Atrinik Server 2.5
socket/sounds.c
Go to the documentation of this file.
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 }