--- deliantra/server/socket/sounds.C 2007/01/15 01:39:42 1.12
+++ deliantra/server/socket/sounds.C 2007/11/08 19:43:30 1.25
@@ -1,3 +1,26 @@
+/*
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
+ *
+ * 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
+ *
+ * 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.
+ *
+ * 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 .
+ *
+ * The authors can be reached via e-mail to
+ */
+
/* Send bug reports to Raphael Quinet (quinet@montefiore.ulg.ac.be) */
/**
@@ -11,62 +34,105 @@
#include
#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
+#include
-/**
+// the hashtable
+typedef std::tr1::unordered_map
+ <
+ const char *,
+ faceidx,
+ str_hash,
+ str_equal,
+ slice_allocator< std::pair >
+ > HT;
+
+static HT ht;
+
+faceidx
+sound_find (const char *str)
+{
+ auto (i, ht.find (str));
+
+ if (i != ht.end ())
+ return i->second;
+
+ if (strncmp (str, "sound/", sizeof ("sound/") - 1))
+ str = format ("sound/%s", str);
+
+ return face_find (str);
+}
+
+void
+sound_set (const char *str, faceidx face)
+{
+ auto (i, ht.find (str));
+
+ if (i != ht.end ())
+ i->second = face;
+ else
+ 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
*/
void
-play_sound_player_only (player *pl, short soundnum, sint8 x, sint8 y)
+client::play_sound (faceidx sound, int dx, int dy)
{
- char soundtype;
+ if (!sound)
+ return;
+
+ uint8 vol = 255 - idistance (dx, dy) * 255 / MAX_SOUND_DISTANCE;
- if (!pl->ns->sound)
+ // cut off volume here
+ if (vol <= 0)
return;
- /* Do some quick conversion to the sound type we want. */
- if (soundnum >= SOUND_CAST_SPELL_0)
+ if (fx_want [FT_SOUND])
{
- soundtype = SOUND_SPELL;
- soundnum -= SOUND_CAST_SPELL_0;
- }
- else
- soundtype = SOUND_NORMAL;
+ // cfplus
+ send_face (sound);
+ flush_fx ();
- packet sl;
+ packet sl ("sc");
- sl << "sound "
- << uint8 (x)
- << uint8 (y)
- << uint16 (soundnum)
- << uint8 (soundtype);
+ uint8 *len = sl.cur;
- pl->ns->send_packet (sl);
-}
+ sl << uint8 (0) // group length
+ << uint8 (0) // type == one-time effect
+ << ber32 (sound)
+ << sint8 (dx)
+ << sint8 (dy)
+ << uint8 (vol); // 0 == silent, 255 max
-/** Plays some sound on map at x,y. */
-void
-play_sound_map (maptile *map, int x, int y, short sound_num)
-{
- if (sound_num >= NROF_SOUNDS)
- {
- LOG (llevError, "Tried to play an invalid sound num: %d\n", sound_num);
- return;
- }
+ *len = sl.cur - len; // patch in group length
- for_all_players (pl)
+ send_packet (sl);
+ }
+ else if (this->sound)
{
- if (pl->ob->map == map)
- {
- int distance = idistance (pl->ob->x - x, pl->ob->y - y);
-
- if (distance <= MAX_SOUND_DISTANCE)
- play_sound_player_only (pl, sound_num, x - pl->ob->x, y - pl->ob->y);
- }
+ //TODO: remove, or make bearable
+ // gcfclient compatibility
+
+ 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);
+
+ send_packet (sl);
+
+ break;
+ }
}
}
+