]> git.mxchange.org Git - quix0rs-blobwars.git/blob - src/triggers.cpp
Prevent a segmentation fault when using the -map option without specifying a map.
[quix0rs-blobwars.git] / src / triggers.cpp
1 /*
2 Copyright (C) 2004-2011 Parallel Realities
3 Copyright (C) 2011-2015 Perpendicular Dimensions
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19
20 */
21
22 #include "triggers.h"
23
24 /**
25 * Checks against various objects (Train, SpawnPoint, Teleporter, Trap)
26 * to see if they should be activated. If the
27 * object name matches the link name, it's active status is changed.
28 * @param linkName The name of the link to check against
29 * @param activateMessage The message to display on successful trigger
30 * @param active The new status of the object
31 */
32 void activateTrigger(const char *linkName, const char *activateMessage, bool active)
33 {
34         if (strcmp(linkName, "@none@") == 0)
35                 return;
36                 
37         if (strcmp(linkName, "WATERLEVEL") == 0)
38         {
39                 int newLevel = atoi(activateMessage);
40                 
41                 // only if the new level is less than our current level
42                 // (ie - raising water up!)
43                 if (newLevel < map.waterLevel)
44                 {
45                         map.requiredWaterLevel = atoi(activateMessage);
46                         engine.setInfoMessage("Water level is rising", 1, INFO_ACTIVATE);
47                 }
48                 return;
49         }
50
51         if (strcmp(linkName, "OBSTACLERESET") == 0)
52         {
53                 if (!active)
54                         return;
55
56                 Entity *obstacle = (Entity*)map.obstacleList.getHead();
57
58                 while (obstacle->next != NULL)
59                 {
60                         obstacle = (Entity*)obstacle->next;
61
62                         if (strcmp(obstacle->name, activateMessage) == 0)
63                         {
64                                 addTeleportParticles(obstacle->x + (obstacle->width / 2), obstacle->y + (obstacle->height / 2), 50, SND_TELEPORT2);
65                                 obstacle->place(obstacle->tx, obstacle->ty);
66                                 Math::removeBit(&obstacle->flags, ENT_TELEPORTING);
67                                 obstacle->dx = obstacle->dy = 0;
68                                 obstacle->environment = ENV_AIR;
69                                 addTeleportParticles(obstacle->x + (obstacle->width / 2), obstacle->y + (obstacle->height / 2), 50, SND_TELEPORT2);
70                         }
71                 }
72
73                 engine.setInfoMessage("Obstacles Reset", 0, INFO_ACTIVATE);
74
75                 return;
76         }
77
78         bool linkOkay = false;
79
80         Train *train = (Train*)map.trainList.getHead();
81         SpawnPoint *sp = (SpawnPoint*)map.spawnList.getHead();
82         Teleporter *tele = (Teleporter*)map.teleportList.getHead();
83         Trap *trap = (Trap*)map.trapList.getHead();
84
85         while (train->next != NULL)
86         {
87                 train = (Train*)train->next;
88
89                 if (strcmp(linkName, train->name) == 0)
90                 {
91                         train->active = active;
92                         if ((train->active) && (strcmp(activateMessage, "@none@")))
93                                 engine.setInfoMessage(activateMessage, 1, INFO_ACTIVATE);
94
95                         if (train->type != TR_TRAIN)
96                                 audio.playSound(SND_OPENDOOR, CH_TOUCH);
97
98                         linkOkay = true;
99                 }
100         }
101
102         while (sp->next != NULL)
103         {
104                 sp = (SpawnPoint*)sp->next;
105
106                 if (strcmp(linkName, sp->name) == 0)
107                 {
108                         sp->active = !sp->active;
109                         if ((sp->active) && (strcmp(activateMessage, "@none@")))
110                                 engine.setInfoMessage(activateMessage, 1, INFO_ACTIVATE);
111
112                         linkOkay = true;
113                 }
114         }
115
116         while (tele->next != NULL)
117         {
118                 tele = (Teleporter*)tele->next;
119
120                 if (strcmp(linkName, tele->name) == 0)
121                 {
122                         tele->active = active;
123                         if ((tele->active) && (strcmp(activateMessage, "@none@")))
124                                 engine.setInfoMessage(activateMessage, 1, INFO_ACTIVATE);
125
126                         linkOkay = true;
127                 }
128         }
129
130         while (trap->next != NULL)
131         {
132                 trap = (Trap*)trap->next;
133
134                 if (strcmp(linkName, trap->name) == 0)
135                 {
136                         toggleTrap(trap);
137                         if (strcmp(activateMessage, "@none@"))
138                                 engine.setInfoMessage(activateMessage, 1, INFO_ACTIVATE);
139                         linkOkay = true;
140                 }
141         }
142
143         if (linkOkay)
144         {
145                 showMessageLineDef(linkName, active);
146         }
147         else
148         {
149                 debug(("WARNING : No such object '%s'!\n", linkName));
150         }
151 }