ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.36
Committed: Sat Nov 17 23:33:18 2018 UTC (5 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.35: +2 -2 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 *
6 * Deliantra is free software: you can redistribute it and/or modify it under
7 * the terms of the Affero GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the Affero GNU General Public License
17 * and the GNU General Public License along with this program. If not, see
18 * <http://www.gnu.org/licenses/>.
19 *
20 * The authors can be reached via e-mail to <support@deliantra.net>
21 */
22
23 /* Send bug reports to Raphael Quinet (quinet@montefiore.ulg.ac.be) */
24
25 /**
26 * \file
27 * Sound-related functions.
28 *
29 * \date 2003-12-02
30 */
31
32 #include <global.h>
33 #include <sproto.h>
34 #include <sounds.h>
35
36 #include <flat_hash_map.hpp>
37
38 // the hashtable
39 typedef ska::flat_hash_map
40 <
41 const char *,
42 faceidx,
43 str_hash,
44 str_equal,
45 slice_allocator< std::pair<const char *const, faceidx> >
46 > HT;
47
48 static HT ht;
49
50 faceidx
51 sound_find (const char *str)
52 {
53 auto (i, ht.find (str));
54
55 if (i != ht.end ())
56 return i->second;
57
58 if (strncmp (str, "sound/", sizeof ("sound/") - 1))
59 str = format ("sound/%s", str);
60
61 return face_find (str);
62 }
63
64 void
65 sound_set (const char *str, faceidx face)
66 {
67 auto (i, ht.find (str));
68
69 if (i != ht.end ())
70 i->second = face;
71 else
72 ht.insert (std::make_pair (strdup (str), face));
73 }
74
75 //TODO: remove
76 // for gcfclient-compatibility, to vanish at some point
77 faceidx old_sound_index [SOUND_CAST_SPELL_0];
78
79 /*
80 * Plays a sound for specified player only
81 */
82 void
83 client::play_sound (faceidx sound, int dx, int dy)
84 {
85 if (!sound)
86 return;
87
88 uint8 vol = 255 - idistance (dx, dy) * 255 / MAX_SOUND_DISTANCE;
89
90 // cut off volume here
91 if (vol <= 0)
92 return;
93
94 if (fx_want [FT_SOUND])
95 {
96 // cfplus
97 send_face (sound);
98 flush_fx ();
99
100 packet sl ("sc");
101
102 uint8 *len = sl.cur;
103
104 sl << uint8 (0) // group length, decoded as BER in clients
105 << uint8 (0) // type == one-time effect
106 << ber32 (sound)
107 << sint8 (dx)
108 << sint8 (dy)
109 << uint8 (vol); // 0 == silent, 255 max
110
111 *len = sl.cur - len - 1; // patch in group length
112
113 send_packet (sl);
114 }
115 else if (this->sound)
116 {
117 //TODO: remove, or make bearable
118 // gcfclient compatibility
119
120 int gcfclient_sound;
121 for (gcfclient_sound = SOUND_CAST_SPELL_0; gcfclient_sound--; )
122 if (old_sound_index [gcfclient_sound] == sound)
123 {
124 packet sl ("sound");
125
126 sl << uint8 (dx)
127 << uint8 (dy)
128 << uint16 (gcfclient_sound)
129 << uint8 (SOUND_NORMAL);
130
131 send_packet (sl);
132
133 break;
134 }
135 }
136 }
137