--- deliantra/server/socket/sounds.C 2007/07/26 00:38:34 1.16
+++ deliantra/server/socket/sounds.C 2007/11/08 19:43:30 1.25
@@ -1,11 +1,11 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
+ * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
- * Crossfire TRT is free software: you can redistribute it and/or modify
+ * Deliantra is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
@@ -18,7 +18,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
- * The authors can be reached via e-mail to
+ * The authors can be reached via e-mail to
*/
/* Send bug reports to Raphael Quinet (quinet@montefiore.ulg.ac.be) */
@@ -36,13 +36,6 @@
#include
-/**
- * Maximum distance a player may hear a sound from.
- * This is only used for new client/server sound. If the sound source
- * on the map is farther away than this, we don't sent it to the client.
- */
-#define MAX_SOUND_DISTANCE 10
-
// the hashtable
typedef std::tr1::unordered_map
<
@@ -60,9 +53,13 @@
{
auto (i, ht.find (str));
- return i == ht.end ()
- ? 0
- : i->second;
+ if (i != ht.end ())
+ return i->second;
+
+ if (strncmp (str, "sound/", sizeof ("sound/") - 1))
+ str = format ("sound/%s", str);
+
+ return face_find (str);
}
void
@@ -76,6 +73,10 @@
ht.insert (std::make_pair (strdup (str), face));
}
+//TODO: remove
+// for gcfclient-compatibility, to vanish at some point
+faceidx old_sound_index [SOUND_CAST_SPELL_0];
+
/*
* Plays a sound for specified player only
*/
@@ -85,6 +86,12 @@
if (!sound)
return;
+ uint8 vol = 255 - idistance (dx, dy) * 255 / MAX_SOUND_DISTANCE;
+
+ // cut off volume here
+ if (vol <= 0)
+ return;
+
if (fx_want [FT_SOUND])
{
// cfplus
@@ -99,7 +106,8 @@
<< uint8 (0) // type == one-time effect
<< ber32 (sound)
<< sint8 (dx)
- << sint8 (dy);
+ << sint8 (dy)
+ << uint8 (vol); // 0 == silent, 255 max
*len = sl.cur - len; // patch in group length
@@ -107,17 +115,24 @@
}
else if (this->sound)
{
+ //TODO: remove, or make bearable
// gcfclient compatibility
- // fetch compatibility sound index first
- packet sl ("sound");
+ int gcfclient_sound;
+ for (gcfclient_sound = SOUND_CAST_SPELL_0; gcfclient_sound--; )
+ if (old_sound_index [gcfclient_sound] == sound)
+ {
+ packet sl ("sound");
+
+ sl << uint8 (dx)
+ << uint8 (dy)
+ << uint16 (gcfclient_sound)
+ << uint8 (SOUND_NORMAL);
- sl << uint8 (dx)
- << uint8 (dy)
- << uint16 (sound)
- << uint8 (SOUND_NORMAL);
+ send_packet (sl);
- send_packet (sl);
+ break;
+ }
}
}