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 namespace BladeRunner {
26 
AIScriptGrigorian(BladeRunnerEngine * vm)27 AIScriptGrigorian::AIScriptGrigorian(BladeRunnerEngine *vm) : AIScriptBase(vm) {
28 	// _varChooseIdleAnimation can have valid values: 0, 1, 2
29 	_varChooseIdleAnimation = 0;
30 	_varNumOfTimesToHoldCurrentFrame = 0;
31 }
32 
Initialize()33 void AIScriptGrigorian::Initialize() {
34 	_varChooseIdleAnimation = 0;
35 	_varNumOfTimesToHoldCurrentFrame = 0;
36 	_animationStateNext = 0;
37 	_animationFrame = 0;
38 	_animationState = 0;
39 }
40 
Update()41 bool AIScriptGrigorian::Update() {
42 	if ( Actor_Query_Friendliness_To_Other(kActorGrigorian, kActorMcCoy) < 30
43 	 && !Game_Flag_Query(kFlagGrigorianDislikeMcCoy)
44 	) {
45 		Game_Flag_Set(kFlagGrigorianDislikeMcCoy);
46 		return true;
47 	}
48 	return false;
49 }
50 
TimerExpired(int timer)51 void AIScriptGrigorian::TimerExpired(int timer) {
52 	//return false;
53 }
54 
CompletedMovementTrack()55 void AIScriptGrigorian::CompletedMovementTrack() {
56 	//return false;
57 }
58 
ReceivedClue(int clueId,int fromActorId)59 void AIScriptGrigorian::ReceivedClue(int clueId, int fromActorId) {
60 	//return false;
61 }
62 
ClickedByPlayer()63 void AIScriptGrigorian::ClickedByPlayer() {
64 	//return false;
65 }
66 
EnteredSet(int setId)67 void AIScriptGrigorian::EnteredSet(int setId) {
68 	// return false;
69 }
70 
OtherAgentEnteredThisSet(int otherActorId)71 void AIScriptGrigorian::OtherAgentEnteredThisSet(int otherActorId) {
72 	// return false;
73 }
74 
OtherAgentExitedThisSet(int otherActorId)75 void AIScriptGrigorian::OtherAgentExitedThisSet(int otherActorId) {
76 	// return false;
77 }
78 
OtherAgentEnteredCombatMode(int otherActorId,int combatMode)79 void AIScriptGrigorian::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
80 	// return false;
81 }
82 
ShotAtAndMissed()83 void AIScriptGrigorian::ShotAtAndMissed() {
84 	// return false;
85 }
86 
ShotAtAndHit()87 bool AIScriptGrigorian::ShotAtAndHit() {
88 	return false;
89 }
90 
Retired(int byActorId)91 void AIScriptGrigorian::Retired(int byActorId) {
92 	// return false;
93 }
94 
GetFriendlinessModifierIfGetsClue(int otherActorId,int clueId)95 int AIScriptGrigorian::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
96 	return 0;
97 }
98 
GoalChanged(int currentGoalNumber,int newGoalNumber)99 bool AIScriptGrigorian::GoalChanged(int currentGoalNumber, int newGoalNumber) {
100 	return false;
101 }
102 
UpdateAnimation(int * animation,int * frame)103 bool AIScriptGrigorian::UpdateAnimation(int *animation, int *frame) {
104 	switch (_animationState) {
105 	case 0:
106 		if (_varChooseIdleAnimation == 0) {
107 			*animation = kModelAnimationGrigorianStandIdle;
108 			if (_varNumOfTimesToHoldCurrentFrame > 0) {
109 				--_varNumOfTimesToHoldCurrentFrame;
110 			} else {
111 				++_animationFrame;
112 				if (_animationFrame == 5 || _animationFrame == 13) {
113 					_varNumOfTimesToHoldCurrentFrame = Random_Query(2, 4);
114 				}
115 				if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandIdle)) {
116 					_animationFrame = 0;
117 					_varChooseIdleAnimation = Random_Query(0, 2);
118 				}
119 			}
120 		} else if (_varChooseIdleAnimation == 1) {
121 			*animation = kModelAnimationGrigorianStandAnnoyedTalk;
122 			++_animationFrame;
123 			if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandAnnoyedTalk)) {
124 				*animation = kModelAnimationGrigorianStandIdle;
125 				_animationFrame = 0;
126 				_varChooseIdleAnimation = 0;
127 			}
128 		} else if (_varChooseIdleAnimation == 2) {
129 			*animation = kModelAnimationGrigorianStandArmsCrossedTalk;
130 			if (_varNumOfTimesToHoldCurrentFrame > 0) {
131 				--_varNumOfTimesToHoldCurrentFrame;
132 			} else {
133 				++_animationFrame;
134 				if (_animationFrame >= 8 && _animationFrame <= 10) {
135 					_varNumOfTimesToHoldCurrentFrame = Random_Query(2, 4);
136 				}
137 #if BLADERUNNER_ORIGINAL_BUGS
138 				if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandIdle)) {
139 					*animation = kModelAnimationGrigorianStandIdle;
140 					_animationFrame = 0;
141 					_varChooseIdleAnimation = 0;
142 				}
143 #else
144 				// bugfix set proper current animation here to get frameset number of frames
145 				//        (could also use *animation)
146 				if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandArmsCrossedTalk)) {
147 					*animation = kModelAnimationGrigorianStandIdle;
148 					_animationFrame = 0;
149 					_varChooseIdleAnimation = 0;
150 				}
151 #endif // BLADERUNNER_ORIGINAL_BUGS
152 			}
153 		}
154 		break;
155 
156 	case 1:
157 		*animation = kModelAnimationGrigorianStandAnnoyedTalk;
158 		++_animationFrame;
159 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandAnnoyedTalk)) {
160 			_animationFrame = 0;
161 		}
162 		break;
163 
164 	case 2:
165 		*animation = kModelAnimationGrigorianStandProtestTalk;
166 		++_animationFrame;
167 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandProtestTalk)) {
168 			_animationFrame = 0;
169 		}
170 		break;
171 
172 	case 3:
173 		*animation = kModelAnimationGrigorianStandProtestMoreTalk;
174 		++_animationFrame;
175 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandProtestMoreTalk)) {
176 			_animationState = 2;
177 			_animationFrame = 0;
178 			*animation = kModelAnimationGrigorianStandProtestTalk;
179 		}
180 		break;
181 
182 	case 4:
183 		*animation = kModelAnimationGrigorianStandProtestEvenMoreTalk;
184 		++_animationFrame;
185 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandProtestEvenMoreTalk)) {
186 			_animationState = 2;
187 			_animationFrame = 0;
188 			*animation = kModelAnimationGrigorianStandProtestTalk;
189 		}
190 		break;
191 
192 	case 5:
193 		*animation = kModelAnimationGrigorianStandInsistentTalk;
194 		++_animationFrame;
195 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandInsistentTalk)) {
196 			_animationState = 2;
197 			_animationFrame = 0;
198 			*animation = kModelAnimationGrigorianStandProtestTalk;
199 		}
200 		break;
201 
202 	case 6:
203 		*animation = kModelAnimationGrigorianStandDismissOrAccuseTalk;
204 		++_animationFrame;
205 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandDismissOrAccuseTalk)) {
206 			_animationState = 2;
207 			_animationFrame = 0;
208 			*animation = kModelAnimationGrigorianStandProtestTalk;
209 		}
210 		break;
211 
212 	case 7:
213 		*animation = kModelAnimationGrigorianStandBegOrMockingTalk;
214 		++_animationFrame;
215 		if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationGrigorianStandBegOrMockingTalk)) {
216 			_animationState = 2;
217 			_animationFrame = 0;
218 			*animation = kModelAnimationGrigorianStandProtestTalk;
219 		}
220 		break;
221 
222 	default:
223 		// Dummy placeholder, kModelAnimationZubenWalking (399) is a Zuben animation
224 		*animation = kModelAnimationZubenWalking;
225 		break;
226 	}
227 	*frame = _animationFrame;
228 	return true;
229 }
230 
ChangeAnimationMode(int mode)231 bool AIScriptGrigorian::ChangeAnimationMode(int mode) {
232 	switch (mode) {
233 	case kAnimationModeIdle:
234 		_animationState = 0;
235 		_animationFrame = 0;
236 		break;
237 
238 	case kAnimationModeWalk:
239 		// TODO A bug? This animation state is not for walking. It is for kModelAnimationGrigorianStandAnnoyedTalk.
240 		if (_animationState != 1) {
241 			_animationState = 1;
242 			_animationFrame = 0;
243 		}
244 		break;
245 
246 	case kAnimationModeTalk:
247 		_animationState = 2;
248 		_animationFrame = 0;
249 		break;
250 
251 	case 12:
252 		_animationState = 3;
253 		_animationFrame = 0;
254 		break;
255 
256 	case 13:
257 		_animationState = 4;
258 		_animationFrame = 0;
259 		break;
260 
261 	case 14:
262 		_animationState = 5;
263 		_animationFrame = 0;
264 		break;
265 
266 	case 15:
267 		_animationState = 6;
268 		_animationFrame = 0;
269 		break;
270 
271 	case 16:
272 		_animationState = 7;
273 		_animationFrame = 0;
274 		break;
275 	}
276 	return true;
277 }
278 
QueryAnimationState(int * animationState,int * animationFrame,int * animationStateNext,int * animationNext)279 void AIScriptGrigorian::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
280 	*animationState     = _animationState;
281 	*animationFrame     = _animationFrame;
282 	*animationStateNext = _animationStateNext;
283 	*animationNext      = _animationNext;
284 }
285 
SetAnimationState(int animationState,int animationFrame,int animationStateNext,int animationNext)286 void AIScriptGrigorian::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
287 	_animationState     = animationState;
288 	_animationFrame     = animationFrame;
289 	_animationStateNext = animationStateNext;
290 	_animationNext      = animationNext;
291 }
292 
ReachedMovementTrackWaypoint(int waypointId)293 bool AIScriptGrigorian::ReachedMovementTrackWaypoint(int waypointId) {
294 	return true;
295 }
296 
FledCombat()297 void AIScriptGrigorian::FledCombat() {
298 	// return false;
299 }
300 
301 } // End of namespace BladeRunner
302