ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.34
Committed: Wed Nov 16 23:42:03 2016 UTC (7 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.33: +1 -1 lines
Log Message:
copyright update 2016

File Contents

# User Rev Content
1 root 1.13 /*
2 root 1.25 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 root 1.32 *
4 root 1.34 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.32 *
6 root 1.27 * 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 root 1.32 *
11 root 1.14 * 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 root 1.32 *
16 root 1.27 * 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 root 1.32 *
20 root 1.25 * The authors can be reached via e-mail to <support@deliantra.net>
21 root 1.13 */
22    
23 elmex 1.1 /* 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 root 1.15 #include <tr1/unordered_map>
37    
38     // the hashtable
39     typedef std::tr1::unordered_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 root 1.22 if (i != ht.end ())
56     return i->second;
57    
58 root 1.24 if (strncmp (str, "sound/", sizeof ("sound/") - 1))
59     str = format ("sound/%s", str);
60    
61     return face_find (str);
62 root 1.15 }
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 root 1.17 //TODO: remove
76     // for gcfclient-compatibility, to vanish at some point
77     faceidx old_sound_index [SOUND_CAST_SPELL_0];
78    
79 root 1.15 /*
80 elmex 1.1 * Plays a sound for specified player only
81     */
82 root 1.3 void
83 root 1.15 client::play_sound (faceidx sound, int dx, int dy)
84 elmex 1.1 {
85 root 1.15 if (!sound)
86 root 1.3 return;
87 root 1.6
88 root 1.23 uint8 vol = 255 - idistance (dx, dy) * 255 / MAX_SOUND_DISTANCE;
89    
90     // cut off volume here
91     if (vol <= 0)
92     return;
93 root 1.20
94 root 1.16 if (fx_want [FT_SOUND])
95 root 1.15 {
96     // cfplus
97     send_face (sound);
98     flush_fx ();
99 elmex 1.1
100 root 1.15 packet sl ("sc");
101 root 1.6
102 root 1.15 uint8 *len = sl.cur;
103 root 1.6
104 root 1.33 sl << uint8 (0) // group length, decoded as BER in clients
105 root 1.15 << uint8 (0) // type == one-time effect
106     << ber32 (sound)
107     << sint8 (dx)
108 root 1.18 << sint8 (dy)
109 root 1.19 << uint8 (vol); // 0 == silent, 255 max
110 elmex 1.1
111 root 1.33 *len = sl.cur - len - 1; // patch in group length
112 elmex 1.1
113 root 1.15 send_packet (sl);
114 elmex 1.1 }
115 root 1.16 else if (this->sound)
116     {
117 root 1.17 //TODO: remove, or make bearable
118 root 1.16 // gcfclient compatibility
119    
120 root 1.17 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 root 1.16
131 root 1.17 send_packet (sl);
132 root 1.16
133 root 1.17 break;
134     }
135 root 1.16 }
136 elmex 1.1 }
137 root 1.15