|
Atrinik Server 2.5
|
00001 /************************************************************************ 00002 * Atrinik, a Multiplayer Online Role Playing Game * 00003 * * 00004 * Copyright (C) 2009-2011 Alex Tokar and Atrinik Development Team * 00005 * * 00006 * Fork from Daimonin (Massive Multiplayer Online Role Playing Game) * 00007 * and Crossfire (Multiplayer game for X-windows). * 00008 * * 00009 * This program is free software; you can redistribute it and/or modify * 00010 * it under the terms of the GNU General Public License as published by * 00011 * the Free Software Foundation; either version 2 of the License, or * 00012 * (at your option) any later version. * 00013 * * 00014 * This program is distributed in the hope that it will be useful, * 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00017 * GNU General Public License for more details. * 00018 * * 00019 * You should have received a copy of the GNU General Public License * 00020 * along with this program; if not, write to the Free Software * 00021 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * 00022 * * 00023 * The author can be reached at admin@atrinik.org * 00024 ************************************************************************/ 00025 00030 #include <global.h> 00031 00037 #define MAX_SOUND_DISTANCE 12 00038 00039 #define MAX_SOUND_DISTANCE_SQUARED POW2(MAX_SOUND_DISTANCE) 00040 00050 void play_sound_player_only(player *pl, int type, const char *filename, int x, int y, int loop, int volume) 00051 { 00052 SockList sl; 00053 unsigned char buf[MAX_BUF]; 00054 00055 /* Player has disabled sound */ 00056 if (!pl->socket.sound) 00057 { 00058 return; 00059 } 00060 00061 sl.buf = buf; 00062 SOCKET_SET_BINARY_CMD(&sl, BINARY_CMD_SOUND); 00063 00064 SockList_AddChar(&sl, (char) type); 00065 SockList_AddString(&sl, filename); 00066 SockList_AddChar(&sl, loop); 00067 SockList_AddChar(&sl, volume); 00068 00069 /* Add X/Y offset for sound effects. */ 00070 if (type == CMD_SOUND_EFFECT) 00071 { 00072 SockList_AddChar(&sl, (char) x); 00073 SockList_AddChar(&sl, (char) y); 00074 } 00075 00076 Send_With_Handling(&pl->socket, &sl); 00077 } 00078 00090 void play_sound_map(mapstruct *map, int type, const char *filename, int x, int y, int loop, int volume) 00091 { 00092 int xt, yt; 00093 object *tmp; 00094 00095 if (!map || map->in_memory != MAP_IN_MEMORY) 00096 { 00097 return; 00098 } 00099 00100 /* any player on this map? */ 00101 if (map->player_first) 00102 { 00103 for (tmp = map->player_first; tmp; tmp = CONTR(tmp)->map_above) 00104 { 00105 if ((POW2(tmp->x - x) + POW2(tmp->y - y)) <= MAX_SOUND_DISTANCE_SQUARED) 00106 { 00107 play_sound_player_only(CONTR(tmp), type, filename, x - tmp->x, y - tmp->y, loop, volume); 00108 } 00109 } 00110 } 00111 00112 if (map->tile_map[0] && map->tile_map[0]->in_memory == MAP_IN_MEMORY && map->tile_map[0]->player_first) 00113 { 00114 yt = y + MAP_HEIGHT(map->tile_map[0]); 00115 00116 for (tmp = map->tile_map[0]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00117 { 00118 if ((POW2(tmp->x - x) + POW2(tmp->y - yt)) <= MAX_SOUND_DISTANCE_SQUARED) 00119 { 00120 play_sound_player_only(CONTR(tmp), type, filename, x - tmp->x, yt - tmp->y, loop, volume); 00121 } 00122 } 00123 } 00124 00125 if (map->tile_map[1] && map->tile_map[1]->in_memory == MAP_IN_MEMORY && map->tile_map[1]->player_first) 00126 { 00127 xt = x - MAP_WIDTH(map); 00128 00129 for (tmp = map->tile_map[1]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00130 { 00131 if ((POW2(tmp->x - xt) + POW2(tmp->y - y)) <= MAX_SOUND_DISTANCE_SQUARED) 00132 { 00133 play_sound_player_only(CONTR(tmp), type, filename, xt - tmp->x, y - tmp->y, loop, volume); 00134 } 00135 } 00136 } 00137 00138 if (map->tile_map[2] && map->tile_map[2]->in_memory == MAP_IN_MEMORY && map->tile_map[2]->player_first) 00139 { 00140 yt = y - MAP_HEIGHT(map); 00141 00142 for (tmp = map->tile_map[2]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00143 { 00144 if ((POW2(tmp->x - x) + POW2(tmp->y - yt)) <= MAX_SOUND_DISTANCE_SQUARED) 00145 { 00146 play_sound_player_only(CONTR(tmp), type, filename, x - tmp->x, yt - tmp->y, loop, volume); 00147 } 00148 } 00149 } 00150 00151 if (map->tile_map[3] && map->tile_map[3]->in_memory == MAP_IN_MEMORY && map->tile_map[3]->player_first) 00152 { 00153 xt = x + MAP_WIDTH(map->tile_map[3]); 00154 00155 for (tmp = map->tile_map[3]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00156 { 00157 if ((POW2(tmp->x - xt) + POW2(tmp->y - y)) <= MAX_SOUND_DISTANCE_SQUARED) 00158 { 00159 play_sound_player_only(CONTR(tmp), type, filename, xt - tmp->x, y - tmp->y, loop, volume); 00160 } 00161 } 00162 } 00163 00164 if (map->tile_map[4] && map->tile_map[4]->in_memory == MAP_IN_MEMORY && map->tile_map[4]->player_first) 00165 { 00166 yt = y + MAP_HEIGHT(map->tile_map[4]); 00167 xt = x - MAP_WIDTH(map); 00168 00169 for (tmp = map->tile_map[4]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00170 { 00171 if ((POW2(tmp->x - xt) + POW2(tmp->y - yt)) <= MAX_SOUND_DISTANCE_SQUARED) 00172 { 00173 play_sound_player_only(CONTR(tmp), type, filename, xt - tmp->x, yt - tmp->y, loop, volume); 00174 } 00175 } 00176 } 00177 00178 if (map->tile_map[5] && map->tile_map[5]->in_memory == MAP_IN_MEMORY && map->tile_map[5]->player_first) 00179 { 00180 xt = x - MAP_WIDTH(map); 00181 yt = y - MAP_HEIGHT(map); 00182 00183 for (tmp = map->tile_map[5]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00184 { 00185 if ((POW2(tmp->x - xt) + POW2(tmp->y - yt)) <= MAX_SOUND_DISTANCE_SQUARED) 00186 { 00187 play_sound_player_only(CONTR(tmp), type, filename, xt - tmp->x, yt - tmp->y, loop, volume); 00188 } 00189 } 00190 } 00191 00192 if (map->tile_map[6] && map->tile_map[6]->in_memory == MAP_IN_MEMORY && map->tile_map[6]->player_first) 00193 { 00194 xt = x + MAP_WIDTH(map->tile_map[6]); 00195 yt = y - MAP_HEIGHT(map); 00196 00197 for (tmp = map->tile_map[6]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00198 { 00199 if ((POW2(tmp->x - xt) + POW2(tmp->y - yt)) <= MAX_SOUND_DISTANCE_SQUARED) 00200 { 00201 play_sound_player_only(CONTR(tmp), type, filename, xt - tmp->x, yt - tmp->y, loop, volume); 00202 } 00203 } 00204 } 00205 00206 if (map->tile_map[7] && map->tile_map[7]->in_memory == MAP_IN_MEMORY && map->tile_map[7]->player_first) 00207 { 00208 xt = x + MAP_WIDTH(map->tile_map[7]); 00209 yt = y + MAP_HEIGHT(map->tile_map[7]); 00210 00211 for (tmp = map->tile_map[7]->player_first; tmp; tmp = CONTR(tmp)->map_above) 00212 { 00213 if ((POW2(tmp->x - xt) + POW2(tmp->y - yt)) <= MAX_SOUND_DISTANCE_SQUARED) 00214 { 00215 play_sound_player_only(CONTR(tmp), type, filename, xt - tmp->x, yt - tmp->y, loop, volume); 00216 } 00217 } 00218 } 00219 }
1.7.4