--- deliantra/server/socket/sounds.C 2007/07/26 00:38:34 1.16
+++ deliantra/server/socket/sounds.C 2009/10/12 14:00:59 1.27
@@ -1,24 +1,25 @@
/*
- * 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,2008 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
- * 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.
+ * Deliantra is free software: you can redistribute it and/or modify it under
+ * the terms of the Affero GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * You should have received a copy of the Affero GNU General Public License
+ * and 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 +37,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 +54,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 +74,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 +87,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 +107,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 +116,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;
+ }
}
}