PageRenderTime 62ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/scummvm-1.4.1/engines/cge/snail.cpp

#
C++ | 1235 lines | 1011 code | 143 blank | 81 comment | 242 complexity | 97fa558f7f909176a73779c0dcc66bdc MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  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. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. *
  19. */
  20. /*
  21. * This code is based on original Soltys source code
  22. * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
  23. */
  24. #include "cge/general.h"
  25. #include "cge/sound.h"
  26. #include "cge/snail.h"
  27. #include "cge/vga13h.h"
  28. #include "cge/text.h"
  29. #include "cge/cge_main.h"
  30. #include "cge/events.h"
  31. #include "cge/walk.h"
  32. namespace CGE {
  33. const char *CommandHandler::_commandText[] = {
  34. "LABEL", "PAUSE", "WAIT", "LEVEL", "HIDE",
  35. "SAY", "INF", "TIME", "CAVE", "KILL",
  36. "RSEQ", "SEQ", "SEND", "SWAP", "KEEP",
  37. "GIVE", "IF", "GAME", "SETX0", "SETY0",
  38. "SLAVE", "SETXY", "RELX", "RELY", "RELZ",
  39. "SETX", "SETY", "SETZ", "TRANS", "PORT",
  40. "NEXT", "NNEXT", "TNEXT", "RNNEXT", "RTNEXT",
  41. "RMNEAR", "RMTAKE", "FLAG", "SETREF", "BACKPT",
  42. "FLASH", "LIGHT", "SETHB", "SETVB", "WALK",
  43. "REACH", "COVER", "UNCOVER", "CLEAR", "TALK",
  44. "MOUSE", "SOUND", "COUNT", NULL
  45. };
  46. CommandHandler::CommandHandler(CGEEngine *vm, bool turbo)
  47. : _turbo(turbo), _busy(false), _textDelay(false),
  48. _timerExpiry(0), _talkEnable(true),
  49. _head(0), _tail(0), _commandList((Command *)malloc(sizeof(Command) * 256)), _vm(vm) {
  50. }
  51. CommandHandler::~CommandHandler() {
  52. free(_commandList);
  53. }
  54. /**
  55. * Add a Command on the head of _commandList
  56. * @param com Command
  57. * @param ref Reference
  58. * @param val Value
  59. * @param ptr Sprite pointer
  60. */
  61. void CommandHandler::addCommand(CommandType com, int ref, int val, void *ptr) {
  62. Command *headCmd = &_commandList[_head++];
  63. headCmd->_commandType = com;
  64. headCmd->_ref = ref;
  65. headCmd->_val = val;
  66. headCmd->_spritePtr = ptr;
  67. headCmd->_cbType = kNullCB;
  68. if (headCmd->_commandType == kCmdClear) {
  69. _tail = _head;
  70. _vm->killText();
  71. _timerExpiry = 0;
  72. }
  73. }
  74. /**
  75. * Add a Callback on the head of _commandList
  76. * @param com Command
  77. * @param ref Reference
  78. * @param val Value
  79. * @param CallbackType Callback type
  80. */
  81. void CommandHandler::addCallback(CommandType com, int ref, int val, CallbackType cbType) {
  82. Command *headCmd = &_commandList[_head++];
  83. headCmd->_commandType = com;
  84. headCmd->_ref = ref;
  85. headCmd->_val = val;
  86. headCmd->_spritePtr = NULL;
  87. headCmd->_cbType = cbType;
  88. if (headCmd->_commandType == kCmdClear) {
  89. _tail = _head;
  90. _vm->killText();
  91. _timerExpiry = 0;
  92. }
  93. }
  94. /**
  95. * Add a Command on the tail of _commandList
  96. * @param com Command
  97. * @param ref Reference
  98. * @param val Value
  99. * @param ptr Sprite pointer
  100. */
  101. void CommandHandler::insertCommand(CommandType com, int ref, int val, void *ptr) {
  102. Command *tailCmd;
  103. if (_busy) {
  104. _commandList[(_tail - 1) & 0xFF] = _commandList[_tail];
  105. tailCmd = &_commandList[_tail];
  106. } else
  107. tailCmd = &_commandList[(_tail - 1) & 0xFF];
  108. _tail--;
  109. tailCmd->_commandType = com;
  110. tailCmd->_ref = ref;
  111. tailCmd->_val = val;
  112. tailCmd->_spritePtr = ptr;
  113. tailCmd->_cbType = kNullCB;
  114. if (tailCmd->_commandType == kCmdClear) {
  115. _tail = _head;
  116. _vm->killText();
  117. _timerExpiry = 0;
  118. }
  119. }
  120. void CommandHandler::runCommand() {
  121. if (_busy)
  122. return;
  123. _busy = true;
  124. uint8 tmpHead = _head;
  125. while (_tail != tmpHead) {
  126. Command *tailCmd = &_commandList[_tail];
  127. if (!_turbo) { // only for the slower one
  128. if (_timerExpiry) {
  129. // Delay in progress
  130. if (_timerExpiry > g_system->getMillis())
  131. // Delay not yet ended
  132. break;
  133. // Delay is finished
  134. _timerExpiry = 0;
  135. } else {
  136. if (_textDelay) {
  137. _vm->killText();
  138. _textDelay = false;
  139. }
  140. }
  141. if (_vm->_talk && tailCmd->_commandType != kCmdPause)
  142. break;
  143. }
  144. Sprite *spr = ((tailCmd->_ref >= 0) ? _vm->locate(tailCmd->_ref) : ((Sprite *) tailCmd->_spritePtr));
  145. switch (tailCmd->_commandType) {
  146. case kCmdLabel:
  147. break;
  148. case kCmdPause:
  149. _timerExpiry = g_system->getMillis() + tailCmd->_val * kCommandFrameDelay;
  150. if (_vm->_talk)
  151. _textDelay = true;
  152. break;
  153. case kCmdWait:
  154. if (spr) {
  155. if (spr->seqTest(tailCmd->_val) &&
  156. (tailCmd->_val >= 0 || spr != _vm->_hero || _vm->_hero->_tracePtr < 0)) {
  157. _timerExpiry = g_system->getMillis() + spr->_time * kCommandFrameDelay;
  158. } else {
  159. _busy = false;
  160. return;
  161. }
  162. }
  163. break;
  164. case kCmdLevel:
  165. _vm->snLevel(spr, tailCmd->_val);
  166. break;
  167. case kCmdHide:
  168. _vm->snHide(spr, tailCmd->_val);
  169. break;
  170. case kCmdSay:
  171. if (spr && _talkEnable) {
  172. if (spr == _vm->_hero && spr->seqTest(-1))
  173. spr->step(kSeqHTalk);
  174. _vm->_text->say(_vm->_text->getText(tailCmd->_val), spr);
  175. _vm->_sys->_funDel = kHeroFun0;
  176. }
  177. break;
  178. case kCmdInf:
  179. if (_talkEnable) {
  180. _vm->inf(_vm->_text->getText(tailCmd->_val));
  181. _vm->_sys->_funDel = kHeroFun0;
  182. }
  183. break;
  184. case kCmdTime:
  185. if (spr && _talkEnable) {
  186. if (spr == _vm->_hero && spr->seqTest(-1))
  187. spr->step(kSeqHTalk);
  188. _vm->_text->sayTime(spr);
  189. }
  190. break;
  191. case kCmdCave:
  192. _vm->switchScene(tailCmd->_val);
  193. break;
  194. case kCmdKill:
  195. _vm->snKill(spr);
  196. break;
  197. case kCmdSeq:
  198. _vm->snSeq(spr, tailCmd->_val);
  199. break;
  200. case kCmdRSeq:
  201. _vm->snRSeq(spr, tailCmd->_val);
  202. break;
  203. case kCmdSend:
  204. _vm->snSend(spr, tailCmd->_val);
  205. break;
  206. case kCmdSwap:
  207. _vm->snSwap(spr, tailCmd->_val);
  208. break;
  209. case kCmdCover:
  210. _vm->snCover(spr, tailCmd->_val);
  211. break;
  212. case kCmdUncover:
  213. _vm->snUncover(spr, (tailCmd->_val >= 0) ? _vm->locate(tailCmd->_val) : ((Sprite *) tailCmd->_spritePtr));
  214. break;
  215. case kCmdKeep:
  216. _vm->snKeep(spr, tailCmd->_val);
  217. break;
  218. case kCmdGive:
  219. _vm->snGive(spr, tailCmd->_val);
  220. break;
  221. case kCmdGame:
  222. _vm->snGame(spr, tailCmd->_val);
  223. break;
  224. case kCmdSetX0:
  225. _vm->snSetX0(tailCmd->_ref, tailCmd->_val);
  226. break;
  227. case kCmdSetY0:
  228. _vm->snSetY0(tailCmd->_ref, tailCmd->_val);
  229. break;
  230. case kCmdSetXY:
  231. _vm->snSetXY(spr, tailCmd->_val);
  232. break;
  233. case kCmdRelX:
  234. _vm->snRelX(spr, tailCmd->_val);
  235. break;
  236. case kCmdRelY:
  237. _vm->snRelY(spr, tailCmd->_val);
  238. break;
  239. case kCmdRelZ:
  240. _vm->snRelZ(spr, tailCmd->_val);
  241. break;
  242. case kCmdSetX:
  243. _vm->snSetX(spr, tailCmd->_val);
  244. break;
  245. case kCmdSetY:
  246. _vm->snSetY(spr, tailCmd->_val);
  247. break;
  248. case kCmdSetZ:
  249. _vm->snSetZ(spr, tailCmd->_val);
  250. break;
  251. case kCmdSlave:
  252. _vm->snSlave(spr, tailCmd->_val);
  253. break;
  254. case kCmdTrans:
  255. _vm->snTrans(spr, tailCmd->_val);
  256. break;
  257. case kCmdPort:
  258. _vm->snPort(spr, tailCmd->_val);
  259. break;
  260. case kCmdNext:
  261. case kCmdIf:
  262. case kCmdTalk:
  263. break;
  264. case kCmdMouse:
  265. _vm->snMouse(tailCmd->_val != 0);
  266. break;
  267. case kCmdNNext:
  268. _vm->snNNext(spr, tailCmd->_val);
  269. break;
  270. case kCmdTNext:
  271. _vm->snTNext(spr, tailCmd->_val);
  272. break;
  273. case kCmdRNNext:
  274. _vm->snRNNext(spr, tailCmd->_val);
  275. break;
  276. case kCmdRTNext:
  277. _vm->snRTNext(spr, tailCmd->_val);
  278. break;
  279. case kCmdRMNear:
  280. _vm->snRmNear(spr);
  281. break;
  282. case kCmdRmTake:
  283. _vm->snRmTake(spr);
  284. break;
  285. case kCmdFlag:
  286. _vm->snFlag(tailCmd->_ref & 3, tailCmd->_val != 0);
  287. break;
  288. case kCmdSetRef:
  289. _vm->snSetRef(spr, tailCmd->_val);
  290. break;
  291. case kCmdBackPt:
  292. _vm->snBackPt(spr, tailCmd->_val);
  293. break;
  294. case kCmdFlash:
  295. _vm->snFlash(tailCmd->_val != 0);
  296. break;
  297. case kCmdLight:
  298. _vm->snLight(tailCmd->_val != 0);
  299. break;
  300. case kCmdSetHBarrier:
  301. _vm->snHBarrier(tailCmd->_ref, tailCmd->_val);
  302. break;
  303. case kCmdSetVBarrier:
  304. _vm->snVBarrier(tailCmd->_ref, tailCmd->_val);
  305. break;
  306. case kCmdWalk:
  307. _vm->snWalk(spr, tailCmd->_ref, tailCmd->_val);
  308. break;
  309. case kCmdReach:
  310. _vm->snReach(spr, tailCmd->_val);
  311. break;
  312. case kCmdSound:
  313. _vm->snSound(spr, tailCmd->_val);
  314. break;
  315. case kCmdCount:
  316. _vm->_sound->setRepeat(tailCmd->_val);
  317. break;
  318. case kCmdExec:
  319. switch (tailCmd->_cbType) {
  320. case kQGame:
  321. _vm->qGame();
  322. break;
  323. case kMiniStep:
  324. _vm->miniStep(tailCmd->_val);
  325. break;
  326. case kXScene:
  327. _vm->xScene();
  328. break;
  329. case kSoundSetVolume:
  330. _vm->sndSetVolume();
  331. break;
  332. default:
  333. error("Unknown Callback Type in SNEXEC");
  334. }
  335. break;
  336. case kCmdStep:
  337. spr->step();
  338. break;
  339. case kCmdZTrim:
  340. _vm->snZTrim(spr);
  341. break;
  342. case kCmdGhost:
  343. _vm->snGhost((Bitmap *) tailCmd->_spritePtr);
  344. break;
  345. default:
  346. warning("Unhandled snc->_com in SNMouse(bool)");
  347. break;
  348. }
  349. _tail++;
  350. if (!_turbo)
  351. break;
  352. }
  353. _busy = false;
  354. }
  355. bool CommandHandler::idle() {
  356. return (_head == _tail);
  357. }
  358. /**
  359. * Handles mini-Games logic
  360. * @param com Command
  361. * @param num mini game number
  362. */
  363. void CGEEngine::snGame(Sprite *spr, int num) {
  364. debugC(1, kCGEDebugEngine, "CGEEngine::snGame(spr, %d)", num);
  365. switch (num) {
  366. case 1: {
  367. static Sprite *dup[3] = { NULL, NULL, NULL };
  368. int buref = 0;
  369. int Stage = 0;
  370. for (dup[0] = _vga->_showQ->first(); dup[0]; dup[0] = dup[0]->_next) {
  371. buref = dup[0]->_ref;
  372. if (buref / 1000 == 16 && buref % 100 == 6) {
  373. Stage = (buref / 100) % 10;
  374. break;
  375. }
  376. }
  377. if (dup[1] == NULL) {
  378. dup[1] = _vga->_showQ->locate(16003); // pan
  379. dup[2] = _vga->_showQ->locate(16004); // pani
  380. }
  381. if (_game) { // continue game
  382. int i = newRandom(3), hand = (dup[0]->_shpCnt == 6);
  383. Stage++;
  384. if (hand && Stage > kDressed)
  385. ++hand;
  386. if (i >= 0 || (dup[i] == spr && newRandom(3) == 0)) {
  387. _commandHandler->addCommand(kCmdSeq, -1, 3, dup[0]); // Yes
  388. _commandHandler->addCommand(kCmdSeq, -1, 3, dup[1]); // Yes
  389. _commandHandler->addCommand(kCmdSeq, -1, 3, dup[2]); // Yes
  390. _commandHandler->addCommand(kCmdTNext, -1, 0, dup[0]); // Reset Take
  391. _commandHandler->addCommand(kCmdTNext, -1, 0, dup[1]); // Reset Take
  392. _commandHandler->addCommand(kCmdTNext, -1, 0, dup[2]); // Reset Take
  393. _commandHandler->addCommand(kCmdNNext, -1, 0, dup[0]); // Reset Near
  394. _commandHandler->addCommand(kCmdPause, -1, 72, NULL); // Pause the game for 72/80 second
  395. _commandHandler->addCommand(kCmdSay, 1, 16009, NULL); // Say "I win.."
  396. _commandHandler->addCommand(kCmdSay, buref, 16010, NULL); // Say "Go Sit..."
  397. _commandHandler->addCommand(kCmdSay, 1, 16011, NULL); // Say "I prefer not"
  398. if (hand) {
  399. _commandHandler->addCommand(kCmdSend, 16060 + hand, 16, NULL); // Give hand
  400. _commandHandler->addCommand(kCmdSeq, buref, 4, NULL); // Take off
  401. _commandHandler->addCommand(kCmdSeq, 16060 + hand, 1, NULL); // start one of the Bartender animations
  402. _commandHandler->addCommand(kCmdSound, 16060 + hand, 16002, NULL); // Play tear sound
  403. _commandHandler->addCommand(kCmdWait, 16060 + hand, 3, NULL); // Take up
  404. _commandHandler->addCommand(kCmdSwap, buref, buref + 100, NULL); // Open hand
  405. _commandHandler->addCommand(kCmdSeq, 16016, Stage, NULL); // Start Belongings animation
  406. _commandHandler->addCommand(kCmdSend, 16060 + hand, -1, NULL); // Hide hand
  407. _commandHandler->addCommand(kCmdWait, 16060 + hand, -1, NULL); // Stop moving hand
  408. } else {
  409. _commandHandler->addCommand(kCmdSeq, buref, 4, NULL); // Take off
  410. _commandHandler->addCommand(kCmdSound, 16060 + hand, 16002, NULL); // Play tear sound
  411. _commandHandler->addCommand(kCmdWait, buref, -1, NULL); // Will take off
  412. _commandHandler->addCommand(kCmdSwap, buref, buref + 100, NULL); // Open hand
  413. _commandHandler->addCommand(kCmdSeq, 16016, Stage, NULL); // Start Belongings animation
  414. }
  415. _commandHandler->addCommand(kCmdPause, -1, 72, NULL); // Pause the game for 72/80 second
  416. _commandHandler->addCommand(kCmdSeq, -1, 0, dup[1]); // Get away (Him)
  417. _commandHandler->addCommand(kCmdSetXY, -1, 203 + kScrWidth * 49, dup[1]);
  418. _commandHandler->addCommand(kCmdSetZ, -1, 7, dup[1]);
  419. _commandHandler->addCommand(kCmdSeq, -1, 0, dup[2]); // Get Away (Her)
  420. _commandHandler->addCommand(kCmdSetXY, -1, 182 + kScrWidth * 62, dup[2]);
  421. _commandHandler->addCommand(kCmdSetZ, -1, 9, dup[2]);
  422. _game = 0;
  423. return;
  424. } else {
  425. _commandHandler->addCommand(kCmdSeq, -1, 2, dup[0]); // reset animation sequence
  426. _commandHandler->addCommand(kCmdSeq, -1, 2, dup[1]); // reset animation sequence
  427. _commandHandler->addCommand(kCmdSeq, -1, 2, dup[2]); // reset animation sequence
  428. _commandHandler->addCommand(kCmdPause, -1, 72, NULL); // Pause the game for 72/80 second
  429. }
  430. }
  431. _commandHandler->addCommand(kCmdWalk, 198, 134, NULL); // Go to place
  432. _commandHandler->addCommand(kCmdWait, 1, -1, NULL); // Stop moving
  433. _commandHandler->addCommand(kCmdCover, 1, 16101, NULL); // Man to beat
  434. _commandHandler->addCommand(kCmdSeq, 16101, 1, NULL); // Start Chief animation (16dupnia)
  435. _commandHandler->addCommand(kCmdWait, 16101, 5, NULL); // wait
  436. _commandHandler->addCommand(kCmdPause, 16101, 24, NULL); // Pause the game for 24/80 second
  437. _commandHandler->addCommand(kCmdSeq, 16040, 1, NULL); // Start Slap animation (16plask)
  438. _commandHandler->addCommand(kCmdSound, 16101, 16001, NULL); // Play "Slap" sound
  439. _commandHandler->addCommand(kCmdPause, 16101, 24, NULL); // Pause the game for 24/80 second
  440. _commandHandler->addCommand(kCmdSeq, 16040, 0, NULL); // Reset animation sequence
  441. _commandHandler->addCommand(kCmdWait, 16101, -1, NULL); // stay
  442. _commandHandler->addCommand(kCmdUncover, 1, 16101, NULL); // SDS
  443. if (!_game) {
  444. _commandHandler->addCommand(kCmdSay, buref, 16008, NULL); // say "Guess!"
  445. _game = true;
  446. }
  447. }
  448. break;
  449. case 2:
  450. if (_sprTv == NULL) {
  451. _sprTv = _vga->_showQ->locate(20700);
  452. _sprK1 = _vga->_showQ->locate(20701);
  453. _sprK2 = _vga->_showQ->locate(20702);
  454. _sprK3 = _vga->_showQ->locate(20703);
  455. }
  456. if (!_game) { // init
  457. _commandHandler->addCommand(kCmdGame, 20002, 2, NULL);
  458. _game = true;
  459. break;
  460. }
  461. // cont
  462. _sprK1->step(newRandom(6));
  463. _sprK2->step(newRandom(6));
  464. _sprK3->step(newRandom(6));
  465. if (spr->_ref == 1 && _keyboard->_key[kKeyAlt]) {
  466. _sprK1->step(5);
  467. _sprK2->step(5);
  468. _sprK3->step(5);
  469. }
  470. _commandHandler->addCommand(kCmdSetZ, 20700, 0, NULL);
  471. bool hit = (_sprK1->_seqPtr + _sprK2->_seqPtr + _sprK3->_seqPtr == 15);
  472. if (hit) {
  473. if (spr->_ref == 1) {
  474. _commandHandler->addCommand(kCmdSay, 1, 20003, NULL); // hurray!
  475. _commandHandler->addCommand(kCmdSeq, 20011, 2, NULL); // Camera away
  476. _commandHandler->addCommand(kCmdSend, 20701, -1, NULL); // move dice1 to scene -1
  477. _commandHandler->addCommand(kCmdSend, 20702, -1, NULL); // move dice2 to scene -1
  478. _commandHandler->addCommand(kCmdSend, 20703, -1, NULL); // move dice3 to scene -1
  479. _commandHandler->addCommand(kCmdSend, 20700, -1, NULL); // move TV to scene -1
  480. _commandHandler->addCommand(kCmdKeep, 20007, 0, NULL); // to pocket
  481. _commandHandler->addCommand(kCmdSend, 20006, 20, NULL); // Move Coin to scene 20
  482. _commandHandler->addCommand(kCmdSound, 20006, 20002, NULL); // Play Coin sound
  483. _commandHandler->addCommand(kCmdSay, 20002, 20004, NULL); // Say "Luck guy..."
  484. _commandHandler->addCommand(kCmdSend, 20010, 20, NULL); // Move Paper to scene 20
  485. _commandHandler->addCommand(kCmdSound, 20010, 20003, NULL); // Play "ksh" sound! (fx20003.wav)
  486. _commandHandler->addCommand(kCmdSay, 20001, 20005, NULL); // Say "Congratulations"
  487. _game = false;
  488. return;
  489. } else
  490. _sprK3->step(newRandom(5));
  491. }
  492. if (_gameCase2Cpt < 100) {
  493. switch (_gameCase2Cpt) {
  494. case 15:
  495. // Give hint about ALTered dice
  496. _commandHandler->addCommand(kCmdSay, 20003, 20021, NULL);
  497. break;
  498. case 30:
  499. case 45:
  500. case 60:
  501. case 75:
  502. // Tell to use ALT key
  503. _commandHandler->addCommand(kCmdSay, 20003, 20022, NULL);
  504. break;
  505. }
  506. _gameCase2Cpt++;
  507. }
  508. switch (spr->_ref) {
  509. case 1:
  510. _commandHandler->addCommand(kCmdSay, 20001, 20011, NULL); // Say "It'a my turn"
  511. _commandHandler->addCommand(kCmdSeq, 20001, 1, NULL); // Throw dice?
  512. _commandHandler->addCommand(kCmdWait, 20001, 1, NULL); // wait
  513. _commandHandler->addCommand(kCmdSetZ, 20700, 2, NULL); // hide dice
  514. _commandHandler->addCommand(kCmdHide, 20007, 1, NULL); // hide dice
  515. _commandHandler->addCommand(kCmdWait, 20001, 16, NULL); // wait
  516. _commandHandler->addCommand(kCmdSeq, 20007, 1, NULL); // Start dice animation (20kosci)
  517. _commandHandler->addCommand(kCmdHide, 20007, 0, NULL); // unhide
  518. _commandHandler->addCommand(kCmdSound, 20007, 20001, NULL); // Play Dice sound
  519. _commandHandler->addCommand(kCmdWait, 20007, -1, NULL); // the end
  520. _commandHandler->addCommand(kCmdGame, 20001, 2, NULL); // again!
  521. break;
  522. case 20001:
  523. _commandHandler->addCommand(kCmdSay, 20002, 20012, NULL); // Say "Now it's mine"
  524. _commandHandler->addCommand(kCmdSeq, 20002, 1, NULL); // Throw dice?
  525. _commandHandler->addCommand(kCmdWait, 20002, 3, NULL); // wait
  526. _commandHandler->addCommand(kCmdSetZ, 20700, 2, NULL); // hide dice
  527. _commandHandler->addCommand(kCmdHide, 20007, 1, NULL); // hide dice
  528. _commandHandler->addCommand(kCmdWait, 20002, 10, NULL); // wait
  529. _commandHandler->addCommand(kCmdSeq, 20007, 2, NULL); // Start dice animation (20kosci)
  530. _commandHandler->addCommand(kCmdHide, 20007, 0, NULL); // unhide
  531. _commandHandler->addCommand(kCmdSound, 20007, 20001, NULL); // Play Dice sound
  532. _commandHandler->addCommand(kCmdWait, 20007, -1, NULL); // the end
  533. _commandHandler->addCommand(kCmdGame, 20002, 2, NULL); // again!
  534. break;
  535. case 20002:
  536. _commandHandler->addCommand(kCmdSay, 20002, 20010, NULL); // "Roll the bones!"
  537. _commandHandler->addCommand(kCmdWalk, 20005, -1, NULL); // Walk to table
  538. _commandHandler->addCommand(kCmdWait, 1, -1, NULL); // Wait
  539. _commandHandler->addCommand(kCmdCover, 1, 20101, NULL); // grasol ??
  540. _commandHandler->addCommand(kCmdSeq, 20101, 1, NULL); // Start Chief animation (20solgra)?
  541. _commandHandler->addCommand(kCmdWait, 20101, 5, NULL); // Wait
  542. _commandHandler->addCommand(kCmdSetZ, 20700, 2, NULL); // Hide dice
  543. _commandHandler->addCommand(kCmdHide, 20007, 1, NULL); // Hide dice
  544. _commandHandler->addCommand(kCmdWait, 20101, 15, NULL); // wait
  545. _commandHandler->addCommand(kCmdSeq, 20007, 1, NULL); // Start dice animation (20kosci)
  546. _commandHandler->addCommand(kCmdHide, 20007, 0, NULL); // Unhide
  547. _commandHandler->addCommand(kCmdSound, 20007, 20001, NULL); // Play Dice sound
  548. _commandHandler->addCommand(kCmdWait, 20101, -1, NULL); // the end
  549. _commandHandler->addCommand(kCmdUncover, 1, 20101, NULL); // SDS ??
  550. _commandHandler->addCommand(kCmdGame, 1, 2, NULL); // again!
  551. break;
  552. }
  553. }
  554. }
  555. void CGEEngine::expandSprite(Sprite *spr) {
  556. debugC(5, kCGEDebugEngine, "CGEEngine::expandSprite(spr)");
  557. if (spr)
  558. _vga->_showQ->insert(_vga->_spareQ->remove(spr));
  559. }
  560. void CGEEngine::contractSprite(Sprite *spr) {
  561. debugC(1, kCGEDebugEngine, "CGEEngine::contractSprite(spr)");
  562. if (spr)
  563. _vga->_spareQ->append(_vga->_showQ->remove(spr));
  564. }
  565. /**
  566. * Check if an item is in the inventory, and returns its position
  567. * @param spr Sprite pointer
  568. * @return -1 if not found, else index.
  569. */
  570. int CGEEngine::findPocket(Sprite *spr) {
  571. debugC(1, kCGEDebugEngine, "CGEEngine::findPocket(spr)");
  572. for (int i = 0; i < kPocketNX; i++)
  573. if (_pocket[i] == spr)
  574. return i;
  575. return -1;
  576. }
  577. /**
  578. * Check if an item is in the inventory, and returns its position
  579. * @param Inventory slot number Sprite pointer
  580. */
  581. void CGEEngine::selectPocket(int n) {
  582. debugC(1, kCGEDebugEngine, "CGEEngine::selectPocket(%d)", n);
  583. if (n < 0 || (_pocLight->_seqPtr && _pocPtr == n)) {
  584. // If no slot specified, or another slot already selected
  585. // stop the blinking animation
  586. _pocLight->step(0);
  587. n = findPocket(NULL);
  588. if (n >= 0)
  589. _pocPtr = n;
  590. } else {
  591. // If slot specified, check if the slot if used.
  592. // Is so, start the blinking animation
  593. if (_pocket[n] != NULL) {
  594. _pocPtr = n;
  595. _pocLight->step(1);
  596. }
  597. }
  598. _pocLight->gotoxy(kPocketX + _pocPtr * kPocketDX + kPocketSX, kPocketY + kPocketSY);
  599. }
  600. /**
  601. * Logic used when all the inventory slots are full and the user tries to pick
  602. * another object.
  603. * @param Inventory slot number Sprite pointer
  604. */
  605. void CGEEngine::pocFul() {
  606. debugC(1, kCGEDebugEngine, "CGEEngine::pocFul()");
  607. _hero->park();
  608. _commandHandler->addCommand(kCmdWait, -1, -1, _hero);
  609. _commandHandler->addCommand(kCmdSeq, -1, kSeqPocketFull, _hero);
  610. _commandHandler->addCommand(kCmdSound, -1, 2, _hero); // Play the 'hum-hum" sound (fx00002)
  611. _commandHandler->addCommand(kCmdWait, -1, -1, _hero);
  612. _commandHandler->addCommand(kCmdSay, 1, kPocketFull, _hero);
  613. }
  614. void CGEEngine::hide1(Sprite *spr) {
  615. debugC(1, kCGEDebugEngine, "CGEEngine::hide1(spr)");
  616. _commandHandlerTurbo->addCommand(kCmdGhost, -1, 0, spr->ghost());
  617. }
  618. void CGEEngine::snGhost(Bitmap *bmp) {
  619. debugC(1, kCGEDebugEngine, "CGEEngine::snGhost(bmp)");
  620. bmp->hide(bmp->_map & 0xFFFF, bmp->_map >> 16);
  621. bmp->_m = NULL;
  622. bmp->_map = 0;
  623. delete bmp;
  624. }
  625. void CGEEngine::feedSnail(Sprite *spr, SnList snq) {
  626. debugC(1, kCGEDebugEngine, "CGEEngine::feedSnail(spr, snq)");
  627. if (!spr || !spr->active())
  628. return;
  629. uint8 ptr = (snq == kTake) ? spr->_takePtr : spr->_nearPtr;
  630. if (ptr == kNoPtr)
  631. return;
  632. CommandHandler::Command *comtab = spr->snList(snq);
  633. CommandHandler::Command *c = comtab + ptr;
  634. if (findPocket(NULL) < 0) { // no empty pockets?
  635. CommandHandler::Command *p;
  636. for (p = c; p->_commandType != kCmdNext; p++) { // find KEEP command
  637. if (p->_commandType == kCmdKeep) {
  638. pocFul();
  639. return;
  640. }
  641. if (p->_spritePtr)
  642. break;
  643. }
  644. }
  645. while (true) {
  646. if (c->_commandType == kCmdTalk) {
  647. if ((_commandHandler->_talkEnable = (c->_val != 0)) == false)
  648. killText();
  649. }
  650. if (c->_commandType == kCmdNext) {
  651. Sprite *s = (c->_ref < 0) ? spr : locate(c->_ref);
  652. if (s) {
  653. uint8 *idx = (snq == kTake) ? &s->_takePtr : &s->_nearPtr;
  654. if (*idx != kNoPtr) {
  655. int v;
  656. switch (c->_val) {
  657. case -1 :
  658. v = c - comtab + 1;
  659. break;
  660. case -2 :
  661. v = c - comtab;
  662. break;
  663. case -3 :
  664. v = -1;
  665. break;
  666. default :
  667. v = c->_val;
  668. break;
  669. }
  670. if (v >= 0)
  671. *idx = v;
  672. }
  673. }
  674. if (s == spr)
  675. break;
  676. }
  677. if (c->_commandType == kCmdIf) {
  678. Sprite *s = (c->_ref < 0) ? spr : locate(c->_ref);
  679. if (s) { // sprite extsts
  680. if (! s->seqTest(-1))
  681. c = comtab + c->_val; // not parked
  682. else
  683. ++c;
  684. } else
  685. ++c;
  686. } else {
  687. _commandHandler->addCommand(c->_commandType, c->_ref, c->_val, spr);
  688. if (c->_spritePtr)
  689. break;
  690. else
  691. c++;
  692. }
  693. }
  694. }
  695. void CGEEngine::snNNext(Sprite *spr, int p) {
  696. debugC(1, kCGEDebugEngine, "CGEEngine::snNNext(spr, %d)", p);
  697. if (spr)
  698. if (spr->_nearPtr != kNoPtr)
  699. spr->_nearPtr = p;
  700. }
  701. void CGEEngine::snTNext(Sprite *spr, int p) {
  702. debugC(1, kCGEDebugEngine, "CGEEngine::snTNext(spr, %d)", p);
  703. if (spr)
  704. if (spr->_takePtr != kNoPtr)
  705. spr->_takePtr = p;
  706. }
  707. void CGEEngine::snRNNext(Sprite *spr, int p) {
  708. debugC(1, kCGEDebugEngine, "CGEEngine::snRNNext(spr, %d)", p);
  709. if (spr)
  710. if (spr->_nearPtr != kNoPtr)
  711. spr->_nearPtr += p;
  712. }
  713. void CGEEngine::snRTNext(Sprite *spr, int p) {
  714. debugC(1, kCGEDebugEngine, "CGEEngine::snRTNext(spr, %d)", p);
  715. if (spr)
  716. if (spr->_takePtr != kNoPtr)
  717. spr->_takePtr += p;
  718. }
  719. void CGEEngine::snZTrim(Sprite *spr) {
  720. debugC(4, kCGEDebugEngine, "CGEEngine::snZTrim(spr)");
  721. if (!spr || !spr->active())
  722. return;
  723. Sprite *s = (spr->_flags._shad) ? spr->_prev : NULL;
  724. _vga->_showQ->insert(_vga->_showQ->remove(spr));
  725. if (s) {
  726. s->_z = spr->_z;
  727. _vga->_showQ->insert(_vga->_showQ->remove(s), spr);
  728. }
  729. }
  730. void CGEEngine::snHide(Sprite *spr, int val) {
  731. debugC(1, kCGEDebugEngine, "CGEEngine::snHide(spr, %d)", val);
  732. if (spr) {
  733. spr->_flags._hide = (val >= 0) ? (val != 0) : (!spr->_flags._hide);
  734. if (spr->_flags._shad)
  735. spr->_prev->_flags._hide = spr->_flags._hide;
  736. }
  737. }
  738. void CGEEngine::snRmNear(Sprite *spr) {
  739. debugC(1, kCGEDebugEngine, "CGEEngine::snRmNear(spr)");
  740. if (spr)
  741. spr->_nearPtr = kNoPtr;
  742. }
  743. void CGEEngine::snRmTake(Sprite *spr) {
  744. debugC(1, kCGEDebugEngine, "CGEEngine::snRmTake(spr)");
  745. if (spr)
  746. spr->_takePtr = kNoPtr;
  747. }
  748. void CGEEngine::snSeq(Sprite *spr, int val) {
  749. debugC(1, kCGEDebugEngine, "CGEEngine::snSeq(spr, %d)", val);
  750. if (spr) {
  751. if (spr == _hero && val == 0)
  752. _hero->park();
  753. else
  754. spr->step(val);
  755. }
  756. }
  757. void CGEEngine::snRSeq(Sprite *spr, int val) {
  758. debugC(1, kCGEDebugEngine, "CGEEngine::snRSeq(spr, %d)", val);
  759. if (spr)
  760. snSeq(spr, spr->_seqPtr + val);
  761. }
  762. void CGEEngine::snSend(Sprite *spr, int val) {
  763. debugC(1, kCGEDebugEngine, "CGEEngine::snSend(spr, %d)", val);
  764. if (!spr)
  765. return;
  766. int was = spr->_scene;
  767. bool was1 = (was == 0 || was == _now);
  768. bool val1 = (val == 0 || val == _now);
  769. spr->_scene = val;
  770. if (val1 != was1) {
  771. if (was1) {
  772. if (spr->_flags._kept) {
  773. int n = findPocket(spr);
  774. if (n >= 0)
  775. _pocket[n] = NULL;
  776. }
  777. hide1(spr);
  778. contractSprite(spr);
  779. spr->_flags._slav = false;
  780. } else {
  781. if (spr->_ref % 1000 == 0)
  782. _bitmapPalette = _vga->_sysPal;
  783. if (spr->_flags._back)
  784. spr->backShow(true);
  785. else
  786. expandSprite(spr);
  787. _bitmapPalette = NULL;
  788. }
  789. }
  790. }
  791. void CGEEngine::snSwap(Sprite *spr, int xref) {
  792. debugC(1, kCGEDebugEngine, "CGEEngine::snSwap(spr, %d)", xref);
  793. Sprite *xspr = locate(xref);
  794. if (!spr || !xspr)
  795. return;
  796. int was = spr->_scene;
  797. int xwas = xspr->_scene;
  798. bool was1 = (was == 0 || was == _now);
  799. bool xwas1 = (xwas == 0 || xwas == _now);
  800. SWAP(spr->_scene, xspr->_scene);
  801. SWAP(spr->_x, xspr->_x);
  802. SWAP(spr->_y, xspr->_y);
  803. SWAP(spr->_z, xspr->_z);
  804. if (spr->_flags._kept) {
  805. int n = findPocket(spr);
  806. if (n >= 0)
  807. _pocket[n] = xspr;
  808. xspr->_flags._kept = true;
  809. xspr->_flags._port = false;
  810. }
  811. if (xwas1 != was1) {
  812. if (was1) {
  813. hide1(spr);
  814. contractSprite(spr);
  815. } else
  816. expandSprite(spr);
  817. if (xwas1) {
  818. hide1(xspr);
  819. contractSprite(xspr);
  820. } else
  821. expandSprite(xspr);
  822. }
  823. }
  824. void CGEEngine::snCover(Sprite *spr, int xref) {
  825. debugC(1, kCGEDebugEngine, "CGEEngine::snCover(spr, %d)", xref);
  826. Sprite *xspr = locate(xref);
  827. if (!spr || !xspr)
  828. return;
  829. spr->_flags._hide = true;
  830. xspr->_z = spr->_z;
  831. xspr->_scene = spr->_scene;
  832. xspr->gotoxy(spr->_x, spr->_y);
  833. expandSprite(xspr);
  834. if ((xspr->_flags._shad = spr->_flags._shad) == 1) {
  835. _vga->_showQ->insert(_vga->_showQ->remove(spr->_prev), xspr);
  836. spr->_flags._shad = false;
  837. }
  838. feedSnail(xspr, kNear);
  839. }
  840. void CGEEngine::snUncover(Sprite *spr, Sprite *xspr) {
  841. debugC(1, kCGEDebugEngine, "CGEEngine::snUncover(spr, xspr)");
  842. if (!spr || !xspr)
  843. return;
  844. spr->_flags._hide = false;
  845. spr->_scene = xspr->_scene;
  846. spr->gotoxy(xspr->_x, xspr->_y);
  847. if ((spr->_flags._shad = xspr->_flags._shad) == 1) {
  848. _vga->_showQ->insert(_vga->_showQ->remove(xspr->_prev), spr);
  849. xspr->_flags._shad = false;
  850. }
  851. spr->_z = xspr->_z;
  852. snSend(xspr, -1);
  853. if (spr->_time == 0)
  854. spr->_time++;
  855. }
  856. void CGEEngine::snSetX0(int scene, int x0) {
  857. debugC(1, kCGEDebugEngine, "CGEEngine::snSetX0(%d, %d)", scene, x0);
  858. _heroXY[scene - 1].x = x0;
  859. }
  860. void CGEEngine::snSetY0(int scene, int y0) {
  861. debugC(1, kCGEDebugEngine, "CGEEngine::snSetY0(%d, %d)", scene, y0);
  862. _heroXY[scene - 1].y = y0;
  863. }
  864. void CGEEngine::snSetXY(Sprite *spr, uint16 xy) {
  865. debugC(1, kCGEDebugEngine, "CGEEngine::snSetXY(spr, %d)", xy);
  866. if (spr)
  867. spr->gotoxy(xy % kScrWidth, xy / kScrWidth);
  868. }
  869. void CGEEngine::snRelX(Sprite *spr, int x) {
  870. debugC(1, kCGEDebugEngine, "CGEEngine::snRelX(spr, %d)", x);
  871. if (spr && _hero)
  872. spr->gotoxy(_hero->_x + x, spr->_y);
  873. }
  874. void CGEEngine::snRelY(Sprite *spr, int y) {
  875. debugC(1, kCGEDebugEngine, "CGEEngine::snRelY(spr, %d)", y);
  876. if (spr && _hero)
  877. spr->gotoxy(spr->_x, _hero->_y + y);
  878. }
  879. void CGEEngine::snRelZ(Sprite *spr, int z) {
  880. debugC(1, kCGEDebugEngine, "CGEEngine::snRelZ(spr, %d)", z);
  881. if (spr && _hero) {
  882. spr->_z = _hero->_z + z;
  883. snZTrim(spr);
  884. }
  885. }
  886. void CGEEngine::snSetX(Sprite *spr, int x) {
  887. debugC(1, kCGEDebugEngine, "CGEEngine::snSetX(spr, %d)", x);
  888. if (spr)
  889. spr->gotoxy(x, spr->_y);
  890. }
  891. void CGEEngine::snSetY(Sprite *spr, int y) {
  892. debugC(1, kCGEDebugEngine, "CGEEngine::snSetY(spr, %d)", y);
  893. if (spr)
  894. spr->gotoxy(spr->_x, y);
  895. }
  896. void CGEEngine::snSetZ(Sprite *spr, int z) {
  897. debugC(1, kCGEDebugEngine, "CGEEngine::snSetZ(spr, %d)", z);
  898. if (spr) {
  899. spr->_z = z;
  900. //SNPOST_(SNZTRIM, -1, 0, spr);
  901. snZTrim(spr);
  902. }
  903. }
  904. void CGEEngine::snSlave(Sprite *spr, int ref) {
  905. debugC(1, kCGEDebugEngine, "CGEEngine::snSlave(spr, %d)", ref);
  906. Sprite *slv = locate(ref);
  907. if (spr && slv) {
  908. if (spr->active()) {
  909. snSend(slv, spr->_scene);
  910. slv->_flags._slav = true;
  911. slv->_z = spr->_z;
  912. _vga->_showQ->insert(_vga->_showQ->remove(slv), spr->_next);
  913. }
  914. }
  915. }
  916. void CGEEngine::snTrans(Sprite *spr, int trans) {
  917. debugC(1, kCGEDebugEngine, "CGEEngine::snTrans(spr, %d)", trans);
  918. if (spr)
  919. spr->_flags._tran = (trans < 0) ? !spr->_flags._tran : (trans != 0);
  920. }
  921. void CGEEngine::snPort(Sprite *spr, int port) {
  922. debugC(1, kCGEDebugEngine, "CGEEngine::snPort(spr, %d)", port);
  923. if (spr)
  924. spr->_flags._port = (port < 0) ? !spr->_flags._port : (port != 0);
  925. }
  926. void CGEEngine::snKill(Sprite *spr) {
  927. debugC(1, kCGEDebugEngine, "CGEEngine::snKill(spr)");
  928. if (!spr)
  929. return;
  930. if (spr->_flags._kept) {
  931. int n = findPocket(spr);
  932. if (n >= 0)
  933. _pocket[n] = NULL;
  934. }
  935. Sprite *nx = spr->_next;
  936. hide1(spr);
  937. _vga->_showQ->remove(spr);
  938. _eventManager->clearEvent(spr);
  939. if (spr->_flags._kill) {
  940. delete spr;
  941. } else {
  942. spr->_scene = -1;
  943. _vga->_spareQ->append(spr);
  944. }
  945. if (nx) {
  946. if (nx->_flags._slav)
  947. snKill(nx);
  948. }
  949. }
  950. /**
  951. * Play a FX sound
  952. * @param spr Sprite pointer
  953. * @param wav FX index
  954. */
  955. void CGEEngine::snSound(Sprite *spr, int wav) {
  956. debugC(1, kCGEDebugEngine, "CGEEngine::snSound(spr, %d)", wav);
  957. if (wav == -1)
  958. _sound->stop();
  959. else
  960. _sound->play((*_fx)[wav], (spr) ? ((spr->_x + spr->_w / 2) / (kScrWidth / 16)) : 8);
  961. _sound->setRepeat(1);
  962. }
  963. void CGEEngine::snKeep(Sprite *spr, int stp) {
  964. debugC(1, kCGEDebugEngine, "CGEEngine::snKeep(spr, %d)", stp);
  965. selectPocket(-1);
  966. if (spr && ! spr->_flags._kept && _pocket[_pocPtr] == NULL) {
  967. int16 oldRepeat = _sound->getRepeat();
  968. _sound->setRepeat(1);
  969. snSound(spr, 3);
  970. _sound->setRepeat(oldRepeat);
  971. _pocket[_pocPtr] = spr;
  972. spr->_scene = 0;
  973. spr->_flags._kept = true;
  974. spr->gotoxy(kPocketX + kPocketDX * _pocPtr + kPocketDX / 2 - spr->_w / 2,
  975. kPocketY + kPocketDY / 2 - spr->_h / 2);
  976. if (stp >= 0)
  977. spr->step(stp);
  978. }
  979. selectPocket(-1);
  980. }
  981. void CGEEngine::snGive(Sprite *spr, int stp) {
  982. debugC(1, kCGEDebugEngine, "CGEEngine::snGive(spr, %d)", stp);
  983. if (spr) {
  984. int p = findPocket(spr);
  985. if (p >= 0) {
  986. _pocket[p] = NULL;
  987. spr->_scene = _now;
  988. spr->_flags._kept = false;
  989. if (stp >= 0)
  990. spr->step(stp);
  991. }
  992. }
  993. selectPocket(-1);
  994. }
  995. void CGEEngine::snBackPt(Sprite *spr, int stp) {
  996. debugC(1, kCGEDebugEngine, "CGEEngine::snBackPt(spr, %d)", stp);
  997. if (spr) {
  998. if (stp >= 0)
  999. spr->step(stp);
  1000. spr->backShow(true);
  1001. }
  1002. }
  1003. void CGEEngine::snLevel(Sprite *spr, int lev) {
  1004. debugC(1, kCGEDebugEngine, "CGEEngine::snLevel(spr, %d)", lev);
  1005. assert((lev >= 0) && (lev < 5));
  1006. for (int i = 0; i < 5; i++) {
  1007. spr = _vga->_spareQ->locate(100 + i);
  1008. if (spr) {
  1009. if (i <= lev) {
  1010. spr->backShow(true);
  1011. spr->_scene = 0;
  1012. spr->_flags._hide = false;
  1013. } else {
  1014. spr->_flags._hide = true;
  1015. spr->_scene = -1;
  1016. }
  1017. } else {
  1018. warning("SPR not found! ref: %d", 100 + i);
  1019. }
  1020. }
  1021. _lev = lev;
  1022. _maxScene = _maxSceneArr[_lev];
  1023. }
  1024. void CGEEngine::snFlag(int indx, bool v) {
  1025. _flag[indx] = v;
  1026. }
  1027. void CGEEngine::snSetRef(Sprite *spr, int nr) {
  1028. debugC(1, kCGEDebugEngine, "CGEEngine::snSetRef(spr, %d)", nr);
  1029. if (spr)
  1030. spr->_ref = nr;
  1031. }
  1032. void CGEEngine::snFlash(bool on) {
  1033. debugC(1, kCGEDebugEngine, "CGEEngine::snFlash(%s)", on ? "true" : "false");
  1034. if (on) {
  1035. Dac *pal = (Dac *)malloc(sizeof(Dac) * kPalCount);
  1036. if (pal) {
  1037. memcpy(pal, _vga->_sysPal, kPalSize);
  1038. for (int i = 0; i < kPalCount; i++) {
  1039. register int c;
  1040. c = pal[i]._r << 1;
  1041. pal[i]._r = (c < 64) ? c : 63;
  1042. c = pal[i]._g << 1;
  1043. pal[i]._g = (c < 64) ? c : 63;
  1044. c = pal[i]._b << 1;
  1045. pal[i]._b = (c < 64) ? c : 63;
  1046. }
  1047. _vga->setColors(pal, 64);
  1048. }
  1049. } else
  1050. _vga->setColors(_vga->_sysPal, 64);
  1051. _dark = false;
  1052. }
  1053. void CGEEngine::snLight(bool in) {
  1054. debugC(1, kCGEDebugEngine, "CGEEngine::snLight(%s)", in ? "true" : "false");
  1055. if (in)
  1056. _vga->sunrise(_vga->_sysPal);
  1057. else
  1058. _vga->sunset();
  1059. _dark = !in;
  1060. }
  1061. void CGEEngine::snHBarrier(const int scene, const int barX) {
  1062. debugC(1, kCGEDebugEngine, "CGEEngine::snHBarrier(%d, %d)", scene, barX);
  1063. _barriers[(scene > 0) ? scene : _now]._horz = barX;
  1064. }
  1065. void CGEEngine::snVBarrier(const int scene, const int barY) {
  1066. debugC(1, kCGEDebugEngine, "CGEEngine::snVBarrier(%d, %d)", scene, barY);
  1067. _barriers[(scene > 0) ? scene : _now]._vert = barY;
  1068. }
  1069. void CGEEngine::snWalk(Sprite *spr, int x, int y) {
  1070. debugC(1, kCGEDebugEngine, "CGEEngine::snWalk(spr, %d, %d)", x, y);
  1071. if (_hero) {
  1072. if (spr && y < 0)
  1073. _hero->findWay(spr);
  1074. else
  1075. _hero->findWay(XZ(x, y));
  1076. }
  1077. }
  1078. void CGEEngine::snReach(Sprite *spr, int mode) {
  1079. debugC(1, kCGEDebugEngine, "CGEEngine::snReach(spr, %d)", mode);
  1080. if (_hero)
  1081. _hero->reach(spr, mode);
  1082. }
  1083. void CGEEngine::snMouse(bool on) {
  1084. debugC(1, kCGEDebugEngine, "CGEEngine::snMouse(%s)", on ? "true" : "false");
  1085. if (on)
  1086. _mouse->on();
  1087. else
  1088. _mouse->off();
  1089. }
  1090. } // End of namespace CGE