ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.16
Committed: Thu Jul 26 00:38:34 2007 UTC (16 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.15: +15 -14 lines
Log Message:
more work better says groz

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 elmex 1.1 /**
40     * Maximum distance a player may hear a sound from.
41     * This is only used for new client/server sound. If the sound source
42     * on the map is farther away than this, we don't sent it to the client.
43     */
44     #define MAX_SOUND_DISTANCE 10
45    
46 root 1.15 // the hashtable
47     typedef std::tr1::unordered_map
48     <
49     const char *,
50     faceidx,
51     str_hash,
52     str_equal,
53     slice_allocator< std::pair<const char *const, faceidx> >
54     > HT;
55    
56     static HT ht;
57    
58     faceidx
59     sound_find (const char *str)
60     {
61     auto (i, ht.find (str));
62    
63     return i == ht.end ()
64     ? 0
65     : i->second;
66     }
67    
68     void
69     sound_set (const char *str, faceidx face)
70     {
71     auto (i, ht.find (str));
72    
73     if (i != ht.end ())
74     i->second = face;
75     else
76     ht.insert (std::make_pair (strdup (str), face));
77     }
78    
79     /*
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.16 if (fx_want [FT_SOUND])
89 root 1.15 {
90     // cfplus
91     send_face (sound);
92     flush_fx ();
93 elmex 1.1
94 root 1.15 packet sl ("sc");
95 root 1.6
96 root 1.15 uint8 *len = sl.cur;
97 root 1.6
98 root 1.15 sl << uint8 (0) // group length
99     << uint8 (0) // type == one-time effect
100     << ber32 (sound)
101     << sint8 (dx)
102     << sint8 (dy);
103 elmex 1.1
104 root 1.15 *len = sl.cur - len; // patch in group length
105 elmex 1.1
106 root 1.15 send_packet (sl);
107 elmex 1.1 }
108 root 1.16 else if (this->sound)
109     {
110     // gcfclient compatibility
111     // fetch compatibility sound index first
112    
113     packet sl ("sound");
114    
115     sl << uint8 (dx)
116     << uint8 (dy)
117     << uint16 (sound)
118     << uint8 (SOUND_NORMAL);
119    
120     send_packet (sl);
121     }
122 elmex 1.1 }
123 root 1.15