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