ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.20
Committed: Tue Jul 31 01:18:16 2007 UTC (16 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.19: +3 -0 lines
Log Message:
experimentally let other players hear when I hit

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 root 1.17 //TODO: remove
80     // for gcfclient-compatibility, to vanish at some point
81     faceidx old_sound_index [SOUND_CAST_SPELL_0];
82    
83 root 1.15 /*
84 elmex 1.1 * Plays a sound for specified player only
85     */
86 root 1.3 void
87 root 1.15 client::play_sound (faceidx sound, int dx, int dy)
88 elmex 1.1 {
89 root 1.15 if (!sound)
90 root 1.3 return;
91 root 1.6
92 root 1.20 if (dx < -10 || dx > 10) return;
93     if (dy < -10 || dy > 10) return;
94    
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.19 uint8 vol = clamp (255 - idistance (dx, dy) * 255 / 10, 0, 255);
102 root 1.18
103     // cut off volume here
104 root 1.19 if (vol < 16)
105 root 1.18 return;
106    
107 root 1.15 packet sl ("sc");
108 root 1.6
109 root 1.15 uint8 *len = sl.cur;
110 root 1.6
111 root 1.15 sl << uint8 (0) // group length
112     << uint8 (0) // type == one-time effect
113     << ber32 (sound)
114     << sint8 (dx)
115 root 1.18 << sint8 (dy)
116 root 1.19 << uint8 (vol); // 0 == silent, 255 max
117 elmex 1.1
118 root 1.15 *len = sl.cur - len; // patch in group length
119 elmex 1.1
120 root 1.15 send_packet (sl);
121 elmex 1.1 }
122 root 1.16 else if (this->sound)
123     {
124 root 1.17 //TODO: remove, or make bearable
125 root 1.16 // gcfclient compatibility
126    
127 root 1.17 int gcfclient_sound;
128     for (gcfclient_sound = SOUND_CAST_SPELL_0; gcfclient_sound--; )
129     if (old_sound_index [gcfclient_sound] == sound)
130     {
131     packet sl ("sound");
132    
133     sl << uint8 (dx)
134     << uint8 (dy)
135     << uint16 (gcfclient_sound)
136     << uint8 (SOUND_NORMAL);
137 root 1.16
138 root 1.17 send_packet (sl);
139 root 1.16
140 root 1.17 break;
141     }
142 root 1.16 }
143 elmex 1.1 }
144 root 1.15