ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.24
Committed: Fri Sep 7 17:39:17 2007 UTC (16 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_2, rel-2_3
Changes since 1.23: +4 -4 lines
Log Message:
for the time being, accept soundfaces with leading sound/ and without

File Contents

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