/engines/bladerunner/script/ai/chew.cpp

https://github.com/somaen/scummvm · C++ · 503 lines · 408 code · 56 blank · 39 comment · 92 complexity · 10e3c652059cb7f42faa039b858964da MD5 · raw file

  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 modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation, either version 3 of the License, or
  10. * (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, see <http://www.gnu.org/licenses/>.
  19. *
  20. */
  21. #include "bladerunner/script/ai_script.h"
  22. namespace BladeRunner {
  23. AIScriptChew::AIScriptChew(BladeRunnerEngine *vm) : AIScriptBase(vm) {
  24. _resumeIdleAfterFramesetCompletesFlag = false;
  25. _varNumOfTimesToHoldCurrentFrame = 0;
  26. // _varChooseIdleAnimation can have valid values: 0, 1, 2
  27. _varChooseIdleAnimation = 0;
  28. _var3 = 1;
  29. }
  30. void AIScriptChew::Initialize() {
  31. _animationFrame = 0;
  32. _animationState = 0;
  33. _animationStateNext = 0;
  34. _animationNext = 0;
  35. _resumeIdleAfterFramesetCompletesFlag = false;
  36. _varNumOfTimesToHoldCurrentFrame = 0;
  37. _varChooseIdleAnimation = 0;
  38. _var3 = 1;
  39. }
  40. bool AIScriptChew::Update() {
  41. return false;
  42. }
  43. void AIScriptChew::TimerExpired(int timer) {
  44. //return false;
  45. }
  46. void AIScriptChew::CompletedMovementTrack() {
  47. //return false;
  48. }
  49. void AIScriptChew::ReceivedClue(int clueId, int fromActorId) {
  50. //return false;
  51. }
  52. void AIScriptChew::ClickedByPlayer() {
  53. //return false;
  54. }
  55. void AIScriptChew::EnteredSet(int setId) {
  56. // return false;
  57. }
  58. void AIScriptChew::OtherAgentEnteredThisSet(int otherActorId) {
  59. // return false;
  60. }
  61. void AIScriptChew::OtherAgentExitedThisSet(int otherActorId) {
  62. // return false;
  63. }
  64. void AIScriptChew::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
  65. // return false;
  66. }
  67. void AIScriptChew::ShotAtAndMissed() {
  68. // return false;
  69. }
  70. bool AIScriptChew::ShotAtAndHit() {
  71. return false;
  72. }
  73. void AIScriptChew::Retired(int byActorId) {
  74. // return false;
  75. }
  76. int AIScriptChew::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
  77. return 0;
  78. }
  79. bool AIScriptChew::GoalChanged(int currentGoalNumber, int newGoalNumber) {
  80. return false;
  81. }
  82. bool AIScriptChew::UpdateAnimation(int *animation, int *frame) {
  83. switch (_animationState) {
  84. case 0:
  85. if (_varChooseIdleAnimation == 0) {
  86. *animation = kModelAnimationChewIdle;
  87. if (_varNumOfTimesToHoldCurrentFrame > 0) {
  88. --_varNumOfTimesToHoldCurrentFrame;
  89. } else {
  90. ++_animationFrame;
  91. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewIdle)) {
  92. _animationFrame = 0;
  93. _var3 = 1;
  94. _varChooseIdleAnimation = Random_Query(0, 2);
  95. } else if (!Random_Query(0, 1)) {
  96. _varNumOfTimesToHoldCurrentFrame = 1;
  97. if (!Random_Query(0, 3)) {
  98. _var3 = -_var3;
  99. }
  100. }
  101. }
  102. } else if (_varChooseIdleAnimation == 1) {
  103. *animation = kModelAnimationChewFiddlingWithInstruments;
  104. _animationFrame += _var3;
  105. if (_animationFrame <= 6) {
  106. _var3 = 1;
  107. }
  108. if (_animationFrame == 13) {
  109. if (!Random_Query(0, 1)) {
  110. _var3 = -1;
  111. }
  112. }
  113. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewFiddlingWithInstruments)) {
  114. _animationFrame = 0;
  115. _varChooseIdleAnimation = Random_Query(0, 2);
  116. _var3 = 1;
  117. }
  118. } else if (_varChooseIdleAnimation == 2) {
  119. *animation = kModelAnimationChewAdjustingInstrument;
  120. _animationFrame += _var3;
  121. if (_animationFrame <= 8) {
  122. _var3 = 1;
  123. }
  124. if (_animationFrame == 16) {
  125. if (!Random_Query(0, 1)) {
  126. _var3 = -1;
  127. }
  128. }
  129. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewAdjustingInstrument)) {
  130. _animationFrame = 0;
  131. _varChooseIdleAnimation = Random_Query(0, 2);
  132. _var3 = 1;
  133. }
  134. }
  135. break;
  136. case 1:
  137. if (_varChooseIdleAnimation == 0) {
  138. *animation = kModelAnimationChewIdle;
  139. }
  140. if (_varChooseIdleAnimation == 1) {
  141. *animation = kModelAnimationChewFiddlingWithInstruments;
  142. }
  143. if (_varChooseIdleAnimation == 2) {
  144. *animation = kModelAnimationChewAdjustingInstrument;
  145. }
  146. if (_animationFrame < Slice_Animation_Query_Number_Of_Frames(*animation)) {
  147. _animationFrame += 2;
  148. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
  149. _animationFrame = 0;
  150. _animationState = _animationStateNext;
  151. *animation = _animationNext;
  152. }
  153. } else {
  154. _animationFrame -= 2;
  155. if (_animationFrame <= 0) {
  156. _animationFrame = 0;
  157. _animationState = _animationStateNext;
  158. *animation = _animationNext;
  159. }
  160. }
  161. break;
  162. case 2:
  163. *animation = kModelAnimationChewProtestTalk;
  164. if (_animationFrame == 0 && _resumeIdleAfterFramesetCompletesFlag) {
  165. *animation = kModelAnimationChewIdle;
  166. _animationState = 0;
  167. _varChooseIdleAnimation = 0;
  168. } else {
  169. ++_animationFrame;
  170. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewProtestTalk)) {
  171. _animationFrame = 0;
  172. }
  173. }
  174. break;
  175. case 3:
  176. *animation = kModelAnimationChewAngryTalk;
  177. ++_animationFrame;
  178. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewAngryTalk)) {
  179. _animationFrame = 0;
  180. _animationState = 2;
  181. *animation = kModelAnimationChewProtestTalk;
  182. }
  183. break;
  184. case 4:
  185. *animation = kModelAnimationChewExplainTalk;
  186. ++_animationFrame;
  187. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewExplainTalk)) {
  188. _animationFrame = 0;
  189. _animationState = 2;
  190. *animation = kModelAnimationChewProtestTalk;
  191. }
  192. break;
  193. case 5:
  194. *animation = kModelAnimationChewGoAwayTalk;
  195. ++_animationFrame;
  196. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewGoAwayTalk)) {
  197. _animationFrame = 0;
  198. _animationState = 2;
  199. *animation = kModelAnimationChewProtestTalk;
  200. }
  201. break;
  202. case 6:
  203. *animation = kModelAnimationChewDismissiveTalk;
  204. ++_animationFrame;
  205. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewDismissiveTalk)) {
  206. _animationFrame = 0;
  207. _animationState = 2;
  208. *animation = kModelAnimationChewProtestTalk;
  209. }
  210. break;
  211. case 7:
  212. *animation = kModelAnimationChewPointingSomewhereTalk;
  213. ++_animationFrame;
  214. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewPointingSomewhereTalk)) {
  215. _animationFrame = 0;
  216. _animationState = 2;
  217. *animation = kModelAnimationChewProtestTalk;
  218. }
  219. break;
  220. case 8:
  221. *animation = kModelAnimationChewDescribePulledTalk;
  222. ++_animationFrame;
  223. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewDescribePulledTalk)) {
  224. _animationFrame = 0;
  225. _animationState = 2;
  226. *animation = kModelAnimationChewProtestTalk;
  227. }
  228. break;
  229. case 9:
  230. *animation = kModelAnimationChewDescribePushedTalk;
  231. ++_animationFrame;
  232. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewDescribePushedTalk)) {
  233. _animationFrame = 0;
  234. _animationState = 2;
  235. *animation = kModelAnimationChewProtestTalk;
  236. }
  237. break;
  238. case 10:
  239. *animation = kModelAnimationChewGotHit;
  240. ++_animationFrame;
  241. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewGotHit)) {
  242. *animation = kModelAnimationChewIdle;
  243. _animationFrame = 0;
  244. _animationState = 0;
  245. _varChooseIdleAnimation = 0;
  246. }
  247. break;
  248. case 11:
  249. *animation = kModelAnimationChewShotDead;
  250. if (_animationFrame < Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewShotDead) - 1) {
  251. ++_animationFrame;
  252. }
  253. break;
  254. case 12:
  255. *animation = kModelAnimationChewWalking;
  256. ++_animationFrame;
  257. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewWalking)) {
  258. _animationFrame = 0;
  259. }
  260. break;
  261. case 13:
  262. *animation = kModelAnimationChewTakesAStepBackwards;
  263. ++_animationFrame;
  264. if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationChewTakesAStepBackwards)) {
  265. _animationFrame = 0;
  266. _animationState = 2;
  267. *animation = kModelAnimationChewProtestTalk;
  268. }
  269. break;
  270. default:
  271. break;
  272. }
  273. *frame = _animationFrame;
  274. return true;
  275. }
  276. bool AIScriptChew::ChangeAnimationMode(int mode) {
  277. switch (mode) {
  278. case kAnimationModeIdle:
  279. switch (_animationState) {
  280. case 0:
  281. return true;
  282. case 2:
  283. // fall through
  284. case 3:
  285. // fall through
  286. case 4:
  287. // fall through
  288. case 5:
  289. // fall through
  290. case 6:
  291. // fall through
  292. case 7:
  293. // fall through
  294. case 8:
  295. // fall through
  296. case 9:
  297. _resumeIdleAfterFramesetCompletesFlag = true;
  298. break;
  299. default:
  300. _animationState = 0;
  301. _varChooseIdleAnimation = 0;
  302. _animationFrame = 0;
  303. break;
  304. }
  305. break;
  306. case kAnimationModeWalk:
  307. _animationFrame = 0;
  308. _animationState = 12;
  309. break;
  310. case 3:
  311. if (_animationState < 2 || _animationState > 9) {
  312. if (_animationState > 0) {
  313. _animationState = 2;
  314. _animationFrame = 0;
  315. _resumeIdleAfterFramesetCompletesFlag = false;
  316. } else {
  317. _animationStateNext = 2;
  318. _animationNext = kModelAnimationChewProtestTalk;
  319. _animationState = 1;
  320. }
  321. }
  322. break;
  323. case 12:
  324. if (_animationState < 2 || _animationState > 9) {
  325. if (_animationState > 0) {
  326. _animationState = 3;
  327. _animationFrame = 0;
  328. _resumeIdleAfterFramesetCompletesFlag = false;
  329. } else {
  330. _animationStateNext = 3;
  331. _animationNext = kModelAnimationChewAngryTalk;
  332. _animationState = 1;
  333. }
  334. }
  335. break;
  336. case 13:
  337. if (_animationState < 2 || _animationState > 9) {
  338. if (_animationState > 0) {
  339. _animationState = 4;
  340. _animationFrame = 0;
  341. _resumeIdleAfterFramesetCompletesFlag = false;
  342. } else {
  343. _animationStateNext = 4;
  344. _animationNext = kModelAnimationChewExplainTalk;
  345. _animationState = 1;
  346. }
  347. }
  348. break;
  349. case 14:
  350. if (_animationState < 2 || _animationState > 9) {
  351. if (_animationState > 0) {
  352. _animationState = 5;
  353. _animationFrame = 0;
  354. _resumeIdleAfterFramesetCompletesFlag = false;
  355. } else {
  356. _animationStateNext = 5;
  357. _animationNext = kModelAnimationChewGoAwayTalk;
  358. _animationState = 1;
  359. }
  360. }
  361. break;
  362. case 15:
  363. if (_animationState < 2 || _animationState > 9) {
  364. if (_animationState > 0) {
  365. _animationState = 6;
  366. _animationFrame = 0;
  367. _resumeIdleAfterFramesetCompletesFlag = false;
  368. } else {
  369. _animationStateNext = 6;
  370. _animationNext = kModelAnimationChewDismissiveTalk;
  371. _animationState = 1;
  372. }
  373. }
  374. break;
  375. case 16:
  376. if (_animationState < 2 || _animationState > 9) {
  377. if (_animationState > 0) {
  378. _animationState = 7;
  379. _animationFrame = 0;
  380. _resumeIdleAfterFramesetCompletesFlag = false;
  381. } else {
  382. _animationStateNext = 7;
  383. _animationNext = kModelAnimationChewPointingSomewhereTalk;
  384. _animationState = 1;
  385. }
  386. }
  387. break;
  388. case 17:
  389. if (_animationState < 2 || _animationState > 9) {
  390. if (_animationState > 0) {
  391. _animationState = 8;
  392. _animationFrame = 0;
  393. _resumeIdleAfterFramesetCompletesFlag = false;
  394. } else {
  395. _animationStateNext = 8;
  396. _animationNext = kModelAnimationChewDescribePulledTalk;
  397. _animationState = 1;
  398. }
  399. }
  400. break;
  401. case 18:
  402. if (_animationState < 2 || _animationState > 9) {
  403. if (_animationState > 0) {
  404. _animationState = 9;
  405. _animationFrame = 0;
  406. _resumeIdleAfterFramesetCompletesFlag = false;
  407. } else {
  408. _animationStateNext = 9;
  409. _animationNext = kModelAnimationChewDescribePushedTalk;
  410. _animationState = 1;
  411. }
  412. }
  413. break;
  414. case 43:
  415. if (_animationState > 0 || (_animationState == 0 && _varChooseIdleAnimation != 1 && _varChooseIdleAnimation != 2)) {
  416. Actor_Change_Animation_Mode(kActorChew, kAnimationModeIdle);
  417. _varChooseIdleAnimation = Random_Query(1, 2);
  418. }
  419. break;
  420. case kAnimationModeDie:
  421. _animationFrame = 0;
  422. _animationState = 11;
  423. break;
  424. default:
  425. break;
  426. }
  427. return true;
  428. }
  429. void AIScriptChew::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
  430. *animationState = _animationState;
  431. *animationFrame = _animationFrame;
  432. *animationStateNext = _animationStateNext;
  433. *animationNext = _animationNext;
  434. }
  435. void AIScriptChew::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
  436. _animationState = animationState;
  437. _animationFrame = animationFrame;
  438. _animationStateNext = animationStateNext;
  439. _animationNext = animationNext;
  440. }
  441. bool AIScriptChew::ReachedMovementTrackWaypoint(int waypointId) {
  442. return true;
  443. }
  444. void AIScriptChew::FledCombat() {
  445. // return false;
  446. }
  447. } // End of namespace BladeRunner