1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "bladerunner/script/ai_script.h"
24 
25 #include "bladerunner/actor.h"
26 #include "bladerunner/bladerunner.h"
27 
28 namespace BladeRunner {
29 
AIScripts(BladeRunnerEngine * vm,int actorCount)30 AIScripts::AIScripts(BladeRunnerEngine *vm, int actorCount) {
31 	_vm = vm;
32 	_inScriptCounter = 0;
33 	_actorCount = actorCount;
34 	_actorUpdating = new bool[actorCount];
35 	_AIScripts = new AIScriptBase*[actorCount];
36 	for (int i = 0; i < actorCount; ++i) {
37 		_AIScripts[i] = nullptr;
38 		_actorUpdating[i] = false;
39 	}
40 
41 	_AIScripts[kActorMcCoy] = new AIScriptMcCoy(_vm);                     //  0
42 	_AIScripts[kActorSteele] = new AIScriptSteele(_vm);                   //  1
43 	_AIScripts[kActorGordo] = new AIScriptGordo(_vm);                     //  2
44 	_AIScripts[kActorDektora] = new AIScriptDektora(_vm);                 //  3
45 	_AIScripts[kActorGuzza] = new AIScriptGuzza(_vm);                     //  4
46 	_AIScripts[kActorClovis] = new AIScriptClovis(_vm);                   //  5
47 	_AIScripts[kActorLucy] = new AIScriptLucy(_vm);                       //  6
48 	_AIScripts[kActorIzo] = new AIScriptIzo(_vm);                         //  7
49 	_AIScripts[kActorSadik] = new AIScriptSadik(_vm);                     //  8
50 	_AIScripts[kActorCrazylegs] = new AIScriptCrazylegs(_vm);             //  9
51 	_AIScripts[kActorLuther] = new AIScriptLuther(_vm);                   // 10
52 	_AIScripts[kActorGrigorian] = new AIScriptGrigorian(_vm);             // 11
53 	_AIScripts[kActorTransient] = new AIScriptTransient(_vm);             // 12
54 	_AIScripts[kActorLance] = new AIScriptLance(_vm);                     // 13
55 	_AIScripts[kActorBulletBob] = new AIScriptBulletBob(_vm);             // 14
56 	_AIScripts[kActorRunciter] = new AIScriptRunciter(_vm);               // 15
57 	_AIScripts[kActorInsectDealer] = new AIScriptInsectDealer(_vm);       // 16
58 	_AIScripts[kActorTyrellGuard] = new AIScriptTyrellGuard(_vm);         // 17
59 	_AIScripts[kActorEarlyQ] = new AIScriptEarlyQ(_vm);                   // 18
60 	_AIScripts[kActorZuben] = new AIScriptZuben(_vm);                     // 19
61 	_AIScripts[kActorHasan] = new AIScriptHasan(_vm);                     // 20
62 	_AIScripts[kActorMarcus] = new AIScriptMarcus(_vm);                   // 21
63 	_AIScripts[kActorMia] = new AIScriptMia(_vm);                         // 22
64 	_AIScripts[kActorOfficerLeary] = new AIScriptOfficerLeary(_vm);       // 23
65 	_AIScripts[kActorOfficerGrayford] = new AIScriptOfficerGrayford(_vm); // 24
66 	_AIScripts[kActorHanoi] = new AIScriptHanoi(_vm);                     // 25
67 	_AIScripts[kActorBaker] = new AIScriptBaker(_vm);                     // 26
68 	_AIScripts[kActorDeskClerk] = new AIScriptDeskClerk(_vm);             // 27
69 	_AIScripts[kActorHowieLee] = new AIScriptHowieLee(_vm);               // 28
70 	_AIScripts[kActorFishDealer] = new AIScriptFishDealer(_vm);           // 29
71 	_AIScripts[kActorKlein] = new AIScriptKlein(_vm);                     // 30
72 	_AIScripts[kActorMurray] = new AIScriptMurray(_vm);                   // 31
73 	_AIScripts[kActorHawkersBarkeep] = new AIScriptHawkersBarkeep(_vm);   // 32
74 	_AIScripts[kActorHolloway] = new AIScriptHolloway(_vm);               // 33
75 	_AIScripts[kActorSergeantWalls] = new AIScriptSergeantWalls(_vm);     // 34
76 	_AIScripts[kActorMoraji] = new AIScriptMoraji(_vm);                   // 35
77 	_AIScripts[kActorTheBard] = new AIScriptTheBard(_vm);                 // 36
78 	_AIScripts[kActorPhotographer] = new AIScriptPhotographer(_vm);       // 37
79 	_AIScripts[kActorDispatcher] = new AIScriptDispatcher(_vm);           // 38
80 	_AIScripts[kActorAnsweringMachine] = new AIScriptAnsweringMachine(_vm);// 39
81 	_AIScripts[kActorRajif] = new AIScriptRajif(_vm);                     // 40
82 	_AIScripts[kActorGovernorKolvig] = new AIScriptGovernorKolvig(_vm);   // 41
83 	_AIScripts[kActorEarlyQBartender] = new AIScriptEarlyQBartender(_vm); // 42
84 	_AIScripts[kActorHawkersParrot] = new AIScriptHawkersParrot(_vm);     // 43
85 	_AIScripts[kActorTaffyPatron] = new AIScriptTaffyPatron(_vm);         // 44
86 	_AIScripts[kActorLockupGuard] = new AIScriptLockupGuard(_vm);         // 45
87 	_AIScripts[kActorTeenager] = new AIScriptTeenager(_vm);               // 46
88 	_AIScripts[kActorHysteriaPatron1] = new AIScriptHysteriaPatron1(_vm); // 47
89 	_AIScripts[kActorHysteriaPatron2] = new AIScriptHysteriaPatron2(_vm); // 48
90 	_AIScripts[kActorHysteriaPatron3] = new AIScriptHysteriaPatron3(_vm); // 49
91 	_AIScripts[kActorShoeshineMan] = new AIScriptShoeshineMan(_vm);       // 50
92 	_AIScripts[kActorTyrell] = new AIScriptTyrell(_vm);                   // 51
93 	_AIScripts[kActorChew] = new AIScriptChew(_vm);                       // 52
94 	_AIScripts[kActorGaff] = new AIScriptGaff(_vm);                       // 53
95 	_AIScripts[kActorBryant] = new AIScriptBryant(_vm);                   // 54
96 	_AIScripts[kActorTaffy] = new AIScriptTaffy(_vm);                     // 55
97 	_AIScripts[kActorSebastian] = new AIScriptSebastian(_vm);             // 56
98 	_AIScripts[kActorRachael] = new AIScriptRachael(_vm);                 // 57
99 	_AIScripts[kActorGeneralDoll] = new AIScriptGeneralDoll(_vm);         // 58
100 	_AIScripts[kActorIsabella] = new AIScriptIsabella(_vm);               // 59
101 	_AIScripts[kActorBlimpGuy] = new AIScriptBlimpGuy(_vm);               // 60
102 	_AIScripts[kActorNewscaster] = new AIScriptNewscaster(_vm);           // 61
103 	_AIScripts[kActorLeon] = new AIScriptLeon(_vm);                       // 62
104 	_AIScripts[kActorMaleAnnouncer] = new AIScriptMaleAnnouncer(_vm);     // 63
105 	_AIScripts[kActorFreeSlotA] = new AIScriptFreeSlotA(_vm);             // 64
106 	_AIScripts[kActorFreeSlotB] = new AIScriptFreeSlotB(_vm);             // 65
107 	_AIScripts[kActorMaggie] = new AIScriptMaggie(_vm);                   // 66
108 	_AIScripts[kActorGenwalkerA] = new AIScriptGenericWalkerA(_vm);       // 67
109 	_AIScripts[kActorGenwalkerB] = new AIScriptGenericWalkerB(_vm);       // 68
110 	_AIScripts[kActorGenwalkerC] = new AIScriptGenericWalkerC(_vm);       // 69
111 	_AIScripts[kActorMutant1] = new AIScriptMutant1(_vm);                 // 70
112 	_AIScripts[kActorMutant2] = new AIScriptMutant2(_vm);                 // 71
113 	_AIScripts[kActorMutant3] = new AIScriptMutant3(_vm);                 // 72
114 }
115 
~AIScripts()116 AIScripts::~AIScripts() {
117 	for (int i = 0; i < _actorCount; ++i) {
118 		delete _AIScripts[i];
119 		_AIScripts[i] = nullptr;
120 	}
121 	delete[] _AIScripts;
122 	delete[] _actorUpdating;
123 }
124 
initialize(int actor)125 void AIScripts::initialize(int actor) {
126 	if (actor >= _actorCount) {
127 		return;
128 	}
129 
130 	if (_AIScripts[actor]) {
131 		_AIScripts[actor]->Initialize();
132 	}
133 }
134 
update(int actor)135 void AIScripts::update(int actor) {
136 	if (actor >= _actorCount) {
137 		return;
138 	}
139 
140 	if (!_actorUpdating[actor]) {
141 		_actorUpdating[actor] = true;
142 		++_inScriptCounter;
143 		if (_AIScripts[actor]) {
144 			_AIScripts[actor]->Update();
145 		}
146 		--_inScriptCounter;
147 		_actorUpdating[actor] = false;
148 	}
149 }
150 
timerExpired(int actor,int timer)151 void AIScripts::timerExpired(int actor, int timer) {
152 	if (actor >= _actorCount) {
153 		return;
154 	}
155 
156 	++_inScriptCounter;
157 	if (_AIScripts[actor]) {
158 		_AIScripts[actor]->TimerExpired(timer);
159 	}
160 	--_inScriptCounter;
161 }
162 
completedMovementTrack(int actor)163 void AIScripts::completedMovementTrack(int actor) {
164 	if (actor >= _actorCount) {
165 		return;
166 	}
167 
168 	if (!_vm->_actors[actor]->inCombat()) {
169 		++_inScriptCounter;
170 		if (_AIScripts[actor]) {
171 			_AIScripts[actor]->CompletedMovementTrack();
172 		}
173 		--_inScriptCounter;
174 	}
175 }
176 
receivedClue(int actor,int clueId,int fromActorId)177 void AIScripts::receivedClue(int actor, int clueId, int fromActorId) {
178 	if (actor >= _actorCount) {
179 		return;
180 	}
181 
182 	++_inScriptCounter;
183 	if (_AIScripts[actor]) {
184 		_AIScripts[actor]->ReceivedClue(clueId, fromActorId);
185 	}
186 	--_inScriptCounter;
187 }
188 
clickedByPlayer(int actor)189 void AIScripts::clickedByPlayer(int actor) {
190 	if (actor >= _actorCount) {
191 		return;
192 	}
193 
194 
195 	if (_vm->_actors[actor]->inCombat()) {
196 		return;
197 	}
198 
199 	++_inScriptCounter;
200 	if (_AIScripts[actor]) {
201 		_AIScripts[actor]->ClickedByPlayer();
202 	}
203 	--_inScriptCounter;
204 }
205 
enteredSet(int actor,int setId)206 void AIScripts::enteredSet(int actor, int setId) {
207 	if (actor >= _actorCount) {
208 		return;
209 	}
210 
211 	++_inScriptCounter;
212 	if (_AIScripts[actor]) {
213 		_AIScripts[actor]->EnteredSet(setId);
214 	}
215 	--_inScriptCounter;
216 }
217 
otherAgentEnteredThisSet(int actor,int otherActorId)218 void AIScripts::otherAgentEnteredThisSet(int actor, int otherActorId) {
219 	if (actor >= _actorCount) {
220 		return;
221 	}
222 
223 	++_inScriptCounter;
224 	if (_AIScripts[actor]) {
225 		_AIScripts[actor]->OtherAgentEnteredThisSet(otherActorId);
226 	}
227 	--_inScriptCounter;
228 }
229 
otherAgentExitedThisSet(int actor,int otherActorId)230 void AIScripts::otherAgentExitedThisSet(int actor, int otherActorId) {
231 	if (actor >= _actorCount) {
232 		return;
233 	}
234 
235 	++_inScriptCounter;
236 	if (_AIScripts[actor]) {
237 		_AIScripts[actor]->OtherAgentExitedThisSet(otherActorId);
238 	}
239 	--_inScriptCounter;
240 }
241 
otherAgentEnteredCombatMode(int actorId,int otherActorId,int combatMode)242 void AIScripts::otherAgentEnteredCombatMode(int actorId, int otherActorId, int combatMode) {
243 	assert(actorId < _actorCount);
244 	++_inScriptCounter;
245 	if (_AIScripts[actorId]) {
246 		_AIScripts[actorId]->OtherAgentEnteredCombatMode(otherActorId, combatMode);
247 	}
248 	--_inScriptCounter;
249 }
250 
shotAtAndMissed(int actorId)251 void AIScripts::shotAtAndMissed(int actorId) {
252 	assert(actorId < _actorCount);
253 	++_inScriptCounter;
254 	if (_AIScripts[actorId]) {
255 		_AIScripts[actorId]->ShotAtAndMissed();
256 	}
257 	--_inScriptCounter;
258 }
259 
shotAtAndHit(int actorId)260 bool AIScripts::shotAtAndHit(int actorId) {
261 	assert(actorId < _actorCount);
262 	bool result = true;
263 	++_inScriptCounter;
264 	if (_AIScripts[actorId]) {
265 		result = _AIScripts[actorId]->ShotAtAndHit();
266 	}
267 	--_inScriptCounter;
268 	return result;
269 }
270 
retired(int actor,int retiredByActorId)271 void AIScripts::retired(int actor, int retiredByActorId) {
272 	if (actor >= _actorCount) {
273 		return;
274 	}
275 
276 	++_inScriptCounter;
277 	if (_AIScripts[actor]) {
278 		_AIScripts[actor]->Retired(retiredByActorId);
279 	}
280 	--_inScriptCounter;
281 }
282 
goalChanged(int actor,int currentGoalNumber,int newGoalNumber)283 void AIScripts::goalChanged(int actor, int currentGoalNumber, int newGoalNumber) {
284 	if (actor >= _actorCount) {
285 		return;
286 	}
287 
288 	++_inScriptCounter;
289 	if (_AIScripts[actor]) {
290 		_AIScripts[actor]->GoalChanged(currentGoalNumber, newGoalNumber);
291 	}
292 	--_inScriptCounter;
293 }
294 
reachedMovementTrackWaypoint(int actor,int waypointId)295 bool AIScripts::reachedMovementTrackWaypoint(int actor, int waypointId) {
296 	if (actor >= _actorCount) {
297 		return false;
298 	}
299 
300 	bool result = false;
301 	if (!_vm->_actors[actor]->inCombat()) {
302 		++_inScriptCounter;
303 		if (_AIScripts[actor]) {
304 			result = _AIScripts[actor]->ReachedMovementTrackWaypoint(waypointId);
305 		}
306 		--_inScriptCounter;
307 	}
308 	return result;
309 }
310 
updateAnimation(int actor,int * animation,int * frame)311 void AIScripts::updateAnimation(int actor, int *animation, int *frame) {
312 	if (actor >= _actorCount) {
313 		return;
314 	}
315 
316 	++_inScriptCounter;
317 	if (_AIScripts[actor]) {
318 		_AIScripts[actor]->UpdateAnimation(animation, frame);
319 	}
320 	--_inScriptCounter;
321 }
322 
changeAnimationMode(int actor,int mode)323 void AIScripts::changeAnimationMode(int actor, int mode) {
324 	if (actor >= _actorCount) {
325 		return;
326 	}
327 
328 	++_inScriptCounter;
329 	if (_AIScripts[actor]) {
330 		_AIScripts[actor]->ChangeAnimationMode(mode);
331 	}
332 	--_inScriptCounter;
333 }
334 
fledCombat(int actor)335 void AIScripts::fledCombat(int actor) {
336 	if (actor >= _actorCount) {
337 		return;
338 	}
339 
340 	++_inScriptCounter;
341 	if (_AIScripts[actor]) {
342 		_AIScripts[actor]->FledCombat();
343 	}
344 	--_inScriptCounter;
345 }
346 
setAnimationState(int actor,int animationState,int animationFrame,int animationStateNext,int animationNext)347 void AIScripts::setAnimationState(int actor, int animationState, int animationFrame, int animationStateNext, int animationNext) {
348 	if (actor >= _actorCount) {
349 		return;
350 	}
351 
352 	++_inScriptCounter;
353 	if (_AIScripts[actor]) {
354 		_AIScripts[actor]->SetAnimationState(animationState, animationFrame, animationStateNext, animationNext);
355 	}
356 	--_inScriptCounter;
357 }
358 
359 
queryAnimationState(int actor,int * animationState,int * animationFrame,int * animationStateNext,int * animationNext)360 void AIScripts::queryAnimationState(int actor, int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
361 	if (actor >= _actorCount) {
362 		return;
363 	}
364 
365 	++_inScriptCounter;
366 	if (_AIScripts[actor]) {
367 		_AIScripts[actor]->QueryAnimationState(animationState, animationFrame, animationStateNext, animationNext);
368 	}
369 	--_inScriptCounter;
370 }
371 
372 
373 } // End of namespace BladeRunner
374