diff options
Diffstat (limited to 'engines/tsage')
-rw-r--r-- | engines/tsage/POTFILES | 3 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_dialogs.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/debugger.cpp | 6 | ||||
-rw-r--r-- | engines/tsage/debugger.h | 4 | ||||
-rw-r--r-- | engines/tsage/module.mk | 3 | ||||
-rw-r--r-- | engines/tsage/ringworld/ringworld_dialogs.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_airduct.cpp | 909 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_airduct.h | 89 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_logic.cpp | 8 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_outpost.cpp | 4700 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_outpost.h | 259 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_scenes0.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_scenes1.cpp | 7254 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_scenes1.h | 401 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_scenes3.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_vampire.cpp | 1821 | ||||
-rw-r--r-- | engines/tsage/ringworld2/ringworld2_vampire.h | 179 | ||||
-rw-r--r-- | engines/tsage/sound.cpp | 2 |
18 files changed, 7979 insertions, 7667 deletions
diff --git a/engines/tsage/POTFILES b/engines/tsage/POTFILES new file mode 100644 index 0000000000..de18cbd072 --- /dev/null +++ b/engines/tsage/POTFILES @@ -0,0 +1,3 @@ +engines/tsage/dialogs.cpp +engines/tsage/scenes.cpp + diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp index 2f337ac549..5be27c9ae7 100644 --- a/engines/tsage/blue_force/blueforce_dialogs.cpp +++ b/engines/tsage/blue_force/blueforce_dialogs.cpp @@ -20,8 +20,6 @@ * */ -#include "common/translation.h" - #include "gui/dialog.h" #include "gui/widget.h" diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index b647807f8a..a38796717a 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -42,7 +42,7 @@ Debugger::Debugger() : GUI::Debugger() { registerCmd("moveobject", WRAP_METHOD(Debugger, Cmd_MoveObject)); registerCmd("hotspots", WRAP_METHOD(Debugger, Cmd_Hotspots)); registerCmd("sound", WRAP_METHOD(Debugger, Cmd_Sound)); - registerCmd("setdebug", WRAP_METHOD(Debugger, Cmd_SetDebug)); + registerCmd("setdebug", WRAP_METHOD(Debugger, Cmd_SetOutpostAlphaDebug)); } static int strToInt(const char *s) { @@ -344,7 +344,7 @@ bool Debugger::Cmd_Sound(int argc, const char **argv) { /** * Activate internal debugger, when available */ -bool Debugger::Cmd_SetDebug(int argc, const char **argv) { +bool Debugger::Cmd_SetOutpostAlphaDebug(int argc, const char **argv) { debugPrintf("Not available in this game\n"); return true; } @@ -720,7 +720,7 @@ bool Ringworld2Debugger::Cmd_MoveObject(int argc, const char **argv) { /** * Activate internal debugger, when available */ -bool Ringworld2Debugger::Cmd_SetDebug(int argc, const char **argv) { +bool Ringworld2Debugger::Cmd_SetOutpostAlphaDebug(int argc, const char **argv) { if (argc != 1) { debugPrintf("Usage: %s\n", argv[0]); return true; diff --git a/engines/tsage/debugger.h b/engines/tsage/debugger.h index 610f45de64..b0f4c665dd 100644 --- a/engines/tsage/debugger.h +++ b/engines/tsage/debugger.h @@ -45,7 +45,7 @@ protected: bool Cmd_Sound(int argc, const char **argv); virtual bool Cmd_ListObjects(int argc, const char **argv) = 0; virtual bool Cmd_MoveObject(int argc, const char **argv) = 0; - virtual bool Cmd_SetDebug(int argc, const char **argv); + virtual bool Cmd_SetOutpostAlphaDebug(int argc, const char **argv); }; class DemoDebugger : public Debugger { @@ -70,7 +70,7 @@ class Ringworld2Debugger : public Debugger { protected: virtual bool Cmd_ListObjects(int argc, const char **argv); virtual bool Cmd_MoveObject(int argc, const char **argv); - virtual bool Cmd_SetDebug(int argc, const char **argv); + virtual bool Cmd_SetOutpostAlphaDebug(int argc, const char **argv); }; } // End of namespace TsAGE diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index 53c03e2e57..d62f398c20 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -35,13 +35,16 @@ MODULE_OBJS := \ ringworld/ringworld_scenes8.o \ ringworld/ringworld_scenes10.o \ ringworld/ringworld_speakers.o \ + ringworld2/ringworld2_airduct.o \ ringworld2/ringworld2_dialogs.o \ ringworld2/ringworld2_logic.o \ + ringworld2/ringworld2_outpost.o \ ringworld2/ringworld2_scenes0.o \ ringworld2/ringworld2_scenes1.o \ ringworld2/ringworld2_scenes2.o \ ringworld2/ringworld2_scenes3.o \ ringworld2/ringworld2_speakers.o \ + ringworld2/ringworld2_vampire.o \ saveload.o \ scenes.o \ sound.o \ diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp index 226a943f08..1dd3bc158b 100644 --- a/engines/tsage/ringworld/ringworld_dialogs.cpp +++ b/engines/tsage/ringworld/ringworld_dialogs.cpp @@ -20,8 +20,6 @@ * */ -#include "common/translation.h" - #include "gui/dialog.h" #include "gui/widget.h" diff --git a/engines/tsage/ringworld2/ringworld2_airduct.cpp b/engines/tsage/ringworld2/ringworld2_airduct.cpp new file mode 100644 index 0000000000..136e8d5d1b --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_airduct.cpp @@ -0,0 +1,909 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/ringworld2/ringworld2_airduct.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 1200 - Air Ducts Maze + * + *--------------------------------------------------------------------------*/ + +Scene1200::Scene1200() { + _nextCrawlDirection = 0; + _field414 = 0; + _field416 = 0; + _field418 = 0; + _field41A = 0; + _fixupMaze = false; +} + +void Scene1200::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_nextCrawlDirection); + s.syncAsSint16LE(_field414); + s.syncAsSint16LE(_field416); + s.syncAsSint16LE(_field418); + s.syncAsSint16LE(_field41A); + s.syncAsSint16LE(_fixupMaze); +} + +Scene1200::LaserPanel::LaserPanel() { +} + +void Scene1200::LaserPanel::Jumper::init(int state) { + _state = state; + + SceneActor::postInit(); + setup(1003, 1, 1); + fixPriority(255); + + switch (_state) { + case 1: + switch (R2_GLOBALS._ductMazePanel1State) { + case 1: + setFrame2(2); + setPosition(Common::Point(129, 101)); + break; + case 2: + setFrame2(3); + setPosition(Common::Point(135, 95)); + break; + default: + break; + } + break; + case 2: + switch (R2_GLOBALS._ductMazePanel2State) { + case 1: + setFrame2(2); + setPosition(Common::Point(152, 101)); + break; + case 2: + setFrame2(3); + setPosition(Common::Point(158, 122)); + break; + case 3: + setFrame2(3); + setPosition(Common::Point(135, 122)); + break; + default: + break; + } + break; + case 3: + switch (R2_GLOBALS._ductMazePanel3State) { + case 1: + setFrame2(3); + setPosition(Common::Point(158, 95)); + break; + case 2: + setFrame2(2); + setPosition(Common::Point(175, 101)); + break; + default: + break; + } + break; + default: + break; + } + + setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL); +} + +bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + R2_GLOBALS._sound2.play(260); + switch (_state) { + case 1: + if (R2_GLOBALS._ductMazePanel1State == 1) { + R2_GLOBALS._ductMazePanel1State = 2; + setFrame2(3); + setPosition(Common::Point(135, 95)); + } else { + R2_GLOBALS._ductMazePanel1State = 1; + setFrame2(2); + setPosition(Common::Point(129, 101)); + } + break; + case 2: + ++R2_GLOBALS._ductMazePanel2State; + if (R2_GLOBALS._ductMazePanel2State == 4) + R2_GLOBALS._ductMazePanel2State = 1; + + switch (R2_GLOBALS._ductMazePanel2State) { + case 1: + setFrame2(2); + setPosition(Common::Point(152, 101)); + break; + case 2: + setFrame2(3); + setPosition(Common::Point(158, 122)); + break; + case 3: + setFrame2(3); + setPosition(Common::Point(135, 122)); + break; + default: + break; + } + break; + case 3: + if (R2_GLOBALS._ductMazePanel3State == 1) { + R2_GLOBALS._ductMazePanel3State = 2; + setFrame2(2); + setPosition(Common::Point(175, 101)); + } else { + R2_GLOBALS._ductMazePanel3State = 1; + setFrame2(3); + setPosition(Common::Point(158, 95)); + } + break; + default: + break; + } + + Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; + scene->_field418 = 0; + + if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + scene->_field418 = 1; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + scene->_field418 = 2; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) + scene->_field418 = 3; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) + scene->_field418 = 4; + + return true; +} + +void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) { + Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; + + scene->_field41A = 1; + R2_GLOBALS._events.setCursor(CURSOR_USE); + setup2(1003, 1, 1, 100, 40); + setup3(1200, 11, -1, -1); + R2_GLOBALS._sound2.play(259); + _jumper1.init(1); + _jumper2.init(2); + _jumper3.init(3); + + R2_GLOBALS._player._canWalk = false; +} + +void Scene1200::LaserPanel::remove() { + Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; + + scene->_field41A = 0; + scene->_sceneAreas.remove(&_jumper1); + scene->_sceneAreas.remove(&_jumper2); + scene->_sceneAreas.remove(&_jumper3); + _jumper1.remove(); + _jumper2.remove(); + _jumper3.remove(); + + ModalWindow::remove(); + R2_GLOBALS._player._canWalk = true; +} + +void Scene1200::postInit(SceneObjectList *OwnerList) { + loadScene(1200); + SceneExt::postInit(); + + if (R2_GLOBALS._sceneManager._previousScene < 3200) + R2_GLOBALS._sound1.play(257); + + _nextCrawlDirection = CRAWL_EAST; + _field414 = 0; + _field416 = 0; + _field418 = 0; + _field41A = 0; + + if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + _field418 = 1; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + _field418 = 2; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) + _field418 = 3; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) + _field418 = 4; + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.setup(3156, 1, 6); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200; + + _actor1.postInit(); + _actor1.hide(); + + _mazeUI.setDisplayBounds(Rect(110, 20, 210, 120)); + + _mazeUI.postInit(); + _mazeUI.load(1); + _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); + + R2_GLOBALS._player.enableControl(); + _item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL); +} + +void Scene1200::signal() { + switch (_sceneMode++) { + case 1: + // No break on purpose + case 1200: + // No break on purpose + case 1201: + // No break on purpose + case 1202: + // No break on purpose + case 1203: + R2_GLOBALS._player.enableControl(); + // CHECKME: The original is calling _eventManager.waitEvent(); + _sceneMode = 2; + break; + case 10: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(1); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 11: + // No break on purpose + case 21: + // No break on purpose + case 31: + // No break on purpose + case 41: + _field416 = 0; + break; + case 12: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 1, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 13: + // No break on purpose + case 16: + // No break on purpose + case 23: + // No break on purpose + case 26: + // No break on purpose + case 33: + // No break on purpose + case 36: + // No break on purpose + case 43: + // No break on purpose + case 46: + R2_GLOBALS._player.setFrame(4); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 15: + // No break on purpose + case 25: + // No break on purpose + case 35: + // No break on purpose + case 45: + _field414 = 20; + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 20: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(2); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 22: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 2, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 30: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 32: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 3, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 40: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(4); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 42: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 4, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 50: + // No break on purpose + case 55: + // No break on purpose + case 60: + R2_GLOBALS._player.setup(3156, 5, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 51: + // No break on purpose + case 56: + // No break on purpose + case 117: + R2_GLOBALS._player.setup(3157, 1, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 52: + // No break on purpose + case 82: + // No break on purpose + case 118: + R2_GLOBALS._player.setup(3156, 3, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 57: + // No break on purpose + case 91: + // No break on purpose + case 96: + R2_GLOBALS._player.setup(3157, 2, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 58: + // No break on purpose + case 92: + // No break on purpose + case 122: + R2_GLOBALS._player.setup(3156, 2, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 61: + R2_GLOBALS._player.setup(3157, 4, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 62: + // No break on purpose + case 72: + // No break on purpose + case 98: + R2_GLOBALS._player.setup(3156, 4, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 70: + // No break on purpose + case 75: + // No break on purpose + case 80: + R2_GLOBALS._player.setup(3156, 6, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 71: + // No break on purpose + case 76: + // No break on purpose + case 97: + R2_GLOBALS._player.setup(3157, 3, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 77: + // No break on purpose + case 111: + // No break on purpose + case 116: + R2_GLOBALS._player.setup(3157, 4, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 78: + // No break on purpose + case 102: + // No break on purpose + case 112: + R2_GLOBALS._player.setup(3156, 1, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 81: + R2_GLOBALS._player.setup(3157, 2, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 90: + // No break on purpose + case 95: + // No break on purpose + case 100: + R2_GLOBALS._player.setup(3156, 7, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 101: + R2_GLOBALS._player.setup(3157, 1, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 110: + // No break on purpose + case 115: + // No break on purpose + case 120: + R2_GLOBALS._player.setup(3156, 8, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 121: + R2_GLOBALS._player.setup(3157, 3, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + default: + // CHECKME: The original is walling _eventManager.waitEvent(); + _sceneMode = 2; + break; + } +} + +void Scene1200::process(Event &event) { + if (_field414 != 0) + return; + + Scene::process(event); + + if (!R2_GLOBALS._player._canWalk) + return; + + if (event.eventType == EVENT_BUTTON_DOWN) { + Common::Point cellPos = R2_GLOBALS._ventCellPos; + _mazeUI.pixelToCellXY(cellPos); + + int cellId = _mazeUI.getCellFromPixelXY(event.mousePos); + switch (R2_GLOBALS._events.getCursor()) { + case CURSOR_WALK: + event.handled = true; + if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) + startCrawling(CRAWL_EAST); + + if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) + startCrawling(CRAWL_WEST); + + if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120)) + startCrawling(CRAWL_SOUTH); + + if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50)) + startCrawling(CRAWL_NORTH); + break; + case CURSOR_USE: + if (cellId > 36) { + if ( ((cellPos.x == 3) && (cellPos.y == 33)) + || ((cellPos.x == 7) && (cellPos.y == 33)) + || ((cellPos.x == 33) && (cellPos.y == 41)) + || ((cellPos.x == 5) && (cellPos.y == 5)) + || ((cellPos.x == 13) && (cellPos.y == 21)) + || ((cellPos.x == 17) && (cellPos.y == 21)) + || ((cellPos.x == 17) && (cellPos.y == 5)) + || ((cellPos.x == 17) && (cellPos.y == 9)) + || ((cellPos.x == 29) && (cellPos.y == 17)) + || ((cellPos.x == 33) && (cellPos.y == 17)) + || ((cellPos.x == 35) && (cellPos.y == 17)) + || ((cellPos.x == 41) && (cellPos.y == 21)) ) { + _laserPanel.postInit(); + event.handled = true; + } + } + + if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { + if ( ((cellPos.x == 3) && (cellPos.y == 9)) + || ((cellPos.x == 11) && (cellPos.y == 27)) + || ((cellPos.x == 17) && (cellPos.y == 7)) + || ((cellPos.x == 17) && (cellPos.y == 27)) + || ((cellPos.x == 17) && (cellPos.y == 33)) + || (cellPos.x == 33) ) { + switch (cellPos.x) { + case 3: + R2_GLOBALS._sceneManager.changeScene(3150); + break; + case 33: + if (R2_GLOBALS._scientistConvIndex >= 4) + R2_GLOBALS._sceneManager.changeScene(3250); + else + SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); + break; + default: + SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); + break; + } + event.handled = true; + } + } + break; + case CURSOR_LOOK: + if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { + event.handled = true; + switch (cellPos.x) { + case 3: + // It was your cell. + SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + case 9: + R2_GLOBALS._sceneManager.changeScene(3240); + break; + case 11: + if (cellPos.y == 27) + R2_GLOBALS._sceneManager.changeScene(3210); + else + // A vent grill + SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + case 17: + switch (cellPos.y) { + case 5: + R2_GLOBALS._sceneManager.changeScene(3230); + break; + case 21: + R2_GLOBALS._sceneManager.changeScene(3220); + break; + case 33: + R2_GLOBALS._sceneManager.changeScene(3200); + break; + default: + // A vent grill + SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + } + break; + case 33: + R2_GLOBALS._sceneManager.changeScene(3245); + break; + default: + SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + } + } + if (cellId > 36) { + // "An anti-pest laser" + event.handled = true; + SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + } + break; + case CURSOR_TALK: + event.handled = true; + break; + default: + return; + } + } else if (event.eventType == EVENT_KEYPRESS) { + if (_field414) { + event.handled = false; + return; + } + + switch (event.kbd.keycode) { + case Common::KEYCODE_KP8: + case Common::KEYCODE_UP: + startCrawling(CRAWL_NORTH); + break; + case Common::KEYCODE_KP4: + case Common::KEYCODE_LEFT: + startCrawling(CRAWL_WEST); + break; + case Common::KEYCODE_KP6: + case Common::KEYCODE_RIGHT: + startCrawling(CRAWL_EAST); + break; + case Common::KEYCODE_KP2: + case Common::KEYCODE_DOWN: + startCrawling(CRAWL_SOUTH); + break; + default: + event.handled = false; + return; + break; + } + } else + return; +} + +void Scene1200::dispatch() { + Rect tmpRect; + Scene::dispatch(); + + if (_fixupMaze) { + _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); + //_mazeUI.draw(); + _fixupMaze = false; + } + + if (_field414 != 0) { + tmpRect.set(110, 20, 210, 120); + _field414--; + + switch (_nextCrawlDirection) { + case CRAWL_EAST: + R2_GLOBALS._ventCellPos.x += 2; + break; + case CRAWL_WEST: + R2_GLOBALS._ventCellPos.x -= 2; + break; + case CRAWL_SOUTH: + R2_GLOBALS._ventCellPos.y += 2; + break; + case CRAWL_NORTH: + R2_GLOBALS._ventCellPos.y -= 2; + break; + default: + break; + } + + _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); + //_mazeUI.draw(); + + if (_field416 != 0) { + switch(_nextCrawlDirection) { + case CRAWL_EAST: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y)); + break; + case CRAWL_WEST: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y)); + break; + case CRAWL_SOUTH: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2)); + break; + case CRAWL_NORTH: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2)); + break; + default: + break; + } + } + if (_field414 == 0) { + if (_field416 == 0) + R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); + signal(); + } + } +} + +void Scene1200::saveCharacter(int characterIndex) { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::saveCharacter(characterIndex); +} + +void Scene1200::startCrawling(CrawlDirection dir) { + Common::Point cellPos = R2_GLOBALS._ventCellPos; + _mazeUI.pixelToCellXY(cellPos); + + switch (dir) { + case CRAWL_EAST: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(200, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(200, 88)) > 36)) + && ( ((cellPos.x == 3) && (cellPos.y == 33) && (_field418 != 4)) + || ((cellPos.x == 13) && (cellPos.y == 21) && (_field418 != 2)) + || ((cellPos.x == 29) && (cellPos.y == 17) && (_field418 != 1)) + || ((cellPos.x == 33) && (cellPos.y == 41)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1200; + setAction(&_sequenceManager, this, 1200, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(200, 69)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 15; + else + _sceneMode = 10; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 76; + else + _sceneMode = 75; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 101; + else + _sceneMode = 100; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 111; + else + _sceneMode = 110; + break; + default: + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 1; + signal(); + } + break; + case CRAWL_WEST: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(120, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(120, 88)) > 36)) + && ( ((cellPos.x == 7) && (cellPos.y == 33) && (_field418 != 4)) + || ((cellPos.x == 17) && (cellPos.y == 21) && (_field418 != 2)) + || ((cellPos.x == 33) && (cellPos.y == 17) && (_field418 != 1)) + || ((cellPos.x == 5) && (cellPos.y == 5)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1201; + setAction(&_sequenceManager, this, 1201, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(120, 69)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 56; + else + _sceneMode = 55; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 25; + else + _sceneMode = 20; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 91; + else + _sceneMode = 90; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 121; + else + _sceneMode = 120; + break; + default: + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 2; + signal(); + } + break; + case CRAWL_SOUTH: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 110)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 110)) > 36)) + && ( ((cellPos.x == 17) && (cellPos.y == 5) && (_field418 != 3)) + || ((cellPos.x == 41) && (cellPos.y == 21)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1203; + setAction(&_sequenceManager, this, 1203, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 110)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 51; + else + _sceneMode = 50; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 81; + else + _sceneMode = 80; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 35; + else + _sceneMode = 30; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 116; + else + _sceneMode = 115; + break; + default: + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 3; + signal(); + } + break; + case CRAWL_NORTH: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 30)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 30)) > 36)) + && ( ((cellPos.x == 17) && (cellPos.y == 9) && (_field418 != 3)) + || ((cellPos.x == 35) && (cellPos.y == 17)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1202; + setAction(&_sequenceManager, this, 1202, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 30)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 61; + else + _sceneMode = 60; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 71; + else + _sceneMode = 70; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 96; + else + _sceneMode = 95; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 45; + else + _sceneMode = 40; + break; + default: + _sceneMode = 1; + R2_GLOBALS._player.setup(3156, 4, 6); + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 4; + signal(); + } + break; + default: + break; + } +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_airduct.h b/engines/tsage/ringworld2/ringworld2_airduct.h new file mode 100644 index 0000000000..89dfe778d0 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_airduct.h @@ -0,0 +1,89 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_AIRDUCT_H +#define TSAGE_RINGWORLD2_AIRDUCT_H + +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene1200 : public SceneExt { + enum CrawlDirection { CRAWL_EAST = 1, CRAWL_WEST = 2, CRAWL_SOUTH = 3, CRAWL_NORTH = 4 }; + + class LaserPanel: public ModalWindow { + public: + class Jumper : public SceneActorExt { + public: + void init(int state); + virtual bool startAction(CursorType action, Event &event); + }; + + Jumper _jumper1; + Jumper _jumper2; + Jumper _jumper3; + + LaserPanel(); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + +public: + NamedHotspot _item1; + SceneActor _actor1; + LaserPanel _laserPanel; + MazeUI _mazeUI; + SequenceManager _sequenceManager; + + int _nextCrawlDirection; + int _field414; + int _field416; + int _field418; + int _field41A; + bool _fixupMaze; + + Scene1200(); + void synchronize(Serializer &s); + + void startCrawling(CrawlDirection dir); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void saveCharacter(int characterIndex); +}; + +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index 99188c1ab6..d24541932f 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -32,6 +32,9 @@ #include "tsage/ringworld2/ringworld2_scenes1.h" #include "tsage/ringworld2/ringworld2_scenes2.h" #include "tsage/ringworld2/ringworld2_scenes3.h" +#include "tsage/ringworld2/ringworld2_airduct.h" +#include "tsage/ringworld2/ringworld2_outpost.h" +#include "tsage/ringworld2/ringworld2_vampire.h" namespace TsAGE { @@ -355,6 +358,11 @@ SceneExt::SceneExt(): Scene() { // to make inter-scene debugging easier, I'm explicitly resetting the _animationCtr // on scene start, since scene objects aren't drawn while it's non-zero R2_GLOBALS._animationCtr = 0; + + // WORKAROUND: We had a case where at some point the number of modal dialogs + // open became incorrect. So reset it on scene changes to fix the problem if + // it ever happens + R2_GLOBALS._insetUp = 0; } void SceneExt::synchronize(Serializer &s) { diff --git a/engines/tsage/ringworld2/ringworld2_outpost.cpp b/engines/tsage/ringworld2/ringworld2_outpost.cpp new file mode 100644 index 0000000000..cad21b4623 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_outpost.cpp @@ -0,0 +1,4700 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "graphics/cursorman.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_outpost.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 1337 - Card game + * + *--------------------------------------------------------------------------*/ + +Scene1337::Card::Card() { + _cardId = 0; + _stationPos = Common::Point(0, 0); +} + +void Scene1337::Card::synchronize(Serializer &s) { + _card.synchronize(s); + + s.syncAsSint16LE(_cardId); + s.syncAsSint16LE(_stationPos.x); + s.syncAsSint16LE(_stationPos.y); +} + +bool Scene1337::Card::isIn(Common::Point pt) { + if ((_stationPos.x > pt.x) || (_stationPos.x + 24 < pt.x)) + return false; + + if ((_stationPos.y > pt.y) || (_stationPos.y + 24 < pt.y)) + return false; + + return true; +} + +Scene1337::GameBoardSide::GameBoardSide() { + _card1Pos = Common::Point(0, 0); + _card2Pos = Common::Point(0, 0); + _card3Pos = Common::Point(0, 0); + _card4Pos = Common::Point(0, 0); + _frameNum = 0; +} + +void Scene1337::GameBoardSide::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + + for (int i = 0; i < 4; i++) + _handCard[i].synchronize(s); + + for (int i = 0; i < 8; i++) + _outpostStation[i].synchronize(s); + + _delayCard.synchronize(s); + _emptyStationPos.synchronize(s); + + s.syncAsSint16LE(_card1Pos.x); + s.syncAsSint16LE(_card1Pos.y); + s.syncAsSint16LE(_card2Pos.x); + s.syncAsSint16LE(_card2Pos.y); + s.syncAsSint16LE(_card3Pos.x); + s.syncAsSint16LE(_card3Pos.y); + s.syncAsSint16LE(_card4Pos.x); + s.syncAsSint16LE(_card4Pos.y); + s.syncAsSint16LE(_frameNum); +} + +Scene1337::Scene1337() { + _autoplay = false; + _cardsAvailableNumb = 0; + _currentDiscardIndex = 0; + + for (int i = 0; i < 100; i++) + _availableCardsPile[i] = 0; + + _shuffleEndedFl = false; + _currentPlayerNumb = 0; + _actionPlayerIdx = 0; + _actionVictimIdx = 0; + _showPlayerTurn = false; + _displayHelpFl = false; + _winnerId = -1; + _instructionsDisplayedFl = false; + _instructionsWaitCount = 0; + + _delayedFunction = nullptr; + _actionCard1 = nullptr; + _actionCard2 = nullptr; + _actionCard3 = nullptr; + + _cursorCurRes = 0; + _cursorCurStrip = 0; + _cursorCurFrame = 0; +} + +void Scene1337::synchronize(Serializer &s) { + _actionCard1->synchronize(s); + _actionCard2->synchronize(s); + _actionCard3->synchronize(s); + _animatedCard.synchronize(s); + _shuffleAnimation.synchronize(s); + _discardedPlatformCard.synchronize(s); + _selectedCard.synchronize(s); + _discardPile.synchronize(s); + _stockCard.synchronize(s); + _aSound1.synchronize(s); + _aSound2.synchronize(s); + _helpIcon.synchronize(s); + _stockPile.synchronize(s); + _actionItem.synchronize(s); + _currentPlayerArrow.synchronize(s); + + for (int i = 0; i < 4; i++) + _gameBoardSide[i].synchronize(s); + + for (int i = 0; i < 8; i++) { + _upperDisplayCard[i].synchronize(s); + _lowerDisplayCard[i].synchronize(s); + } + + // TODO s.syncPointer(_delayedFunction); + s.syncAsByte(_autoplay); + s.syncAsByte(_shuffleEndedFl); + s.syncAsByte(_showPlayerTurn); + s.syncAsByte(_displayHelpFl); + s.syncAsByte(_instructionsDisplayedFl); + s.syncAsSint16LE(_currentDiscardIndex); + s.syncAsSint16LE(_cardsAvailableNumb); + s.syncAsSint16LE(_currentPlayerNumb); + s.syncAsSint16LE(_actionPlayerIdx); + s.syncAsSint16LE(_actionVictimIdx); + s.syncAsSint16LE(_winnerId); + s.syncAsSint16LE(_instructionsWaitCount); + s.syncAsSint16LE(_cursorCurRes); + s.syncAsSint16LE(_cursorCurStrip); + s.syncAsSint16LE(_cursorCurFrame); + + for (int i = 0; i < 100; i++) + s.syncAsSint16LE(_availableCardsPile[i]); + +} + +void Scene1337::Action1337::waitFrames(int32 frameCount) { + uint32 firstFrameNumber = g_globals->_events.getFrameNumber(); + uint32 curFrame = firstFrameNumber; + uint32 destFrame = firstFrameNumber + frameCount; + + while ((curFrame < destFrame) && !g_vm->shouldQuit()) { + TsAGE::Event event; + g_globals->_events.getEvent(event); + curFrame = g_globals->_events.getFrameNumber(); + } + + // CHECKME: The original is calling _eventManager.waitEvent(); +} + +/** + * Display instructions + */ +void Scene1337::Action1::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 1: { + scene->actionDisplay(1331, 6, 159, 10, 1, 200, 0, 7, 0, 154, 154); + R2_GLOBALS._sceneObjects->draw(); + scene->actionDisplay(1331, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154); + scene->actionDisplay(1331, 8, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + scene->_gameBoardSide[1]._outpostStation[0]._cardId = 2; + scene->_gameBoardSide[1]._outpostStation[0]._card.postInit(); + scene->_gameBoardSide[1]._outpostStation[0]._card.setVisage(1332); + scene->_gameBoardSide[1]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[1]._outpostStation[0]._stationPos, 0); + scene->_gameBoardSide[1]._outpostStation[0]._card.setStrip(2); + scene->_gameBoardSide[1]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[1]._outpostStation[0]._cardId); + scene->_gameBoardSide[1]._outpostStation[0]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[1]._outpostStation[0]); + + scene->_gameBoardSide[1]._outpostStation[1]._cardId = 3; + scene->_gameBoardSide[1]._outpostStation[1]._card.postInit(); + scene->_gameBoardSide[1]._outpostStation[1]._card.setVisage(1332); + scene->_gameBoardSide[1]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[1]._outpostStation[1]._stationPos, 0); + scene->_gameBoardSide[1]._outpostStation[1]._card.setStrip(2); + scene->_gameBoardSide[1]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[1]._outpostStation[1]._cardId); + scene->_gameBoardSide[1]._outpostStation[1]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[1]._outpostStation[1]); + + scene->_gameBoardSide[2]._outpostStation[0]._cardId = 4; + scene->_gameBoardSide[2]._outpostStation[0]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[0]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[0]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[0]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[0]._cardId); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[0]); + + scene->_gameBoardSide[3]._outpostStation[0]._cardId = 5; + scene->_gameBoardSide[3]._outpostStation[0]._card.postInit(); + scene->_gameBoardSide[3]._outpostStation[0]._card.setVisage(1332); + scene->_gameBoardSide[3]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[0]._stationPos, 0); + scene->_gameBoardSide[3]._outpostStation[0]._card.setStrip(2); + scene->_gameBoardSide[3]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[0]._cardId); + scene->_gameBoardSide[3]._outpostStation[0]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[0]); + + scene->_gameBoardSide[3]._outpostStation[1]._cardId = 6; + scene->_gameBoardSide[3]._outpostStation[1]._card.postInit(); + scene->_gameBoardSide[3]._outpostStation[1]._card.setVisage(1332); + scene->_gameBoardSide[3]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[1]._stationPos, 0); + scene->_gameBoardSide[3]._outpostStation[1]._card.setStrip(2); + scene->_gameBoardSide[3]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[1]._cardId); + scene->_gameBoardSide[3]._outpostStation[1]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[1]); + + scene->_gameBoardSide[3]._outpostStation[2]._cardId = 7; + scene->_gameBoardSide[3]._outpostStation[2]._card.postInit(); + scene->_gameBoardSide[3]._outpostStation[2]._card.setVisage(1332); + scene->_gameBoardSide[3]._outpostStation[2]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[2]._stationPos, 0); + scene->_gameBoardSide[3]._outpostStation[2]._card.setStrip(2); + scene->_gameBoardSide[3]._outpostStation[2]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[2]._cardId); + scene->_gameBoardSide[3]._outpostStation[2]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[2]); + + scene->_gameBoardSide[0]._outpostStation[0]._cardId = 8; + scene->_gameBoardSide[0]._outpostStation[0]._card.postInit(); + scene->_gameBoardSide[0]._outpostStation[0]._card.setVisage(1332); + scene->_gameBoardSide[0]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[0]._outpostStation[0]._stationPos, 0); + scene->_gameBoardSide[0]._outpostStation[0]._card.setStrip(2); + scene->_gameBoardSide[0]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[0]._outpostStation[0]._cardId); + scene->_gameBoardSide[0]._outpostStation[0]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[0]._outpostStation[0]); + + scene->_gameBoardSide[0]._outpostStation[1]._cardId = 9; + scene->_gameBoardSide[0]._outpostStation[1]._card.postInit(); + scene->_gameBoardSide[0]._outpostStation[1]._card.setVisage(1332); + scene->_gameBoardSide[0]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[0]._outpostStation[1]._stationPos, 0); + scene->_gameBoardSide[0]._outpostStation[1]._card.setStrip(2); + scene->_gameBoardSide[0]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[0]._outpostStation[1]._cardId); + scene->_gameBoardSide[0]._outpostStation[1]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[0]._outpostStation[1]); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(60); + scene->actionDisplay(1331, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + scene->_gameBoardSide[2]._outpostStation[1]._cardId = 2; + scene->_gameBoardSide[2]._outpostStation[1]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[1]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[1]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[1]._cardId); + scene->_gameBoardSide[2]._outpostStation[1]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]); + + scene->_gameBoardSide[2]._outpostStation[2]._cardId = 3; + scene->_gameBoardSide[2]._outpostStation[2]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[2]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[2]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[2]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[2]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[2]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[2]._cardId); + scene->_gameBoardSide[2]._outpostStation[2]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[2]); + + scene->_gameBoardSide[2]._outpostStation[3]._cardId = 5; + scene->_gameBoardSide[2]._outpostStation[3]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[3]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[3]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[3]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[3]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[3]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[3]._cardId); + scene->_gameBoardSide[2]._outpostStation[3]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[3]); + + scene->_gameBoardSide[2]._outpostStation[4]._cardId = 6; + scene->_gameBoardSide[2]._outpostStation[4]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[4]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[4]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[4]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[4]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[4]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[4]._cardId); + scene->_gameBoardSide[2]._outpostStation[4]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[4]); + + scene->_gameBoardSide[2]._outpostStation[5]._cardId = 7; + scene->_gameBoardSide[2]._outpostStation[5]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[5]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[5]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[5]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[5]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[5]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[5]._cardId); + scene->_gameBoardSide[2]._outpostStation[5]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[5]); + + scene->_gameBoardSide[2]._outpostStation[6]._cardId = 8; + scene->_gameBoardSide[2]._outpostStation[6]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[6]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[6]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[6]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[6]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[6]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[6]._cardId); + scene->_gameBoardSide[2]._outpostStation[6]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[6]); + + scene->_gameBoardSide[2]._outpostStation[7]._cardId = 9; + scene->_gameBoardSide[2]._outpostStation[7]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[7]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[7]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[7]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[7]._card.setStrip(2); + scene->_gameBoardSide[2]._outpostStation[7]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[7]._cardId); + scene->_gameBoardSide[2]._outpostStation[7]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[7]); + + scene->_aSound1.play(62); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(120); + scene->_gameBoardSide[2]._outpostStation[0]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[1]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[2]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[3]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[4]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[5]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[6]._card.remove(); + scene->_gameBoardSide[2]._outpostStation[7]._card.remove(); + + scene->_gameBoardSide[1]._outpostStation[0]._card.remove(); + scene->_gameBoardSide[1]._outpostStation[1]._card.remove(); + + scene->_gameBoardSide[3]._outpostStation[0]._card.remove(); + scene->_gameBoardSide[3]._outpostStation[1]._card.remove(); + scene->_gameBoardSide[3]._outpostStation[2]._card.remove(); + + scene->_gameBoardSide[0]._outpostStation[0]._card.remove(); + scene->_gameBoardSide[0]._outpostStation[1]._card.remove(); + + scene->_stockPile.setup(1332, 5, 1); + scene->_stockPile.setPosition(Common::Point(162, 95)); + scene->_stockPile.setPriority(110); + scene->_stockPile._effect = EFFECT_SHADED; + scene->_stockPile.show(); + + scene->_gameBoardSide[1]._handCard[0]._card.postInit(); + scene->_gameBoardSide[1]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[1]._handCard[0]._card.setPosition(scene->_gameBoardSide[1]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[1]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[1]._handCard[0]._card.setFrame(4); + scene->_gameBoardSide[1]._handCard[0]._card.fixPriority(170); + + scene->_gameBoardSide[1]._handCard[1]._card.postInit(); + scene->_gameBoardSide[1]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[1]._handCard[1]._card.setPosition(scene->_gameBoardSide[1]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[1]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[1]._handCard[1]._card.setFrame(4); + scene->_gameBoardSide[1]._handCard[1]._card.fixPriority(170); + + scene->_gameBoardSide[1]._handCard[2]._card.postInit(); + scene->_gameBoardSide[1]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[1]._handCard[2]._card.setPosition(scene->_gameBoardSide[1]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[1]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[1]._handCard[2]._card.setFrame(4); + scene->_gameBoardSide[1]._handCard[2]._card.fixPriority(170); + + scene->_gameBoardSide[2]._handCard[0]._cardId = 30; + scene->_gameBoardSide[2]._handCard[0]._card.postInit(); + scene->_gameBoardSide[2]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[0]._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[2]._handCard[0]._card.setFrame(2); + scene->_gameBoardSide[2]._handCard[0]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[0]); + + scene->_gameBoardSide[2]._handCard[1]._cardId = 16; + scene->_gameBoardSide[2]._handCard[1]._card.postInit(); + scene->_gameBoardSide[2]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[1]._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[2]._handCard[1]._card.setFrame(2); + scene->_gameBoardSide[2]._handCard[1]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[1]); + + scene->_gameBoardSide[2]._handCard[2]._cardId = 1; + scene->_gameBoardSide[2]._handCard[2]._card.postInit(); + scene->_gameBoardSide[2]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[2]._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[2]._handCard[2]._card.setFrame(2); + scene->_gameBoardSide[2]._handCard[2]._card.fixPriority(170); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[2]); + + scene->_gameBoardSide[3]._handCard[0]._card.postInit(); + scene->_gameBoardSide[3]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[3]._handCard[0]._card.setPosition(scene->_gameBoardSide[3]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[3]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[3]._handCard[0]._card.setFrame(3); + scene->_gameBoardSide[3]._handCard[0]._card.fixPriority(170); + + scene->_gameBoardSide[3]._handCard[1]._card.postInit(); + scene->_gameBoardSide[3]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[3]._handCard[1]._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[3]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[3]._handCard[1]._card.setFrame(3); + scene->_gameBoardSide[3]._handCard[1]._card.fixPriority(170); + + scene->_gameBoardSide[3]._handCard[2]._card.postInit(); + scene->_gameBoardSide[3]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[3]._handCard[2]._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[3]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[3]._handCard[2]._card.setFrame(3); + scene->_gameBoardSide[3]._handCard[2]._card.fixPriority(170); + + scene->_gameBoardSide[0]._handCard[0]._card.postInit(); + scene->_gameBoardSide[0]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[0]._handCard[0]._card.setPosition(scene->_gameBoardSide[0]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[0]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[0]._handCard[0]._card.setFrame(2); + scene->_gameBoardSide[0]._handCard[0]._card.fixPriority(170); + + scene->_gameBoardSide[0]._handCard[1]._card.postInit(); + scene->_gameBoardSide[0]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[0]._handCard[1]._card.setPosition(scene->_gameBoardSide[0]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[0]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[0]._handCard[1]._card.setFrame(2); + scene->_gameBoardSide[0]._handCard[1]._card.fixPriority(170); + + scene->_gameBoardSide[0]._handCard[2]._card.postInit(); + scene->_gameBoardSide[0]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[0]._handCard[2]._card.setPosition(scene->_gameBoardSide[0]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[0]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[0]._handCard[2]._card.setFrame(2); + scene->_gameBoardSide[0]._handCard[2]._card.fixPriority(170); + + R2_GLOBALS._sceneObjects->draw(); + + scene->actionDisplay(1331, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154); + scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0); + scene->_animatedCard._card.show(); + scene->_aSound2.play(61); + + Common::Point pt(91, 174); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + } + break; + case 2: { + scene->_gameBoardSide[2]._handCard[3]._cardId = 2; + scene->_gameBoardSide[2]._handCard[3]._card.postInit(); + scene->_gameBoardSide[2]._handCard[3]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[3]._card.setPosition(scene->_gameBoardSide[2]._handCard[3]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[3]._card.setStrip(1); + scene->_gameBoardSide[2]._handCard[3]._card.setFrame(2); + scene->_gameBoardSide[2]._handCard[3]._card.fixPriority(170); + + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[3]); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(60); + scene->actionDisplay(1331, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + scene->actionDisplay(1331, 12, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + scene->_gameBoardSide[2]._outpostStation[1]._cardId = 1; + scene->_gameBoardSide[2]._outpostStation[1]._card.postInit(); + scene->_gameBoardSide[2]._outpostStation[1]._card.setVisage(1332); + scene->_gameBoardSide[2]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0); + scene->_gameBoardSide[2]._outpostStation[1]._card.hide(); + + scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[2]._card._strip); + scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._card._frame); + scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL); + + scene->_gameBoardSide[2]._handCard[2]._cardId = 0; + scene->_gameBoardSide[2]._handCard[2]._card.remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._outpostStation[1]._stationPos, this); + } + break; + case 3: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]); + scene->_aSound1.play(59); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(60); + scene->actionDisplay(1331, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + scene->_gameBoardSide[2]._outpostStation[1]._cardId = scene->_gameBoardSide[2]._handCard[3]._cardId; + + scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[3]._card._strip); + scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[3]._card._frame); + + scene->_gameBoardSide[2]._handCard[3]._cardId = 0; + scene->_gameBoardSide[2]._handCard[3]._card.remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[3]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._outpostStation[1]._stationPos, this); + } + break; + case 4: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]); + scene->_aSound1.play(59); + + scene->_discardPile._cardId = 1; + scene->_discardPile._card.hide(); + + scene->_animatedCard._card.setStrip(5); + scene->_animatedCard._card.setFrame(1); + scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); + } + break; + case 5: { + scene->_animatedCard._card.hide(); + + scene->_discardPile._card.postInit(); + scene->_discardPile._card.setVisage(1332); + scene->_discardPile._card.setPosition(scene->_discardPile._stationPos, 0); + scene->setAnimationInfo(&scene->_discardPile); + scene->_aSound2.play(61); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(60); + scene->actionDisplay(1331, 14, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + scene->_gameBoardSide[2]._delayCard._card.postInit(); + scene->_gameBoardSide[2]._delayCard._card.setVisage(1332); + scene->_gameBoardSide[2]._delayCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); + scene->_gameBoardSide[2]._delayCard._card.hide(); + + scene->_gameBoardSide[3]._handCard[2]._cardId = 0; + scene->_gameBoardSide[3]._handCard[2].remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this); + } + break; + case 6: { + scene->_animatedCard._card.hide(); + scene->_gameBoardSide[2]._delayCard._cardId = 21; + scene->setAnimationInfo(&scene->_gameBoardSide[2]._delayCard); + scene->_aSound1.play(57); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(60); + scene->actionDisplay(1331, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + int tmpVal = 15; + int i = -1; + + for (i = 0; i <= 7; i++) { + tmpVal += 29; + + scene->_upperDisplayCard[i].postInit(); + scene->_upperDisplayCard[i].setVisage(1332); + scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 90), 0); + scene->_upperDisplayCard[i].setStrip(3); + scene->_upperDisplayCard[i].fixPriority(190); + + scene->_lowerDisplayCard[i].postInit(); + scene->_lowerDisplayCard[i].setVisage(1332); + scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 90), 0); + scene->_lowerDisplayCard[i].setStrip(7); + scene->_lowerDisplayCard[i].setFrame(1); + scene->_lowerDisplayCard[i].fixPriority(180); + } + + scene->_upperDisplayCard[0].setFrame(1); + scene->_upperDisplayCard[1].setFrame(3); + scene->_upperDisplayCard[2].setFrame(6); + scene->_upperDisplayCard[3].setFrame(8); + scene->_upperDisplayCard[4].setFrame(9); + scene->_upperDisplayCard[5].setFrame(10); + scene->_upperDisplayCard[6].setFrame(11); + scene->_upperDisplayCard[7].setFrame(12); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(240); + + scene->_upperDisplayCard[0].remove(); + scene->_upperDisplayCard[1].remove(); + scene->_upperDisplayCard[2].remove(); + scene->_upperDisplayCard[3].remove(); + scene->_upperDisplayCard[4].remove(); + scene->_upperDisplayCard[5].remove(); + scene->_upperDisplayCard[6].remove(); + scene->_upperDisplayCard[7].remove(); + + scene->_lowerDisplayCard[0].remove(); + scene->_lowerDisplayCard[1].remove(); + scene->_lowerDisplayCard[2].remove(); + scene->_lowerDisplayCard[3].remove(); + scene->_lowerDisplayCard[4].remove(); + scene->_lowerDisplayCard[5].remove(); + scene->_lowerDisplayCard[6].remove(); + scene->_lowerDisplayCard[7].remove(); + + scene->_discardPile._cardId = scene->_gameBoardSide[2]._delayCard._cardId; + + scene->_gameBoardSide[2]._delayCard._cardId = 0; + scene->_gameBoardSide[2]._delayCard._card.remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); + } + break; + case 7: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_discardPile); + scene->_aSound2.play(61); + + R2_GLOBALS._sceneObjects->draw(); + + scene->_gameBoardSide[2]._delayCard._card.postInit(); + scene->_gameBoardSide[2]._delayCard._card.setVisage(1332); + scene->_gameBoardSide[2]._delayCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); + scene->_gameBoardSide[2]._delayCard._card.hide(); + + scene->_gameBoardSide[3]._handCard[1]._cardId = 0; + scene->_gameBoardSide[3]._handCard[1].remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this); + } + break; + case 8: { + scene->_animatedCard._card.hide(); + scene->_gameBoardSide[2]._delayCard._cardId = 14; + scene->setAnimationInfo(&scene->_gameBoardSide[2]._delayCard); + scene->_aSound1.play(57); + + R2_GLOBALS._sceneObjects->draw(); + + scene->actionDisplay(1331, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154); + int tmpVal = 72; + int i = -1; + + for (i = 0; i <= 3; i++) { + tmpVal += 29; + scene->_upperDisplayCard[i].postInit(); + scene->_upperDisplayCard[i].setVisage(1332); + scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 71), 0); + scene->_upperDisplayCard[i].setStrip(3); + scene->_upperDisplayCard[i].fixPriority(190); + + scene->_lowerDisplayCard[i].postInit(); + scene->_lowerDisplayCard[i].setVisage(1332); + scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 71), 0); + scene->_lowerDisplayCard[i].setStrip(7); + scene->_lowerDisplayCard[i].setFrame(1); + scene->_lowerDisplayCard[i].fixPriority(180); + } + + scene->_upperDisplayCard[0].setFrame(2); + scene->_upperDisplayCard[1].setFrame(5); + scene->_upperDisplayCard[2].setFrame(7); + scene->_upperDisplayCard[3].setFrame(15); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(240); + scene->actionDisplay(1331, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + tmpVal = 72; + for (i = 4; i <= 7; i++) { + tmpVal += 29; + + scene->_upperDisplayCard[i].postInit(); + scene->_upperDisplayCard[i].setVisage(1332); + scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 100), 0); + scene->_upperDisplayCard[i].setStrip(4); + scene->_upperDisplayCard[i].fixPriority(190); + + scene->_lowerDisplayCard[i].postInit(); + scene->_lowerDisplayCard[i].setVisage(1332); + scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 100), 0); + scene->_lowerDisplayCard[i].setStrip(7); + scene->_lowerDisplayCard[i].setFrame(1); + scene->_lowerDisplayCard[i].fixPriority(180); + } + + scene->_upperDisplayCard[4].setFrame(1); + scene->_upperDisplayCard[5].setFrame(5); + scene->_upperDisplayCard[6].setFrame(7); + scene->_upperDisplayCard[7].setFrame(3); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(240); + + scene->_upperDisplayCard[0].remove(); + scene->_upperDisplayCard[1].remove(); + scene->_upperDisplayCard[2].remove(); + scene->_upperDisplayCard[3].remove(); + scene->_upperDisplayCard[4].remove(); + scene->_upperDisplayCard[5].remove(); + scene->_upperDisplayCard[6].remove(); + scene->_upperDisplayCard[7].remove(); + + scene->_lowerDisplayCard[0].remove(); + scene->_lowerDisplayCard[1].remove(); + scene->_lowerDisplayCard[2].remove(); + scene->_lowerDisplayCard[3].remove(); + scene->_lowerDisplayCard[4].remove(); + scene->_lowerDisplayCard[5].remove(); + scene->_lowerDisplayCard[6].remove(); + scene->_lowerDisplayCard[7].remove(); + + scene->_discardPile._cardId = scene->_gameBoardSide[2]._handCard[0]._cardId; + + scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[0]._card._strip); + scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._card._frame); + scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL); + + scene->_gameBoardSide[2]._handCard[0]._cardId = 0; + scene->_gameBoardSide[2]._handCard[0]._card.remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this); + } + break; + case 9: { + scene->_aSound1.play(58); + scene->_gameBoardSide[2]._delayCard._cardId = 0; + scene->_gameBoardSide[2]._delayCard.remove(); + scene->_animatedCard._card.setStrip(5); + scene->_animatedCard._card.setFrame(1); + scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); + } + break; + case 10: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_discardPile); + scene->_aSound2.play(61); + + R2_GLOBALS._sceneObjects->draw(); + scene->actionDisplay(1331, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + scene->_upperDisplayCard[0].postInit(); + scene->_upperDisplayCard[0].setVisage(1332); + scene->_upperDisplayCard[0].setPosition(Common::Point(131, 71), 0); + scene->_upperDisplayCard[0].fixPriority(190); + scene->_upperDisplayCard[0].setStrip(3); + scene->_upperDisplayCard[0].setFrame(4); + + scene->_lowerDisplayCard[0].postInit(); + scene->_lowerDisplayCard[0].setVisage(1332); + scene->_lowerDisplayCard[0].setPosition(Common::Point(131, 71), 0); + scene->_lowerDisplayCard[0].setStrip(7); + scene->_lowerDisplayCard[0].setFrame(1); + scene->_lowerDisplayCard[0].fixPriority(180); + + scene->_upperDisplayCard[1].postInit(); + scene->_upperDisplayCard[1].setVisage(1332); + scene->_upperDisplayCard[1].setPosition(Common::Point(160, 71), 0); + scene->_upperDisplayCard[1].fixPriority(190); + scene->_upperDisplayCard[1].setStrip(3); + scene->_upperDisplayCard[1].setFrame(16); + + scene->_lowerDisplayCard[1].postInit(); + scene->_lowerDisplayCard[1].setVisage(1332); + scene->_lowerDisplayCard[1].setPosition(Common::Point(160, 71), 0); + scene->_lowerDisplayCard[1].setStrip(7); + scene->_lowerDisplayCard[1].setFrame(1); + scene->_lowerDisplayCard[1].fixPriority(180); + + scene->_upperDisplayCard[2].postInit(); + scene->_upperDisplayCard[2].setVisage(1332); + scene->_upperDisplayCard[2].setPosition(Common::Point(131, 100), 0); + scene->_upperDisplayCard[2].fixPriority(190); + scene->_upperDisplayCard[2].setStrip(4); + scene->_upperDisplayCard[2].setFrame(4); + + scene->_lowerDisplayCard[2].postInit(); + scene->_lowerDisplayCard[2].setVisage(1332); + scene->_lowerDisplayCard[2].setPosition(Common::Point(131, 100), 0); + scene->_lowerDisplayCard[2].setStrip(7); + scene->_lowerDisplayCard[2].setFrame(1); + scene->_lowerDisplayCard[2].fixPriority(180); + + scene->_upperDisplayCard[3].postInit(); + scene->_upperDisplayCard[3].setVisage(1332); + scene->_upperDisplayCard[3].setPosition(Common::Point(160, 100), 0); + scene->_upperDisplayCard[3].fixPriority(190); + scene->_upperDisplayCard[3].setStrip(4); + scene->_upperDisplayCard[3].setFrame(2); + + scene->_lowerDisplayCard[3].postInit(); + scene->_lowerDisplayCard[3].setVisage(1332); + scene->_lowerDisplayCard[3].setPosition(Common::Point(160, 100), 0); + scene->_lowerDisplayCard[3].setStrip(7); + scene->_lowerDisplayCard[3].setFrame(1); + scene->_lowerDisplayCard[3].fixPriority(180); + + R2_GLOBALS._sceneObjects->draw(); + + waitFrames(240); + + scene->_upperDisplayCard[0].remove(); + scene->_upperDisplayCard[1].remove(); + scene->_upperDisplayCard[2].remove(); + scene->_upperDisplayCard[3].remove(); + + scene->_lowerDisplayCard[0].remove(); + scene->_lowerDisplayCard[1].remove(); + scene->_lowerDisplayCard[2].remove(); + scene->_lowerDisplayCard[3].remove(); + + scene->_currentPlayerArrow.setFrame(1); + scene->_currentPlayerArrow.show(); + scene->_currentPlayerArrow.animate(ANIM_MODE_2, NULL); + + R2_GLOBALS._sceneObjects->draw(); + + scene->actionDisplay(1331, 19, 159, 10, 1, 220, 0, 7, 0, 154, 154); + + scene->_currentPlayerArrow.hide(); + + scene->actionDisplay(1331, 20, 159, 10, 1, 220, 0, 7, 0, 154, 154); + scene->actionDisplay(1331, 21, 159, 10, 1, 220, 0, 7, 0, 154, 154); + + scene->_discardPile._cardId = scene->_gameBoardSide[2]._handCard[1]._cardId; + + scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[1]._card._strip); + scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._card._frame); + scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL); + + scene->_gameBoardSide[2]._handCard[1]._cardId = 0; + scene->_gameBoardSide[2]._handCard[1]._card.remove(); + + scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); + } + break; + case 11: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_discardPile); + scene->_aSound2.play(61); + scene->_animatedCard._card.setStrip(5); + scene->_animatedCard._card.setFrame(1); + scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); + + R2_GLOBALS._sceneObjects->draw(); + + scene->actionDisplay(1331, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + int i = -1; + for (i = 0; i <= 3; i ++) { + scene->_gameBoardSide[3]._handCard[i]._cardId = 0; + scene->_gameBoardSide[3]._handCard[i]._card.remove(); + + scene->_gameBoardSide[2]._handCard[i]._cardId = 0; + scene->_gameBoardSide[2]._handCard[i]._card.remove(); + + scene->_gameBoardSide[0]._handCard[i]._cardId = 0; + scene->_gameBoardSide[0]._handCard[i]._card.remove(); + + scene->_gameBoardSide[1]._handCard[i]._cardId = 0; + scene->_gameBoardSide[1]._handCard[i]._card.remove(); + } + + for (i = 0; i <= 7; i++) { + scene->_gameBoardSide[3]._outpostStation[i]._cardId = 0; + scene->_gameBoardSide[3]._outpostStation[i]._card.remove(); + + scene->_gameBoardSide[2]._outpostStation[i]._cardId = 0; + scene->_gameBoardSide[2]._outpostStation[i]._card.remove(); + + scene->_gameBoardSide[0]._outpostStation[i]._cardId = 0; + scene->_gameBoardSide[0]._outpostStation[i]._card.remove(); + + scene->_gameBoardSide[1]._outpostStation[i]._cardId = 0; + scene->_gameBoardSide[1]._outpostStation[i]._card.remove(); + } + + scene->_gameBoardSide[2]._delayCard._cardId = 0; + scene->_gameBoardSide[2]._delayCard._card.remove(); + + scene->_discardPile._cardId = 0; + scene->_discardPile._card.remove(); + + scene->_stockPile.remove(); + } + // No break on purpose + case 0: + R2_GLOBALS._sceneObjects->draw(); + signal(); + break; + case 12: + scene->suggestInstructions(); + remove(); + break; + default: + break; + } +} + +/** + * Shuffle cards animation + */ +void Scene1337::Action2::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_shuffleAnimation._card.postInit(); + scene->_shuffleAnimation._card.setVisage(1332); + scene->_shuffleAnimation._card.setStrip(8); + scene->_shuffleAnimation._card.setFrame(1); + scene->_shuffleAnimation._card.fixPriority(300); + scene->_shuffleAnimation._card.setPosition(Common::Point(156, 108)); + + scene->_discardPile._card.remove(); + scene->_discardPile._cardId = 0; + + scene->_aSound1.play(60); + scene->_shuffleAnimation._card.animate(ANIM_MODE_5, this); + break; + case 1: + scene->_shuffleAnimation._card.setFrame(1); + + scene->_aSound1.play(60); + scene->_shuffleAnimation._card.animate(ANIM_MODE_5, this); + break; + case 2: { + Common::Point pt(156, 108); + NpcMover *mover = new NpcMover(); + scene->_shuffleAnimation._card.addMover(mover, &pt, this); + } + break; + case 3: + scene->_shuffleAnimation._card.remove(); + scene->_stockPile.setup(1332, 5, 1); + scene->_stockPile.setPosition(Common::Point(162, 95)); + scene->_stockPile.setPriority(110); + scene->_stockPile._effect = EFFECT_SHADED; + scene->_stockPile.show(); + scene->_shuffleEndedFl = true; + break; + default: + break; + } +} + +/** + * Deal cards + */ +void Scene1337::Action3::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0); + + switch (_actionIndex++) { + case 0: { + scene->_animatedCard._card._moveDiff = Common::Point(30, 30); + scene->_animatedCard._card.setVisage(1332); + scene->_animatedCard._card.setStrip(5); + scene->_animatedCard._card.setFrame(1); + scene->_animatedCard._card.fixPriority(400); + scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); + scene->_aSound2.play(61); + + Common::Point pt(283, 146); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_animatedCard._card.show(); + scene->_gameBoardSide[1]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 1: { + scene->_gameBoardSide[1]._handCard[0]._card.postInit(); + scene->_gameBoardSide[1]._handCard[0]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[1]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[1]._handCard[0]._card.setPosition(scene->_gameBoardSide[1]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[1]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[1]._handCard[0]._card.setFrame(4); + scene->_gameBoardSide[1]._handCard[0]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(10, 174); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[2]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 2: { + scene->_gameBoardSide[2]._handCard[0]._card.postInit(); + scene->_gameBoardSide[2]._handCard[0]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[2]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[0]._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[0]._card.fixPriority(170); + if (scene->_gameBoardSide[2]._handCard[0]._cardId > 25) { + scene->_gameBoardSide[2]._handCard[0]._card.setStrip(4); + scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId - 25); + } else if (scene->_gameBoardSide[2]._handCard[0]._cardId > 9) { + scene->_gameBoardSide[2]._handCard[0]._card.setStrip(3); + scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId - 9); + } else { + scene->_gameBoardSide[2]._handCard[0]._card.setStrip(2); + scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId); + } + scene->_aSound2.play(61); + + Common::Point pt(14, 14); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[3]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 3: { + scene->_gameBoardSide[3]._handCard[0]._card.postInit(); + scene->_gameBoardSide[3]._handCard[0]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[3]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[3]._handCard[0]._card.setPosition(scene->_gameBoardSide[3]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[3]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[3]._handCard[0]._card.setFrame(3); + scene->_gameBoardSide[3]._handCard[0]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(280, 5); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[0]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 4: { + scene->_gameBoardSide[0]._handCard[0]._card.postInit(); + scene->_gameBoardSide[0]._handCard[0]._card._moveDiff = Common::Point(30,30); + scene->_gameBoardSide[0]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[0]._handCard[0]._card.setPosition(scene->_gameBoardSide[0]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[0]._handCard[0]._card.setStrip(5); + scene->_gameBoardSide[0]._handCard[0]._card.setFrame(1); + scene->_gameBoardSide[0]._handCard[0]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(283, 124); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[1]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 5: { + scene->_gameBoardSide[1]._handCard[1]._card.postInit(); + scene->_gameBoardSide[1]._handCard[1]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[1]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[1]._handCard[1]._card.setPosition(scene->_gameBoardSide[1]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[1]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[1]._handCard[1]._card.setFrame(4); + scene->_gameBoardSide[1]._handCard[1]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(37, 174); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[2]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 6: { + scene->_gameBoardSide[2]._handCard[1]._card.postInit(); + scene->_gameBoardSide[2]._handCard[1]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[2]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[1]._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[1]._card.fixPriority(170); + + if (scene->_gameBoardSide[2]._handCard[1]._cardId > 25) { + scene->_gameBoardSide[2]._handCard[1]._card.setStrip(4); + scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId - 25); + } else if (scene->_gameBoardSide[2]._handCard[1]._cardId > 9) { + scene->_gameBoardSide[2]._handCard[1]._card.setStrip(3); + scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId - 9); + } else { + scene->_gameBoardSide[2]._handCard[1]._card.setStrip(2); + scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId); + } + + scene->_aSound2.play(61); + + Common::Point pt(14, 36); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[3]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 7: { + scene->_gameBoardSide[3]._handCard[1]._card.postInit(); + scene->_gameBoardSide[3]._handCard[1]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[3]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[3]._handCard[1]._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos); + scene->_gameBoardSide[3]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[3]._handCard[1]._card.setFrame(3); + scene->_gameBoardSide[3]._handCard[1]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(253, 5); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[0]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 8: { + scene->_gameBoardSide[0]._handCard[1]._card.postInit(); + scene->_gameBoardSide[0]._handCard[1]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[0]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[0]._handCard[1]._card.setPosition(scene->_gameBoardSide[0]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[0]._handCard[1]._card.setStrip(5); + scene->_gameBoardSide[0]._handCard[1]._card.setFrame(1); + scene->_gameBoardSide[0]._handCard[1]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(283, 102); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[1]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 9: { + scene->_gameBoardSide[1]._handCard[2]._card.postInit(); + scene->_gameBoardSide[1]._handCard[2]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[1]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[1]._handCard[2]._card.setPosition(scene->_gameBoardSide[1]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[1]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[1]._handCard[2]._card.setFrame(4); + scene->_gameBoardSide[1]._handCard[2]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(64, 174); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[2]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 10: { + scene->_gameBoardSide[2]._handCard[2]._card.postInit(); + scene->_gameBoardSide[2]._handCard[2]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[2]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[2]._handCard[2]._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[2]._handCard[2]._card.fixPriority(170); + + if (scene->_gameBoardSide[2]._handCard[2]._cardId > 25) { + scene->_gameBoardSide[2]._handCard[2]._card.setStrip(4); + scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId - 25); + } else if (scene->_gameBoardSide[2]._handCard[2]._cardId > 9) { + scene->_gameBoardSide[2]._handCard[2]._card.setStrip(3); + scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId - 9); + } else { + scene->_gameBoardSide[2]._handCard[2]._card.setStrip(2); + scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId); + } + + scene->_aSound2.play(61); + + Common::Point pt(14, 58); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[3]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 11: { + scene->_gameBoardSide[3]._handCard[2]._card.postInit(); + scene->_gameBoardSide[3]._handCard[2]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[3]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[3]._handCard[2]._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[3]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[3]._handCard[2]._card.setFrame(3); + scene->_gameBoardSide[3]._handCard[2]._card.fixPriority(170); + scene->_aSound2.play(61); + + Common::Point pt(226, 5); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + + scene->_gameBoardSide[0]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + } + break; + case 12: + scene->_gameBoardSide[0]._handCard[2]._card.postInit(); + scene->_gameBoardSide[0]._handCard[2]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[0]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[0]._handCard[2]._card.setPosition(scene->_gameBoardSide[0]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[0]._handCard[2]._card.setStrip(5); + scene->_gameBoardSide[0]._handCard[2]._card.setFrame(1); + scene->_gameBoardSide[0]._handCard[2]._card.fixPriority(170); + scene->_animatedCard._card.hide(); + default: + break; + } + + if (_actionIndex > 12) { + scene->_currentPlayerNumb = 0; + R2_GLOBALS._sceneObjects->draw(); + scene->actionDisplay(1330, 0, 159, 10, 1, 200, 0, 7, 0, 154, 154); + scene->handleNextTurn(); + } else if (_actionIndex >= 1) { + scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; + scene->_cardsAvailableNumb--; + } +} + +/** + * Action used to handle the other players' turn + */ +void Scene1337::Action4::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId == 0) + && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { + if (scene->_cardsAvailableNumb < 0) + scene->shuffleCards(); + scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0); + scene->_animatedCard._card.show(); + scene->_aSound2.play(61); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos, this); + + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; + scene->_cardsAvailableNumb--; + + if (scene->_cardsAvailableNumb < 0) + scene->_stockPile.remove(); + } else { + // Self call, forcing next actionIndex + signal(); + } + break; + case 1: + if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos.x) + && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos.y) ) { + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.postInit(); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setVisage(1332); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._stationPos, 0); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setStrip(1); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.fixPriority(170); + } + + if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) + scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]); + + scene->_animatedCard._card.hide(); + if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._cardId == 0) + && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { + if (scene->_cardsAvailableNumb < 0) + scene->shuffleCards(); + scene->_animatedCard._card.setPosition(Common::Point(162, 95)); + scene->_animatedCard._card.show(); + + scene->_aSound2.play(61); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos, this); + + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; + scene->_cardsAvailableNumb--; + if (scene->_cardsAvailableNumb < 0) + scene->_stockPile.remove(); + } else + signal(); + break; + case 2: + if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos.x) + && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos.y) ) { + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.postInit(); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setVisage(1332); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._stationPos, 0); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setStrip(1); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.fixPriority(170); + } + + if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) + scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]); + + scene->_animatedCard._card.hide(); + if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._cardId == 0) + && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { + if (scene->_cardsAvailableNumb < 0) + scene->shuffleCards(); + scene->_animatedCard._card.setPosition(Common::Point(162, 95)); + scene->_animatedCard._card.show(); + + scene->_aSound2.play(61); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos, this); + + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; + scene->_cardsAvailableNumb--; + if (scene->_cardsAvailableNumb < 0) + scene->_stockPile.remove(); + } else + signal(); + break; + case 3: + if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos.x) + && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos.y) ) { + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.postInit(); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setVisage(1332); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._stationPos, 0); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setStrip(1); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.fixPriority(170); + } + + if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) + scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]); + + scene->_animatedCard._card.hide(); + if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._cardId == 0) + && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { + if (scene->_cardsAvailableNumb < 0) + scene->shuffleCards(); + scene->_animatedCard._card.setPosition(Common::Point(162, 95)); + scene->_animatedCard._card.show(); + + scene->_aSound2.play(61); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos, this); + + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; + scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; + scene->_cardsAvailableNumb--; + if (scene->_cardsAvailableNumb < 0) + scene->_stockPile.remove(); + } else + signal(); + break; + case 4: + if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos.x) + && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos.y) ) { + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.postInit(); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card._moveDiff = Common::Point(30, 30); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setVisage(1332); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._stationPos, 0); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setStrip(1); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); + scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.fixPriority(170); + } + + if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) + scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]); + + scene->_animatedCard._card.hide(); + switch (scene->_currentPlayerNumb) { + case 0: + scene->handlePlayer0(); + break; + case 1: + scene->handlePlayer1(); + break; + case 2: + scene->handleAutoplayPlayer2(); + break; + case 3: + scene->handlePlayer3(); + break; + default: + break; + } + break; + default: + break; + } +} + +/** + * Animations for discarding a card + */ +void Scene1337::Action5::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard1->_cardId; + scene->_currentDiscardIndex--; + if (!g_globals->_sceneObjects->contains(&scene->_discardPile._card)) { + // The first discarded card makes the pile appear + scene->_discardPile._card.postInit(); + scene->_discardPile._card.hide(); + scene->_discardPile._card.setVisage(1332); + scene->_discardPile._card.setPosition(scene->_discardPile._stationPos, 0); + scene->_discardPile._card.fixPriority(170); + } + + scene->_discardPile._cardId = scene->_actionCard1->_cardId; + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + + if (scene->_actionCard1 == &scene->_selectedCard) { + scene->setCursorData(5, 1, 4); + scene->subC4CEC(); + } + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + Common::Point pt(128, 95); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &pt, this); + } + break; + case 1: + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(&scene->_discardPile); + scene->_aSound2.play(61); + scene->handleNextTurn(); + break; + default: + break; + } +} + +/** + * Animations for playing a platform card + */ +void Scene1337::Action6::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_actionCard2->_cardId = 1; + scene->_actionCard2->_card.postInit(); + scene->_actionCard2->_card.hide(); + scene->_actionCard2->_card.setVisage(1332); + scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos); + scene->_actionCard2->_card.fixPriority(170); + + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 1: + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(59); + if (scene->_actionCard1 == &scene->_selectedCard) { + scene->setCursorData(5, 1, 4); + scene->subC4CEC(); + } + scene->handleNextTurn(); + break; + default: + break; + } +} + +/** + * Upgrade platform to station by playing a station card on top of it + */ +void Scene1337::Action7::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; + + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 1: + if (scene->_actionCard1 == &scene->_selectedCard) { + scene->setCursorData(5, 1, 4); + scene->subC4CEC(); + } + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(59); + scene->_discardedPlatformCard._cardId = 1; + scene->_discardedPlatformCard._stationPos = scene->_actionCard2->_stationPos; + scene->_discardedPlatformCard._card.postInit(); + scene->_discardedPlatformCard._card.hide(); + scene->_discardedPlatformCard._card._flags = OBJFLAG_HIDING; + + scene->discardCard(&scene->_discardedPlatformCard); + break; + default: + break; + } +} + +// Remove a delay card +void Scene1337::Action8::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; + scene->_currentDiscardIndex--; + + scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; + scene->_actionCard1->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 1: + scene->_animatedCard._card.hide(); + + if (scene->_actionCard1 == &scene->_selectedCard) { + scene->setCursorData(5, 1, 4); + scene->subC4CEC(); + } + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(58); + scene->discardCard(scene->_actionCard2); + break; + default: + break; + } +} + +// Play delay card +void Scene1337::Action9::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; + scene->_actionCard2->_card.postInit(); + scene->_actionCard2->_card.hide(); + scene->_actionCard2->_card.setVisage(1332); + scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos, 0); + scene->_actionCard2->_card.fixPriority(170); + + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 1: + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(57); + + if (scene->_actionCard1 == &scene->_selectedCard) { + scene->setCursorData(5, 1, 4); + scene->subC4CEC(); + } + + scene->handleNextTurn(); + break; + default: + break; + } +} + +// Play a card on the central outpost. +// This card is either a counter-trick card or a meteor card +void Scene1337::Action10::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_actionCard3->_card.postInit(); + scene->_actionCard3->_card.hide(); + scene->_actionCard3->_card.setVisage(1332); + scene->_actionCard3->_card.setPosition(scene->_actionCard3->_stationPos, 0); + scene->_actionCard3->_card.fixPriority(170); + scene->_actionCard3->_cardId = scene->_actionCard1->_cardId; + + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + + if (scene->_actionCard1 == &scene->_selectedCard) { + scene->setCursorData(5, 1, 4); + scene->subC4CEC(); + } + + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard3->_stationPos, this); + } + break; + case 1: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(scene->_actionCard3); + scene->_aSound1.play(57); + + bool found = false; + int indexFound = -1; + + switch (scene->_actionPlayerIdx) { + case 0: + for (indexFound = 0; indexFound < 3; indexFound++) { + // Check for the presence of an interceptor card + if (scene->_gameBoardSide[0]._handCard[indexFound]._cardId == 29) { + found = true; + break; + } + } + break; + case 1: + for (indexFound = 0; indexFound < 3; indexFound++) { + // Check for the presence of an interceptor card + if (scene->_gameBoardSide[1]._handCard[indexFound]._cardId == 29) { + found = true; + break; + } + } + break; + case 2: + for (indexFound = 0; indexFound < 3; indexFound++) { + // Check for the presence of an interceptor card + if (scene->_gameBoardSide[2]._handCard[indexFound]._cardId == 29) { + found = true; + break; + } + } + break; + case 3: + for (indexFound = 0; indexFound < 3; indexFound++) { + // Check for the presence of an interceptor card + if (scene->_gameBoardSide[3]._handCard[indexFound]._cardId == 29) { + found = true; + break; + } + } + break; + default: + break; + } + + bool found2 = false; + + if (found) { + switch (scene->_actionPlayerIdx) { + case 0: + scene->playInterceptorCard(&scene->_gameBoardSide[0]._handCard[indexFound], scene->_actionCard3); + found2 = true; + break; + case 1: + scene->playInterceptorCard(&scene->_gameBoardSide[1]._handCard[indexFound], scene->_actionCard3); + found2 = true; + break; + case 2: + scene->subC4CD2(); + if (MessageDialog::show(USE_INTERCEPTOR, NO_MSG, YES_MSG) == 0) + scene->subC4CEC(); + else { + scene->playInterceptorCard(&scene->_gameBoardSide[2]._handCard[indexFound], scene->_actionCard3); + found2 = true; + } + break; + case 3: + scene->playInterceptorCard(&scene->_gameBoardSide[3]._handCard[indexFound], scene->_actionCard3); + found2 = true; + break; + default: + break; + } + } + + if (found2) + break; + + if (scene->_actionPlayerIdx == 2) { + int stationCount = 0; + for (int i = 0; i <= 7; i++) { + if (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0) + ++stationCount; + } + + if (stationCount <= 1) { + for (int i = 0; i <= 7; i++) { + if (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0) { + scene->_actionCard2 = &scene->_gameBoardSide[2]._outpostStation[i]; + break; + } + } + } else { + scene->subC4CD2(); + + found2 = false; + while (!found2) { + scene->actionDisplay(1330, 130, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + // Wait for a mouse or keypress + Event event; + while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) { + g_globals->_scenePalette.signalListeners(); + R2_GLOBALS._sceneObjects->draw(); + g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); + } + + scene->_selectedCard._stationPos = event.mousePos; + + for (int i = 0; i <= 7; i++) { + if (scene->_gameBoardSide[2]._outpostStation[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0)) { + scene->_actionCard2 = &scene->_gameBoardSide[2]._outpostStation[i]; + found2 = true; + break; + } + } + } + scene->subC4CEC(); + } + } + + scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; + scene->_currentDiscardIndex--; + scene->_actionCard2->_cardId = 0; + scene->_actionCard2->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard2->_stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard3->_stationPos, this); + } + break; + case 2: + scene->_animatedCard._card.hide(); + scene->discardCard(scene->_actionCard3); + break; + default: + break; + } +} + +// Use Thief card (#25) and pick a card from the opponent +void Scene1337::Action11::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_actionCard2->_card.postInit(); + scene->_actionCard2->_card.hide(); + scene->_actionCard2->_card.setVisage(1332); + scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos, 0); + scene->_actionCard2->_card.fixPriority(170); + scene->_actionCard2->_cardId = 25; + + if (scene->_actionPlayerIdx == 2) { + scene->_animatedCard._card.setPosition(scene->_actionCard2->_stationPos, 0); + scene->setCursorData(5, 1, 4); + } else { + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + } + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 1: { + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(57); + + bool found = false; + bool noAction = true; + + int i = -1; + + switch (scene->_actionVictimIdx) { + case 0: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[0]._handCard[i]._cardId == 27) { + found = true; + break; + } + } + + if ((found) && (scene->getRandomCardFromHand(scene->_actionPlayerIdx) != -1)) { + scene->_actionCard1 = &scene->_gameBoardSide[0]._handCard[i]; + scene->_actionCard2 = &scene->_gameBoardSide[0]._emptyStationPos; + if (scene->_actionPlayerIdx != 0) { + int tmpVal = scene->getRandomCardFromHand(scene->_actionPlayerIdx); + scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionPlayerIdx]._handCard[tmpVal]; + } + scene->_actionItem.setAction(&scene->_action12); + noAction = false; + } + break; + case 1: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[1]._handCard[i]._cardId == 27) { + found = true; + break; + } + } + + if ((found) && (scene->getRandomCardFromHand(scene->_actionPlayerIdx) != -1)) { + scene->_actionCard1 = &scene->_gameBoardSide[1]._handCard[i]; + scene->_actionCard2 = &scene->_gameBoardSide[1]._emptyStationPos; + if (scene->_actionPlayerIdx != 1) { + int tmpVal = scene->getRandomCardFromHand(scene->_actionPlayerIdx); + scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionPlayerIdx]._handCard[tmpVal]; + } + scene->_actionItem.setAction(&scene->_action12); + noAction = false; + } + break; + case 2: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[2]._handCard[i]._cardId == 27) { + found = true; + break; + } + } + + if ((found) && (scene->getRandomCardFromHand(scene->_actionPlayerIdx) != -1)) { + scene->subC4CD2(); + if (MessageDialog::show(USE_DOUBLE_AGENT, NO_MSG, YES_MSG) == 0) + scene->subC4CEC(); + else { + scene->subC4CEC(); + scene->_actionCard1 = &scene->_gameBoardSide[2]._handCard[i]; + scene->_actionCard2 = &scene->_gameBoardSide[2]._emptyStationPos; + if (scene->_actionPlayerIdx != 2) { + int tmpVal = scene->getRandomCardFromHand(scene->_actionPlayerIdx); + scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionPlayerIdx]._handCard[tmpVal]; + } + scene->_actionItem.setAction(&scene->_action12); + noAction = false; + } + } + break; + case 3: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[3]._handCard[i]._cardId == 27) { + found = true; + break; + } + } + + if ((found) && (scene->getRandomCardFromHand(scene->_actionPlayerIdx) != -1)) { + scene->_actionCard1 = &scene->_gameBoardSide[3]._handCard[i]; + scene->_actionCard2 = &scene->_gameBoardSide[3]._emptyStationPos; + if (scene->_actionPlayerIdx != 3) { + int tmpVal = scene->getRandomCardFromHand(scene->_actionPlayerIdx); + scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionPlayerIdx]._handCard[tmpVal]; + } + scene->_actionItem.setAction(&scene->_action12); + noAction = false; + } + break; + default: + break; + } + + if (!noAction) + break; + + if (scene->_actionPlayerIdx == 2) { + int count = 0; + if (scene->_actionVictimIdx != 2) { + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[scene->_actionVictimIdx]._handCard[i]._cardId != 0) + ++count; + } + } + + if (count > 1) { + scene->subC4CD2(); + + found = false; + while (!found) { + switch (scene->_actionVictimIdx) { + case 0: + scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 1: + scene->actionDisplay(1330, 132, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 3: + scene->actionDisplay(1330, 133, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + + Event event; + while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) { + g_globals->_scenePalette.signalListeners(); + R2_GLOBALS._sceneObjects->draw(); + g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); + } + + scene->_selectedCard._stationPos = event.mousePos; + + found = false; + + if (scene->_actionVictimIdx != 2) { + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[scene->_actionVictimIdx]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[scene->_actionVictimIdx]._handCard[i]._cardId != 0)) { + scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionVictimIdx]._handCard[i]; + found = true; + break; + } + } + } + } // while + scene->_displayHelpFl = true; + scene->subC4CEC(); + } else if (scene->_actionVictimIdx != 2) { + int tmpVal = scene->getRandomCardFromHand(scene->_actionVictimIdx); + scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionVictimIdx]._handCard[tmpVal]; + } + } + + scene->_actionCard1->_card.postInit(); + scene->_actionCard1->_card.hide(); + scene->_actionCard1->_card.setVisage(1332); + scene->_actionCard1->_card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_actionCard1->_card.fixPriority(170); + scene->_actionCard1->_card.setStrip2(1); + scene->_actionCard1->_cardId = scene->_actionCard3->_cardId; + + scene->_actionCard3->_cardId = 0; + scene->_actionCard3->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard3->_stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard1->_stationPos, this); + } + break; + case 2: + scene->_animatedCard._card.hide(); + switch (scene->_actionPlayerIdx) { + case 0: + scene->_actionCard1->_card.setFrame2(2); + scene->_actionCard1->_card.show(); + break; + case 1: + scene->_actionCard1->_card.setFrame2(4); + scene->_actionCard1->_card.show(); + break; + case 3: + scene->_actionCard1->_card.setFrame2(3); + scene->_actionCard1->_card.show(); + break; + default: + scene->setAnimationInfo(scene->_actionCard1); + break; + } + + scene->_currentPlayerNumb--; + scene->_showPlayerTurn = false; + scene->discardCard(scene->_actionCard2); + break; + default: + break; + } +} + +// Pick a card in opponent hand +void Scene1337::Action12::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + signal(); + break; + case 1: { + scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; + scene->_currentDiscardIndex++; + scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 2: + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(58); + if (scene->_actionVictimIdx == 2) { + int count = 0; + int i = -1; + switch (scene->_actionPlayerIdx) { + case 0: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[0]._handCard[i]._cardId != 0) + ++count; + } + break; + case 1: + for (i = 0; i <= 3; i++) { + // The original game was counting in the hand of player 3, which is obviously wrong + if (scene->_gameBoardSide[1]._handCard[i]._cardId != 0) + ++count; + } + break; + case 3: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[3]._handCard[i]._cardId != 0) + ++count; + } + break; + default: + break; + } + + if (count > 1) { + scene->subC4CD2(); + + bool found = false; + + while (!found) { + switch (scene->_actionPlayerIdx) { + case 0: + scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 1: + scene->actionDisplay(1330, 132, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 3: + scene->actionDisplay(1330, 133, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + + Event event; + while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) { + g_globals->_scenePalette.signalListeners(); + R2_GLOBALS._sceneObjects->draw(); + g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); + } + + scene->_selectedCard._stationPos = event.mousePos; + + switch (scene->_actionPlayerIdx) { + case 0: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[0]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[0]._handCard[i]._cardId != 0)) { + found = true; + scene->_actionCard3 = &scene->_gameBoardSide[0]._handCard[i]; + break; + } + } + break; + case 1: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[1]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[1]._handCard[i]._cardId != 0)) { + found = true; + scene->_actionCard3 = &scene->_gameBoardSide[1]._handCard[i]; + break; + } + } + break; + case 3: + for (i = 0; i <= 3; i++) { + if (scene->_gameBoardSide[3]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[3]._handCard[i]._cardId != 0)) { + found = true; + scene->_actionCard3 = &scene->_gameBoardSide[3]._handCard[i]; + break; + } + } + break; + default: + break; + } + } + scene->subC4CEC(); + } else { + switch (scene->_actionPlayerIdx) { + case 0: + scene->_actionCard3 = &scene->_gameBoardSide[0]._handCard[scene->getRandomCardFromHand(0)]; + break; + case 1: + scene->_actionCard3 = &scene->_gameBoardSide[1]._handCard[scene->getRandomCardFromHand(1)]; + break; + case 3: + scene->_actionCard3 = &scene->_gameBoardSide[3]._handCard[scene->getRandomCardFromHand(3)]; + break; + default: + break; + } + } + + scene->_actionCard1->_card.postInit(); + scene->_actionCard1->_card.hide(); + scene->_actionCard1->_card.setVisage(1332); + scene->_actionCard1->_card.setPosition(scene->_actionCard1->_stationPos); + scene->_actionCard1->_card.fixPriority(170); + scene->_actionCard1->_card.setStrip2(1); + scene->_actionCard1->_cardId = scene->_actionCard3->_cardId; + + scene->_actionCard3->_cardId = 0; + scene->_actionCard3->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard3->_stationPos); + scene->_animatedCard._card.show(); + scene->_aSound1.play(57); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard1->_stationPos, this); + } + break; + case 3: + scene->_animatedCard._card.hide(); + switch (scene->_actionVictimIdx) { + case 0: + scene->_actionCard1->_card.setFrame2(2); + scene->_actionCard1->_card.show(); + break; + case 1: + scene->_actionCard1->_card.setFrame2(4); + scene->_actionCard1->_card.show(); + break; + case 3: + scene->_actionCard1->_card.setFrame2(3); + scene->_actionCard1->_card.show(); + break; + default: + scene->setAnimationInfo(scene->_actionCard1); + break; + } + scene->discardCard(scene->_actionCard2); + break; + default: + break; + } +} + +// Handle the animations of the interceptor card +void Scene1337::Action13::signal() { + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; + scene->_currentDiscardIndex--; + + scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; + + scene->_actionCard1->_cardId = 0; + scene->_actionCard1->_card.remove(); + + scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); + scene->_animatedCard._card.show(); + + NpcMover *mover = new NpcMover(); + scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); + } + break; + case 1: + scene->_animatedCard._card.hide(); + scene->setAnimationInfo(scene->_actionCard2); + scene->_aSound1.play(58); + signal(); + break; + case 2: + scene->discardCard(scene->_actionCard2); + break; + default: + break; + } +} + +void Scene1337::postInit(SceneObjectList *OwnerList) { +// In the original, may be found in subPostInit. +// Without it, enableControl asserts + loadScene(1330); + R2_GLOBALS._uiElements._active = false; + SceneExt::postInit(); +// + + // Hide the user interface + BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + R2_GLOBALS._uiElements._visible = false; + + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + R2_GLOBALS._player._uiEnabled = false; + + _delayedFunction = nullptr; + + _actionCard1 = nullptr; + _actionCard2 = nullptr; + _actionCard3 = nullptr; + + _gameBoardSide[2]._handCard[0]._stationPos = Common::Point(10, 174); + _gameBoardSide[2]._handCard[1]._stationPos = Common::Point(37, 174); + _gameBoardSide[2]._handCard[2]._stationPos = Common::Point(64, 174); + _gameBoardSide[2]._handCard[3]._stationPos = Common::Point(91, 174); + + _gameBoardSide[2]._outpostStation[0]._stationPos = Common::Point(119, 174); + _gameBoardSide[2]._outpostStation[1]._stationPos = Common::Point(119, 148); + _gameBoardSide[2]._outpostStation[2]._stationPos = Common::Point(119, 122); + _gameBoardSide[2]._outpostStation[3]._stationPos = Common::Point(145, 122); + _gameBoardSide[2]._outpostStation[4]._stationPos = Common::Point(171, 122); + _gameBoardSide[2]._outpostStation[5]._stationPos = Common::Point(171, 148); + _gameBoardSide[2]._outpostStation[6]._stationPos = Common::Point(171, 174); + _gameBoardSide[2]._outpostStation[7]._stationPos = Common::Point(145, 174); + + _gameBoardSide[2]._delayCard._stationPos = Common::Point(199, 174); + + _gameBoardSide[2]._emptyStationPos._stationPos = Common::Point(145, 148); + + _gameBoardSide[2]._card1Pos = Common::Point(10, 174); + _gameBoardSide[2]._card2Pos = Common::Point(37, 174); + _gameBoardSide[2]._card3Pos = Common::Point(64, 174); + _gameBoardSide[2]._card4Pos = Common::Point(91, 174); + _gameBoardSide[2]._frameNum = 2; + + _gameBoardSide[3]._handCard[0]._stationPos = Common::Point(14, 14); + _gameBoardSide[3]._handCard[1]._stationPos = Common::Point(14, 36); + _gameBoardSide[3]._handCard[2]._stationPos = Common::Point(14, 58); + _gameBoardSide[3]._handCard[3]._stationPos = Common::Point(14, 80); + + _gameBoardSide[3]._outpostStation[0]._stationPos = Common::Point(37, 66); + _gameBoardSide[3]._outpostStation[1]._stationPos = Common::Point(63, 66); + _gameBoardSide[3]._outpostStation[2]._stationPos = Common::Point(89, 66); + _gameBoardSide[3]._outpostStation[3]._stationPos = Common::Point(89, 92); + _gameBoardSide[3]._outpostStation[4]._stationPos = Common::Point(89, 118); + _gameBoardSide[3]._outpostStation[5]._stationPos = Common::Point(63, 118); + _gameBoardSide[3]._outpostStation[6]._stationPos = Common::Point(37, 118); + _gameBoardSide[3]._outpostStation[7]._stationPos = Common::Point(37, 92); + + _gameBoardSide[3]._delayCard._stationPos = Common::Point(37, 145); + + _gameBoardSide[3]._emptyStationPos._stationPos = Common::Point(63, 92); + + _gameBoardSide[3]._card1Pos = Common::Point(14, 14); + _gameBoardSide[3]._card2Pos = Common::Point(14, 36); + _gameBoardSide[3]._card3Pos = Common::Point(14, 58); + _gameBoardSide[3]._card4Pos = Common::Point(14, 80); + _gameBoardSide[3]._frameNum = 3; + + _gameBoardSide[0]._handCard[0]._stationPos = Common::Point(280, 5); + _gameBoardSide[0]._handCard[1]._stationPos = Common::Point(253, 5); + _gameBoardSide[0]._handCard[2]._stationPos = Common::Point(226, 5); + _gameBoardSide[0]._handCard[3]._stationPos = Common::Point(199, 5); + + _gameBoardSide[0]._outpostStation[0]._stationPos = Common::Point(171, 16); + _gameBoardSide[0]._outpostStation[1]._stationPos = Common::Point(171, 42); + _gameBoardSide[0]._outpostStation[2]._stationPos = Common::Point(171, 68); + _gameBoardSide[0]._outpostStation[3]._stationPos = Common::Point(145, 68); + _gameBoardSide[0]._outpostStation[4]._stationPos = Common::Point(119, 68); + _gameBoardSide[0]._outpostStation[5]._stationPos = Common::Point(119, 42); + _gameBoardSide[0]._outpostStation[6]._stationPos = Common::Point(119, 16); + _gameBoardSide[0]._outpostStation[7]._stationPos = Common::Point(145, 16); + + _gameBoardSide[0]._delayCard._stationPos = Common::Point(91, 16); + + _gameBoardSide[0]._emptyStationPos._stationPos = Common::Point(145, 42); + + _gameBoardSide[0]._card1Pos = Common::Point(280, 5); + _gameBoardSide[0]._card2Pos = Common::Point(253, 5); + _gameBoardSide[0]._card3Pos = Common::Point(226, 5); + _gameBoardSide[0]._card4Pos = Common::Point(199, 5); + _gameBoardSide[0]._frameNum = 2; + + _gameBoardSide[1]._handCard[0]._stationPos = Common::Point(283, 146); + _gameBoardSide[1]._handCard[1]._stationPos = Common::Point(283, 124); + _gameBoardSide[1]._handCard[2]._stationPos = Common::Point(283, 102); + _gameBoardSide[1]._handCard[3]._stationPos = Common::Point(283, 80); + + _gameBoardSide[1]._outpostStation[0]._stationPos = Common::Point(253, 122); + _gameBoardSide[1]._outpostStation[1]._stationPos = Common::Point(227, 122); + _gameBoardSide[1]._outpostStation[2]._stationPos = Common::Point(201, 122); + _gameBoardSide[1]._outpostStation[3]._stationPos = Common::Point(201, 96); + _gameBoardSide[1]._outpostStation[4]._stationPos = Common::Point(201, 70); + _gameBoardSide[1]._outpostStation[5]._stationPos = Common::Point(227, 70); + _gameBoardSide[1]._outpostStation[6]._stationPos = Common::Point(253, 70); + _gameBoardSide[1]._outpostStation[7]._stationPos = Common::Point(253, 96); + + _gameBoardSide[1]._delayCard._stationPos = Common::Point(253, 43); + + _gameBoardSide[1]._emptyStationPos._stationPos = Common::Point(227, 96); + + _gameBoardSide[1]._card1Pos = Common::Point(283, 146); + _gameBoardSide[1]._card2Pos = Common::Point(283, 124); + _gameBoardSide[1]._card3Pos = Common::Point(283, 102); + _gameBoardSide[1]._card4Pos = Common::Point(283, 80); + _gameBoardSide[1]._frameNum = 4; + + subPostInit(); + + _stockPile.postInit(); +} + +void Scene1337::remove() { + if (R2_GLOBALS._v57709 > 1) { + subD1917(); + subD1940(false); + } + + R2_GLOBALS._uiElements._active = true; + R2_GLOBALS._uiElements._visible = true; + SceneExt::remove(); +} + +void Scene1337::process(Event &event) { + if (event.eventType == EVENT_BUTTON_DOWN) { + if (event.btnState == BTNSHIFT_RIGHT) { + updateCursorId(R2_GLOBALS._mouseCursorId, true); + event.handled = true; + } else if (_delayedFunction) { + FunctionPtrType tmpFctPtr = _delayedFunction; + _delayedFunction = nullptr; + (this->*tmpFctPtr)(); + event.handled = true; + } + } else if (event.eventType == EVENT_KEYPRESS) { + if (event.kbd.keycode == Common::KEYCODE_SPACE) { + if (_delayedFunction) { + FunctionPtrType tmpFctPtr = _delayedFunction; + _delayedFunction = nullptr; + (this->*tmpFctPtr)(); + event.handled = true; + } + } else + warning("Fixme: Find proper keycode value"); + } + + if (!event.handled) + Scene::process(event); +} + +void Scene1337::dispatch() { + if (!_instructionsDisplayedFl) { + ++_instructionsWaitCount; + if (_instructionsWaitCount == 4) { + _instructionsDisplayedFl = true; + suggestInstructions(); + } + } + + // The following code is in the original in sceneHandler::process(), + // which is terrible as it's checked in every scene of the game. + setCursorData(5, _cursorCurStrip, _cursorCurFrame); + // + + Scene::dispatch(); +} + +void Scene1337::actionDisplay(int resNum, int lineNum, int x, int y, int keepOnScreen, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt) { + // TODO: Check if it's normal that arg5 is unused and replaced by an hardcoded 0 value + // May hide an original bug + + SceneItem::display(resNum, lineNum, SET_X, x, SET_Y, y, SET_KEEP_ONSCREEN, 0, + SET_WIDTH, width, SET_POS_MODE, -1, SET_TEXT_MODE, textMode, + SET_FONT, fontNum, SET_FG_COLOR, colFG, SET_EXT_BGCOLOR, colBGExt, + SET_EXT_FGCOLOR, colFGExt, LIST_END); +} + +void Scene1337::setAnimationInfo(Card *card) { + if (!card) + return; + + if (card->_cardId > 25) { + card->_card.setStrip2(4); + card->_card.setFrame(card->_cardId - 25); + } else if (card->_cardId > 9) { + card->_card.setStrip2(3); + card->_card.setFrame(card->_cardId - 9); + } else { + card->_card.setStrip2(2); + card->_card.setFrame(card->_cardId); + } + + card->_card.show(); + R2_GLOBALS._sceneObjects->draw(); +} + +void Scene1337::handleNextTurn() { + switch (_winnerId) { + case -1: + ++_currentPlayerNumb; + if (_currentPlayerNumb > 3) + _currentPlayerNumb = 0; + + if (_showPlayerTurn) { + _currentPlayerArrow.show(); + switch (_currentPlayerNumb) { + case 0: + _currentPlayerArrow.setStrip(3); + break; + case 1: + _currentPlayerArrow.setStrip(4); + break; + case 2: + subD1975(174, 107); + _currentPlayerArrow.setStrip(1); + break; + case 3: + subC4CEC(); + _currentPlayerArrow.setStrip(2); + break; + default: + break; + } + + if (!_autoplay) + _delayedFunction = &Scene1337::handlePlayerTurn; + else + handlePlayerTurn(); + } else { + handlePlayerTurn(); + } + break; + case 0: + _aSound2.play(62); + actionDisplay(1330, 135, 159, 10, 1, 200, 0, 7, 0, 154, 154); + actionDisplay(1330, 121, 20, 99, 1, 136, 0, 7, 0, 172, 172); + actionDisplay(1330, 122, 300, 99, 1, 136, 0, 7, 0, 117, 117); + R2_GLOBALS._sceneObjects->draw(); + actionDisplay(1330, 123, 159, 134, 1, 200, 0, 7, 0, 105, 105); + break; + case 1: + _aSound2.play(62); + actionDisplay(1330, 151, 300, 99, 1, 136, 0, 7, 0, 117, 117); + actionDisplay(1330, 118, 20, 99, 1, 136, 0, 7, 0, 172, 172); + actionDisplay(1330, 119, 159, 10, 1, 200, 0, 7, 0, 154, 154); + R2_GLOBALS._sceneObjects->draw(); + actionDisplay(1330, 120, 159, 134, 1, 200, 0, 7, 0, 105, 105); + break; + case 2: + _aSound2.play(62); + actionDisplay(1330, 134, 159, 134, 1, 200, 0, 7, 0, 105, 105); + actionDisplay(1330, 124, 20, 99, 1, 136, 0, 7, 0, 172, 172); + actionDisplay(1330, 126, 159, 10, 1, 200, 0, 7, 0, 154, 154); + R2_GLOBALS._sceneObjects->draw(); + actionDisplay(1330, 125, 300, 99, 1, 136, 0, 7, 0, 117, 117); + break; + case 3: + _aSound2.play(62); + actionDisplay(1330, 150, 20, 99, 1, 136, 0, 7, 0, 172, 172); + actionDisplay(1330, 115, 300, 99, 1, 136, 0, 7, 0, 117, 117); + actionDisplay(1330, 116, 159, 10, 1, 200, 0, 7, 0, 154, 154); + R2_GLOBALS._sceneObjects->draw(); + actionDisplay(1330, 117, 159, 134, 1, 200, 0, 7, 0, 105, 105); + break; + default: + break; + } + + if (_winnerId != -1) + R2_GLOBALS._sceneManager.changeScene(125); + +} + +void Scene1337::handlePlayerTurn() { + if (_showPlayerTurn) + _currentPlayerArrow.hide(); + + switch (_currentPlayerNumb) { + case 2: + subC4CD2(); + if (_displayHelpFl) + actionDisplay(1330, 114, 159, 10, 1, 200, 0, 7, 0, 154, 154); + _displayHelpFl = false; + // No break on purpose + case 0: + // No break on purpose + case 1: + // No break on purpose + case 3: + _actionItem.setAction(&_action4); + default: + break; + } + + _showPlayerTurn = true; + +} + +bool Scene1337::isStationCard(int cardId) { + switch (cardId) { + case 10: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 17: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 20: + // No break on purpose + case 21: + return true; + default: + return false; + } +} + +bool Scene1337::isStopConstructionCard(int cardId) { + switch (cardId) { + case 11: + // No break on purpose + case 14: + // No break on purpose + case 16: + // No break on purpose + case 24: + return true; + default: + return false; + } +} + +int Scene1337::getStationId(int playerId, int handCardId) { + if ((_gameBoardSide[playerId]._handCard[handCardId]._cardId > 1) && (_gameBoardSide[playerId]._handCard[handCardId]._cardId <= 9)) + return handCardId; + + return -1; +} + +int Scene1337::findPlatformCardInHand(int playerId) { + for (int i = 0; i <= 3; i++) { + if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) + return i; + } + + return -1; +} + +int Scene1337::findMeteorCardInHand(int playerId) { + for (int i = 0; i <= 3; i++) { + if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) + return i; + } + + return -1; +} + +int Scene1337::findThieftCardInHand(int playerId) { + for (int i = 0; i <= 3; i++) { + if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) + return i; + } + + return -1; +} + +int Scene1337::isDelayCard(int cardId) { + switch (cardId) { + case 11: + // No break on purpose + case 14: + // No break on purpose + case 16: + // No break on purpose + case 24: + return cardId; + break; + default: + return -1; + break; + } +} + +int Scene1337::getStationCardId(int cardId) { + switch (cardId) { + case 10: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 17: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 20: + // No break on purpose + case 21: + return cardId; + default: + return -1; + } +} + +void Scene1337::handlePlayer01Discard(int playerId) { + switch (playerId) { + case 0: + for (int i = 0; i <= 3; i++) { + if (getStationCardId(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if (isDelayCard(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Outpost Card + if ((_gameBoardSide[playerId]._handCard[i]._cardId > 1) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 9)) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if ((_gameBoardSide[playerId]._handCard[i]._cardId >= 26) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 33)) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Station Card + if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Thief card + if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Meteor Card + if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + break; + case 1: + for (int i = 0; i <= 3; i++) { + if ((_gameBoardSide[playerId]._handCard[i]._cardId >= 26) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 33)) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Station Card + if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Outpost Card + if ((_gameBoardSide[playerId]._handCard[i]._cardId > 1) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 9)) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if (getStationCardId(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if (isDelayCard(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Thief card + if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + for (int i = 0; i <= 3; i++) { + // Meteor Card + if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) { + discardCard(&_gameBoardSide[playerId]._handCard[i]); + return; + } + } + + break; + default: + break; + } +} + +void Scene1337::playThieftCard(int playerId, Card *card, int victimId) { + _actionPlayerIdx = playerId; + _actionVictimIdx = victimId; + + int randIndx; + + for (;;) { + randIndx = R2_GLOBALS._randomSource.getRandomNumber(3); + if (_gameBoardSide[victimId]._handCard[randIndx]._cardId != 0) + break; + } + + _actionCard1 = card; + _actionCard2 = &_gameBoardSide[victimId]._emptyStationPos; + _actionCard3 = &_gameBoardSide[victimId]._handCard[randIndx]; + + _actionItem.setAction(&_action11); +} + +int Scene1337::getPreventionCardId(int cardId) { + int retVal; + + switch (cardId) { + case 10: + retVal = 2; + break; + case 12: + retVal = 3; + break; + case 15: + retVal = 5; + break; + case 17: + retVal = 9; + break; + case 18: + retVal = 6; + break; + case 19: + retVal = 4; + break; + case 20: + retVal = 8; + break; + case 21: + retVal = 7; + break; + default: + retVal = -1; + } + + return retVal; +} + +bool Scene1337::isAttackPossible(int victimId, int cardId) { + if (victimId < 0 || victimId >= ARRAYSIZE(_gameBoardSide)) + error("Scene1337::isAttackPossible() victimId:%d out of range 0 to %d", victimId, ARRAYSIZE(_gameBoardSide)-1); + + for (int i = 0; i <= 7; i++) { + if (_gameBoardSide[victimId]._outpostStation[i]._cardId != 0) { + if (getPreventionCardId(cardId) == _gameBoardSide[victimId]._outpostStation[i]._cardId) + return false; + } + } + return true; +} + +int Scene1337::getPlayerWithOutpost(int playerId) { + int randPlayerId = R2_GLOBALS._randomSource.getRandomNumber(3); + + for (int i = 0; i <= 3; i++) { + if (randPlayerId != playerId) { + for (int j = 0; j <= 7; j++) { + if (_gameBoardSide[randPlayerId]._outpostStation[j]._cardId != 0) + return randPlayerId; + } + } + + if (playerId == 1) { + randPlayerId--; + if (randPlayerId < 0) + randPlayerId = 3; + } else { + ++randPlayerId; + if (randPlayerId > 3) + randPlayerId = 0; + } + } + + return -1; +} + +bool Scene1337::checkAntiDelayCard(int delayCardId, int cardId) { + if ((delayCardId == 11) && (cardId == 26)) // Diplomacy + return true; + + if ((delayCardId == 14) && (cardId == 30)) // Cure + return true; + + if ((delayCardId == 16) && (cardId == 32)) // Agreement + return true; + + if ((delayCardId == 24) && (cardId == 28)) // Innovation + return true; + + return false; +} + +void Scene1337::playStationCard(Card *station, Card *platform) { + _actionCard1 = station; + _actionCard2 = platform; + _actionItem.setAction(&_action7); +} + +int Scene1337::getRandomCardFromHand(int playerId) { + if ( (_gameBoardSide[playerId]._handCard[0]._cardId == 0) + && (_gameBoardSide[playerId]._handCard[1]._cardId == 0) + && (_gameBoardSide[playerId]._handCard[2]._cardId == 0) + && (_gameBoardSide[playerId]._handCard[3]._cardId == 0)) + return -1; + + int randIndx; + for (;;) { + randIndx = R2_GLOBALS._randomSource.getRandomNumber(3); + if (_gameBoardSide[playerId]._handCard[randIndx]._cardId != 0) + break; + } + + return randIndx; +} + +void Scene1337::playPlatformCard(Card *card, Card *dest) { + _actionCard1 = card; + _actionCard2 = dest; + + _actionItem.setAction(&_action6); +} + +void Scene1337::playDelayCard(Card *card, Card *dest) { + _actionCard1 = card; + _actionCard2 = dest; + + _actionItem.setAction(&_action9); +} + +void Scene1337::playAntiDelayCard(Card *card, Card *dest) { + _actionCard1 = card; + _actionCard2 = dest; + + _actionItem.setAction(&_action8); + + // WORKAROUND: Restore the default cursor and for a call to signal. + // This works around the cursor caching we got rid of, and avoid + // the game ends in an eternal loop when a player reacts to another player + // attack. + setCursorData(5, 1, 4); + signal(); +} + + +Scene1337::Card *Scene1337::getStationCard(int playerId) { + for (int i = 0; i <= 7; i++) { + if ((_gameBoardSide[playerId]._outpostStation[i]._cardId >= 1) && (_gameBoardSide[playerId]._outpostStation[i]._cardId <= 9)) + return &_gameBoardSide[playerId]._outpostStation[i]; + } + + return nullptr; +} + +void Scene1337::playCentralOutpostCard(Card *card, int playerId) { + _actionCard1 = card; + _actionCard2 = getStationCard(playerId); + _actionCard3 = &_gameBoardSide[playerId]._emptyStationPos; + _actionPlayerIdx = playerId; + _actionItem.setAction(&_action10); +} + +void Scene1337::discardCard(Card *card) { + _actionCard1 = card; + + _actionItem.setAction(&_action5); +} + +void Scene1337::subC4CD2() { + if (R2_GLOBALS._v57709 > 0) { + subD1917(); + subD1940(false); // _v5780C-- + } +} + +void Scene1337::subC4CEC() { + if (R2_GLOBALS._v57709 == 0) { + subD18F5(); + subD1940(true); // _v5780C++ + } +} + +// Play Interceptor card +void Scene1337::playInterceptorCard(Card *subObj1, Card *subObj2) { + _actionCard1 = subObj1; + _actionCard2 = subObj2; + + _actionItem.setAction(&_action13); +} + +void Scene1337::displayDialog(int dialogNumb) { + switch (dialogNumb - 1) { + case 0: + actionDisplay(1330, 53, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 1: + actionDisplay(1330, 57, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 2: + actionDisplay(1330, 58, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 3: + actionDisplay(1330, 59, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 4: + actionDisplay(1330, 60, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 5: + actionDisplay(1330, 61, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 6: + actionDisplay(1330, 62, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 7: + actionDisplay(1330, 63, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 8: + actionDisplay(1330, 64, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 9: + actionDisplay(1330, 65, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 10: + actionDisplay(1330, 67, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 11: + actionDisplay(1330, 69, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 12: + actionDisplay(1330, 71, 159, 10, 1, 200, 0, 7, 0, 154, 154); + actionDisplay(1330, 72, 159, 10, 1, 200, 0, 7, 0, 154, 154); + actionDisplay(1330, 73, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 13: + actionDisplay(1330, 79, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 14: + actionDisplay(1330, 81, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + actionDisplay(1330, 83, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 16: + actionDisplay(1330, 85, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 17: + actionDisplay(1330, 87, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 18: + actionDisplay(1330, 89, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 19: + actionDisplay(1330, 91, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + actionDisplay(1330, 93, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 23: + actionDisplay(1330, 95, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 24: + actionDisplay(1330, 97, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 25: + actionDisplay(1330, 104, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 26: + actionDisplay(1330, 105, 159, 10, 1, 200, 0, 7, 0, 154, 154); + actionDisplay(1330, 106, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 27: + actionDisplay(1330, 110, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 28: + actionDisplay(1330, 108, 159, 10, 1, 200, 0, 7, 0, 154, 154); + actionDisplay(1330, 109, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 29: + actionDisplay(1330, 111, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 31: + actionDisplay(1330, 112, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } +} + +void Scene1337::subPostInit() { + R2_GLOBALS._v57709 = 0; + R2_GLOBALS._v5780C = 0; + updateCursorId(1, false); + subD1940(true); // _v5780C++ + subD18F5(); + +// loadScene(1330); +// SceneExt::postInit(); + + R2_GLOBALS._scenePalette.addRotation(224, 235, 1); + + _availableCardsPile[0] = 1; + _availableCardsPile[1] = 1; + _availableCardsPile[2] = 1; + _availableCardsPile[3] = 1; + _availableCardsPile[4] = 1; + _availableCardsPile[5] = 1; + _availableCardsPile[6] = 1; + _availableCardsPile[7] = 1; + _availableCardsPile[8] = 26; + _availableCardsPile[9] = 2; + _availableCardsPile[10] = 2; + _availableCardsPile[11] = 2; + _availableCardsPile[12] = 2; + _availableCardsPile[13] = 2; + _availableCardsPile[14] = 26; + _availableCardsPile[15] = 3; + _availableCardsPile[16] = 3; + _availableCardsPile[17] = 3; + _availableCardsPile[18] = 3; + _availableCardsPile[19] = 3; + _availableCardsPile[20] = 28; + _availableCardsPile[21] = 4; + _availableCardsPile[22] = 4; + _availableCardsPile[23] = 4; + _availableCardsPile[24] = 4; + _availableCardsPile[25] = 4; + _availableCardsPile[26] = 28; + _availableCardsPile[27] = 5; + _availableCardsPile[28] = 5; + _availableCardsPile[29] = 5; + _availableCardsPile[30] = 5; + _availableCardsPile[31] = 5; + _availableCardsPile[32] = 30; + _availableCardsPile[33] = 6; + _availableCardsPile[34] = 6; + _availableCardsPile[35] = 6; + _availableCardsPile[36] = 6; + _availableCardsPile[37] = 6; + _availableCardsPile[38] = 30; + _availableCardsPile[39] = 7; + _availableCardsPile[40] = 7; + _availableCardsPile[41] = 7; + _availableCardsPile[42] = 7; + _availableCardsPile[43] = 7; + _availableCardsPile[44] = 32; + _availableCardsPile[45] = 8; + _availableCardsPile[46] = 8; + _availableCardsPile[47] = 8; + _availableCardsPile[48] = 8; + _availableCardsPile[49] = 8; + _availableCardsPile[50] = 32; + _availableCardsPile[51] = 9; + _availableCardsPile[52] = 9; + _availableCardsPile[53] = 9; + _availableCardsPile[54] = 9; + _availableCardsPile[55] = 9; + _availableCardsPile[56] = 10; + _availableCardsPile[57] = 11; + _availableCardsPile[58] = 12; + _availableCardsPile[59] = 13; + _availableCardsPile[60] = 13; + _availableCardsPile[61] = 14; + _availableCardsPile[62] = 15; + _availableCardsPile[63] = 16; + _availableCardsPile[64] = 17; + _availableCardsPile[65] = 18; + _availableCardsPile[66] = 19; + _availableCardsPile[67] = 20; + _availableCardsPile[68] = 21; + _availableCardsPile[69] = 26; + _availableCardsPile[70] = 28; + _availableCardsPile[71] = 24; + _availableCardsPile[72] = 25; + _availableCardsPile[73] = 25; + _availableCardsPile[74] = 25; + _availableCardsPile[75] = 25; + _availableCardsPile[76] = 26; + _availableCardsPile[77] = 26; + _availableCardsPile[78] = 26; + _availableCardsPile[79] = 27; + _availableCardsPile[80] = 27; + _availableCardsPile[81] = 28; + _availableCardsPile[82] = 28; + _availableCardsPile[83] = 28; + _availableCardsPile[84] = 29; + _availableCardsPile[85] = 29; + _availableCardsPile[86] = 29; + _availableCardsPile[87] = 30; + _availableCardsPile[88] = 30; + _availableCardsPile[89] = 30; + _availableCardsPile[90] = 30; + _availableCardsPile[91] = 32; + _availableCardsPile[92] = 1; + _availableCardsPile[93] = 32; + _availableCardsPile[94] = 32; + _availableCardsPile[95] = 32; + _availableCardsPile[96] = 1; + _availableCardsPile[97] = 1; + _availableCardsPile[98] = 1; + _availableCardsPile[99] = 0; + + _cardsAvailableNumb = 98; + _currentDiscardIndex = 98; // CHECKME: Would make more sense at pos 99 + + _discardPile._cardId = 0; + _discardPile._stationPos = Common::Point(128, 95); + + _stockCard._cardId = 0; + _stockCard._stationPos = Common::Point(162, 95); + + _selectedCard._cardId = 0; + + _animatedCard._card.postInit(); + _animatedCard._card.setVisage(1332); + _animatedCard._card.setStrip(5); + _animatedCard._card.setFrame(1); + _animatedCard._card._moveDiff = Common::Point(10, 10); + _animatedCard._card.fixPriority(400); + _animatedCard._card.setPosition(Common::Point(128, 95), 0); + _animatedCard._card.animate(ANIM_MODE_2, NULL); + _animatedCard._card.hide(); + + _currentPlayerArrow.postInit(); + _currentPlayerArrow.setVisage(1334); + _currentPlayerArrow.setStrip(1); + _currentPlayerArrow.setFrame(1); + _currentPlayerArrow._numFrames = 12; + _currentPlayerArrow.fixPriority(500); + _currentPlayerArrow.setPosition(Common::Point(174, 107), 0); + _currentPlayerArrow.animate(ANIM_MODE_2, NULL); + _currentPlayerArrow.hide(); + + _showPlayerTurn = true; + _displayHelpFl = false; + _winnerId = -1; + + _helpIcon.postInit(); + _helpIcon.setup(9531, 1, 1); + _helpIcon.setPosition(Common::Point(249, 168)); + _helpIcon.setPriority(155); + _helpIcon._effect = EFFECT_NONE; + _helpIcon.show(); + + _autoplay = false; + _instructionsDisplayedFl = false; + _instructionsWaitCount = 0; +} + +void Scene1337::suggestInstructions() { + if (R2_GLOBALS._v57709 > 0) + subD1917(); + + if (MessageDialog::show(NEED_INSTRUCTIONS, NO_MSG, YES_MSG) == 0) { + if (R2_GLOBALS._v57709 == 0) + subD18F5(); + dealCards(); + } else { + if (R2_GLOBALS._v57709 == 0) + subD18F5(); + displayInstructions(); + } +} + +void Scene1337::displayInstructions() { + _actionItem.setAction(&_action1); +} + +void Scene1337::shuffleCards() { + R2_GLOBALS._sceneObjects->draw(); + + // Remove holes in card pile + for (int i = 0; i <= 98; i++) { + if (_availableCardsPile[i] == 0) { + for (int j = i + 1; j <= 98; j ++) { + if (_availableCardsPile[j] != 0) { + _availableCardsPile[i] = _availableCardsPile[j]; + _availableCardsPile[j] = 0; + break; + } + } + } + } + + // Compute the number of available cards + for (int i = 0; i <= 99; i ++) { + if (_availableCardsPile[i] == 0) { + // CHECKME: This will fail if i == 0, which shouldn't happen + // as we don't shuffle cards when no card is available. + _cardsAvailableNumb = i - 1; + _currentDiscardIndex = 98; // CHECKME: Would make more sense at pos 99 + break; + } + } + + for (int i = 0; i < 2000; i ++) { + int randIndx = R2_GLOBALS._randomSource.getRandomNumber(_cardsAvailableNumb); + int swap = _availableCardsPile[0]; + _availableCardsPile[0] = _availableCardsPile[randIndx]; + _availableCardsPile[randIndx] = swap; + } + + _shuffleEndedFl = false; + + // Shuffle cards + _animatedCard._card.setAction(&_action2); + + while(!_shuffleEndedFl && !g_vm->shouldQuit()) { + g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); + g_globals->_scenePalette.signalListeners(); + R2_GLOBALS._sceneObjects->draw(); + g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); + } +} + +void Scene1337::dealCards() { + _animatedCard._card._moveDiff = Common::Point(30, 30); + shuffleCards(); + + // Deal cards + _actionItem.setAction(&_action3); +} + +void Scene1337::showOptionsDialog() { + // Display menu with "Auto Play", "New Game", "Quit" and "Continue" + OptionsDialog::show(); +} + +void Scene1337::handleClick(int arg1, Common::Point pt) { + int curReg = R2_GLOBALS._sceneRegions.indexOf(g_globals->_events._mousePos); + + if (arg1 == 3) { + bool found = false; + int i; + for (i = 0; i <= 7; i++) { + if ( _gameBoardSide[2]._outpostStation[i].isIn(pt) + || _gameBoardSide[0]._outpostStation[i].isIn(pt) + || _gameBoardSide[1]._outpostStation[i].isIn(pt) + || _gameBoardSide[3]._outpostStation[i].isIn(pt) ) { + found = true; + break; + } + } + + if (found) { + switch (curReg) { + case 5: + if (_gameBoardSide[2]._outpostStation[i]._cardId != 0) + displayDialog(_gameBoardSide[2]._outpostStation[i]._cardId); + else + actionDisplay(1330, 20, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 10: + if (_gameBoardSide[3]._outpostStation[i]._cardId != 0) + displayDialog(_gameBoardSide[3]._outpostStation[i]._cardId); + else + actionDisplay(1330, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + if (_gameBoardSide[0]._outpostStation[i]._cardId != 0) + displayDialog(_gameBoardSide[0]._outpostStation[i]._cardId); + else + actionDisplay(1330, 21, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + if (_gameBoardSide[1]._outpostStation[i]._cardId != 0) + displayDialog(_gameBoardSide[1]._outpostStation[i]._cardId); + else + actionDisplay(1330, 23, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } else if ( _gameBoardSide[2]._delayCard.isIn(pt) + || _gameBoardSide[0]._delayCard.isIn(pt) + || _gameBoardSide[1]._delayCard.isIn(pt) + || _gameBoardSide[3]._delayCard.isIn(pt) ) { + switch (curReg) { + case 5: + if (_gameBoardSide[2]._delayCard._cardId != 0) + displayDialog(_gameBoardSide[2]._delayCard._cardId); + else + actionDisplay(1330, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 10: + if (_gameBoardSide[3]._delayCard._cardId != 0) + displayDialog(_gameBoardSide[3]._delayCard._cardId); + else + actionDisplay(1330, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + if (_gameBoardSide[0]._delayCard._cardId != 0) + displayDialog(_gameBoardSide[0]._delayCard._cardId); + else + actionDisplay(1330, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + if (_gameBoardSide[1]._delayCard._cardId != 0) + displayDialog(_gameBoardSide[1]._delayCard._cardId); + else + actionDisplay(1330, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } else if (_discardPile.isIn(pt)) { + if (_discardPile._cardId != 0) + displayDialog(_discardPile._cardId); + else + actionDisplay(1330, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (_helpIcon._bounds.contains(pt)) + actionDisplay(1330, 43, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else if (_stockCard.isIn(pt)) + actionDisplay(1330, 4, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else if ( (_gameBoardSide[2]._emptyStationPos.isIn(pt)) + || (_gameBoardSide[3]._emptyStationPos.isIn(pt)) + || (_gameBoardSide[0]._emptyStationPos.isIn(pt)) + || (_gameBoardSide[1]._emptyStationPos.isIn(pt)) ) + actionDisplay(1330, 32, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else if (_gameBoardSide[2]._handCard[0].isIn(pt)) + displayDialog(_gameBoardSide[2]._handCard[0]._cardId); + else if (_gameBoardSide[2]._handCard[1].isIn(pt)) + displayDialog(_gameBoardSide[2]._handCard[1]._cardId); + else if (_gameBoardSide[2]._handCard[2].isIn(pt)) + displayDialog(_gameBoardSide[2]._handCard[2]._cardId); + else if (_gameBoardSide[2]._handCard[3].isIn(pt)) + displayDialog(_gameBoardSide[2]._handCard[3]._cardId); + else if ((curReg >= 6) && (curReg <= 9)) + actionDisplay(1330, 29, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else if ((curReg >= 11) && (curReg <= 14)) + actionDisplay(1330, 31, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else if ((curReg >= 16) && (curReg <= 19)) + actionDisplay(1330, 30, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else { + switch (curReg) { + case 0: + actionDisplay(1330, 2, 159, 134, 1, 200, 0, 7, 0, 105, 105); + break; + case 5: + actionDisplay(1330, 25, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 10: + actionDisplay(1330, 27, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + actionDisplay(1330, 26, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + actionDisplay(1330, 28, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 21: + actionDisplay(1330, 24, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } + } + + if (arg1 != 1) + return; + + for (int i = 0; i <= 7; i++) { + if (_gameBoardSide[2]._outpostStation[i].isIn(pt)) { + switch (_gameBoardSide[2]._outpostStation[i]._cardId) { + case 0: + actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 1: + actionDisplay(1330, 54, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + } + return; + } + if (_gameBoardSide[0]._outpostStation[i].isIn(pt)) { + switch (_gameBoardSide[0]._outpostStation[i]._cardId) { + case 0: + actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + } + return; + } + if (_gameBoardSide[1]._outpostStation[i].isIn(pt)) { + switch (_gameBoardSide[1]._outpostStation[i]._cardId) { + case 0: + actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); + break; + default: + actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117); + break; + } + return; + } + if (_gameBoardSide[3]._outpostStation[i].isIn(pt)) { + switch (_gameBoardSide[3]._outpostStation[i]._cardId) { + case 0: + actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); + break; + default: + actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172); + break; + } + return; + } + } + + if (_gameBoardSide[2]._delayCard.isIn(pt)) { + // The original uses _gameBoardSide[0], which is obviously a bug. + if (_gameBoardSide[2]._delayCard._cardId != 0) + actionDisplay(1330, 39, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else + actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + return; + } + if (_gameBoardSide[3]._delayCard.isIn(pt)) { + if (_gameBoardSide[3]._delayCard._cardId != 0) + actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172); + else + actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); + + return; + } + if (_gameBoardSide[1]._delayCard.isIn(pt)) { + if (_gameBoardSide[1]._delayCard._cardId != 0) + actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117); + else + actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); + + return; + } + if (_gameBoardSide[0]._delayCard.isIn(pt)) { + if (_gameBoardSide[0]._delayCard._cardId != 0) + actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else + actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + + return; + } + if (_gameBoardSide[3]._emptyStationPos.isIn(pt)) { + actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); + return; + } + if (_gameBoardSide[1]._emptyStationPos.isIn(pt)) { + actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); + return; + } + if (_gameBoardSide[0]._emptyStationPos.isIn(pt)) { + actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + return; + } + + if (_helpIcon._bounds.contains(pt)) { + showOptionsDialog(); + return; + } + + if (_discardPile.isIn(pt)) + actionDisplay(1330, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else if (_stockCard.isIn(pt)) + actionDisplay(1330, 5, 159, 10, 1, 200, 0, 7, 0, 154, 154); + else { + switch (curReg) { + case 0: + actionDisplay(1330, 3, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 6: + // no break on purpose + case 7: + // no break on purpose + case 8: + // no break on purpose + case 9: + actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172); + break; + case 10: + actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); + break; + case 11: + // no break on purpose + case 12: + // no break on purpose + case 13: + // no break on purpose + case 14: + actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 16: + // no break on purpose + case 17: + // no break on purpose + case 18: + // no break on purpose + case 19: + actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117); + break; + case 20: + actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); + break; + default: + actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + } + } +} + +void Scene1337::handlePlayer0() { + if (_gameBoardSide[0]._delayCard._cardId != 0) { + switch (_gameBoardSide[0]._delayCard._cardId) { + case 10: + //No break on purpose + case 12: + //No break on purpose + case 15: + //No break on purpose + case 17: + //No break on purpose + case 18: + //No break on purpose + case 19: + //No break on purpose + case 20: + //No break on purpose + case 21: + discardCard(&_gameBoardSide[0]._delayCard); + return; + default: + for (int i = 0; i <= 3; i++) { + if (checkAntiDelayCard(_gameBoardSide[0]._delayCard._cardId, _gameBoardSide[0]._handCard[i]._cardId)) { + playAntiDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[0]._delayCard); + return; + } + } + + break; + } + } + + for (int i = 0; i <= 3; i++) { + int tmpVal = getStationId(0, i); + + if (tmpVal != -1) { + bool stationAlreadyPresentFl = false; + for (int j = 0; j <= 7; j++) { + if (_gameBoardSide[0]._outpostStation[j]._cardId == _gameBoardSide[0]._handCard[tmpVal]._cardId) { + stationAlreadyPresentFl = true; + break; + } + } + + if (!stationAlreadyPresentFl) { + for (int j = 0; j <= 7; j++) { + if ((_gameBoardSide[0]._outpostStation[j]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[0]._delayCard._cardId)) { + int stationCount = 0; + for (int k = 0; k <= 7; k++) { + if ((_gameBoardSide[0]._outpostStation[k]._cardId > 1) && (_gameBoardSide[0]._outpostStation[k]._cardId <= 9)) { + ++stationCount; + } + } + + if (stationCount == 7) + _winnerId = 0; + + playStationCard(&_gameBoardSide[0]._handCard[tmpVal], &_gameBoardSide[0]._outpostStation[j]); + return; + } + } + } + } + } + + int tmpVal = findPlatformCardInHand(0); + + if (tmpVal != -1) { + for (int i = 0; i <= 7; i++) { + if ((_gameBoardSide[0]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[0]._delayCard._cardId)) { + playPlatformCard(&_gameBoardSide[0]._handCard[tmpVal], &_gameBoardSide[0]._outpostStation[i]); + return; + } + } + } + + int meteorCardId = findMeteorCardInHand(0); + if (meteorCardId != -1) { + for (int i = 0; i <= 7; i++) { + if (_gameBoardSide[2]._outpostStation[i]._cardId != 0) { + playCentralOutpostCard(&_gameBoardSide[0]._handCard[meteorCardId], 2); + return; + } + } + } + + int thieftId = findThieftCardInHand(0); + if (thieftId != -1) { + if ( (_gameBoardSide[2]._handCard[0]._cardId != 0) + || (_gameBoardSide[2]._handCard[1]._cardId != 0) + || (_gameBoardSide[2]._handCard[2]._cardId != 0) + || (_gameBoardSide[2]._handCard[3]._cardId != 0) ) { + playThieftCard(0, &_gameBoardSide[0]._handCard[thieftId], 2); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if ((isDelayCard(_gameBoardSide[0]._handCard[i]._cardId) != -1) + && (_gameBoardSide[2]._delayCard._cardId == 0) + && isAttackPossible(2, _gameBoardSide[0]._handCard[i]._cardId)) { + playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[2]._delayCard); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if ((getStationCardId(_gameBoardSide[0]._handCard[i]._cardId) != -1) + && (_gameBoardSide[2]._delayCard._cardId == 0) + && isAttackPossible(2, _gameBoardSide[0]._handCard[i]._cardId)) { + playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[2]._delayCard); + return; + } + } + + meteorCardId = findMeteorCardInHand(0); + int victimId = getPlayerWithOutpost(0); + + if ((meteorCardId != -1) && (victimId != -1)) { + playCentralOutpostCard(&_gameBoardSide[0]._handCard[meteorCardId], victimId); + return; + } + + thieftId = findThieftCardInHand(0); + if (thieftId != -1) { + if ( (_gameBoardSide[1]._handCard[0]._cardId != 0) + || (_gameBoardSide[1]._handCard[1]._cardId != 0) + || (_gameBoardSide[1]._handCard[2]._cardId != 0) + || (_gameBoardSide[1]._handCard[3]._cardId != 0) ) { + playThieftCard(0, &_gameBoardSide[0]._handCard[thieftId], 1); + return; + } + } + + for (int i = 0; i <= 3; i++) { + if (getStationCardId(_gameBoardSide[0]._handCard[i]._cardId) != -1) { + if ((_gameBoardSide[1]._delayCard._cardId == 0) && isAttackPossible(1, _gameBoardSide[0]._handCard[i]._cardId)) { + playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[1]._delayCard); + return; + } + + if ((_gameBoardSide[3]._delayCard._cardId == 0) && isAttackPossible(3, _gameBoardSide[0]._handCard[i]._cardId)) { + playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[3]._delayCard); + return; + } + } + } + + for (int i = 0; i <= 3; i++) { + tmpVal = isDelayCard(_gameBoardSide[0]._handCard[i]._cardId); + if (tmpVal != -1) { + if ((_gameBoardSide[1]._delayCard._cardId == 0) && isAttackPossible(1, _gameBoardSide[0]._handCard[i]._cardId)) { + playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[1]._delayCard); + return; + } + + if ((_gameBoardSide[3]._delayCard._cardId == 0) && isAttackPossible(3, _gameBoardSide[0]._handCard[i]._cardId)) { + playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[3]._delayCard); + return; + } + } + } + + handlePlayer01Discard(0); +} + +void Scene1337::handlePlayer1() { + if (this->_gameBoardSide[1]._delayCard._cardId != 0) { + switch (_gameBoardSide[1]._delayCard._cardId) { + case 10: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 17: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 20: + // No break on purpose + case 21: + discardCard(&_gameBoardSide[1]._delayCard); + return; + default: + for (int i = 0; i <= 3; i++) { + if (checkAntiDelayCard(_gameBoardSide[1]._delayCard._cardId, _gameBoardSide[1]._handCard[i]._cardId)) { + playAntiDelayCard(&_gameBoardSide[1]._handCard[i], &_gameBoardSide[1]._delayCard); + return; + } + } + break; + } + } + + for (int i = 0; i <= 3; i++) { + int tmpIndx = getStationId(1, i); + if (tmpIndx == -1) + break; + + int tmpVal = 0; + for (int j = 0; j <= 7; j++) { + if (_gameBoardSide[1]._outpostStation[j]._cardId == _gameBoardSide[1]._handCard[tmpIndx]._cardId) { + tmpVal = 1; + break; + } + } + + if (tmpVal == 0) + break; + + for (int j = 0; j <= 7; j++) { + if ((_gameBoardSide[1]._outpostStation[j]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[1]._delayCard._cardId)) { + int stationCount = 0; + for (int k = 0; k <= 7; k++) { + if ((_gameBoardSide[1]._outpostStation[k]._cardId > 1) && (_gameBoardSide[1]._outpostStation[k]._cardId <= 9)) + ++stationCount; + } + + if (stationCount == 7) + _winnerId = 1; + + playStationCard(&_gameBoardSide[1]._handCard[tmpIndx], &_gameBoardSide[1]._outpostStation[j]); + return; + } + } + } + + int normalCardId = findPlatformCardInHand(1); + if (normalCardId != -1) { + for (int i = 0; i <= 7; i++) { + if ((_gameBoardSide[1]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[1]._delayCard._cardId)) { + playPlatformCard(&_gameBoardSide[1]._handCard[normalCardId], &_gameBoardSide[1]._outpostStation[i]); + return; + } + } + } + + int meterorCardId = findMeteorCardInHand(1); + int victimId = getPlayerWithOutpost(1); + + if ((meterorCardId != -1) && (victimId != -1)) { + playCentralOutpostCard(&_gameBoardSide[1]._handCard[meterorCardId], victimId); + return; + } + + int thieftId = findThieftCardInHand(1); + if (thieftId != -1) { + int playerIdFound = -1; + int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3); + for (int i = 0; i <= 3; i++) { + if (rndVal != 1) { + if ( (_gameBoardSide[rndVal]._handCard[0]._cardId != 0) + || (_gameBoardSide[rndVal]._handCard[1]._cardId != 0) + || (_gameBoardSide[rndVal]._handCard[2]._cardId != 0) + || (_gameBoardSide[rndVal]._handCard[3]._cardId != 0)) { + playerIdFound = rndVal; + break; + } + } + // The original was only updating in the rndVal block, + // which was a bug as the checks were stopping at this point + rndVal--; + if (rndVal < 0) + rndVal = 3; + } + + if (playerIdFound != -1) { + playThieftCard(1, &_gameBoardSide[1]._handCard[thieftId], playerIdFound); + return; + } + } + + for (int i = 0; i <= 3; i++) { + int tmpVal = isDelayCard(_gameBoardSide[1]._handCard[i]._cardId); + if (tmpVal != -1) { + victimId = -1; + int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3); + + for (int j = 0; j <= 3; j++) { + if (rndVal != 1) { + if ((_gameBoardSide[rndVal]._delayCard._cardId == 0) && isAttackPossible(rndVal, _gameBoardSide[1]._handCard[i]._cardId)) + victimId = rndVal; + } + + if (victimId != -1) { + playDelayCard(&_gameBoardSide[1]._handCard[i], &_gameBoardSide[victimId]._delayCard); + return; + } else { + rndVal--; + if (rndVal < 0) + rndVal = 3; + } + } + } + } + + for (int j = 0; j <= 3; j++) { + if (getStationCardId(_gameBoardSide[1]._handCard[j]._cardId) != -1) { + victimId = -1; + int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3); + for (int l = 0; l <= 3; l++) { + if (rndVal != 1) { + if ((_gameBoardSide[rndVal]._delayCard._cardId == 0) && (_gameBoardSide[1]._handCard[j]._cardId == 1)) + victimId = rndVal; + } + if (victimId != -1) { + playDelayCard(&_gameBoardSide[1]._handCard[j], &_gameBoardSide[victimId]._delayCard); + return; + } else { + rndVal--; + if (rndVal < 0) + rndVal = 3; + } + } + } + } + + handlePlayer01Discard(1); +} + +void Scene1337::handlePlayer3() { + if (_gameBoardSide[3]._delayCard._cardId != 0) { + switch (_gameBoardSide[3]._delayCard._cardId) { + case 10: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 17: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 20: + // No break on purpose + case 21: + discardCard(&_gameBoardSide[3]._delayCard); + return; + default: + for (int i = 0; i <= 3; i++) { + if (checkAntiDelayCard(_gameBoardSide[3]._delayCard._cardId, _gameBoardSide[3]._handCard[i]._cardId)) { + playAntiDelayCard(&_gameBoardSide[3]._handCard[i], &_gameBoardSide[3]._delayCard); + return; + } + } + break; + } + } + + int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3); + if (_gameBoardSide[3]._handCard[randIndx]._cardId == 1) { + // Station Card + for (int i = 0; i <= 7; i++) { + if ((_gameBoardSide[3]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[3]._delayCard._cardId)) { + playPlatformCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[3]._outpostStation[i]); + return; + } + } + } else if (_gameBoardSide[3]._handCard[randIndx]._cardId <= 9) { + // Outpost Card + for (int i = 0; i <= 7; i++) { + if (_gameBoardSide[3]._outpostStation[i]._cardId == _gameBoardSide[3]._handCard[randIndx]._cardId) { + discardCard(&_gameBoardSide[3]._handCard[randIndx]); + return; + } + } + + for (int i = 0; i <= 7; i++) { + if ((_gameBoardSide[3]._outpostStation[i]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[3]._delayCard._cardId)) { + int stationCount = 0; + for (int j = 0; j <= 7; j++) { + if ((_gameBoardSide[3]._outpostStation[j]._cardId > 1) && (_gameBoardSide[3]._outpostStation[j]._cardId <= 9)) + ++stationCount; + } + + if (stationCount == 7) + _winnerId = 3; + + playStationCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[3]._outpostStation[i]); + return; + } + } + } else if (_gameBoardSide[3]._handCard[randIndx]._cardId == 13) { + // Meteor Card + int victimId = getPlayerWithOutpost(3); + + if (victimId != -1) { + playCentralOutpostCard(&_gameBoardSide[3]._handCard[randIndx], victimId); + return; + } + } else if (_gameBoardSide[3]._handCard[randIndx]._cardId == 25) { + // Thief card + int victimId = -1; + int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3); + + for (int i = 0; i <= 3; i++) { + if ( (tmpRandIndx != 3) + && ( (_gameBoardSide[tmpRandIndx]._handCard[0]._cardId != 0) + || (_gameBoardSide[tmpRandIndx]._handCard[1]._cardId != 0) + || (_gameBoardSide[tmpRandIndx]._handCard[2]._cardId != 0) + || (_gameBoardSide[tmpRandIndx]._handCard[3]._cardId != 0) )) { + victimId = tmpRandIndx; + break; + } + + ++tmpRandIndx; + if (tmpRandIndx > 3) + tmpRandIndx = 0; + } + + if (victimId != -1) { + playThieftCard(3, &_gameBoardSide[3]._handCard[randIndx], victimId); + return; + } + } else { + switch (_gameBoardSide[3]._handCard[randIndx]._cardId) { + case 10: + // No break on purpose + case 11: + // No break on purpose + case 12: + // No break on purpose + case 14: + // No break on purpose + case 15: + // No break on purpose + case 16: + // No break on purpose + case 17: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 20: + // No break on purpose + case 21: + // No break on purpose + case 24: { + int victimId = -1; + int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3); + + for (int i = 0; i <= 3; i++) { + if (tmpRandIndx != 3) { + if ((_gameBoardSide[tmpRandIndx]._delayCard._cardId == 0) + && isAttackPossible(tmpRandIndx, _gameBoardSide[3]._handCard[randIndx]._cardId)) + victimId = tmpRandIndx; + } + + ++tmpRandIndx; + if (tmpRandIndx > 3) + tmpRandIndx = 0; + + if (victimId != -1) + break; + } + + if (victimId != -1) { + // Useless second identical check skipped + playDelayCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[victimId]._delayCard); + return; + } + } + default: + break; + } + } + + discardCard(&_gameBoardSide[3]._handCard[randIndx]); +} + +void Scene1337::handleAutoplayPlayer2() { + if (getStationCardId(this->_gameBoardSide[2]._delayCard._cardId) == -1) + _delayedFunction = &Scene1337::handlePlayer2; + else + discardCard(&_gameBoardSide[2]._delayCard); +} + +void Scene1337::handlePlayer2() { + _selectedCard._stationPos = g_globals->_events._mousePos; + + if (R2_GLOBALS._v57810 == 200) { + // Hand + int i; + for (i = 0; i < 4; i++) { + if ((_gameBoardSide[2]._handCard[i].isIn(_selectedCard._stationPos)) && (_gameBoardSide[2]._handCard[i]._cardId != 0)) { + Card *handcard = &_gameBoardSide[2]._handCard[i]; + _selectedCard._cardId = handcard->_cardId; + _selectedCard._stationPos = handcard->_stationPos; + //warning("_selectedCard._actorName = handcard->_actorName;"); + //warning("_selectedCard._fieldE = handcard->_fieldE;"); + //warning("_selectedCard._field10 = handcard->_field10;"); + //warning("_selectedCard._field12 = handcard->_field12;"); + //warning("_selectedCard._field14 = handcard->_field14;"); + //warning("_selectedCard._field16 = handcard->_field16;"); + _selectedCard._sceneRegionId = handcard->_sceneRegionId; + _selectedCard._position = handcard->_position; + _selectedCard._yDiff = handcard->_yDiff; + _selectedCard._bounds = handcard->_bounds; + _selectedCard._resNum = handcard->_resNum; + _selectedCard._lookLineNum = handcard->_lookLineNum; + _selectedCard._talkLineNum = handcard->_talkLineNum; + _selectedCard._useLineNum = handcard->_useLineNum; + _selectedCard._action = handcard->_action; + //warning("_selectedCard._field0 = handcard->_field0;"); + _selectedCard._card._updateStartFrame = handcard->_card._updateStartFrame; + _selectedCard._card._walkStartFrame = handcard->_card._walkStartFrame; + _selectedCard._card._oldPosition = handcard->_card._oldPosition; + _selectedCard._card._percent = handcard->_card._percent; + _selectedCard._card._priority = handcard->_card._priority; + _selectedCard._card._angle = handcard->_card._angle; + _selectedCard._card._flags = handcard->_card._flags; + _selectedCard._card._xe = handcard->_card._xe; + _selectedCard._card._xs = handcard->_card._xs; + _selectedCard._card._paneRects[0] = handcard->_card._paneRects[0]; + _selectedCard._card._paneRects[1] = handcard->_card._paneRects[1]; + _selectedCard._card._visage = handcard->_card._visage; + _selectedCard._card._objectWrapper = handcard->_card._objectWrapper; + _selectedCard._card._strip = handcard->_card._strip; + _selectedCard._card._animateMode = handcard->_card._animateMode; + _selectedCard._card._frame = handcard->_card._frame; + _selectedCard._card._endFrame = handcard->_card._endFrame; + _selectedCard._card._loopCount = handcard->_card._loopCount; + _selectedCard._card._frameChange = handcard->_card._frameChange; + _selectedCard._card._numFrames = handcard->_card._numFrames; + _selectedCard._card._regionIndex = handcard->_card._regionIndex; + _selectedCard._card._mover = handcard->_card._mover; + _selectedCard._card._moveDiff = handcard->_card._moveDiff; + _selectedCard._card._moveRate = handcard->_card._moveRate; + _selectedCard._card._actorDestPos = handcard->_card._actorDestPos; + _selectedCard._card._endAction = handcard->_card._endAction; + _selectedCard._card._regionBitList = handcard->_card._regionBitList; + // _selectedCard._object1._actorName = handcard->_object1._actorName; + //warning("_selectedCard._card._fieldE = handcard->_card._fieldE;"); + //warning("_selectedCard._card._field10 = handcard->_card._field10;"); + //warning("_selectedCard._card._field12 = handcard->_card._field12;"); + //warning("_selectedCard._card._field14 = handcard->_card._field14;"); + //warning("_selectedCard._card._field16 = handcard->_card._field16;"); + + _gameBoardSide[2]._handCard[i]._cardId = 0; + _gameBoardSide[2]._handCard[i]._card.remove(); + break; + } + } + + if (i == 4) { + handleClick(1, _selectedCard._stationPos); + handleAutoplayPlayer2(); + return; + } else { + setCursorData(1332, _selectedCard._card._strip, _selectedCard._card._frame); + R2_GLOBALS._sceneObjects->draw(); + } + } else if (R2_GLOBALS._v57810 == 300) { + // Eye + handleClick(3, _selectedCard._stationPos); + handleAutoplayPlayer2(); + return; + } else { + // The original code is calling a function full of dead code. + // Only this message remains after a cleanup. + MessageDialog::show(WRONG_ANSWER_MSG, OK_BTN_STRING); + // + handleAutoplayPlayer2(); + return; + } + + Event event; + bool found; + for (;;) { + if ( ((g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN)) && (event.btnState == BTNSHIFT_RIGHT)) + || (g_globals->_events.getEvent(event, EVENT_KEYPRESS)) ){ + _selectedCard._stationPos = g_globals->_events._mousePos; + found = false; + + for (int i = 0; i <= 3; i ++) { + if (_gameBoardSide[2]._handCard[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if (_gameBoardSide[2]._handCard[i]._cardId == 0) { + _gameBoardSide[2]._handCard[i]._cardId = _selectedCard._cardId; + _gameBoardSide[2]._handCard[i]._card.postInit(); + _gameBoardSide[2]._handCard[i]._card.hide(); + _gameBoardSide[2]._handCard[i]._card.setVisage(1332); + _gameBoardSide[2]._handCard[i]._card.setPosition(_gameBoardSide[2]._handCard[i]._stationPos, 0); + _gameBoardSide[2]._handCard[i]._card.fixPriority(170); + setAnimationInfo(&_gameBoardSide[2]._handCard[i]); + setCursorData(5, 1, 4); + _currentPlayerNumb--; + _showPlayerTurn = false; + handleNextTurn(); + return; + } else { + actionDisplay(1330, 127, 159, 10, 1, 200, 0, 7, 0, 154, 154); + found = true; + } + break; + } + } + + if (!found) { + if (_discardPile.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + discardCard(&_selectedCard); + return; + } else if (_selectedCard._cardId == 1) { + bool isInCardFl = false; + int i; + for (i = 0; i <= 7; i++) { + if (_gameBoardSide[2]._outpostStation[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + isInCardFl = true; + break; + } + } + + if ((isInCardFl) && (_gameBoardSide[2]._outpostStation[i]._cardId == 0)) { + if (isDelayCard(_gameBoardSide[2]._delayCard._cardId) != -1) { + actionDisplay(1330, 55, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else { + playPlatformCard(&_selectedCard, &_gameBoardSide[2]._outpostStation[i]); + return; + } + } else { + actionDisplay(1330, 56, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else if (_selectedCard._cardId <= 9) { + bool isInCardFl = false; + int i; + for (i = 0; i <= 7; i++) { + if (_gameBoardSide[2]._outpostStation[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + isInCardFl = true; + break; + } + } + if ((isInCardFl) && (_gameBoardSide[2]._outpostStation[i]._cardId == 1)) { + isInCardFl = false; + for (int j = 0; j <= 7; j++) { + if (_selectedCard._cardId == _gameBoardSide[2]._outpostStation[j]._cardId) { + isInCardFl = true; + break; + } + } + if (isInCardFl) { + // This station is already in place + actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (isDelayCard(_gameBoardSide[2]._delayCard._cardId) != -1) { + // You must eliminate your delay before you can play a station + actionDisplay(1330, 35, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else { + int stationCount = 0; + for (int k = 0; k <= 7; k++) { + if ((_gameBoardSide[2]._outpostStation[k]._cardId > 1) && (_gameBoardSide[2]._outpostStation[k]._cardId <= 9)) + ++stationCount; + } + + if (stationCount == 7) + _winnerId = 2; + + playStationCard(&_selectedCard, &_gameBoardSide[2]._outpostStation[i]); + return; + } + } else { + actionDisplay(1330, 37, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else if ((_selectedCard._cardId == 26) || (_selectedCard._cardId == 30) ||(_selectedCard._cardId == 32) || (_selectedCard._cardId == 28)) { + // Check anti-delay card (26 = Diplomacy, 28 = Innovation, 30 = Cure, 32 = Agreement) + if (_gameBoardSide[2]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + actionDisplay(1330, 42, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (checkAntiDelayCard(_gameBoardSide[2]._delayCard._cardId, _selectedCard._cardId)) { + playAntiDelayCard(&_selectedCard, &_gameBoardSide[2]._delayCard); + return; + } else { + if (_gameBoardSide[2]._delayCard._cardId != 0) { + switch (_gameBoardSide[2]._delayCard._cardId) { + case 11: + actionDisplay(1330, 68, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 14: + actionDisplay(1330, 80, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 16: + actionDisplay(1330, 84, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 24: + actionDisplay(1330, 96, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } else { + actionDisplay(1330, 41, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } + } else if ((getStationCardId(_selectedCard._cardId) == -1) && (isDelayCard(_selectedCard._cardId) == -1)) { + if (_selectedCard._cardId == 13) { + // Meteor Card + if (_gameBoardSide[0]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + for (int k = 0; k <= 7; k++) { + if (_gameBoardSide[0]._outpostStation[k]._cardId != 0) { + playCentralOutpostCard(&_selectedCard, 0); + return; + } + } + actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (_gameBoardSide[3]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + for (int k = 0; k <= 7; k++) { + if (_gameBoardSide[3]._outpostStation[k]._cardId != 0) { + playCentralOutpostCard(&_selectedCard, 3); + return; + } + } + actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (_gameBoardSide[1]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + for (int k = 0; k <= 7; k++) { + if (_gameBoardSide[1]._outpostStation[k]._cardId == 0) { + playCentralOutpostCard(&_selectedCard, 1); + return; + } + } + actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else { + actionDisplay(1330, 128, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else if (_selectedCard._cardId == 25) { + // Thief card + if (_gameBoardSide[0]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if ( (_gameBoardSide[0]._handCard[0]._cardId != 0) + || (_gameBoardSide[0]._handCard[1]._cardId != 0) + || (_gameBoardSide[0]._handCard[2]._cardId != 0) + || (_gameBoardSide[0]._handCard[3]._cardId != 0) ) { + int k; + for (k = 0; k <= 3; k++){ + if (_gameBoardSide[2]._handCard[k]._cardId == 0) + break; + } + playThieftCard(2, &_gameBoardSide[2]._handCard[k], 0); + return; + } else { + actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else if (_gameBoardSide[1]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if ( (_gameBoardSide[1]._handCard[0]._cardId != 0) + || (_gameBoardSide[1]._handCard[1]._cardId != 0) + || (_gameBoardSide[1]._handCard[2]._cardId != 0) + || (_gameBoardSide[1]._handCard[3]._cardId != 0) ) { + int k; + for (k = 0; k <= 3; k++){ + if (_gameBoardSide[2]._handCard[k]._cardId == 0) + break; + } + playThieftCard(2, &_gameBoardSide[2]._handCard[k], 1); + return; + } else { + actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } + + if (_gameBoardSide[3]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if ( (_gameBoardSide[3]._handCard[0]._cardId != 0) + || (_gameBoardSide[3]._handCard[1]._cardId != 0) + || (_gameBoardSide[3]._handCard[2]._cardId != 0) + || (_gameBoardSide[3]._handCard[3]._cardId != 0) ) { + int k; + for (k = 0; k <= 3; k++){ + if (_gameBoardSide[2]._handCard[k]._cardId == 0) + break; + } + playThieftCard(2, &_gameBoardSide[2]._handCard[k], 3); + return; + } else { + actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else { + actionDisplay(1330, 129, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else if (_selectedCard._cardId == 29) { + // Interceptor cards are used to prevent collision + actionDisplay(1330, 136, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (_selectedCard._cardId == 27) { + actionDisplay(1330, 137, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } else if (_gameBoardSide[0]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if (_gameBoardSide[0]._delayCard._cardId != 0) { + actionDisplay(1330, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (!isAttackPossible(0, _selectedCard._cardId)) { + switch (_selectedCard._cardId) { + case 10: + actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 12: + actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 17: + actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 18: + actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 19: + actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 21: + actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } else { + playDelayCard(&_selectedCard, &_gameBoardSide[0]._delayCard); + return; + } + } else if (_gameBoardSide[3]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if (_gameBoardSide[3]._delayCard._cardId != 0) { + actionDisplay(1330, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (!isAttackPossible(3, _selectedCard._cardId)) { + switch (_selectedCard._cardId) { + case 10: + actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 12: + actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 17: + actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 18: + actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 19: + actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 21: + actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } else { + playDelayCard(&_selectedCard, &_gameBoardSide[3]._delayCard); + return; + } + } else if (_gameBoardSide[1]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { + if (_gameBoardSide[1]._delayCard._cardId != 0) { + actionDisplay(1330, 19, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } else if (!isAttackPossible(1, _selectedCard._cardId)) { + switch (_selectedCard._cardId) { + case 10: + actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 12: + actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 15: + actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 17: + actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 18: + actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 19: + actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 20: + actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + case 21: + actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154); + break; + default: + break; + } + } else { + playDelayCard(&_selectedCard, &_gameBoardSide[1]._delayCard); + return; + } + } else { + actionDisplay(1330, 38, 159, 10, 1, 200, 0, 7, 0, 154, 154); + } + } + } else { + g_globals->_scenePalette.signalListeners(); + R2_GLOBALS._sceneObjects->draw(); + g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); + } + + g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); + } +} + +void Scene1337::updateCursorId(int cursorId, bool updateFl) { + if ((R2_GLOBALS._v57709 != 0) || (R2_GLOBALS._v5780C != 0)) + return; + + R2_GLOBALS._mouseCursorId = cursorId; + + if (updateFl) { + R2_GLOBALS._mouseCursorId++; + + if (R2_GLOBALS._mouseCursorId < 1) + R2_GLOBALS._mouseCursorId = 2; + + if (R2_GLOBALS._mouseCursorId > 2) + R2_GLOBALS._mouseCursorId = 1; + } + + // The original was using an intermediate function to call setCursorData. + // It has been removed to improve readability + if (R2_GLOBALS._mouseCursorId == 1) { + R2_GLOBALS._v57810 = 200; + setCursorData(5, 1, 4); + } else if (R2_GLOBALS._mouseCursorId == 2) { + R2_GLOBALS._v57810 = 300; + setCursorData(5, 1, 5); + } else { + R2_GLOBALS._v57810 = 0; + setCursorData(5, 0, 0); + } +} + +void Scene1337::setCursorData(int resNum, int rlbNum, int frameNum) { + _cursorCurRes = resNum; + _cursorCurStrip = rlbNum; + _cursorCurFrame = frameNum; + + if (!frameNum) { + // Should be a hardcoded cursor displaying only a dot. + // FIXME: Use another cursor when possible + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + } else { + // TODO: The original was using some resource caching, which was useless and complex + // and which has been removed. This cursor behavior clearly made intensive use of this caching... + // We now have to find a way to cache these cursor pointers and avoid loading them multiple times per seconds + uint size; + byte *cursor = g_resourceManager->getSubResource(resNum, rlbNum, frameNum, &size); + // Decode the cursor + GfxSurface s = surfaceFromRes(cursor); + + Graphics::Surface surface = s.lockSurface(); + const byte *cursorData = (const byte *)surface.getPixels(); + CursorMan.replaceCursor(cursorData, surface.w, surface.h, s._centroid.x, s._centroid.y, s._transColor); + s.unlockSurface(); + + DEALLOCATE(cursor); + } +} + +void Scene1337::subD18F5() { + if (R2_GLOBALS._v57709 == 0) + // The original restores a copy of the default cursor (the hand), which isn't possible with our implementation + // We reload that cursor instead. + setCursorData(5, 1, 4); + + ++R2_GLOBALS._v57709; +} + +void Scene1337::subD1917() { + if (R2_GLOBALS._v57709 != 0) { + R2_GLOBALS._v57709--; + if (R2_GLOBALS._v57709 == 0) { + // The original was using an intermediate function to call setCursorData. + // It has been removed to improve readability + setCursorData(5, _cursorCurStrip, _cursorCurFrame); + } + } +} + +void Scene1337::subD1940(bool flag) { + if (flag) + ++R2_GLOBALS._v5780C; + else if (R2_GLOBALS._v5780C != 0) + --R2_GLOBALS._v5780C; +} + +void Scene1337::subD1975(int arg1, int arg2) { + // No implementation required in ScummVM: Mouse handling with tons of caching +} + +void Scene1337::OptionsDialog::show() { + OptionsDialog *dlg = new OptionsDialog(); + dlg->draw(); + + // Show the dialog + GfxButton *btn = dlg->execute(NULL); + + // Figure out the new selected character + if (btn == &dlg->_quitGame) + R2_GLOBALS._sceneManager.changeScene(125); + else if (btn == &dlg->_restartGame) + R2_GLOBALS._sceneManager.changeScene(1330); + + // Remove the dialog + dlg->remove(); + delete dlg; +} + +Scene1337::OptionsDialog::OptionsDialog() { + // Set the elements text + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + _autoplay.setText(scene->_autoplay ? AUTO_PLAY_ON : AUTO_PLAY_OFF); + _restartGame.setText(START_NEW_CARD_GAME); + _quitGame.setText(QUIT_CARD_GAME); + _continueGame.setText(CONTINUE_CARD_GAME); + + // Set position of the elements + _autoplay._bounds.moveTo(5, 2); + _restartGame._bounds.moveTo(5, _autoplay._bounds.bottom + 2); + _quitGame._bounds.moveTo(5, _restartGame._bounds.bottom + 2); + _continueGame._bounds.moveTo(5, _quitGame._bounds.bottom + 2); + + // Add the items to the dialog + addElements(&_autoplay, &_restartGame, &_quitGame, &_continueGame, NULL); + + // Set the dialog size and position + frame(); + _bounds.collapse(-6, -6); + setCenter(160, 100); +} + +GfxButton *Scene1337::OptionsDialog::execute(GfxButton *defaultButton) { + _gfxManager.activate(); + + // Event loop + GfxButton *selectedButton = NULL; + + bool breakFlag = false; + while (!g_vm->shouldQuit() && !breakFlag) { + Event event; + while (g_globals->_events.getEvent(event) && !breakFlag) { + // Adjust mouse positions to be relative within the dialog + event.mousePos.x -= _gfxManager._bounds.left; + event.mousePos.y -= _gfxManager._bounds.top; + + for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) { + if ((*i)->process(event)) + selectedButton = static_cast<GfxButton *>(*i); + } + + if (selectedButton == &_autoplay) { + // Toggle Autoplay + selectedButton = NULL; + Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; + scene->_autoplay = !scene->_autoplay; + + _autoplay.setText(scene->_autoplay ? AUTO_PLAY_ON : AUTO_PLAY_OFF); + _autoplay.draw(); + } else if (selectedButton) { + breakFlag = true; + break; + } else if (!event.handled) { + if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { + selectedButton = NULL; + breakFlag = true; + break; + } + } + } + + g_system->delayMillis(10); + GLOBALS._screenSurface.updateScreen(); + } + + _gfxManager.deactivate(); + return selectedButton; +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_outpost.h b/engines/tsage/ringworld2/ringworld2_outpost.h new file mode 100644 index 0000000000..6c6952c196 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_outpost.h @@ -0,0 +1,259 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_OUTPOST_H +#define TSAGE_RINGWORLD2_OUTPOST_H + +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene1337 : public SceneExt { + class OptionsDialog: public GfxDialog { + private: + GfxButton _autoplay; + GfxButton _restartGame; + GfxButton _quitGame; + GfxButton _continueGame; + + OptionsDialog(); + virtual ~OptionsDialog() {} + virtual GfxButton *execute(GfxButton *defaultButton); + public: + static void show(); + }; + + class Card: public SceneHotspot { + public: + SceneObject _card; + + int _cardId; + Common::Point _stationPos; + + Card(); + void synchronize(Serializer &s); + bool isIn(Common::Point pt); + }; + + class GameBoardSide: public SceneHotspot { + public: + Card _handCard[4]; + Card _outpostStation[8]; + Card _delayCard; + Card _emptyStationPos; + + Common::Point _card1Pos; + Common::Point _card2Pos; + Common::Point _card3Pos; + Common::Point _card4Pos; + int _frameNum; + + GameBoardSide(); + void synchronize(Serializer &s); + }; + + class Action1337: public Action { + public: + void waitFrames(int32 frameCount); + }; + + class Action1: public Action1337 { + public: + void signal(); + }; + class Action2: public Action1337 { + public: + void signal(); + }; + class Action3: public Action1337 { + public: + void signal(); + }; + class Action4: public Action1337 { + public: + void signal(); + }; + class Action5: public Action1337 { + public: + void signal(); + }; + class Action6: public Action1337 { + public: + void signal(); + }; + class Action7: public Action1337 { + public: + void signal(); + }; + class Action8: public Action1337 { + public: + void signal(); + }; + class Action9: public Action1337 { + public: + void signal(); + }; + class Action10: public Action1337 { + public: + void signal(); + }; + class Action11: public Action1337 { + public: + void signal(); + }; + class Action12: public Action1337 { + public: + void signal(); + }; + class Action13: public Action1337 { + public: + void signal(); + }; +public: + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + Action10 _action10; + Action11 _action11; + Action12 _action12; + Action13 _action13; + + typedef void (Scene1337::*FunctionPtrType)(); + FunctionPtrType _delayedFunction; + + bool _autoplay; + bool _shuffleEndedFl; + bool _showPlayerTurn; + bool _displayHelpFl; + bool _instructionsDisplayedFl; + + // Discarded cards are put in the available cards pile, with an higher index so there no conflict + int _currentDiscardIndex; + int _availableCardsPile[100]; + int _cardsAvailableNumb; + int _currentPlayerNumb; + int _actionPlayerIdx; + int _actionVictimIdx; + int _winnerId; + int _instructionsWaitCount; + int _cursorCurRes; + int _cursorCurStrip; + int _cursorCurFrame; + + ASound _aSound1; + ASound _aSound2; + GameBoardSide _gameBoardSide[4]; + SceneActor _helpIcon; + SceneActor _stockPile; + SceneItem _actionItem; + SceneObject _currentPlayerArrow; + + Card *_actionCard1; + Card *_actionCard2; + Card *_actionCard3; + Card _animatedCard; + Card _shuffleAnimation; + Card _discardedPlatformCard; + Card _selectedCard; + Card _discardPile; + Card _stockCard; + + SceneObject _upperDisplayCard[8]; + SceneObject _lowerDisplayCard[8]; + + Scene1337(); + virtual void synchronize(Serializer &s); + + void actionDisplay(int resNum, int lineNum, int x, int y, int keepOnScreen, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt); + void setAnimationInfo(Card *card); + void handleNextTurn(); + void handlePlayerTurn(); + bool isStationCard(int cardId); + bool isStopConstructionCard(int cardId); + int getStationId(int playerId, int handCardId); + int findPlatformCardInHand(int playerId); + int findMeteorCardInHand(int playerId); + int findThieftCardInHand(int playerId); + int isDelayCard(int cardId); + int getStationCardId(int cardId); + void handlePlayer01Discard(int playerId); + void playThieftCard(int playerId, Card *card, int victimId); + int getPreventionCardId(int cardId); + bool isAttackPossible(int victimId, int cardId); + int getPlayerWithOutpost(int playerId); + bool checkAntiDelayCard(int delayCardId, int cardId); + void playStationCard(Card *station, Card *platform); + void playDelayCard(Card *card, Card *dest); + void playPlatformCard(Card *card, Card *dest); + void playAntiDelayCard(Card *card, Card *dest); + Card *getStationCard(int arg1); + void playCentralOutpostCard(Card *card, int playerId); + int getRandomCardFromHand(int playerId); + void discardCard(Card *card); + void subC4CD2(); + void subC4CEC(); + void playInterceptorCard(Card *subObj1, Card *subObj2); + void displayDialog(int dialogNumb); + void subPostInit(); + void displayInstructions(); + void suggestInstructions(); + void shuffleCards(); + void dealCards(); + void showOptionsDialog(); + void handleClick(int arg1, Common::Point pt); + void handlePlayer0(); + void handlePlayer1(); + void handlePlayer2(); + void handlePlayer3(); + void handleAutoplayPlayer2(); + void updateCursorId(int arg1, bool arg2); + void setCursorData(int resNum, int rlbNum, int frameNum); + void subD18F5(); + void subD1917(); + void subD1940(bool flag); + void subD1975(int arg1, int arg2); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp index b82565332a..573cbbb29a 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -627,7 +627,7 @@ void Scene125::postInit(SceneObjectList *OwnerList) { SceneExt::postInit(); _palette.loadPalette(0); - if (R2_GLOBALS._sceneManager._previousScene != 125) + if ((R2_GLOBALS._sceneManager._previousScene != 125) && (R2_GLOBALS._sceneManager._previousScene != 1337) && (R2_GLOBALS._sceneManager._previousScene != 1330)) // Save the prior scene to return to when the console is turned off R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = R2_GLOBALS._sceneManager._previousScene; diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp index e2c22bd0b4..81dc05e2a4 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp @@ -1321,5469 +1321,6 @@ void Scene1100::saveCharacter(int characterIndex) { } /*-------------------------------------------------------------------------- - * Scene 1200 - Air Ducts Maze - * - *--------------------------------------------------------------------------*/ - -Scene1200::Scene1200() { - _nextCrawlDirection = 0; - _field414 = 0; - _field416 = 0; - _field418 = 0; - _field41A = 0; - _fixupMaze = false; -} - -void Scene1200::synchronize(Serializer &s) { - SceneExt::synchronize(s); - - s.syncAsSint16LE(_nextCrawlDirection); - s.syncAsSint16LE(_field414); - s.syncAsSint16LE(_field416); - s.syncAsSint16LE(_field418); - s.syncAsSint16LE(_field41A); - s.syncAsSint16LE(_fixupMaze); -} - -Scene1200::LaserPanel::LaserPanel() { -} - -void Scene1200::LaserPanel::Jumper::init(int state) { - _state = state; - - SceneActor::postInit(); - setup(1003, 1, 1); - fixPriority(255); - - switch (_state) { - case 1: - switch (R2_GLOBALS._ductMazePanel1State) { - case 1: - setFrame2(2); - setPosition(Common::Point(129, 101)); - break; - case 2: - setFrame2(3); - setPosition(Common::Point(135, 95)); - break; - default: - break; - } - break; - case 2: - switch (R2_GLOBALS._ductMazePanel2State) { - case 1: - setFrame2(2); - setPosition(Common::Point(152, 101)); - break; - case 2: - setFrame2(3); - setPosition(Common::Point(158, 122)); - break; - case 3: - setFrame2(3); - setPosition(Common::Point(135, 122)); - break; - default: - break; - } - break; - case 3: - switch (R2_GLOBALS._ductMazePanel3State) { - case 1: - setFrame2(3); - setPosition(Common::Point(158, 95)); - break; - case 2: - setFrame2(2); - setPosition(Common::Point(175, 101)); - break; - default: - break; - } - break; - default: - break; - } - - setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL); -} - -bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - R2_GLOBALS._sound2.play(260); - switch (_state) { - case 1: - if (R2_GLOBALS._ductMazePanel1State == 1) { - R2_GLOBALS._ductMazePanel1State = 2; - setFrame2(3); - setPosition(Common::Point(135, 95)); - } else { - R2_GLOBALS._ductMazePanel1State = 1; - setFrame2(2); - setPosition(Common::Point(129, 101)); - } - break; - case 2: - ++R2_GLOBALS._ductMazePanel2State; - if (R2_GLOBALS._ductMazePanel2State == 4) - R2_GLOBALS._ductMazePanel2State = 1; - - switch (R2_GLOBALS._ductMazePanel2State) { - case 1: - setFrame2(2); - setPosition(Common::Point(152, 101)); - break; - case 2: - setFrame2(3); - setPosition(Common::Point(158, 122)); - break; - case 3: - setFrame2(3); - setPosition(Common::Point(135, 122)); - break; - default: - break; - } - break; - case 3: - if (R2_GLOBALS._ductMazePanel3State == 1) { - R2_GLOBALS._ductMazePanel3State = 2; - setFrame2(2); - setPosition(Common::Point(175, 101)); - } else { - R2_GLOBALS._ductMazePanel3State = 1; - setFrame2(3); - setPosition(Common::Point(158, 95)); - } - break; - default: - break; - } - - Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; - scene->_field418 = 0; - - if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - scene->_field418 = 1; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - scene->_field418 = 2; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) - scene->_field418 = 3; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) - scene->_field418 = 4; - - return true; -} - -void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) { - Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; - - scene->_field41A = 1; - R2_GLOBALS._events.setCursor(CURSOR_USE); - setup2(1003, 1, 1, 100, 40); - setup3(1200, 11, -1, -1); - R2_GLOBALS._sound2.play(259); - _jumper1.init(1); - _jumper2.init(2); - _jumper3.init(3); - - R2_GLOBALS._player._canWalk = false; -} - -void Scene1200::LaserPanel::remove() { - Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; - - scene->_field41A = 0; - scene->_sceneAreas.remove(&_jumper1); - scene->_sceneAreas.remove(&_jumper2); - scene->_sceneAreas.remove(&_jumper3); - _jumper1.remove(); - _jumper2.remove(); - _jumper3.remove(); - - ModalWindow::remove(); - R2_GLOBALS._player._canWalk = true; -} - -void Scene1200::postInit(SceneObjectList *OwnerList) { - loadScene(1200); - SceneExt::postInit(); - - if (R2_GLOBALS._sceneManager._previousScene < 3200) - R2_GLOBALS._sound1.play(257); - - _nextCrawlDirection = CRAWL_EAST; - _field414 = 0; - _field416 = 0; - _field418 = 0; - _field41A = 0; - - if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - _field418 = 1; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - _field418 = 2; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) - _field418 = 3; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) - _field418 = 4; - - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.setup(3156, 1, 6); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200; - - _actor1.postInit(); - _actor1.hide(); - - _mazeUI.setDisplayBounds(Rect(110, 20, 210, 120)); - - _mazeUI.postInit(); - _mazeUI.load(1); - _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); - - R2_GLOBALS._player.enableControl(); - _item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL); -} - -void Scene1200::signal() { - switch (_sceneMode++) { - case 1: - // No break on purpose - case 1200: - // No break on purpose - case 1201: - // No break on purpose - case 1202: - // No break on purpose - case 1203: - R2_GLOBALS._player.enableControl(); - // CHECKME: The original is calling _eventManager.waitEvent(); - _sceneMode = 2; - break; - case 10: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(1); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 11: - // No break on purpose - case 21: - // No break on purpose - case 31: - // No break on purpose - case 41: - _field416 = 0; - break; - case 12: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 1, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 13: - // No break on purpose - case 16: - // No break on purpose - case 23: - // No break on purpose - case 26: - // No break on purpose - case 33: - // No break on purpose - case 36: - // No break on purpose - case 43: - // No break on purpose - case 46: - R2_GLOBALS._player.setFrame(4); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 15: - // No break on purpose - case 25: - // No break on purpose - case 35: - // No break on purpose - case 45: - _field414 = 20; - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 20: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(2); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 22: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 2, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 30: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(3); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 32: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 3, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 40: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(4); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 42: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 4, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 50: - // No break on purpose - case 55: - // No break on purpose - case 60: - R2_GLOBALS._player.setup(3156, 5, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 51: - // No break on purpose - case 56: - // No break on purpose - case 117: - R2_GLOBALS._player.setup(3157, 1, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 52: - // No break on purpose - case 82: - // No break on purpose - case 118: - R2_GLOBALS._player.setup(3156, 3, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 57: - // No break on purpose - case 91: - // No break on purpose - case 96: - R2_GLOBALS._player.setup(3157, 2, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 58: - // No break on purpose - case 92: - // No break on purpose - case 122: - R2_GLOBALS._player.setup(3156, 2, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 61: - R2_GLOBALS._player.setup(3157, 4, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 62: - // No break on purpose - case 72: - // No break on purpose - case 98: - R2_GLOBALS._player.setup(3156, 4, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 70: - // No break on purpose - case 75: - // No break on purpose - case 80: - R2_GLOBALS._player.setup(3156, 6, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 71: - // No break on purpose - case 76: - // No break on purpose - case 97: - R2_GLOBALS._player.setup(3157, 3, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 77: - // No break on purpose - case 111: - // No break on purpose - case 116: - R2_GLOBALS._player.setup(3157, 4, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 78: - // No break on purpose - case 102: - // No break on purpose - case 112: - R2_GLOBALS._player.setup(3156, 1, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 81: - R2_GLOBALS._player.setup(3157, 2, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 90: - // No break on purpose - case 95: - // No break on purpose - case 100: - R2_GLOBALS._player.setup(3156, 7, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 101: - R2_GLOBALS._player.setup(3157, 1, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 110: - // No break on purpose - case 115: - // No break on purpose - case 120: - R2_GLOBALS._player.setup(3156, 8, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 121: - R2_GLOBALS._player.setup(3157, 3, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - default: - // CHECKME: The original is walling _eventManager.waitEvent(); - _sceneMode = 2; - break; - } -} - -void Scene1200::process(Event &event) { - if (_field414 != 0) - return; - - Scene::process(event); - - if (!R2_GLOBALS._player._canWalk) - return; - - if (event.eventType == EVENT_BUTTON_DOWN) { - Common::Point cellPos = R2_GLOBALS._ventCellPos; - _mazeUI.pixelToCellXY(cellPos); - - int cellId = _mazeUI.getCellFromPixelXY(event.mousePos); - switch (R2_GLOBALS._events.getCursor()) { - case CURSOR_WALK: - event.handled = true; - if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) - startCrawling(CRAWL_EAST); - - if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) - startCrawling(CRAWL_WEST); - - if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120)) - startCrawling(CRAWL_SOUTH); - - if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50)) - startCrawling(CRAWL_NORTH); - break; - case CURSOR_USE: - if (cellId > 36) { - if ( ((cellPos.x == 3) && (cellPos.y == 33)) - || ((cellPos.x == 7) && (cellPos.y == 33)) - || ((cellPos.x == 33) && (cellPos.y == 41)) - || ((cellPos.x == 5) && (cellPos.y == 5)) - || ((cellPos.x == 13) && (cellPos.y == 21)) - || ((cellPos.x == 17) && (cellPos.y == 21)) - || ((cellPos.x == 17) && (cellPos.y == 5)) - || ((cellPos.x == 17) && (cellPos.y == 9)) - || ((cellPos.x == 29) && (cellPos.y == 17)) - || ((cellPos.x == 33) && (cellPos.y == 17)) - || ((cellPos.x == 35) && (cellPos.y == 17)) - || ((cellPos.x == 41) && (cellPos.y == 21)) ) { - _laserPanel.postInit(); - event.handled = true; - } - } - - if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { - if ( ((cellPos.x == 3) && (cellPos.y == 9)) - || ((cellPos.x == 11) && (cellPos.y == 27)) - || ((cellPos.x == 17) && (cellPos.y == 7)) - || ((cellPos.x == 17) && (cellPos.y == 27)) - || ((cellPos.x == 17) && (cellPos.y == 33)) - || (cellPos.x == 33) ) { - switch (cellPos.x) { - case 3: - R2_GLOBALS._sceneManager.changeScene(3150); - break; - case 33: - if (R2_GLOBALS._scientistConvIndex >= 4) - R2_GLOBALS._sceneManager.changeScene(3250); - else - SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); - break; - default: - SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); - break; - } - event.handled = true; - } - } - break; - case CURSOR_LOOK: - if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { - event.handled = true; - switch (cellPos.x) { - case 3: - // It was your cell. - SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 9: - R2_GLOBALS._sceneManager.changeScene(3240); - break; - case 11: - if (cellPos.y == 27) - R2_GLOBALS._sceneManager.changeScene(3210); - else - // A vent grill - SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 17: - switch (cellPos.y) { - case 5: - R2_GLOBALS._sceneManager.changeScene(3230); - break; - case 21: - R2_GLOBALS._sceneManager.changeScene(3220); - break; - case 33: - R2_GLOBALS._sceneManager.changeScene(3200); - break; - default: - // A vent grill - SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - } - break; - case 33: - R2_GLOBALS._sceneManager.changeScene(3245); - break; - default: - SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - } - } - if (cellId > 36) { - // "An anti-pest laser" - event.handled = true; - SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - } - break; - case CURSOR_TALK: - event.handled = true; - break; - default: - return; - } - } else if (event.eventType == EVENT_KEYPRESS) { - if (_field414) { - event.handled = false; - return; - } - - switch (event.kbd.keycode) { - case Common::KEYCODE_KP8: - case Common::KEYCODE_UP: - startCrawling(CRAWL_NORTH); - break; - case Common::KEYCODE_KP4: - case Common::KEYCODE_LEFT: - startCrawling(CRAWL_WEST); - break; - case Common::KEYCODE_KP6: - case Common::KEYCODE_RIGHT: - startCrawling(CRAWL_EAST); - break; - case Common::KEYCODE_KP2: - case Common::KEYCODE_DOWN: - startCrawling(CRAWL_SOUTH); - break; - default: - event.handled = false; - return; - break; - } - } else - return; -} - -void Scene1200::dispatch() { - Rect tmpRect; - Scene::dispatch(); - - if (_fixupMaze) { - _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); - //_mazeUI.draw(); - _fixupMaze = false; - } - - if (_field414 != 0) { - tmpRect.set(110, 20, 210, 120); - _field414--; - - switch (_nextCrawlDirection) { - case CRAWL_EAST: - R2_GLOBALS._ventCellPos.x += 2; - break; - case CRAWL_WEST: - R2_GLOBALS._ventCellPos.x -= 2; - break; - case CRAWL_SOUTH: - R2_GLOBALS._ventCellPos.y += 2; - break; - case CRAWL_NORTH: - R2_GLOBALS._ventCellPos.y -= 2; - break; - default: - break; - } - - _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); - //_mazeUI.draw(); - - if (_field416 != 0) { - switch(_nextCrawlDirection) { - case CRAWL_EAST: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y)); - break; - case CRAWL_WEST: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y)); - break; - case CRAWL_SOUTH: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2)); - break; - case CRAWL_NORTH: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2)); - break; - default: - break; - } - } - if (_field414 == 0) { - if (_field416 == 0) - R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); - signal(); - } - } -} - -void Scene1200::saveCharacter(int characterIndex) { - R2_GLOBALS._sound1.fadeOut2(NULL); - SceneExt::saveCharacter(characterIndex); -} - -void Scene1200::startCrawling(CrawlDirection dir) { - Common::Point cellPos = R2_GLOBALS._ventCellPos; - _mazeUI.pixelToCellXY(cellPos); - - switch (dir) { - case CRAWL_EAST: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(200, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(200, 88)) > 36)) - && ( ((cellPos.x == 3) && (cellPos.y == 33) && (_field418 != 4)) - || ((cellPos.x == 13) && (cellPos.y == 21) && (_field418 != 2)) - || ((cellPos.x == 29) && (cellPos.y == 17) && (_field418 != 1)) - || ((cellPos.x == 33) && (cellPos.y == 41)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1200; - setAction(&_sequenceManager, this, 1200, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(200, 69)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 15; - else - _sceneMode = 10; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 76; - else - _sceneMode = 75; - break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 101; - else - _sceneMode = 100; - break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 111; - else - _sceneMode = 110; - break; - default: - break; - } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 1; - signal(); - } - break; - case CRAWL_WEST: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(120, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(120, 88)) > 36)) - && ( ((cellPos.x == 7) && (cellPos.y == 33) && (_field418 != 4)) - || ((cellPos.x == 17) && (cellPos.y == 21) && (_field418 != 2)) - || ((cellPos.x == 33) && (cellPos.y == 17) && (_field418 != 1)) - || ((cellPos.x == 5) && (cellPos.y == 5)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1201; - setAction(&_sequenceManager, this, 1201, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(120, 69)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 56; - else - _sceneMode = 55; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 25; - else - _sceneMode = 20; - break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 91; - else - _sceneMode = 90; - break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 121; - else - _sceneMode = 120; - break; - default: - break; - } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 2; - signal(); - } - break; - case CRAWL_SOUTH: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 110)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 110)) > 36)) - && ( ((cellPos.x == 17) && (cellPos.y == 5) && (_field418 != 3)) - || ((cellPos.x == 41) && (cellPos.y == 21)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1203; - setAction(&_sequenceManager, this, 1203, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 110)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 51; - else - _sceneMode = 50; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 81; - else - _sceneMode = 80; - break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 35; - else - _sceneMode = 30; - break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 116; - else - _sceneMode = 115; - break; - default: - break; - } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 3; - signal(); - } - break; - case CRAWL_NORTH: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 30)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 30)) > 36)) - && ( ((cellPos.x == 17) && (cellPos.y == 9) && (_field418 != 3)) - || ((cellPos.x == 35) && (cellPos.y == 17)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1202; - setAction(&_sequenceManager, this, 1202, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 30)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 61; - else - _sceneMode = 60; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 71; - else - _sceneMode = 70; - break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 96; - else - _sceneMode = 95; - break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 45; - else - _sceneMode = 40; - break; - default: - _sceneMode = 1; - R2_GLOBALS._player.setup(3156, 4, 6); - break; - } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 4; - signal(); - } - break; - default: - break; - } -} - -/*-------------------------------------------------------------------------- - * Scene 1337 - Card game - * - *--------------------------------------------------------------------------*/ - -Scene1337::Card::Card() { - _cardId = 0; - _stationPos = Common::Point(0, 0); -} - -void Scene1337::Card::synchronize(Serializer &s) { - warning("STUBBED: Card::synchronize()"); -} - -bool Scene1337::Card::isIn(Common::Point pt) { - if ((_stationPos.x > pt.x) || (_stationPos.x + 24 < pt.x)) - return false; - - if ((_stationPos.y > pt.y) || (_stationPos.y + 24 < pt.y)) - return false; - - return true; -} - -Scene1337::GameBoardSide::GameBoardSide() { - _card1Pos = Common::Point(0, 0); - _card2Pos = Common::Point(0, 0); - _card3Pos = Common::Point(0, 0); - _card4Pos = Common::Point(0, 0); - _frameNum = 0; -} - -void Scene1337::GameBoardSide::synchronize(Serializer &s) { - warning("STUBBED: GameBoardSide::synchronize()"); -} - -Scene1337::Scene1337() { - _autoplay = false; - _cardsAvailableNumb = 0; - _currentDiscardIndex = 0; - - for (int i = 0; i < 100; i++) - _availableCardsPile[i] = 0; - - _shuffleEndedFl = false; - _currentPlayerNumb = 0; - _actionIdx1 = 0; - _actionIdx2 = 0; - _showPlayerTurn = false; - _displayHelpFl = false; - _winnerId = -1; - _instructionsDisplayedFl = false; - _instructionsWaitCount = 0; - - _delayedFunction = nullptr; - _actionCard1 = nullptr; - _actionCard2 = nullptr; - _actionCard3 = nullptr; - - _cursorCurRes = 0; - _cursorCurStrip = 0; - _cursorCurFrame = 0; -} - -void Scene1337::synchronize(Serializer &s) { - warning("STUBBED: Scene1337::synchronize()"); -} - -void Scene1337::Action1337::waitFrames(int32 frameCount) { - uint32 firstFrameNumber = g_globals->_events.getFrameNumber(); - uint32 curFrame = firstFrameNumber; - uint32 destFrame = firstFrameNumber + frameCount; - - while ((curFrame < destFrame) && !g_vm->shouldQuit()) { - TsAGE::Event event; - g_globals->_events.getEvent(event); - curFrame = g_globals->_events.getFrameNumber(); - } - - // CHECKME: The original is calling _eventManager.waitEvent(); -} - -/** - * Display instructions - */ -void Scene1337::Action1::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 1: { - scene->actionDisplay(1331, 6, 159, 10, 1, 200, 0, 7, 0, 154, 154); - R2_GLOBALS._sceneObjects->draw(); - scene->actionDisplay(1331, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154); - scene->actionDisplay(1331, 8, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - scene->_gameBoardSide[1]._outpostStation[0]._cardId = 2; - scene->_gameBoardSide[1]._outpostStation[0]._card.postInit(); - scene->_gameBoardSide[1]._outpostStation[0]._card.setVisage(1332); - scene->_gameBoardSide[1]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[1]._outpostStation[0]._stationPos, 0); - scene->_gameBoardSide[1]._outpostStation[0]._card.setStrip(2); - scene->_gameBoardSide[1]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[1]._outpostStation[0]._cardId); - scene->_gameBoardSide[1]._outpostStation[0]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[1]._outpostStation[0]); - - scene->_gameBoardSide[1]._outpostStation[1]._cardId = 3; - scene->_gameBoardSide[1]._outpostStation[1]._card.postInit(); - scene->_gameBoardSide[1]._outpostStation[1]._card.setVisage(1332); - scene->_gameBoardSide[1]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[1]._outpostStation[1]._stationPos, 0); - scene->_gameBoardSide[1]._outpostStation[1]._card.setStrip(2); - scene->_gameBoardSide[1]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[1]._outpostStation[1]._cardId); - scene->_gameBoardSide[1]._outpostStation[1]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[1]._outpostStation[1]); - - scene->_gameBoardSide[2]._outpostStation[0]._cardId = 4; - scene->_gameBoardSide[2]._outpostStation[0]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[0]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[0]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[0]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[0]._cardId); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[0]); - - scene->_gameBoardSide[3]._outpostStation[0]._cardId = 5; - scene->_gameBoardSide[3]._outpostStation[0]._card.postInit(); - scene->_gameBoardSide[3]._outpostStation[0]._card.setVisage(1332); - scene->_gameBoardSide[3]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[0]._stationPos, 0); - scene->_gameBoardSide[3]._outpostStation[0]._card.setStrip(2); - scene->_gameBoardSide[3]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[0]._cardId); - scene->_gameBoardSide[3]._outpostStation[0]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[0]); - - scene->_gameBoardSide[3]._outpostStation[1]._cardId = 6; - scene->_gameBoardSide[3]._outpostStation[1]._card.postInit(); - scene->_gameBoardSide[3]._outpostStation[1]._card.setVisage(1332); - scene->_gameBoardSide[3]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[1]._stationPos, 0); - scene->_gameBoardSide[3]._outpostStation[1]._card.setStrip(2); - scene->_gameBoardSide[3]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[1]._cardId); - scene->_gameBoardSide[3]._outpostStation[1]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[1]); - - scene->_gameBoardSide[3]._outpostStation[2]._cardId = 7; - scene->_gameBoardSide[3]._outpostStation[2]._card.postInit(); - scene->_gameBoardSide[3]._outpostStation[2]._card.setVisage(1332); - scene->_gameBoardSide[3]._outpostStation[2]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[2]._stationPos, 0); - scene->_gameBoardSide[3]._outpostStation[2]._card.setStrip(2); - scene->_gameBoardSide[3]._outpostStation[2]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[2]._cardId); - scene->_gameBoardSide[3]._outpostStation[2]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[2]); - - scene->_gameBoardSide[0]._outpostStation[0]._cardId = 8; - scene->_gameBoardSide[0]._outpostStation[0]._card.postInit(); - scene->_gameBoardSide[0]._outpostStation[0]._card.setVisage(1332); - scene->_gameBoardSide[0]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[0]._outpostStation[0]._stationPos, 0); - scene->_gameBoardSide[0]._outpostStation[0]._card.setStrip(2); - scene->_gameBoardSide[0]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[0]._outpostStation[0]._cardId); - scene->_gameBoardSide[0]._outpostStation[0]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[0]._outpostStation[0]); - - scene->_gameBoardSide[0]._outpostStation[1]._cardId = 9; - scene->_gameBoardSide[0]._outpostStation[1]._card.postInit(); - scene->_gameBoardSide[0]._outpostStation[1]._card.setVisage(1332); - scene->_gameBoardSide[0]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[0]._outpostStation[1]._stationPos, 0); - scene->_gameBoardSide[0]._outpostStation[1]._card.setStrip(2); - scene->_gameBoardSide[0]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[0]._outpostStation[1]._cardId); - scene->_gameBoardSide[0]._outpostStation[1]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[0]._outpostStation[1]); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(60); - scene->actionDisplay(1331, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - scene->_gameBoardSide[2]._outpostStation[1]._cardId = 2; - scene->_gameBoardSide[2]._outpostStation[1]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[1]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[1]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[1]._cardId); - scene->_gameBoardSide[2]._outpostStation[1]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]); - - scene->_gameBoardSide[2]._outpostStation[2]._cardId = 3; - scene->_gameBoardSide[2]._outpostStation[2]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[2]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[2]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[2]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[2]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[2]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[2]._cardId); - scene->_gameBoardSide[2]._outpostStation[2]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[2]); - - scene->_gameBoardSide[2]._outpostStation[3]._cardId = 5; - scene->_gameBoardSide[2]._outpostStation[3]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[3]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[3]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[3]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[3]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[3]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[3]._cardId); - scene->_gameBoardSide[2]._outpostStation[3]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[3]); - - scene->_gameBoardSide[2]._outpostStation[4]._cardId = 6; - scene->_gameBoardSide[2]._outpostStation[4]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[4]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[4]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[4]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[4]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[4]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[4]._cardId); - scene->_gameBoardSide[2]._outpostStation[4]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[4]); - - scene->_gameBoardSide[2]._outpostStation[5]._cardId = 7; - scene->_gameBoardSide[2]._outpostStation[5]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[5]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[5]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[5]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[5]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[5]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[5]._cardId); - scene->_gameBoardSide[2]._outpostStation[5]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[5]); - - scene->_gameBoardSide[2]._outpostStation[6]._cardId = 8; - scene->_gameBoardSide[2]._outpostStation[6]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[6]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[6]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[6]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[6]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[6]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[6]._cardId); - scene->_gameBoardSide[2]._outpostStation[6]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[6]); - - scene->_gameBoardSide[2]._outpostStation[7]._cardId = 9; - scene->_gameBoardSide[2]._outpostStation[7]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[7]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[7]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[7]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[7]._card.setStrip(2); - scene->_gameBoardSide[2]._outpostStation[7]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[7]._cardId); - scene->_gameBoardSide[2]._outpostStation[7]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[7]); - - scene->_aSound1.play(62); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(120); - scene->_gameBoardSide[2]._outpostStation[0]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[1]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[2]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[3]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[4]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[5]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[6]._card.remove(); - scene->_gameBoardSide[2]._outpostStation[7]._card.remove(); - - scene->_gameBoardSide[1]._outpostStation[0]._card.remove(); - scene->_gameBoardSide[1]._outpostStation[1]._card.remove(); - - scene->_gameBoardSide[3]._outpostStation[0]._card.remove(); - scene->_gameBoardSide[3]._outpostStation[1]._card.remove(); - scene->_gameBoardSide[3]._outpostStation[2]._card.remove(); - - scene->_gameBoardSide[0]._outpostStation[0]._card.remove(); - scene->_gameBoardSide[0]._outpostStation[1]._card.remove(); - - scene->_stockPile.setup(1332, 5, 1); - scene->_stockPile.setPosition(Common::Point(165, 95)); - scene->_stockPile.setPriority(110); - scene->_stockPile._effect = EFFECT_SHADED; - scene->_stockPile.show(); - - scene->_gameBoardSide[1]._handCard[0]._card.postInit(); - scene->_gameBoardSide[1]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[1]._handCard[0]._card.setPosition(scene->_gameBoardSide[1]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[1]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[1]._handCard[0]._card.setFrame(4); - scene->_gameBoardSide[1]._handCard[0]._card.fixPriority(170); - - scene->_gameBoardSide[1]._handCard[1]._card.postInit(); - scene->_gameBoardSide[1]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[1]._handCard[1]._card.setPosition(scene->_gameBoardSide[1]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[1]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[1]._handCard[1]._card.setFrame(4); - scene->_gameBoardSide[1]._handCard[1]._card.fixPriority(170); - - scene->_gameBoardSide[1]._handCard[2]._card.postInit(); - scene->_gameBoardSide[1]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[1]._handCard[2]._card.setPosition(scene->_gameBoardSide[1]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[1]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[1]._handCard[2]._card.setFrame(4); - scene->_gameBoardSide[1]._handCard[2]._card.fixPriority(170); - - scene->_gameBoardSide[2]._handCard[0]._cardId = 30; - scene->_gameBoardSide[2]._handCard[0]._card.postInit(); - scene->_gameBoardSide[2]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[0]._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[2]._handCard[0]._card.setFrame(2); - scene->_gameBoardSide[2]._handCard[0]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[0]); - - scene->_gameBoardSide[2]._handCard[1]._cardId = 16; - scene->_gameBoardSide[2]._handCard[1]._card.postInit(); - scene->_gameBoardSide[2]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[1]._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[2]._handCard[1]._card.setFrame(2); - scene->_gameBoardSide[2]._handCard[1]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[1]); - - scene->_gameBoardSide[2]._handCard[2]._cardId = 1; - scene->_gameBoardSide[2]._handCard[2]._card.postInit(); - scene->_gameBoardSide[2]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[2]._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[2]._handCard[2]._card.setFrame(2); - scene->_gameBoardSide[2]._handCard[2]._card.fixPriority(170); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[2]); - - scene->_gameBoardSide[3]._handCard[0]._card.postInit(); - scene->_gameBoardSide[3]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[3]._handCard[0]._card.setPosition(scene->_gameBoardSide[3]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[3]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[3]._handCard[0]._card.setFrame(3); - scene->_gameBoardSide[3]._handCard[0]._card.fixPriority(170); - - scene->_gameBoardSide[3]._handCard[1]._card.postInit(); - scene->_gameBoardSide[3]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[3]._handCard[1]._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[3]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[3]._handCard[1]._card.setFrame(3); - scene->_gameBoardSide[3]._handCard[1]._card.fixPriority(170); - - scene->_gameBoardSide[3]._handCard[2]._card.postInit(); - scene->_gameBoardSide[3]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[3]._handCard[2]._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[3]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[3]._handCard[2]._card.setFrame(3); - scene->_gameBoardSide[3]._handCard[2]._card.fixPriority(170); - - scene->_gameBoardSide[0]._handCard[0]._card.postInit(); - scene->_gameBoardSide[0]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[0]._handCard[0]._card.setPosition(scene->_gameBoardSide[0]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[0]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[0]._handCard[0]._card.setFrame(2); - scene->_gameBoardSide[0]._handCard[0]._card.fixPriority(170); - - scene->_gameBoardSide[0]._handCard[1]._card.postInit(); - scene->_gameBoardSide[0]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[0]._handCard[1]._card.setPosition(scene->_gameBoardSide[0]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[0]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[0]._handCard[1]._card.setFrame(2); - scene->_gameBoardSide[0]._handCard[1]._card.fixPriority(170); - - scene->_gameBoardSide[0]._handCard[2]._card.postInit(); - scene->_gameBoardSide[0]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[0]._handCard[2]._card.setPosition(scene->_gameBoardSide[0]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[0]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[0]._handCard[2]._card.setFrame(2); - scene->_gameBoardSide[0]._handCard[2]._card.fixPriority(170); - - R2_GLOBALS._sceneObjects->draw(); - - scene->actionDisplay(1331, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154); - scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0); - scene->_animatedCard._card.show(); - scene->_aSound2.play(61); - - Common::Point pt(91, 174); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - } - break; - case 2: { - scene->_gameBoardSide[2]._handCard[3]._cardId = 2; - scene->_gameBoardSide[2]._handCard[3]._card.postInit(); - scene->_gameBoardSide[2]._handCard[3]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[3]._card.setPosition(scene->_gameBoardSide[2]._handCard[3]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[3]._card.setStrip(1); - scene->_gameBoardSide[2]._handCard[3]._card.setFrame(2); - scene->_gameBoardSide[2]._handCard[3]._card.fixPriority(170); - - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[3]); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(60); - scene->actionDisplay(1331, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - scene->actionDisplay(1331, 12, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - scene->_gameBoardSide[2]._outpostStation[1]._cardId = 1; - scene->_gameBoardSide[2]._outpostStation[1]._card.postInit(); - scene->_gameBoardSide[2]._outpostStation[1]._card.setVisage(1332); - scene->_gameBoardSide[2]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0); - scene->_gameBoardSide[2]._outpostStation[1]._card.hide(); - - scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[2]._card._strip); - scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._card._frame); - scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL); - - scene->_gameBoardSide[2]._handCard[2]._cardId = 0; - scene->_gameBoardSide[2]._handCard[2]._card.remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._outpostStation[1]._stationPos, this); - } - break; - case 3: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]); - scene->_aSound1.play(59); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(60); - scene->actionDisplay(1331, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - scene->_gameBoardSide[2]._outpostStation[1]._cardId = scene->_gameBoardSide[2]._handCard[3]._cardId; - - scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[3]._card._strip); - scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[3]._card._frame); - - scene->_gameBoardSide[2]._handCard[3]._cardId = 0; - scene->_gameBoardSide[2]._handCard[3]._card.remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[3]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._outpostStation[1]._stationPos, this); - } - break; - case 4: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]); - scene->_aSound1.play(59); - - scene->_discardPile._cardId = 1; - scene->_discardPile._card.hide(); - - scene->_animatedCard._card.setStrip(5); - scene->_animatedCard._card.setFrame(1); - scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); - } - break; - case 5: { - scene->_animatedCard._card.hide(); - - scene->_discardPile._card.postInit(); - scene->_discardPile._card.setVisage(1332); - scene->_discardPile._card.setPosition(scene->_discardPile._stationPos, 0); - scene->setAnimationInfo(&scene->_discardPile); - scene->_aSound2.play(61); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(60); - scene->actionDisplay(1331, 14, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - scene->_gameBoardSide[2]._delayCard._card.postInit(); - scene->_gameBoardSide[2]._delayCard._card.setVisage(1332); - scene->_gameBoardSide[2]._delayCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); - scene->_gameBoardSide[2]._delayCard._card.hide(); - - scene->_gameBoardSide[3]._handCard[2]._cardId = 0; - scene->_gameBoardSide[3]._handCard[2].remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this); - } - break; - case 6: { - scene->_animatedCard._card.hide(); - scene->_gameBoardSide[2]._delayCard._cardId = 21; - scene->setAnimationInfo(&scene->_gameBoardSide[2]._delayCard); - scene->_aSound1.play(57); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(60); - scene->actionDisplay(1331, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - int tmpVal = 15; - int i = -1; - - for (i = 0; i <= 7; i++) { - tmpVal += 29; - - scene->_upperDisplayCard[i].postInit(); - scene->_upperDisplayCard[i].setVisage(1332); - scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 90), 0); - scene->_upperDisplayCard[i].setStrip(3); - scene->_upperDisplayCard[i].fixPriority(190); - - scene->_lowerDisplayCard[i].postInit(); - scene->_lowerDisplayCard[i].setVisage(1332); - scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 90), 0); - scene->_lowerDisplayCard[i].setStrip(7); - scene->_lowerDisplayCard[i].setFrame(1); - scene->_lowerDisplayCard[i].fixPriority(180); - } - - scene->_upperDisplayCard[0].setFrame(1); - scene->_upperDisplayCard[1].setFrame(3); - scene->_upperDisplayCard[2].setFrame(6); - scene->_upperDisplayCard[3].setFrame(8); - scene->_upperDisplayCard[4].setFrame(9); - scene->_upperDisplayCard[5].setFrame(10); - scene->_upperDisplayCard[6].setFrame(11); - scene->_upperDisplayCard[7].setFrame(12); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(240); - - scene->_upperDisplayCard[0].remove(); - scene->_upperDisplayCard[1].remove(); - scene->_upperDisplayCard[2].remove(); - scene->_upperDisplayCard[3].remove(); - scene->_upperDisplayCard[4].remove(); - scene->_upperDisplayCard[5].remove(); - scene->_upperDisplayCard[6].remove(); - scene->_upperDisplayCard[7].remove(); - - scene->_lowerDisplayCard[0].remove(); - scene->_lowerDisplayCard[1].remove(); - scene->_lowerDisplayCard[2].remove(); - scene->_lowerDisplayCard[3].remove(); - scene->_lowerDisplayCard[4].remove(); - scene->_lowerDisplayCard[5].remove(); - scene->_lowerDisplayCard[6].remove(); - scene->_lowerDisplayCard[7].remove(); - - scene->_discardPile._cardId = scene->_gameBoardSide[2]._delayCard._cardId; - - scene->_gameBoardSide[2]._delayCard._cardId = 0; - scene->_gameBoardSide[2]._delayCard._card.remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); - } - break; - case 7: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_discardPile); - scene->_aSound2.play(61); - - R2_GLOBALS._sceneObjects->draw(); - - scene->_gameBoardSide[2]._delayCard._card.postInit(); - scene->_gameBoardSide[2]._delayCard._card.setVisage(1332); - scene->_gameBoardSide[2]._delayCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); - scene->_gameBoardSide[2]._delayCard._card.hide(); - - scene->_gameBoardSide[3]._handCard[1]._cardId = 0; - scene->_gameBoardSide[3]._handCard[1].remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this); - } - break; - case 8: { - scene->_animatedCard._card.hide(); - scene->_gameBoardSide[2]._delayCard._cardId = 14; - scene->setAnimationInfo(&scene->_gameBoardSide[2]._delayCard); - scene->_aSound1.play(57); - - R2_GLOBALS._sceneObjects->draw(); - - scene->actionDisplay(1331, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154); - int tmpVal = 72; - int i = -1; - - for (i = 0; i <= 3; i++) { - tmpVal += 29; - scene->_upperDisplayCard[i].postInit(); - scene->_upperDisplayCard[i].setVisage(1332); - scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 71), 0); - scene->_upperDisplayCard[i].setStrip(3); - scene->_upperDisplayCard[i].fixPriority(190); - - scene->_lowerDisplayCard[i].postInit(); - scene->_lowerDisplayCard[i].setVisage(1332); - scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 71), 0); - scene->_lowerDisplayCard[i].setStrip(7); - scene->_lowerDisplayCard[i].setFrame(1); - scene->_lowerDisplayCard[i].fixPriority(180); - } - - scene->_upperDisplayCard[0].setFrame(2); - scene->_upperDisplayCard[1].setFrame(5); - scene->_upperDisplayCard[2].setFrame(7); - scene->_upperDisplayCard[3].setFrame(15); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(240); - scene->actionDisplay(1331, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - tmpVal = 72; - for (i = 4; i <= 7; i++) { - tmpVal += 29; - - scene->_upperDisplayCard[i].postInit(); - scene->_upperDisplayCard[i].setVisage(1332); - scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 100), 0); - scene->_upperDisplayCard[i].setStrip(4); - scene->_upperDisplayCard[i].fixPriority(190); - - scene->_lowerDisplayCard[i].postInit(); - scene->_lowerDisplayCard[i].setVisage(1332); - scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 100), 0); - scene->_lowerDisplayCard[i].setStrip(7); - scene->_lowerDisplayCard[i].setFrame(1); - scene->_lowerDisplayCard[i].fixPriority(180); - } - - scene->_upperDisplayCard[4].setFrame(1); - scene->_upperDisplayCard[5].setFrame(5); - scene->_upperDisplayCard[6].setFrame(7); - scene->_upperDisplayCard[7].setFrame(3); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(240); - - scene->_upperDisplayCard[0].remove(); - scene->_upperDisplayCard[1].remove(); - scene->_upperDisplayCard[2].remove(); - scene->_upperDisplayCard[3].remove(); - scene->_upperDisplayCard[4].remove(); - scene->_upperDisplayCard[5].remove(); - scene->_upperDisplayCard[6].remove(); - scene->_upperDisplayCard[7].remove(); - - scene->_lowerDisplayCard[0].remove(); - scene->_lowerDisplayCard[1].remove(); - scene->_lowerDisplayCard[2].remove(); - scene->_lowerDisplayCard[3].remove(); - scene->_lowerDisplayCard[4].remove(); - scene->_lowerDisplayCard[5].remove(); - scene->_lowerDisplayCard[6].remove(); - scene->_lowerDisplayCard[7].remove(); - - scene->_discardPile._cardId = scene->_gameBoardSide[2]._handCard[0]._cardId; - - scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[0]._card._strip); - scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._card._frame); - scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL); - - scene->_gameBoardSide[2]._handCard[0]._cardId = 0; - scene->_gameBoardSide[2]._handCard[0]._card.remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this); - } - break; - case 9: { - scene->_aSound1.play(58); - scene->_gameBoardSide[2]._delayCard._cardId = 0; - scene->_gameBoardSide[2]._delayCard.remove(); - scene->_animatedCard._card.setStrip(5); - scene->_animatedCard._card.setFrame(1); - scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); - } - break; - case 10: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_discardPile); - scene->_aSound2.play(61); - - R2_GLOBALS._sceneObjects->draw(); - scene->actionDisplay(1331, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - scene->_upperDisplayCard[0].postInit(); - scene->_upperDisplayCard[0].setVisage(1332); - scene->_upperDisplayCard[0].setPosition(Common::Point(131, 71), 0); - scene->_upperDisplayCard[0].fixPriority(190); - scene->_upperDisplayCard[0].setStrip(3); - scene->_upperDisplayCard[0].setFrame(4); - - scene->_lowerDisplayCard[0].postInit(); - scene->_lowerDisplayCard[0].setVisage(1332); - scene->_lowerDisplayCard[0].setPosition(Common::Point(131, 71), 0); - scene->_lowerDisplayCard[0].setStrip(7); - scene->_lowerDisplayCard[0].setFrame(1); - scene->_lowerDisplayCard[0].fixPriority(180); - - scene->_upperDisplayCard[1].postInit(); - scene->_upperDisplayCard[1].setVisage(1332); - scene->_upperDisplayCard[1].setPosition(Common::Point(160, 71), 0); - scene->_upperDisplayCard[1].fixPriority(190); - scene->_upperDisplayCard[1].setStrip(3); - scene->_upperDisplayCard[1].setFrame(16); - - scene->_lowerDisplayCard[1].postInit(); - scene->_lowerDisplayCard[1].setVisage(1332); - scene->_lowerDisplayCard[1].setPosition(Common::Point(160, 71), 0); - scene->_lowerDisplayCard[1].setStrip(7); - scene->_lowerDisplayCard[1].setFrame(1); - scene->_lowerDisplayCard[1].fixPriority(180); - - scene->_upperDisplayCard[2].postInit(); - scene->_upperDisplayCard[2].setVisage(1332); - scene->_upperDisplayCard[2].setPosition(Common::Point(131, 100), 0); - scene->_upperDisplayCard[2].fixPriority(190); - scene->_upperDisplayCard[2].setStrip(4); - scene->_upperDisplayCard[2].setFrame(4); - - scene->_lowerDisplayCard[2].postInit(); - scene->_lowerDisplayCard[2].setVisage(1332); - scene->_lowerDisplayCard[2].setPosition(Common::Point(131, 100), 0); - scene->_lowerDisplayCard[2].setStrip(7); - scene->_lowerDisplayCard[2].setFrame(1); - scene->_lowerDisplayCard[2].fixPriority(180); - - scene->_upperDisplayCard[3].postInit(); - scene->_upperDisplayCard[3].setVisage(1332); - scene->_upperDisplayCard[3].setPosition(Common::Point(160, 100), 0); - scene->_upperDisplayCard[3].fixPriority(190); - scene->_upperDisplayCard[3].setStrip(4); - scene->_upperDisplayCard[3].setFrame(2); - - scene->_lowerDisplayCard[3].postInit(); - scene->_lowerDisplayCard[3].setVisage(1332); - scene->_lowerDisplayCard[3].setPosition(Common::Point(160, 100), 0); - scene->_lowerDisplayCard[3].setStrip(7); - scene->_lowerDisplayCard[3].setFrame(1); - scene->_lowerDisplayCard[3].fixPriority(180); - - R2_GLOBALS._sceneObjects->draw(); - - waitFrames(240); - - scene->_upperDisplayCard[0].remove(); - scene->_upperDisplayCard[1].remove(); - scene->_upperDisplayCard[2].remove(); - scene->_upperDisplayCard[3].remove(); - - scene->_lowerDisplayCard[0].remove(); - scene->_lowerDisplayCard[1].remove(); - scene->_lowerDisplayCard[2].remove(); - scene->_lowerDisplayCard[3].remove(); - - scene->_currentPlayerArrow.setFrame(1); - scene->_currentPlayerArrow.show(); - scene->_currentPlayerArrow.animate(ANIM_MODE_2, NULL); - - R2_GLOBALS._sceneObjects->draw(); - - scene->actionDisplay(1331, 19, 159, 10, 1, 220, 0, 7, 0, 154, 154); - - scene->_currentPlayerArrow.hide(); - - scene->actionDisplay(1331, 20, 159, 10, 1, 220, 0, 7, 0, 154, 154); - scene->actionDisplay(1331, 21, 159, 10, 1, 220, 0, 7, 0, 154, 154); - - scene->_discardPile._cardId = scene->_gameBoardSide[2]._handCard[1]._cardId; - - scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[1]._card._strip); - scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._card._frame); - scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL); - - scene->_gameBoardSide[2]._handCard[1]._cardId = 0; - scene->_gameBoardSide[2]._handCard[1]._card.remove(); - - scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this); - } - break; - case 11: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_discardPile); - scene->_aSound2.play(61); - scene->_animatedCard._card.setStrip(5); - scene->_animatedCard._card.setFrame(1); - scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); - - R2_GLOBALS._sceneObjects->draw(); - - scene->actionDisplay(1331, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - int i = -1; - for (i = 0; i <= 3; i ++) { - scene->_gameBoardSide[3]._handCard[i]._cardId = 0; - scene->_gameBoardSide[3]._handCard[i]._card.remove(); - - scene->_gameBoardSide[2]._handCard[i]._cardId = 0; - scene->_gameBoardSide[2]._handCard[i]._card.remove(); - - scene->_gameBoardSide[0]._handCard[i]._cardId = 0; - scene->_gameBoardSide[0]._handCard[i]._card.remove(); - - scene->_gameBoardSide[1]._handCard[i]._cardId = 0; - scene->_gameBoardSide[1]._handCard[i]._card.remove(); - } - - for (i = 0; i <= 7; i++) { - scene->_gameBoardSide[3]._outpostStation[i]._cardId = 0; - scene->_gameBoardSide[3]._outpostStation[i]._card.remove(); - - scene->_gameBoardSide[2]._outpostStation[i]._cardId = 0; - scene->_gameBoardSide[2]._outpostStation[i]._card.remove(); - - scene->_gameBoardSide[0]._outpostStation[i]._cardId = 0; - scene->_gameBoardSide[0]._outpostStation[i]._card.remove(); - - scene->_gameBoardSide[1]._outpostStation[i]._cardId = 0; - scene->_gameBoardSide[1]._outpostStation[i]._card.remove(); - } - - scene->_gameBoardSide[2]._delayCard._cardId = 0; - scene->_gameBoardSide[2]._delayCard._card.remove(); - - scene->_discardPile._cardId = 0; - scene->_discardPile._card.remove(); - - scene->_stockPile.remove(); - } - // No break on purpose - case 0: - R2_GLOBALS._sceneObjects->draw(); - signal(); - break; - case 12: - scene->suggestInstructions(); - remove(); - break; - default: - break; - } -} - -/** - * Shuffle cards animation - */ -void Scene1337::Action2::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: - scene->_shuffleAnimation._card.postInit(); - scene->_shuffleAnimation._card.setVisage(1332); - scene->_shuffleAnimation._card.setStrip(8); - scene->_shuffleAnimation._card.setFrame(1); - scene->_shuffleAnimation._card.fixPriority(300); - scene->_shuffleAnimation._card.setPosition(Common::Point(156, 108)); - - scene->_discardPile._card.remove(); - scene->_discardPile._cardId = 0; - - scene->_aSound1.play(60); - scene->_shuffleAnimation._card.animate(ANIM_MODE_5, this); - break; - case 1: - scene->_shuffleAnimation._card.setFrame(1); - - scene->_aSound1.play(60); - scene->_shuffleAnimation._card.animate(ANIM_MODE_5, this); - break; - case 2: { - Common::Point pt(156, 108); - NpcMover *mover = new NpcMover(); - scene->_shuffleAnimation._card.addMover(mover, &pt, this); - } - break; - case 3: - scene->_shuffleAnimation._card.remove(); - scene->_stockPile.setup(1332, 5, 1); - scene->_stockPile.setPosition(Common::Point(162, 95)); - scene->_stockPile.setPriority(110); - scene->_stockPile._effect = EFFECT_SHADED; - scene->_stockPile.show(); - scene->_shuffleEndedFl = true; - break; - default: - break; - } -} - -/** - * Deal cards - */ -void Scene1337::Action3::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0); - - switch (_actionIndex++) { - case 0: { - scene->_animatedCard._card._moveDiff = Common::Point(30, 30); - scene->_animatedCard._card.setVisage(1332); - scene->_animatedCard._card.setStrip(5); - scene->_animatedCard._card.setFrame(1); - scene->_animatedCard._card.fixPriority(400); - scene->_animatedCard._card.animate(ANIM_MODE_2, NULL); - scene->_aSound2.play(61); - - Common::Point pt(283, 146); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_animatedCard._card.show(); - scene->_gameBoardSide[1]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 1: { - scene->_gameBoardSide[1]._handCard[0]._card.postInit(); - scene->_gameBoardSide[1]._handCard[0]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[1]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[1]._handCard[0]._card.setPosition(scene->_gameBoardSide[1]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[1]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[1]._handCard[0]._card.setFrame(4); - scene->_gameBoardSide[1]._handCard[0]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(10, 174); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[2]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 2: { - scene->_gameBoardSide[2]._handCard[0]._card.postInit(); - scene->_gameBoardSide[2]._handCard[0]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[2]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[0]._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[0]._card.fixPriority(170); - if (scene->_gameBoardSide[2]._handCard[0]._cardId > 25) { - scene->_gameBoardSide[2]._handCard[0]._card.setStrip(4); - scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId - 25); - } else if (scene->_gameBoardSide[2]._handCard[0]._cardId > 9) { - scene->_gameBoardSide[2]._handCard[0]._card.setStrip(3); - scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId - 9); - } else { - scene->_gameBoardSide[2]._handCard[0]._card.setStrip(2); - scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId); - } - scene->_aSound2.play(61); - - Common::Point pt(14, 14); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[3]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 3: { - scene->_gameBoardSide[3]._handCard[0]._card.postInit(); - scene->_gameBoardSide[3]._handCard[0]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[3]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[3]._handCard[0]._card.setPosition(scene->_gameBoardSide[3]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[3]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[3]._handCard[0]._card.setFrame(3); - scene->_gameBoardSide[3]._handCard[0]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(280, 5); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[0]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 4: { - scene->_gameBoardSide[0]._handCard[0]._card.postInit(); - scene->_gameBoardSide[0]._handCard[0]._card._moveDiff = Common::Point(30,30); - scene->_gameBoardSide[0]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[0]._handCard[0]._card.setPosition(scene->_gameBoardSide[0]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[0]._handCard[0]._card.setStrip(5); - scene->_gameBoardSide[0]._handCard[0]._card.setFrame(1); - scene->_gameBoardSide[0]._handCard[0]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(283, 124); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[1]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 5: { - scene->_gameBoardSide[1]._handCard[1]._card.postInit(); - scene->_gameBoardSide[1]._handCard[1]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[1]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[1]._handCard[1]._card.setPosition(scene->_gameBoardSide[1]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[1]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[1]._handCard[1]._card.setFrame(4); - scene->_gameBoardSide[1]._handCard[1]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(37, 174); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[2]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 6: { - scene->_gameBoardSide[2]._handCard[1]._card.postInit(); - scene->_gameBoardSide[2]._handCard[1]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[2]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[1]._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[1]._card.fixPriority(170); - - if (scene->_gameBoardSide[2]._handCard[1]._cardId > 25) { - scene->_gameBoardSide[2]._handCard[1]._card.setStrip(4); - scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId - 25); - } else if (scene->_gameBoardSide[2]._handCard[1]._cardId > 9) { - scene->_gameBoardSide[2]._handCard[1]._card.setStrip(3); - scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId - 9); - } else { - scene->_gameBoardSide[2]._handCard[1]._card.setStrip(2); - scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId); - } - - scene->_aSound2.play(61); - - Common::Point pt(14, 36); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[3]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 7: { - scene->_gameBoardSide[3]._handCard[1]._card.postInit(); - scene->_gameBoardSide[3]._handCard[1]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[3]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[3]._handCard[1]._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos); - scene->_gameBoardSide[3]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[3]._handCard[1]._card.setFrame(3); - scene->_gameBoardSide[3]._handCard[1]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(253, 5); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[0]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 8: { - scene->_gameBoardSide[0]._handCard[1]._card.postInit(); - scene->_gameBoardSide[0]._handCard[1]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[0]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[0]._handCard[1]._card.setPosition(scene->_gameBoardSide[0]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[0]._handCard[1]._card.setStrip(5); - scene->_gameBoardSide[0]._handCard[1]._card.setFrame(1); - scene->_gameBoardSide[0]._handCard[1]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(283, 102); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[1]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 9: { - scene->_gameBoardSide[1]._handCard[2]._card.postInit(); - scene->_gameBoardSide[1]._handCard[2]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[1]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[1]._handCard[2]._card.setPosition(scene->_gameBoardSide[1]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[1]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[1]._handCard[2]._card.setFrame(4); - scene->_gameBoardSide[1]._handCard[2]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(64, 174); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[2]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 10: { - scene->_gameBoardSide[2]._handCard[2]._card.postInit(); - scene->_gameBoardSide[2]._handCard[2]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[2]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[2]._handCard[2]._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[2]._handCard[2]._card.fixPriority(170); - - if (scene->_gameBoardSide[2]._handCard[2]._cardId > 25) { - scene->_gameBoardSide[2]._handCard[2]._card.setStrip(4); - scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId - 25); - } else if (scene->_gameBoardSide[2]._handCard[2]._cardId > 9) { - scene->_gameBoardSide[2]._handCard[2]._card.setStrip(3); - scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId - 9); - } else { - scene->_gameBoardSide[2]._handCard[2]._card.setStrip(2); - scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId); - } - - scene->_aSound2.play(61); - - Common::Point pt(14, 58); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[3]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 11: { - scene->_gameBoardSide[3]._handCard[2]._card.postInit(); - scene->_gameBoardSide[3]._handCard[2]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[3]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[3]._handCard[2]._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[3]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[3]._handCard[2]._card.setFrame(3); - scene->_gameBoardSide[3]._handCard[2]._card.fixPriority(170); - scene->_aSound2.play(61); - - Common::Point pt(226, 5); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - - scene->_gameBoardSide[0]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - } - break; - case 12: - scene->_gameBoardSide[0]._handCard[2]._card.postInit(); - scene->_gameBoardSide[0]._handCard[2]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[0]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[0]._handCard[2]._card.setPosition(scene->_gameBoardSide[0]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[0]._handCard[2]._card.setStrip(5); - scene->_gameBoardSide[0]._handCard[2]._card.setFrame(1); - scene->_gameBoardSide[0]._handCard[2]._card.fixPriority(170); - scene->_animatedCard._card.hide(); - default: - break; - } - - if (_actionIndex > 12) { - scene->_currentPlayerNumb = 0; - R2_GLOBALS._sceneObjects->draw(); - scene->actionDisplay(1330, 0, 159, 10, 1, 200, 0, 7, 0, 154, 154); - scene->handleNextTurn(); - } else if (_actionIndex >= 1) { - scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; - scene->_cardsAvailableNumb--; - } -} - -/** - * Action used to handle the other players' turn - */ -void Scene1337::Action4::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: - if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId == 0) - && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { - if (scene->_cardsAvailableNumb < 0) - scene->shuffleCards(); - scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0); - scene->_animatedCard._card.show(); - scene->_aSound2.play(61); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos, this); - - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; - scene->_cardsAvailableNumb--; - - if (scene->_cardsAvailableNumb < 0) - scene->_stockPile.remove(); - } else { - // Self call, forcing next actionIndex - signal(); - } - break; - case 1: - if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos.x) - && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos.y) ) { - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.postInit(); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setVisage(1332); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._stationPos, 0); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setStrip(1); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.fixPriority(170); - } - - if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) - scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]); - - scene->_animatedCard._card.hide(); - if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId == 0) - && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { - if (scene->_cardsAvailableNumb < 0) - scene->shuffleCards(); - scene->_animatedCard._card.setPosition(Common::Point(162, 95)); - scene->_animatedCard._card.show(); - - scene->_aSound2.play(61); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos, this); - - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; - scene->_cardsAvailableNumb--; - if (scene->_cardsAvailableNumb < 0) - scene->_stockPile.remove(); - } else - signal(); - break; - case 2: - if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos.x) - && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos.y) ) { - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.postInit(); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setVisage(1332); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._stationPos, 0); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setStrip(1); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.fixPriority(170); - } - - if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) - scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]); - - scene->_animatedCard._card.hide(); - if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._cardId == 0) - && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { - if (scene->_cardsAvailableNumb < 0) - scene->shuffleCards(); - scene->_animatedCard._card.setPosition(Common::Point(162, 95)); - scene->_animatedCard._card.show(); - - scene->_aSound2.play(61); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos, this); - - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; - scene->_cardsAvailableNumb--; - if (scene->_cardsAvailableNumb < 0) - scene->_stockPile.remove(); - } else - signal(); - break; - case 3: - if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos.x) - && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos.y) ) { - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.postInit(); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setVisage(1332); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._stationPos, 0); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setStrip(1); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.fixPriority(170); - } - - if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) - scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]); - - scene->_animatedCard._card.hide(); - if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._cardId == 0) - && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) { - if (scene->_cardsAvailableNumb < 0) - scene->shuffleCards(); - scene->_animatedCard._card.setPosition(Common::Point(162, 95)); - scene->_animatedCard._card.show(); - - scene->_aSound2.play(61); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos, this); - - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb]; - scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0; - scene->_cardsAvailableNumb--; - if (scene->_cardsAvailableNumb < 0) - scene->_stockPile.remove(); - } else - signal(); - break; - case 4: - if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos.x) - && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos.y) ) { - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.postInit(); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card._moveDiff = Common::Point(30, 30); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setVisage(1332); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._stationPos, 0); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setStrip(1); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum); - scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.fixPriority(170); - } - - if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2)) - scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]); - - scene->_animatedCard._card.hide(); - switch (scene->_currentPlayerNumb) { - case 0: - scene->handlePlayer0(); - break; - case 1: - scene->handlePlayer1(); - break; - case 2: - scene->handleAutoplayPlayer2(); - break; - case 3: - scene->handlePlayer3(); - break; - default: - break; - } - break; - default: - break; - } -} - -/** - * Animations for discarding a card - */ -void Scene1337::Action5::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard1->_cardId; - scene->_currentDiscardIndex--; - if (!g_globals->_sceneObjects->contains(&scene->_discardPile._card)) { - // The first discarded card makes the pile appear - scene->_discardPile._card.postInit(); - scene->_discardPile._card.hide(); - scene->_discardPile._card.setVisage(1332); - scene->_discardPile._card.setPosition(scene->_discardPile._stationPos, 0); - scene->_discardPile._card.fixPriority(170); - } - - scene->_discardPile._cardId = scene->_actionCard1->_cardId; - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - - if (scene->_actionCard1 == &scene->_selectedCard) { - scene->setCursorData(5, 1, 4); - scene->subC4CEC(); - } - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - Common::Point pt(128, 95); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &pt, this); - } - break; - case 1: - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(&scene->_discardPile); - scene->_aSound2.play(61); - scene->handleNextTurn(); - break; - default: - break; - } -} - -/** - * Animations for playing a platform card - */ -void Scene1337::Action6::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_actionCard2->_cardId = 1; - scene->_actionCard2->_card.postInit(); - scene->_actionCard2->_card.hide(); - scene->_actionCard2->_card.setVisage(1332); - scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos); - scene->_actionCard2->_card.fixPriority(170); - - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 1: - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(59); - if (scene->_actionCard1 == &scene->_selectedCard) { - scene->setCursorData(5, 1, 4); - scene->subC4CEC(); - } - scene->handleNextTurn(); - break; - default: - break; - } -} - -/** - * Upgrade platform to station by playing a station card on top of it - */ -void Scene1337::Action7::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; - - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 1: - if (scene->_actionCard1 == &scene->_selectedCard) { - scene->setCursorData(5, 1, 4); - scene->subC4CEC(); - } - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(59); - scene->_discardedPlatformCard._cardId = 1; - scene->_discardedPlatformCard._stationPos = scene->_actionCard2->_stationPos; - scene->_discardedPlatformCard._card.postInit(); - scene->_discardedPlatformCard._card.hide(); - scene->_discardedPlatformCard._card._flags = OBJFLAG_HIDING; - - scene->discardCard(&scene->_discardedPlatformCard); - break; - default: - break; - } -} - -void Scene1337::Action8::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; - scene->_currentDiscardIndex--; - - scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; - scene->_actionCard1->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 1: - scene->_animatedCard._card.hide(); - - if (scene->_actionCard1 == &scene->_selectedCard) { - scene->setCursorData(5, 1, 4); - scene->subC4CEC(); - } - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(58); - scene->discardCard(scene->_actionCard2); - break; - default: - break; - } -} - -// Play delay card -void Scene1337::Action9::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; - scene->_actionCard2->_card.postInit(); - scene->_actionCard2->_card.hide(); - scene->_actionCard2->_card.setVisage(1332); - scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos, 0); - scene->_actionCard2->_card.fixPriority(170); - - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 1: - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(57); - - if (scene->_actionCard1 == &scene->_selectedCard) { - scene->setCursorData(5, 1, 4); - scene->subC4CEC(); - } - - scene->handleNextTurn(); - break; - default: - break; - } -} - -// Counter a trick with a card -void Scene1337::Action10::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_actionCard3->_card.postInit(); - scene->_actionCard3->_card.hide(); - scene->_actionCard3->_card.setVisage(1332); - scene->_actionCard3->_card.setPosition(scene->_actionCard3->_stationPos, 0); - scene->_actionCard3->_card.fixPriority(170); - scene->_actionCard3->_cardId = scene->_actionCard1->_cardId; - - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - - if (scene->_actionCard1 == &scene->_selectedCard) { - scene->setCursorData(5, 1, 4); - scene->subC4CEC(); - } - - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard3->_stationPos, this); - } - break; - case 1: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(scene->_actionCard3); - scene->_aSound1.play(57); - - bool found = false; - int indexFound = -1; - - switch (scene->_actionIdx1) { - case 0: - for (indexFound = 0; indexFound < 3; indexFound++) { - if (scene->_gameBoardSide[0]._handCard[indexFound]._cardId == 29) { - found = true; - break; - } - } - break; - case 1: - for (indexFound = 0; indexFound < 3; indexFound++) { - if (scene->_gameBoardSide[1]._handCard[indexFound]._cardId == 29) { - found = true; - break; - } - } - break; - case 2: - for (indexFound = 0; indexFound < 3; indexFound++) { - if (scene->_gameBoardSide[2]._handCard[indexFound]._cardId == 29) { - found = true; - break; - } - } - break; - case 3: - for (indexFound = 0; indexFound < 3; indexFound++) { - if (scene->_gameBoardSide[3]._handCard[indexFound]._cardId == 29) { - found = true; - break; - } - } - break; - default: - break; - } - - bool found2 = false; - - if (found) { - switch (scene->_actionIdx1) { - case 0: - scene->subC51A0(&scene->_gameBoardSide[0]._handCard[indexFound], scene->_actionCard3); - found2 = true; - break; - case 1: - scene->subC51A0(&scene->_gameBoardSide[1]._handCard[indexFound], scene->_actionCard3); - found2 = true; - break; - case 2: - scene->subC4CD2(); - if (MessageDialog::show(USE_INTERCEPTOR, NO_MSG, YES_MSG) == 0) - scene->subC4CEC(); - else { - scene->subC51A0(&scene->_gameBoardSide[2]._handCard[indexFound], scene->_actionCard3); - found2 = true; - } - break; - case 3: - scene->subC51A0(&scene->_gameBoardSide[3]._handCard[indexFound], scene->_actionCard3); - found2 = true; - break; - default: - break; - } - } - - if (!found2) - break; - - if (scene->_actionIdx1 == 2) { - int j = 0; - for (int i = 0; i <= 7; i++) { - if (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0) - ++j; - } - - if (j <= 1) { - for (int i = 0; i <= 7; i++) { - if (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0) { - scene->_actionCard2 = &scene->_gameBoardSide[2]._outpostStation[i]; - break; - } - } - } else { - scene->subC4CD2(); - - found2 = false; - while (!found2) { - scene->actionDisplay(1330, 130, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - // Wait for a mouse or keypress - Event event; - while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) { - g_globals->_scenePalette.signalListeners(); - R2_GLOBALS._sceneObjects->draw(); - g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); - } - - scene->_selectedCard._stationPos = event.mousePos; - - for (int i = 0; i <= 7; i++) { - if (scene->_gameBoardSide[2]._outpostStation[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0)) { - scene->_actionCard2 = &scene->_gameBoardSide[2]._outpostStation[0]; - found2 = true; - break; - } - } - } - scene->subC4CEC(); - } - } - - scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; - scene->_currentDiscardIndex--; - scene->_actionCard2->_cardId = 0; - scene->_actionCard2->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard2->_stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard3->_stationPos, this); - } - break; - case 2: - scene->_animatedCard._card.hide(); - scene->discardCard(scene->_actionCard3); - break; - default: - break; - } -} - -// Use trick (card #25 - thieft ?) and pick a card from the opponent -void Scene1337::Action11::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_actionCard2->_card.postInit(); - scene->_actionCard2->_card.hide(); - scene->_actionCard2->_card.setVisage(1332); - scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos, 0); - scene->_actionCard2->_card.fixPriority(170); - scene->_actionCard2->_cardId = 25; - - if (scene->_actionIdx1 == 2) { - scene->_animatedCard._card.setPosition(scene->_actionCard2->_stationPos, 0); - scene->setCursorData(5, 1, 4); - } else { - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - } - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 1: { - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(57); - - bool found = false; - bool noAction = true; - - int i = -1; - - switch (scene->_actionIdx2) { - case 0: - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[0]._handCard[i]._cardId == 27) { - found = true; - break; - } - } - - if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) { - scene->_actionCard1 = &scene->_gameBoardSide[0]._handCard[i]; - scene->_actionCard2 = &scene->_gameBoardSide[0]._emptyStationPos; - if (scene->_actionIdx1 != 0) { - int tmpVal = scene->getFreeHandCard(scene->_actionIdx1); - scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal]; - } - scene->_actionItem.setAction(&scene->_action12); - noAction = false; - } - break; - case 1: - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[1]._handCard[i]._cardId == 27) { - found = true; - break; - } - } - - if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) { - scene->_actionCard1 = &scene->_gameBoardSide[1]._handCard[i]; - scene->_actionCard2 = &scene->_gameBoardSide[1]._emptyStationPos; - if (scene->_actionIdx1 != 1) { - int tmpVal = scene->getFreeHandCard(scene->_actionIdx1); - scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal]; - } - scene->_actionItem.setAction(&scene->_action12); - noAction = false; - } - break; - case 2: - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[2]._handCard[i]._cardId == 27) { - found = true; - break; - } - } - - if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) { - scene->subC4CD2(); - if (MessageDialog::show(USE_DOUBLE_AGENT, NO_MSG, YES_MSG) == 0) - scene->subC4CEC(); - else { - scene->subC4CEC(); - scene->_actionCard1 = &scene->_gameBoardSide[2]._handCard[i]; - scene->_actionCard2 = &scene->_gameBoardSide[2]._emptyStationPos; - if (scene->_actionIdx1 != 2) { - int tmpVal = scene->getFreeHandCard(scene->_actionIdx1); - scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal]; - } - scene->_actionItem.setAction(&scene->_action12); - noAction = false; - } - } - break; - case 3: - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[3]._handCard[i]._cardId == 27) { - found = true; - break; - } - } - - if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) { - scene->_actionCard1 = &scene->_gameBoardSide[3]._handCard[i]; - scene->_actionCard2 = &scene->_gameBoardSide[3]._emptyStationPos; - if (scene->_actionIdx1 != 3) { - int tmpVal = scene->getFreeHandCard(scene->_actionIdx1); - scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal]; - } - scene->_actionItem.setAction(&scene->_action12); - noAction = false; - } - break; - default: - break; - } - - if (!noAction) - return; - - if (scene->_actionIdx1 == 2) { - int count = 0; - if (scene->_actionIdx2 != 2) { - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[scene->_actionIdx2]._handCard[i]._cardId == 0) - ++count; - } - } - - if (count > 1) { - scene->subC4CD2(); - - found = false; - while (!found) { - switch (scene->_actionIdx2) { - case 0: - scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 1: - scene->actionDisplay(1330, 132, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 3: - scene->actionDisplay(1330, 133, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - - Event event; - while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) { - g_globals->_scenePalette.signalListeners(); - R2_GLOBALS._sceneObjects->draw(); - g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); - } - - scene->_selectedCard._stationPos = event.mousePos; - - found = false; - - if (scene->_actionIdx2 != 2) { - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[scene->_actionIdx2]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[scene->_actionIdx2]._handCard[i]._cardId != 0)) { - scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx2]._handCard[i]; - found = true; - break; - } - } - } - } // while - scene->_displayHelpFl = true; - scene->subC4CEC(); - } else if (scene->_actionIdx2 != 2) { - int tmpVal = scene->getFreeHandCard(scene->_actionIdx2); - scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx2]._handCard[tmpVal]; - } - } - - scene->_actionCard1->_card.postInit(); - scene->_actionCard1->_card.hide(); - scene->_actionCard1->_card.setVisage(1332); - scene->_actionCard1->_card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_actionCard1->_card.fixPriority(170); - scene->_actionCard1->_card.setStrip2(1); - scene->_actionCard1->_cardId = scene->_actionCard3->_cardId; - - scene->_actionCard3->_cardId = 0; - scene->_actionCard3->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard3->_stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard1->_stationPos, this); - } - break; - case 2: - scene->_animatedCard._card.hide(); - switch (scene->_actionIdx1) { - case 0: - scene->_actionCard1->_card.setFrame2(2); - scene->_actionCard1->_card.show(); - break; - case 1: - scene->_actionCard1->_card.setFrame2(4); - scene->_actionCard1->_card.show(); - break; - case 3: - scene->_actionCard1->_card.setFrame2(3); - scene->_actionCard1->_card.show(); - break; - default: - scene->setAnimationInfo(scene->_actionCard1); - break; - } - - scene->_currentPlayerNumb--; - scene->_showPlayerTurn = false; - scene->discardCard(scene->_actionCard2); - break; - default: - break; - } -} - -// Pick a card in opponent hand -void Scene1337::Action12::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: - signal(); - break; - case 1: { - scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; - scene->_currentDiscardIndex++; - scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 2: - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(58); - if (scene->_actionIdx2 == 2) { - int count = 0; - int i = -1; - switch (scene->_actionIdx1) { - case 0: - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[0]._handCard[i]._cardId != 0) - ++count; - } - break; - case 1: - for (i = 0; i <= 3; i++) { - // The original game was counting in the hand of player 3, which is obviously wrong - if (scene->_gameBoardSide[1]._handCard[i]._cardId != 0) - ++count; - } - break; - case 3: - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[3]._handCard[i]._cardId != 0) - ++count; - } - break; - default: - break; - } - - if (count > 1) { - scene->subC4CD2(); - - bool found = false; - - while (!found) { - switch (scene->_actionIdx1) { - case 0: - scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 1: - scene->actionDisplay(1330, 132, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 3: - scene->actionDisplay(1330, 133, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - - Event event; - while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) { - g_globals->_scenePalette.signalListeners(); - R2_GLOBALS._sceneObjects->draw(); - g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); - } - - scene->_selectedCard._stationPos = event.mousePos; - - if (scene->_actionIdx1 == 0) { - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[0]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[0]._handCard[i]._cardId != 0)) { - found = true; - scene->_actionCard3 = &scene->_gameBoardSide[0]._handCard[i]; - break; - } - } - } - - if (scene->_actionIdx1 == 3) { - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[3]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[3]._handCard[i]._cardId != 0)) { - found = true; - scene->_actionCard3 = &scene->_gameBoardSide[3]._handCard[i]; - break; - } - } - } - - if (scene->_actionIdx1 == 1) { - for (i = 0; i <= 3; i++) { - if (scene->_gameBoardSide[1]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[1]._handCard[i]._cardId != 0)) { - found = true; - scene->_actionCard3 = &scene->_gameBoardSide[1]._handCard[i]; - break; - } - } - } - } - scene->subC4CEC(); - } else if (scene->_actionIdx1 != 1) { - switch (scene->_actionIdx1) { - case 0: - scene->_actionCard3 = &scene->_gameBoardSide[0]._handCard[scene->getFreeHandCard(0)]; - break; - case 3: - scene->_actionCard3 = &scene->_gameBoardSide[3]._handCard[scene->getFreeHandCard(3)]; - break; - default: - break; - } - } else { - scene->_actionCard3 = &scene->_gameBoardSide[1]._handCard[scene->getFreeHandCard(1)]; - } - - scene->_actionCard1->_card.postInit(); - scene->_actionCard1->_card.hide(); - scene->_actionCard1->_card.setVisage(1332); - scene->_actionCard1->_card.setPosition(scene->_actionCard1->_stationPos); - scene->_actionCard1->_card.fixPriority(170); - scene->_actionCard1->_card.setStrip2(1); - scene->_actionCard1->_cardId = scene->_actionCard3->_cardId; - - scene->_actionCard3->_cardId = 0; - scene->_actionCard3->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard3->_stationPos); - scene->_animatedCard._card.show(); - scene->_aSound1.play(57); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard1->_stationPos, this); - } - break; - case 3: - scene->_animatedCard._card.hide(); - switch (scene->_actionIdx2) { - case 0: - scene->_actionCard1->_card.setFrame2(2); - scene->_actionCard1->_card.show(); - break; - case 1: - scene->_actionCard1->_card.setFrame2(4); - scene->_actionCard1->_card.show(); - break; - case 3: - scene->_actionCard1->_card.setFrame2(3); - scene->_actionCard1->_card.show(); - break; - default: - scene->setAnimationInfo(scene->_actionCard1); - break; - } - scene->discardCard(scene->_actionCard2); - scene->handleNextTurn(); - break; - default: - break; - } -} - -void Scene1337::Action13::signal() { - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - - switch (_actionIndex++) { - case 0: { - scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId; - scene->_currentDiscardIndex--; - - scene->_actionCard2->_cardId = scene->_actionCard1->_cardId; - - scene->_actionCard1->_cardId = 0; - scene->_actionCard1->_card.remove(); - - scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0); - scene->_animatedCard._card.show(); - - NpcMover *mover = new NpcMover(); - scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this); - } - break; - case 1: - scene->_animatedCard._card.hide(); - scene->setAnimationInfo(scene->_actionCard2); - scene->_aSound1.play(58); - signal(); - break; - case 2: - scene->discardCard(scene->_actionCard2); - break; - default: - break; - } -} - -void Scene1337::postInit(SceneObjectList *OwnerList) { -// In the original, may be found in subPostInit. -// Without it, enableControl asserts - loadScene(1330); - R2_GLOBALS._uiElements._active = false; - SceneExt::postInit(); -// - - // Hide the user interface - BF_GLOBALS._interfaceY = SCREEN_HEIGHT; - R2_GLOBALS._uiElements._visible = false; - - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; - R2_GLOBALS._player._uiEnabled = false; - - _delayedFunction = nullptr; - - _actionCard1 = nullptr; - _actionCard2 = nullptr; - _actionCard3 = nullptr; - - _gameBoardSide[2]._handCard[0]._stationPos = Common::Point(10, 174); - _gameBoardSide[2]._handCard[1]._stationPos = Common::Point(37, 174); - _gameBoardSide[2]._handCard[2]._stationPos = Common::Point(64, 174); - _gameBoardSide[2]._handCard[3]._stationPos = Common::Point(91, 174); - - _gameBoardSide[2]._outpostStation[0]._stationPos = Common::Point(119, 174); - _gameBoardSide[2]._outpostStation[1]._stationPos = Common::Point(119, 148); - _gameBoardSide[2]._outpostStation[2]._stationPos = Common::Point(119, 122); - _gameBoardSide[2]._outpostStation[3]._stationPos = Common::Point(145, 122); - _gameBoardSide[2]._outpostStation[4]._stationPos = Common::Point(171, 122); - _gameBoardSide[2]._outpostStation[5]._stationPos = Common::Point(171, 148); - _gameBoardSide[2]._outpostStation[6]._stationPos = Common::Point(171, 174); - _gameBoardSide[2]._outpostStation[7]._stationPos = Common::Point(145, 174); - - _gameBoardSide[2]._delayCard._stationPos = Common::Point(199, 174); - - _gameBoardSide[2]._emptyStationPos._stationPos = Common::Point(145, 148); - - _gameBoardSide[2]._card1Pos = Common::Point(10, 174); - _gameBoardSide[2]._card2Pos = Common::Point(37, 174); - _gameBoardSide[2]._card3Pos = Common::Point(64, 174); - _gameBoardSide[2]._card4Pos = Common::Point(91, 174); - _gameBoardSide[2]._frameNum = 2; - - _gameBoardSide[3]._handCard[0]._stationPos = Common::Point(14, 14); - _gameBoardSide[3]._handCard[1]._stationPos = Common::Point(14, 36); - _gameBoardSide[3]._handCard[2]._stationPos = Common::Point(14, 58); - _gameBoardSide[3]._handCard[3]._stationPos = Common::Point(14, 80); - - _gameBoardSide[3]._outpostStation[0]._stationPos = Common::Point(37, 66); - _gameBoardSide[3]._outpostStation[1]._stationPos = Common::Point(63, 66); - _gameBoardSide[3]._outpostStation[2]._stationPos = Common::Point(89, 66); - _gameBoardSide[3]._outpostStation[3]._stationPos = Common::Point(89, 92); - _gameBoardSide[3]._outpostStation[4]._stationPos = Common::Point(89, 118); - _gameBoardSide[3]._outpostStation[5]._stationPos = Common::Point(63, 118); - _gameBoardSide[3]._outpostStation[6]._stationPos = Common::Point(37, 118); - _gameBoardSide[3]._outpostStation[7]._stationPos = Common::Point(37, 92); - - _gameBoardSide[3]._delayCard._stationPos = Common::Point(37, 145); - - _gameBoardSide[3]._emptyStationPos._stationPos = Common::Point(63, 92); - - _gameBoardSide[3]._card1Pos = Common::Point(14, 14); - _gameBoardSide[3]._card2Pos = Common::Point(14, 36); - _gameBoardSide[3]._card3Pos = Common::Point(14, 58); - _gameBoardSide[3]._card4Pos = Common::Point(14, 80); - _gameBoardSide[3]._frameNum = 3; - - _gameBoardSide[0]._handCard[0]._stationPos = Common::Point(280, 5); - _gameBoardSide[0]._handCard[1]._stationPos = Common::Point(253, 5); - _gameBoardSide[0]._handCard[2]._stationPos = Common::Point(226, 5); - _gameBoardSide[0]._handCard[3]._stationPos = Common::Point(199, 5); - - _gameBoardSide[0]._outpostStation[0]._stationPos = Common::Point(171, 16); - _gameBoardSide[0]._outpostStation[1]._stationPos = Common::Point(171, 42); - _gameBoardSide[0]._outpostStation[2]._stationPos = Common::Point(171, 68); - _gameBoardSide[0]._outpostStation[3]._stationPos = Common::Point(145, 68); - _gameBoardSide[0]._outpostStation[4]._stationPos = Common::Point(119, 68); - _gameBoardSide[0]._outpostStation[5]._stationPos = Common::Point(119, 42); - _gameBoardSide[0]._outpostStation[6]._stationPos = Common::Point(119, 16); - _gameBoardSide[0]._outpostStation[7]._stationPos = Common::Point(145, 16); - - _gameBoardSide[0]._delayCard._stationPos = Common::Point(91, 16); - - _gameBoardSide[0]._emptyStationPos._stationPos = Common::Point(145, 42); - - _gameBoardSide[0]._card1Pos = Common::Point(280, 5); - _gameBoardSide[0]._card2Pos = Common::Point(253, 5); - _gameBoardSide[0]._card3Pos = Common::Point(226, 5); - _gameBoardSide[0]._card4Pos = Common::Point(199, 5); - _gameBoardSide[0]._frameNum = 2; - - _gameBoardSide[1]._handCard[0]._stationPos = Common::Point(283, 146); - _gameBoardSide[1]._handCard[1]._stationPos = Common::Point(283, 124); - _gameBoardSide[1]._handCard[2]._stationPos = Common::Point(283, 102); - _gameBoardSide[1]._handCard[3]._stationPos = Common::Point(283, 80); - - _gameBoardSide[1]._outpostStation[0]._stationPos = Common::Point(253, 122); - _gameBoardSide[1]._outpostStation[1]._stationPos = Common::Point(227, 122); - _gameBoardSide[1]._outpostStation[2]._stationPos = Common::Point(201, 122); - _gameBoardSide[1]._outpostStation[3]._stationPos = Common::Point(201, 96); - _gameBoardSide[1]._outpostStation[4]._stationPos = Common::Point(201, 70); - _gameBoardSide[1]._outpostStation[5]._stationPos = Common::Point(227, 70); - _gameBoardSide[1]._outpostStation[6]._stationPos = Common::Point(253, 70); - _gameBoardSide[1]._outpostStation[7]._stationPos = Common::Point(253, 96); - - _gameBoardSide[1]._delayCard._stationPos = Common::Point(253, 43); - - _gameBoardSide[1]._emptyStationPos._stationPos = Common::Point(227, 96); - - _gameBoardSide[1]._card1Pos = Common::Point(283, 146); - _gameBoardSide[1]._card2Pos = Common::Point(283, 124); - _gameBoardSide[1]._card3Pos = Common::Point(283, 102); - _gameBoardSide[1]._card4Pos = Common::Point(283, 80); - _gameBoardSide[1]._frameNum = 4; - - subPostInit(); - - _stockPile.postInit(); -} - -void Scene1337::remove() { - if (R2_GLOBALS._v57709 > 1) { - subD1917(); - subD1940(false); - } - - R2_GLOBALS._uiElements._active = true; - R2_GLOBALS._uiElements._visible = true; - SceneExt::remove(); -} - -void Scene1337::process(Event &event) { - if (event.eventType == EVENT_BUTTON_DOWN) { - if (event.btnState == BTNSHIFT_RIGHT) { - updateCursorId(R2_GLOBALS._mouseCursorId, true); - event.handled = true; - } else if (_delayedFunction) { - FunctionPtrType tmpFctPtr = _delayedFunction; - _delayedFunction = nullptr; - (this->*tmpFctPtr)(); - event.handled = true; - } - } else if (event.eventType == EVENT_KEYPRESS) { - if (event.kbd.keycode == Common::KEYCODE_SPACE) { - if (_delayedFunction) { - FunctionPtrType tmpFctPtr = _delayedFunction; - _delayedFunction = nullptr; - (this->*tmpFctPtr)(); - event.handled = true; - } - } else - warning("Fixme: Find proper keycode value"); - } - - if (!event.handled) - Scene::process(event); -} - -void Scene1337::dispatch() { - if (!_instructionsDisplayedFl) { - ++_instructionsWaitCount; - if (_instructionsWaitCount == 4) { - _instructionsDisplayedFl = true; - suggestInstructions(); - } - } - - // The following code is in the original in sceneHandler::process(), - // which is terrible as it's checked in every scene of the game. - setCursorData(5, _cursorCurStrip, _cursorCurFrame); - // - - Scene::dispatch(); -} - -void Scene1337::actionDisplay(int resNum, int lineNum, int x, int y, int keepOnScreen, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt) { - // TODO: Check if it's normal that arg5 is unused and replaced by an hardcoded 0 value - // May hide an original bug - - SceneItem::display(resNum, lineNum, SET_X, x, SET_Y, y, SET_KEEP_ONSCREEN, 0, - SET_WIDTH, width, SET_POS_MODE, -1, SET_TEXT_MODE, textMode, - SET_FONT, fontNum, SET_FG_COLOR, colFG, SET_EXT_BGCOLOR, colBGExt, - SET_EXT_FGCOLOR, colFGExt, LIST_END); -} - -void Scene1337::setAnimationInfo(Card *card) { - if (!card) - return; - - if (card->_cardId > 25) { - card->_card.setStrip2(4); - card->_card.setFrame(card->_cardId - 25); - } else if (card->_cardId > 9) { - card->_card.setStrip2(3); - card->_card.setFrame(card->_cardId - 9); - } else { - card->_card.setStrip2(2); - card->_card.setFrame(card->_cardId); - } - - card->_card.show(); - R2_GLOBALS._sceneObjects->draw(); -} - -void Scene1337::handleNextTurn() { - switch (_winnerId) { - case -1: - ++_currentPlayerNumb; - if (_currentPlayerNumb > 3) - _currentPlayerNumb = 0; - - if (_showPlayerTurn) { - _currentPlayerArrow.show(); - switch (_currentPlayerNumb) { - case 0: - _currentPlayerArrow.setStrip(3); - break; - case 1: - _currentPlayerArrow.setStrip(4); - break; - case 2: - subD1975(174, 107); - _currentPlayerArrow.setStrip(1); - break; - case 3: - subC4CEC(); - _currentPlayerArrow.setStrip(2); - break; - default: - break; - } - - if (!_autoplay) - _delayedFunction = &Scene1337::handlePlayerTurn; - else - handlePlayerTurn(); - } else { - handlePlayerTurn(); - } - break; - case 0: - _aSound2.play(62); - actionDisplay(1330, 135, 159, 10, 1, 200, 0, 7, 0, 154, 154); - actionDisplay(1330, 121, 20, 99, 1, 136, 0, 7, 0, 172, 172); - actionDisplay(1330, 122, 300, 99, 1, 136, 0, 7, 0, 117, 117); - R2_GLOBALS._sceneObjects->draw(); - actionDisplay(1330, 123, 159, 134, 1, 200, 0, 7, 0, 105, 105); - break; - case 1: - _aSound2.play(62); - actionDisplay(1330, 151, 300, 99, 1, 136, 0, 7, 0, 117, 117); - actionDisplay(1330, 118, 20, 99, 1, 136, 0, 7, 0, 172, 172); - actionDisplay(1330, 119, 159, 10, 1, 200, 0, 7, 0, 154, 154); - R2_GLOBALS._sceneObjects->draw(); - actionDisplay(1330, 120, 159, 134, 1, 200, 0, 7, 0, 105, 105); - break; - case 2: - _aSound2.play(62); - actionDisplay(1330, 134, 159, 134, 1, 200, 0, 7, 0, 105, 105); - actionDisplay(1330, 124, 20, 99, 1, 136, 0, 7, 0, 172, 172); - actionDisplay(1330, 126, 159, 10, 1, 200, 0, 7, 0, 154, 154); - R2_GLOBALS._sceneObjects->draw(); - actionDisplay(1330, 125, 300, 99, 1, 136, 0, 7, 0, 117, 117); - break; - case 3: - _aSound2.play(62); - actionDisplay(1330, 150, 20, 99, 1, 136, 0, 7, 0, 172, 172); - actionDisplay(1330, 115, 300, 99, 1, 136, 0, 7, 0, 117, 117); - actionDisplay(1330, 116, 159, 10, 1, 200, 0, 7, 0, 154, 154); - R2_GLOBALS._sceneObjects->draw(); - actionDisplay(1330, 117, 159, 134, 1, 200, 0, 7, 0, 105, 105); - break; - default: - break; - } - - if (_winnerId != -1) - R2_GLOBALS._sceneManager.changeScene(125); - -} - -void Scene1337::handlePlayerTurn() { - if (_showPlayerTurn) - _currentPlayerArrow.hide(); - - switch (_currentPlayerNumb) { - case 2: - subC4CD2(); - if (_displayHelpFl) - actionDisplay(1330, 114, 159, 10, 1, 200, 0, 7, 0, 154, 154); - _displayHelpFl = false; - // No break on purpose - case 0: - // No break on purpose - case 1: - // No break on purpose - case 3: - _actionItem.setAction(&_action4); - default: - break; - } - - _showPlayerTurn = true; - -} - -bool Scene1337::isStationCard(int cardId) { - switch (cardId) { - case 10: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 17: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 20: - // No break on purpose - case 21: - return true; - default: - return false; - } -} - -bool Scene1337::isStopConstructionCard(int cardId) { - switch (cardId) { - case 11: - // No break on purpose - case 14: - // No break on purpose - case 16: - // No break on purpose - case 24: - return true; - default: - return false; - } -} - -int Scene1337::getStationId(int playerId, int handCardId) { - if ((_gameBoardSide[playerId]._handCard[handCardId]._cardId > 1) && (_gameBoardSide[playerId]._handCard[handCardId]._cardId <= 9)) - return handCardId; - - return -1; -} - -int Scene1337::findPlatformCardInHand(int playerId) { - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) - return i; - } - - return -1; -} - -int Scene1337::findCard13InHand(int playerId) { - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) - return i; - } - - return -1; -} - -int Scene1337::checkThieftCard(int playerId) { - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) - return i; - } - - return -1; -} - -int Scene1337::isDelayCard(int cardId) { - switch (cardId) { - case 11: - // No break on purpose - case 14: - // No break on purpose - case 16: - // No break on purpose - case 24: - return cardId; - break; - default: - return -1; - break; - } -} - -int Scene1337::getStationCardId(int cardId) { - switch (cardId) { - case 10: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 17: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 20: - // No break on purpose - case 21: - return cardId; - default: - return -1; - } -} - -void Scene1337::handlePlayer01Discard(int playerId) { - switch (playerId) { - case 0: - for (int i = 0; i <= 3; i++) { - if (getStationCardId(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (isDelayCard(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if ((_gameBoardSide[playerId]._handCard[i]._cardId > 1) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 9)) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if ((_gameBoardSide[playerId]._handCard[i]._cardId >= 26) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 33)) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - break; - case 1: - for (int i = 0; i <= 3; i++) { - if ((_gameBoardSide[playerId]._handCard[i]._cardId >= 26) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 33)) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if ((_gameBoardSide[playerId]._handCard[i]._cardId > 1) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 9)) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (getStationCardId(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (isDelayCard(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) { - discardCard(&_gameBoardSide[playerId]._handCard[i]); - return; - } - } - - break; - default: - break; - } -} - -void Scene1337::playThieftCard(int playerId, Card *card, int victimId) { - _actionIdx1 = playerId; - _actionIdx2 = victimId; - - int randIndx; - - for (;;) { - randIndx = R2_GLOBALS._randomSource.getRandomNumber(3); - if (_gameBoardSide[victimId]._handCard[randIndx]._cardId != 0) - break; - } - - _actionCard1 = card; - _actionCard2 = &_gameBoardSide[victimId]._emptyStationPos; - _actionCard3 = &_gameBoardSide[victimId]._handCard[randIndx]; - - _actionItem.setAction(&_action11); -} - -int Scene1337::getPreventionCardId(int cardId) { - int retVal; - - switch (cardId) { - case 10: - retVal = 2; - break; - case 12: - retVal = 3; - break; - case 15: - retVal = 5; - break; - case 17: - retVal = 9; - break; - case 18: - retVal = 6; - break; - case 19: - retVal = 4; - break; - case 20: - retVal = 8; - break; - case 21: - retVal = 7; - break; - default: - retVal = -1; - } - - return retVal; -} - -bool Scene1337::isAttackPossible(int victimId, int cardId) { - if (victimId < 0 || victimId >= ARRAYSIZE(_gameBoardSide)) - error("Scene1337::isAttackPossible() victimId:%d out of range 0 to %d", victimId, ARRAYSIZE(_gameBoardSide)-1); - - for (int i = 0; i <= 7; i++) { - if (_gameBoardSide[victimId]._outpostStation[i]._cardId != 0) { - if (getPreventionCardId(cardId) == _gameBoardSide[victimId]._outpostStation[i]._cardId) - return false; - } - } - return true; -} - -int Scene1337::getPlayerWithOutpost(int playerId) { - int randPlayerId = R2_GLOBALS._randomSource.getRandomNumber(3); - - for (int i = 0; i <= 3; i++) { - if (randPlayerId != playerId) { - for (int j = 0; j <= 7; j++) { - if (_gameBoardSide[randPlayerId]._outpostStation[j]._cardId != 0) - return randPlayerId; - } - } - - if (playerId == 1) { - randPlayerId--; - if (randPlayerId < 0) - randPlayerId = 3; - } else { - ++randPlayerId; - if (randPlayerId > 3) - randPlayerId = 0; - } - } - - return -1; -} - -bool Scene1337::checkAntiDelayCard(int delayCardId, int cardId) { - if ((delayCardId == 11) && (cardId == 26)) - return true; - - if ((delayCardId == 14) && (cardId == 30)) - return true; - - if ((delayCardId == 16) && (cardId == 32)) - return true; - - if ((delayCardId == 24) && (cardId == 28)) - return true; - - return false; -} - -void Scene1337::playStationCard(Card *station, Card *platform) { - _actionCard1 = station; - _actionCard2 = platform; - _actionItem.setAction(&_action7); -} - -int Scene1337::getFreeHandCard(int playerId) { - if ( (_gameBoardSide[playerId]._handCard[0]._cardId == 0) - && (_gameBoardSide[playerId]._handCard[1]._cardId == 0) - && (_gameBoardSide[playerId]._handCard[2]._cardId == 0) - && (_gameBoardSide[playerId]._handCard[3]._cardId == 0)) - return -1; - - int randIndx; - for (;;) { - randIndx = R2_GLOBALS._randomSource.getRandomNumber(3); - if (_gameBoardSide[playerId]._handCard[randIndx]._cardId == 0) - break; - } - - return randIndx; -} - -void Scene1337::playPlatformCard(Card *card, Card *dest) { - _actionCard1 = card; - _actionCard2 = dest; - - _actionItem.setAction(&_action6); -} - -void Scene1337::playDelayCard(Card *card, Card *dest) { - _actionCard1 = card; - _actionCard2 = dest; - - _actionItem.setAction(&_action9); -} - -void Scene1337::playAntiDelayCard(Card *card, Card *dest) { - _actionCard1 = card; - _actionCard2 = dest; - - _actionItem.setAction(&_action8); - - handleNextTurn(); -} - - -Scene1337::Card *Scene1337::getStationCard(int playerId) { - for (int i = 0; i <= 7; i++) { - if ((_gameBoardSide[playerId]._outpostStation[i]._cardId >= 1) && (_gameBoardSide[playerId]._outpostStation[i]._cardId <= 9)) - return &_gameBoardSide[playerId]._outpostStation[i]; - } - - return nullptr; -} - -void Scene1337::playCounterTrickCard(Card *card, int playerId) { - _actionCard1 = card; - _actionCard2 = getStationCard(playerId); - _actionCard3 = &_gameBoardSide[playerId]._emptyStationPos; - _actionIdx1 = playerId; - _actionItem.setAction(&_action10); - handleNextTurn(); -} - -void Scene1337::discardCard(Card *card) { - _actionCard1 = card; - - _actionItem.setAction(&_action5); -} - -void Scene1337::subC4CD2() { - if (R2_GLOBALS._v57709 > 0) { - subD1917(); - subD1940(false); // _v5780C-- - } -} - -void Scene1337::subC4CEC() { - if (R2_GLOBALS._v57709 == 0) { - subD18F5(); - subD1940(true); // _v5780C++ - } -} - -void Scene1337::subC51A0(Card *subObj1, Card *subObj2) { - _actionCard1 = subObj1; - _actionCard2 = subObj2; - - _actionItem.setAction(&_action13); -} - -void Scene1337::displayDialog(int dialogNumb) { - switch (dialogNumb - 1) { - case 0: - actionDisplay(1330, 53, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 1: - actionDisplay(1330, 57, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 2: - actionDisplay(1330, 58, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 3: - actionDisplay(1330, 59, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 4: - actionDisplay(1330, 60, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 5: - actionDisplay(1330, 61, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 6: - actionDisplay(1330, 62, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 7: - actionDisplay(1330, 63, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 8: - actionDisplay(1330, 64, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 9: - actionDisplay(1330, 65, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 10: - actionDisplay(1330, 67, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 11: - actionDisplay(1330, 69, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 12: - actionDisplay(1330, 71, 159, 10, 1, 200, 0, 7, 0, 154, 154); - actionDisplay(1330, 72, 159, 10, 1, 200, 0, 7, 0, 154, 154); - actionDisplay(1330, 73, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 13: - actionDisplay(1330, 79, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 14: - actionDisplay(1330, 81, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - actionDisplay(1330, 83, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 16: - actionDisplay(1330, 85, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 17: - actionDisplay(1330, 87, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 18: - actionDisplay(1330, 89, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 19: - actionDisplay(1330, 91, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - actionDisplay(1330, 93, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 23: - actionDisplay(1330, 95, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 24: - actionDisplay(1330, 97, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 25: - actionDisplay(1330, 104, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 26: - actionDisplay(1330, 105, 159, 10, 1, 200, 0, 7, 0, 154, 154); - actionDisplay(1330, 106, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 27: - actionDisplay(1330, 110, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 28: - actionDisplay(1330, 108, 159, 10, 1, 200, 0, 7, 0, 154, 154); - actionDisplay(1330, 109, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 29: - actionDisplay(1330, 111, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 31: - actionDisplay(1330, 112, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } -} - -void Scene1337::subPostInit() { - R2_GLOBALS._v57709 = 0; - R2_GLOBALS._v5780C = 0; - updateCursorId(1, false); - subD1940(true); // _v5780C++ - subD18F5(); - -// loadScene(1330); -// SceneExt::postInit(); - - R2_GLOBALS._scenePalette.addRotation(224, 235, 1); - - _availableCardsPile[0] = 1; - _availableCardsPile[1] = 1; - _availableCardsPile[2] = 1; - _availableCardsPile[3] = 1; - _availableCardsPile[4] = 1; - _availableCardsPile[5] = 1; - _availableCardsPile[6] = 1; - _availableCardsPile[7] = 1; - _availableCardsPile[8] = 26; - _availableCardsPile[9] = 2; - _availableCardsPile[10] = 2; - _availableCardsPile[11] = 2; - _availableCardsPile[12] = 2; - _availableCardsPile[13] = 2; - _availableCardsPile[14] = 26; - _availableCardsPile[15] = 3; - _availableCardsPile[16] = 3; - _availableCardsPile[17] = 3; - _availableCardsPile[18] = 3; - _availableCardsPile[19] = 3; - _availableCardsPile[20] = 28; - _availableCardsPile[21] = 4; - _availableCardsPile[22] = 4; - _availableCardsPile[23] = 4; - _availableCardsPile[24] = 4; - _availableCardsPile[25] = 4; - _availableCardsPile[26] = 28; - _availableCardsPile[27] = 5; - _availableCardsPile[28] = 5; - _availableCardsPile[29] = 5; - _availableCardsPile[30] = 5; - _availableCardsPile[31] = 5; - _availableCardsPile[32] = 30; - _availableCardsPile[33] = 6; - _availableCardsPile[34] = 6; - _availableCardsPile[35] = 6; - _availableCardsPile[36] = 6; - _availableCardsPile[37] = 6; - _availableCardsPile[38] = 30; - _availableCardsPile[39] = 7; - _availableCardsPile[40] = 7; - _availableCardsPile[41] = 7; - _availableCardsPile[42] = 7; - _availableCardsPile[43] = 7; - _availableCardsPile[44] = 32; - _availableCardsPile[45] = 8; - _availableCardsPile[46] = 8; - _availableCardsPile[47] = 8; - _availableCardsPile[48] = 8; - _availableCardsPile[49] = 8; - _availableCardsPile[50] = 32; - _availableCardsPile[51] = 9; - _availableCardsPile[52] = 9; - _availableCardsPile[53] = 9; - _availableCardsPile[54] = 9; - _availableCardsPile[55] = 9; - _availableCardsPile[56] = 10; - _availableCardsPile[57] = 11; - _availableCardsPile[58] = 12; - _availableCardsPile[59] = 13; - _availableCardsPile[60] = 13; - _availableCardsPile[61] = 14; - _availableCardsPile[62] = 15; - _availableCardsPile[63] = 16; - _availableCardsPile[64] = 17; - _availableCardsPile[65] = 18; - _availableCardsPile[66] = 19; - _availableCardsPile[67] = 20; - _availableCardsPile[68] = 21; - _availableCardsPile[69] = 26; - _availableCardsPile[70] = 28; - _availableCardsPile[71] = 24; - _availableCardsPile[72] = 25; - _availableCardsPile[73] = 25; - _availableCardsPile[74] = 25; - _availableCardsPile[75] = 25; - _availableCardsPile[76] = 26; - _availableCardsPile[77] = 26; - _availableCardsPile[78] = 26; - _availableCardsPile[79] = 27; - _availableCardsPile[80] = 27; - _availableCardsPile[81] = 28; - _availableCardsPile[82] = 28; - _availableCardsPile[83] = 28; - _availableCardsPile[84] = 29; - _availableCardsPile[85] = 29; - _availableCardsPile[86] = 29; - _availableCardsPile[87] = 30; - _availableCardsPile[88] = 30; - _availableCardsPile[89] = 30; - _availableCardsPile[90] = 30; - _availableCardsPile[91] = 32; - _availableCardsPile[92] = 1; - _availableCardsPile[93] = 32; - _availableCardsPile[94] = 32; - _availableCardsPile[95] = 32; - _availableCardsPile[96] = 1; - _availableCardsPile[97] = 1; - _availableCardsPile[98] = 1; - _availableCardsPile[99] = 0; - - _cardsAvailableNumb = 98; - _currentDiscardIndex = 98; // CHECKME: Would make more sense at pos 99 - - _discardPile._cardId = 0; - _discardPile._stationPos = Common::Point(128, 95); - - _stockCard._cardId = 0; - _stockCard._stationPos = Common::Point(162, 95); - - _selectedCard._cardId = 0; - - _animatedCard._card.postInit(); - _animatedCard._card.setVisage(1332); - _animatedCard._card.setStrip(5); - _animatedCard._card.setFrame(1); - _animatedCard._card._moveDiff = Common::Point(10, 10); - _animatedCard._card.fixPriority(400); - _animatedCard._card.setPosition(Common::Point(128, 95), 0); - _animatedCard._card.animate(ANIM_MODE_2, NULL); - _animatedCard._card.hide(); - - _currentPlayerArrow.postInit(); - _currentPlayerArrow.setVisage(1334); - _currentPlayerArrow.setStrip(1); - _currentPlayerArrow.setFrame(1); - _currentPlayerArrow._numFrames = 12; - _currentPlayerArrow.fixPriority(500); - _currentPlayerArrow.setPosition(Common::Point(174, 107), 0); - _currentPlayerArrow.animate(ANIM_MODE_2, NULL); - _currentPlayerArrow.hide(); - - _showPlayerTurn = true; - _displayHelpFl = false; - _winnerId = -1; - - _helpIcon.postInit(); - _helpIcon.setup(9531, 1, 1); - _helpIcon.setPosition(Common::Point(249, 168)); - _helpIcon.setPriority(155); - _helpIcon._effect = EFFECT_NONE; - _helpIcon.show(); - - _autoplay = false; - _instructionsDisplayedFl = false; - _instructionsWaitCount = 0; -} - -void Scene1337::suggestInstructions() { - if (R2_GLOBALS._v57709 > 0) - subD1917(); - - if (MessageDialog::show(NEED_INSTRUCTIONS, NO_MSG, YES_MSG) == 0) { - if (R2_GLOBALS._v57709 == 0) - subD18F5(); - dealCards(); - } else { - if (R2_GLOBALS._v57709 == 0) - subD18F5(); - displayInstructions(); - } -} - -void Scene1337::displayInstructions() { - _actionItem.setAction(&_action1); -} - -void Scene1337::shuffleCards() { - R2_GLOBALS._sceneObjects->draw(); - - // Remove holes in card pile - for (int i = 0; i <= 98; i++) { - if (_availableCardsPile[i] == 0) { - for (int j = i + 1; j <= 98; j ++) { - if (_availableCardsPile[j] != 0) { - _availableCardsPile[i] = _availableCardsPile[j]; - _availableCardsPile[j] = 0; - break; - } - } - } - } - - // Compute the number of available cards - for (int i = 0; i <= 99; i ++) { - if (_availableCardsPile[i] == 0) { - // CHECKME: This will fail if i == 0, which shouldn't happen - // as we don't shuffle cards when no card is available. - _cardsAvailableNumb = i - 1; - _currentDiscardIndex = 98; // CHECKME: Would make more sense at pos 99 - break; - } - } - - for (int i = 0; i < 2000; i ++) { - int randIndx = R2_GLOBALS._randomSource.getRandomNumber(_cardsAvailableNumb); - int swap = _availableCardsPile[0]; - _availableCardsPile[0] = _availableCardsPile[randIndx]; - _availableCardsPile[randIndx] = swap; - } - - _shuffleEndedFl = false; - - // Shuffle cards - _animatedCard._card.setAction(&_action2); - - while(!_shuffleEndedFl && !g_vm->shouldQuit()) { - g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); - g_globals->_scenePalette.signalListeners(); - R2_GLOBALS._sceneObjects->draw(); - g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); - } -} - -void Scene1337::dealCards() { - _animatedCard._card._moveDiff = Common::Point(30, 30); - shuffleCards(); - - // Deal cards - _actionItem.setAction(&_action3); -} - -void Scene1337::showOptionsDialog() { - // Display menu with "Auto Play", "New Game", "Quit" and "Continue" - OptionsDialog::show(); -} - -void Scene1337::handleClick(int arg1, Common::Point pt) { - int curReg = R2_GLOBALS._sceneRegions.indexOf(g_globals->_events._mousePos); - - if (arg1 == 3) { - bool found = false; - int i; - for (i = 0; i <= 7; i++) { - if ( _gameBoardSide[2]._outpostStation[i].isIn(pt) - || _gameBoardSide[0]._outpostStation[i].isIn(pt) - || _gameBoardSide[1]._outpostStation[i].isIn(pt) - || _gameBoardSide[3]._outpostStation[i].isIn(pt) ) { - found = true; - break; - } - } - - if (found) { - switch (curReg) { - case 5: - if (_gameBoardSide[2]._outpostStation[i]._cardId != 0) - displayDialog(_gameBoardSide[2]._outpostStation[i]._cardId); - else - actionDisplay(1330, 20, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 10: - if (_gameBoardSide[3]._outpostStation[i]._cardId != 0) - displayDialog(_gameBoardSide[3]._outpostStation[i]._cardId); - else - actionDisplay(1330, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - if (_gameBoardSide[0]._outpostStation[i]._cardId != 0) - displayDialog(_gameBoardSide[0]._outpostStation[i]._cardId); - else - actionDisplay(1330, 21, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - if (_gameBoardSide[1]._outpostStation[i]._cardId != 0) - displayDialog(_gameBoardSide[1]._outpostStation[i]._cardId); - else - actionDisplay(1330, 23, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } else if ( _gameBoardSide[2]._delayCard.isIn(pt) - || _gameBoardSide[0]._delayCard.isIn(pt) - || _gameBoardSide[1]._delayCard.isIn(pt) - || _gameBoardSide[3]._delayCard.isIn(pt) ) { - switch (curReg) { - case 5: - if (_gameBoardSide[2]._delayCard._cardId != 0) - displayDialog(_gameBoardSide[2]._delayCard._cardId); - else - actionDisplay(1330, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 10: - if (_gameBoardSide[3]._delayCard._cardId != 0) - displayDialog(_gameBoardSide[3]._delayCard._cardId); - else - actionDisplay(1330, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - if (_gameBoardSide[0]._delayCard._cardId != 0) - displayDialog(_gameBoardSide[0]._delayCard._cardId); - else - actionDisplay(1330, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - if (_gameBoardSide[1]._delayCard._cardId != 0) - displayDialog(_gameBoardSide[1]._delayCard._cardId); - else - actionDisplay(1330, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } else if (_discardPile.isIn(pt)) { - if (_discardPile._cardId != 0) - displayDialog(_discardPile._cardId); - else - actionDisplay(1330, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (_helpIcon._bounds.contains(pt)) - actionDisplay(1330, 43, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else if (_stockCard.isIn(pt)) - actionDisplay(1330, 4, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else if ( (_gameBoardSide[2]._emptyStationPos.isIn(pt)) - || (_gameBoardSide[3]._emptyStationPos.isIn(pt)) - || (_gameBoardSide[0]._emptyStationPos.isIn(pt)) - || (_gameBoardSide[1]._emptyStationPos.isIn(pt)) ) - actionDisplay(1330, 32, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else if (_gameBoardSide[2]._handCard[0].isIn(pt)) - displayDialog(_gameBoardSide[2]._handCard[0]._cardId); - else if (_gameBoardSide[2]._handCard[1].isIn(pt)) - displayDialog(_gameBoardSide[2]._handCard[1]._cardId); - else if (_gameBoardSide[2]._handCard[2].isIn(pt)) - displayDialog(_gameBoardSide[2]._handCard[2]._cardId); - else if (_gameBoardSide[2]._handCard[3].isIn(pt)) - displayDialog(_gameBoardSide[2]._handCard[3]._cardId); - else if ((curReg >= 6) && (curReg <= 9)) - actionDisplay(1330, 29, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else if ((curReg >= 11) && (curReg <= 14)) - actionDisplay(1330, 31, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else if ((curReg >= 16) && (curReg <= 19)) - actionDisplay(1330, 30, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else { - switch (curReg) { - case 0: - actionDisplay(1330, 2, 159, 134, 1, 200, 0, 7, 0, 105, 105); - break; - case 5: - actionDisplay(1330, 25, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 10: - actionDisplay(1330, 27, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - actionDisplay(1330, 26, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - actionDisplay(1330, 28, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 21: - actionDisplay(1330, 24, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } - } - - if (arg1 != 1) - return; - - for (int i = 0; i <= 7; i++) { - if (_gameBoardSide[2]._outpostStation[i].isIn(pt)) { - switch (_gameBoardSide[2]._outpostStation[i]._cardId) { - case 0: - actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 1: - actionDisplay(1330, 54, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - } - return; - } - if (_gameBoardSide[0]._outpostStation[i].isIn(pt)) { - switch (_gameBoardSide[0]._outpostStation[i]._cardId) { - case 0: - actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - } - return; - } - if (_gameBoardSide[1]._outpostStation[i].isIn(pt)) { - switch (_gameBoardSide[1]._outpostStation[i]._cardId) { - case 0: - actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); - break; - default: - actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117); - break; - } - return; - } - if (_gameBoardSide[3]._outpostStation[i].isIn(pt)) { - switch (_gameBoardSide[3]._outpostStation[i]._cardId) { - case 0: - actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); - break; - default: - actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172); - break; - } - return; - } - } - - if (_gameBoardSide[2]._delayCard.isIn(pt)) { - // The original uses _gameBoardSide[0], which is obviously a bug. - if (_gameBoardSide[2]._delayCard._cardId != 0) - actionDisplay(1330, 39, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else - actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - return; - } - if (_gameBoardSide[3]._delayCard.isIn(pt)) { - if (_gameBoardSide[3]._delayCard._cardId != 0) - actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172); - else - actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); - - return; - } - if (_gameBoardSide[1]._delayCard.isIn(pt)) { - if (_gameBoardSide[1]._delayCard._cardId != 0) - actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117); - else - actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); - - return; - } - if (_gameBoardSide[0]._delayCard.isIn(pt)) { - if (_gameBoardSide[0]._delayCard._cardId != 0) - actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else - actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - - return; - } - if (_gameBoardSide[3]._emptyStationPos.isIn(pt)) { - actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); - return; - } - if (_gameBoardSide[1]._emptyStationPos.isIn(pt)) { - actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); - return; - } - if (_gameBoardSide[0]._emptyStationPos.isIn(pt)) { - actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - return; - } - - if (_helpIcon._bounds.contains(pt)) { - showOptionsDialog(); - return; - } - - if (_discardPile.isIn(pt)) - actionDisplay(1330, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else if (_stockCard.isIn(pt)) - actionDisplay(1330, 5, 159, 10, 1, 200, 0, 7, 0, 154, 154); - else { - switch (curReg) { - case 0: - actionDisplay(1330, 3, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 6: - // no break on purpose - case 7: - // no break on purpose - case 8: - // no break on purpose - case 9: - actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172); - break; - case 10: - actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172); - break; - case 11: - // no break on purpose - case 12: - // no break on purpose - case 13: - // no break on purpose - case 14: - actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 16: - // no break on purpose - case 17: - // no break on purpose - case 18: - // no break on purpose - case 19: - actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117); - break; - case 20: - actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117); - break; - default: - actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - } - } -} - -void Scene1337::handlePlayer0() { - if (_gameBoardSide[0]._delayCard._cardId != 0) { - switch (_gameBoardSide[0]._delayCard._cardId) { - case 10: - //No break on purpose - case 12: - //No break on purpose - case 15: - //No break on purpose - case 17: - //No break on purpose - case 18: - //No break on purpose - case 19: - //No break on purpose - case 20: - //No break on purpose - case 21: - discardCard(&_gameBoardSide[0]._delayCard); - break; - default: - for (int i = 0; i <= 3; i++) { - if (checkAntiDelayCard(_gameBoardSide[0]._delayCard._cardId, _gameBoardSide[0]._handCard[i]._cardId)) { - playAntiDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[0]._delayCard); - return; - } - } - - break; - } - } - - for (int i = 0; i <= 3; i++) { - int tmpVal = getStationId(0, i); - - if (tmpVal != -1) { - bool stationAlreadyPresentFl = false; - for (int j = 0; j <= 7; j++) { - if (_gameBoardSide[0]._outpostStation[j]._cardId == _gameBoardSide[0]._handCard[tmpVal]._cardId) { - stationAlreadyPresentFl = true; - break; - } - } - - if (!stationAlreadyPresentFl) { - for (int j = 0; j <= 7; j++) { - if ((_gameBoardSide[0]._outpostStation[j]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[0]._delayCard._cardId)) { - int stationCount = 0; - for (int k = 0; k <= 7; k++) { - if ((_gameBoardSide[0]._outpostStation[k]._cardId > 1) && (_gameBoardSide[0]._outpostStation[k]._cardId <= 9)) { - ++stationCount; - } - } - - if (stationCount == 7) - _winnerId = 0; - - playStationCard(&_gameBoardSide[0]._handCard[tmpVal], &_gameBoardSide[0]._outpostStation[j]); - return; - } - } - } - } - } - - int tmpVal = findPlatformCardInHand(0); - - if (tmpVal != -1) { - for (int i = 0; i <= 7; i++) { - if ((_gameBoardSide[0]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[0]._delayCard._cardId)) { - playPlatformCard(&_gameBoardSide[0]._handCard[tmpVal], &_gameBoardSide[0]._outpostStation[i]); - return; - } - } - } - - int card13Id = findCard13InHand(0); - if (card13Id != -1) { - for (int i = 0; i <= 7; i++) { - if (_gameBoardSide[2]._outpostStation[i]._cardId != 0) { - playCounterTrickCard(&_gameBoardSide[0]._handCard[card13Id], 2); - return; - } - } - } - - int thieftId = checkThieftCard(0); - if (thieftId != -1) { - if ( (_gameBoardSide[2]._handCard[0]._cardId != 0) - || (_gameBoardSide[2]._handCard[1]._cardId != 0) - || (_gameBoardSide[2]._handCard[2]._cardId != 0) - || (_gameBoardSide[2]._handCard[3]._cardId != 0) ) { - playThieftCard(0, &_gameBoardSide[0]._handCard[thieftId], 2); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if ((isDelayCard(_gameBoardSide[0]._handCard[i]._cardId) != -1) - && (_gameBoardSide[2]._delayCard._cardId == 0) - && isAttackPossible(2, _gameBoardSide[0]._handCard[i]._cardId)) { - playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[2]._delayCard); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if ((getStationCardId(_gameBoardSide[0]._handCard[i]._cardId) != -1) - && (_gameBoardSide[2]._delayCard._cardId == 0) - && isAttackPossible(2, _gameBoardSide[0]._handCard[i]._cardId)) { - playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[2]._delayCard); - return; - } - } - - card13Id = findCard13InHand(0); - int victimPlayerId = getPlayerWithOutpost(0); - - if ((card13Id != -1) && (victimPlayerId != -1)) { - playCounterTrickCard(&_gameBoardSide[0]._handCard[card13Id], victimPlayerId); - return; - } - - thieftId = checkThieftCard(0); - if (thieftId != -1) { - if ( (_gameBoardSide[1]._handCard[0]._cardId != 0) - || (_gameBoardSide[1]._handCard[1]._cardId != 0) - || (_gameBoardSide[1]._handCard[2]._cardId != 0) - || (_gameBoardSide[1]._handCard[3]._cardId != 0) ) { - playThieftCard(0, &_gameBoardSide[0]._handCard[thieftId], 1); - return; - } - } - - for (int i = 0; i <= 3; i++) { - if (getStationCardId(_gameBoardSide[0]._handCard[i]._cardId) != -1) { - if ((_gameBoardSide[1]._delayCard._cardId == 0) && isAttackPossible(1, _gameBoardSide[0]._handCard[i]._cardId)) { - playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[1]._delayCard); - return; - } - - if ((_gameBoardSide[3]._delayCard._cardId == 0) && isAttackPossible(3, _gameBoardSide[0]._handCard[i]._cardId)) { - playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[3]._delayCard); - return; - } - } - } - - for (int i = 0; i <= 3; i++) { - tmpVal = isDelayCard(_gameBoardSide[0]._handCard[i]._cardId); - if (tmpVal != -1) { - if ((_gameBoardSide[1]._delayCard._cardId == 0) && isAttackPossible(1, _gameBoardSide[0]._handCard[i]._cardId)) { - playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[1]._delayCard); - return; - } - - if ((_gameBoardSide[3]._delayCard._cardId == 0) && isAttackPossible(3, _gameBoardSide[0]._handCard[i]._cardId)) { - playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[3]._delayCard); - return; - } - } - } - - handlePlayer01Discard(0); -} - -void Scene1337::handlePlayer1() { - if (this->_gameBoardSide[1]._delayCard._cardId != 0) { - switch (_gameBoardSide[1]._delayCard._cardId) { - case 10: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 17: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 20: - // No break on purpose - case 21: - discardCard(&_gameBoardSide[1]._delayCard); - return; - default: - for (int i = 0; i <= 3; i++) { - if (checkAntiDelayCard(_gameBoardSide[1]._delayCard._cardId, _gameBoardSide[1]._handCard[i]._cardId)) { - playAntiDelayCard(&_gameBoardSide[1]._handCard[i], &_gameBoardSide[1]._delayCard); - return; - } - } - break; - } - } - - for (int i = 0; i <= 3; i++) { - int tmpIndx = getStationId(1, i); - if (tmpIndx == -1) - break; - - int tmpVal = 0; - for (int j = 0; j <= 7; j++) { - if (_gameBoardSide[1]._outpostStation[j]._cardId == _gameBoardSide[1]._handCard[tmpIndx]._cardId) { - tmpVal = 1; - break; - } - } - - if (tmpVal == 0) - break; - - for (int j = 0; j <= 7; j++) { - if ((_gameBoardSide[1]._outpostStation[j]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[1]._delayCard._cardId)) { - int stationCount = 0; - for (int k = 0; k <= 7; k++) { - if ((_gameBoardSide[1]._outpostStation[k]._cardId > 1) && (_gameBoardSide[1]._outpostStation[k]._cardId <= 9)) - ++stationCount; - } - - if (stationCount == 7) - _winnerId = 1; - - playStationCard(&_gameBoardSide[1]._handCard[tmpIndx], &_gameBoardSide[1]._outpostStation[j]); - return; - } - } - } - - int normalCardId = findPlatformCardInHand(1); - if (normalCardId != -1) { - for (int i = 0; i <= 7; i++) { - if ((_gameBoardSide[1]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[1]._delayCard._cardId)) { - playPlatformCard(&_gameBoardSide[1]._handCard[normalCardId], &_gameBoardSide[1]._outpostStation[i]); - return; - } - } - } - - int card13Id = findCard13InHand(1); - int tmpVal2 = getPlayerWithOutpost(1); - - if ((card13Id != -1) && (tmpVal2 != -1)) { - playCounterTrickCard(&_gameBoardSide[1]._handCard[card13Id], tmpVal2); - return; - } - - int thieftId = checkThieftCard(1); - if (thieftId != -1) { - int playerIdFound = -1; - int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3); - for (int i = 0; i <= 3; i++) { - if (rndVal != 1) { - if ( (_gameBoardSide[rndVal]._handCard[0]._cardId != 0) - || (_gameBoardSide[rndVal]._handCard[1]._cardId != 0) - || (_gameBoardSide[rndVal]._handCard[2]._cardId != 0) - || (_gameBoardSide[rndVal]._handCard[3]._cardId == 0)) { - playerIdFound = rndVal; - break; - } - } - // The original was only updating in the rndVal block, - // which was a bug as the checks were stopping at this point - rndVal--; - if (rndVal < 0) - rndVal = 3; - } - - if (playerIdFound != -1) { - playThieftCard(1, &_gameBoardSide[1]._handCard[thieftId], playerIdFound); - return; - } - } - - int count = -1; - int i; - for (i = 0; i <= 3; i++) { - int tmpVal = isDelayCard(_gameBoardSide[1]._handCard[i]._cardId); - if (tmpVal != -1) { - int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3); - - for (int j = 0; j <= 3; j++) { - //CHECKME: tmpVal or rndVal? - // FIXME: This is probably meant to be rndVal, but not clear... - if (tmpVal < 0 || tmpVal >= ARRAYSIZE(_gameBoardSide)) - error("Scene1337::handlePlayer1() tmpVal:%d out of range 0 to %d", tmpVal, ARRAYSIZE(_gameBoardSide)-1); - - if (tmpVal != 1) { - if ((_gameBoardSide[tmpVal]._delayCard._cardId == 0) && isAttackPossible(tmpVal, _gameBoardSide[1]._handCard[i]._cardId)) - count = tmpVal; - } - - if (count < 0 || count >= ARRAYSIZE(_gameBoardSide)) - error("Scene1337::handlePlayer1() count:%d out of range 0 to %d", count, ARRAYSIZE(_gameBoardSide)-1); - - if (count != -1) { - playDelayCard(&_gameBoardSide[1]._handCard[i], &_gameBoardSide[count]._delayCard); - return; - } else { - rndVal--; - if (rndVal < 0) - rndVal = 3; - } - } - } - } - - int j; - for (j = 0; j <= 3; j++) { - if (getStationCardId(_gameBoardSide[1]._handCard[j]._cardId) != -1) { - count = -1; - int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3); - for (int l = 0; l <= 3; l++) { - if (rndVal != 1) { - if ((_gameBoardSide[rndVal]._delayCard._cardId == 0) && (_gameBoardSide[1]._handCard[j]._cardId == 1)) - count = rndVal; - } - if (count != -1) { - playDelayCard(&_gameBoardSide[1]._handCard[j], &_gameBoardSide[count]._delayCard); - return; - } else { - rndVal--; - if (rndVal < 0) - rndVal = 3; - } - } - } - } - - handlePlayer01Discard(1); -} - -void Scene1337::handlePlayer3() { - if (_gameBoardSide[3]._delayCard._cardId != 0) { - switch (_gameBoardSide[3]._delayCard._cardId) { - case 10: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 17: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 20: - // No break on purpose - case 21: - discardCard(&_gameBoardSide[3]._delayCard); - return; - default: - for (int i = 0; i <= 3; i++) { - if (checkAntiDelayCard(_gameBoardSide[3]._delayCard._cardId, _gameBoardSide[3]._handCard[i]._cardId)) { - playAntiDelayCard(&_gameBoardSide[3]._handCard[i], &_gameBoardSide[3]._delayCard); - return; - } - } - break; - } - } - - int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3); - - if (_gameBoardSide[3]._handCard[randIndx]._cardId == 1) { - for (int i = 0; i <= 7; i++) { - if ((_gameBoardSide[3]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[3]._delayCard._cardId)) { - playPlatformCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[3]._outpostStation[i]); - return; - } - } - } else if (_gameBoardSide[3]._handCard[randIndx]._cardId <= 9) { - for (int i = 0; i <= 7; i++) { - if (_gameBoardSide[3]._outpostStation[i]._cardId == _gameBoardSide[3]._handCard[randIndx]._cardId) { - discardCard(&_gameBoardSide[3]._handCard[randIndx]); - return; - } - } - - for (int i = 0; i <= 7; i++) { - if ((_gameBoardSide[3]._outpostStation[i]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[3]._delayCard._cardId)) { - int stationCount = 0; - for (int j = 0; j <= 7; j++) { - if ((_gameBoardSide[3]._outpostStation[j]._cardId > 1) && (_gameBoardSide[3]._outpostStation[j]._cardId <= 9)) - ++stationCount; - } - - if (stationCount == 7) - _winnerId = 3; - - playStationCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[3]._outpostStation[i]); - return; - } - } - } else if (_gameBoardSide[3]._handCard[randIndx]._cardId == 13) { - int victimId = getPlayerWithOutpost(3); - - if (victimId != -1) { - playCounterTrickCard(&_gameBoardSide[3]._handCard[randIndx], victimId); - return; - } - } else if (_gameBoardSide[3]._handCard[randIndx]._cardId == 25) { - int victimId = -1; - int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3); - - for (int i = 0; i <= 3; i++) { - if ( (tmpRandIndx != 3) - && ( (_gameBoardSide[tmpRandIndx]._handCard[0]._cardId != 0) - || (_gameBoardSide[tmpRandIndx]._handCard[1]._cardId != 0) - || (_gameBoardSide[tmpRandIndx]._handCard[2]._cardId != 0) - || (_gameBoardSide[tmpRandIndx]._handCard[3]._cardId != 0) )) { - victimId = tmpRandIndx; - break; - } - - ++tmpRandIndx; - if (tmpRandIndx > 3) - tmpRandIndx = 0; - } - - if (victimId != -1) { - playThieftCard(3, &_gameBoardSide[3]._handCard[randIndx], victimId); - return; - } - } else { - switch (_gameBoardSide[3]._handCard[randIndx]._cardId) { - case 10: - // No break on purpose - case 11: - // No break on purpose - case 12: - // No break on purpose - case 14: - // No break on purpose - case 15: - // No break on purpose - case 16: - // No break on purpose - case 17: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 20: - // No break on purpose - case 21: - // No break on purpose - case 24: { - int victimId = -1; - int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3); - - for (int i = 0; i <= 3; i++) { - if (tmpRandIndx != 3) { - if ((_gameBoardSide[tmpRandIndx]._delayCard._cardId == 0) - && isAttackPossible(tmpRandIndx, _gameBoardSide[3]._handCard[randIndx]._cardId)) - victimId = tmpRandIndx; - } - - ++tmpRandIndx; - if (tmpRandIndx > 3) - tmpRandIndx = 0; - - if (victimId != -1) - break; - } - - if (victimId != -1) { - // Useless second identical check skipped - playDelayCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[victimId]._delayCard); - return; - } - } - default: - break; - } - } - - discardCard(&_gameBoardSide[3]._handCard[randIndx]); -} - -void Scene1337::handleAutoplayPlayer2() { - if (getStationCardId(this->_gameBoardSide[2]._delayCard._cardId) == -1) - _delayedFunction = &Scene1337::handlePlayer2; - else - discardCard(&_gameBoardSide[2]._delayCard); -} - -void Scene1337::handlePlayer2() { - _selectedCard._stationPos = g_globals->_events._mousePos; - - if (R2_GLOBALS._v57810 == 200) { - // Hand - int i; - for (i = 0; i < 4; i++) { - if ((_gameBoardSide[2]._handCard[i].isIn(_selectedCard._stationPos)) && (_gameBoardSide[2]._handCard[i]._cardId != 0)) { - Card *handcard = &_gameBoardSide[2]._handCard[i]; - _selectedCard._cardId = handcard->_cardId; - _selectedCard._stationPos = handcard->_stationPos; - //warning("_selectedCard._actorName = handcard->_actorName;"); - //warning("_selectedCard._fieldE = handcard->_fieldE;"); - //warning("_selectedCard._field10 = handcard->_field10;"); - //warning("_selectedCard._field12 = handcard->_field12;"); - //warning("_selectedCard._field14 = handcard->_field14;"); - //warning("_selectedCard._field16 = handcard->_field16;"); - _selectedCard._sceneRegionId = handcard->_sceneRegionId; - _selectedCard._position = handcard->_position; - _selectedCard._yDiff = handcard->_yDiff; - _selectedCard._bounds = handcard->_bounds; - _selectedCard._resNum = handcard->_resNum; - _selectedCard._lookLineNum = handcard->_lookLineNum; - _selectedCard._talkLineNum = handcard->_talkLineNum; - _selectedCard._useLineNum = handcard->_useLineNum; - _selectedCard._action = handcard->_action; - //warning("_selectedCard._field0 = handcard->_field0;"); - _selectedCard._card._updateStartFrame = handcard->_card._updateStartFrame; - _selectedCard._card._walkStartFrame = handcard->_card._walkStartFrame; - // _field2E is named _field3C in R2R - _selectedCard._card._oldPosition = handcard->_card._oldPosition; - _selectedCard._card._percent = handcard->_card._percent; - _selectedCard._card._priority = handcard->_card._priority; - _selectedCard._card._angle = handcard->_card._angle; - _selectedCard._card._flags = handcard->_card._flags; - _selectedCard._card._xe = handcard->_card._xe; - _selectedCard._card._xs = handcard->_card._xs; - _selectedCard._card._paneRects[0] = handcard->_card._paneRects[0]; - _selectedCard._card._paneRects[1] = handcard->_card._paneRects[1]; - _selectedCard._card._visage = handcard->_card._visage; - _selectedCard._card._objectWrapper = handcard->_card._objectWrapper; - _selectedCard._card._strip = handcard->_card._strip; - _selectedCard._card._animateMode = handcard->_card._animateMode; - _selectedCard._card._frame = handcard->_card._frame; - _selectedCard._card._endFrame = handcard->_card._endFrame; - // _field68 is named _field76 in R2R - _selectedCard._card._loopCount = handcard->_card._loopCount; - _selectedCard._card._frameChange = handcard->_card._frameChange; - _selectedCard._card._numFrames = handcard->_card._numFrames; - _selectedCard._card._regionIndex = handcard->_card._regionIndex; - _selectedCard._card._mover = handcard->_card._mover; - _selectedCard._card._moveDiff = handcard->_card._moveDiff; - _selectedCard._card._moveRate = handcard->_card._moveRate; - _selectedCard._card._actorDestPos = handcard->_card._actorDestPos; - _selectedCard._card._endAction = handcard->_card._endAction; - _selectedCard._card._regionBitList = handcard->_card._regionBitList; - // _selectedCard._object1._actorName = handcard->_object1._actorName; - //warning("_selectedCard._card._fieldE = handcard->_card._fieldE;"); - //warning("_selectedCard._card._field10 = handcard->_card._field10;"); - //warning("_selectedCard._card._field12 = handcard->_card._field12;"); - //warning("_selectedCard._card._field14 = handcard->_card._field14;"); - //warning("_selectedCard._card._field16 = handcard->_card._field16;"); - - _gameBoardSide[2]._handCard[i]._cardId = 0; - _gameBoardSide[2]._handCard[i]._card.remove(); - break; - } - } - - if (i == 4) { - handleClick(1, _selectedCard._stationPos); - handleAutoplayPlayer2(); - return; - } else { - setCursorData(1332, _selectedCard._card._strip, _selectedCard._card._frame); - R2_GLOBALS._sceneObjects->draw(); - } - } else if (R2_GLOBALS._v57810 == 300) { - // Eye - handleClick(3, _selectedCard._stationPos); - handleAutoplayPlayer2(); - return; - } else { - // The original code is calling a function full of dead code. - // Only this message remains after a cleanup. - MessageDialog::show(WRONG_ANSWER_MSG, OK_BTN_STRING); - // - handleAutoplayPlayer2(); - return; - } - - Event event; - bool found; - for (;;) { - if ( ((g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN)) && (event.btnState == BTNSHIFT_RIGHT)) - || (g_globals->_events.getEvent(event, EVENT_KEYPRESS)) ){ - _selectedCard._stationPos = g_globals->_events._mousePos; - found = false; - - for (int i = 0; i <= 3; i ++) { - if (_gameBoardSide[2]._handCard[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if (_gameBoardSide[2]._handCard[i]._cardId == 0) { - _gameBoardSide[2]._handCard[i]._cardId = _selectedCard._cardId; - _gameBoardSide[2]._handCard[i]._card.postInit(); - _gameBoardSide[2]._handCard[i]._card.hide(); - _gameBoardSide[2]._handCard[i]._card.setVisage(1332); - _gameBoardSide[2]._handCard[i]._card.setPosition(_gameBoardSide[2]._handCard[i]._stationPos, 0); - _gameBoardSide[2]._handCard[i]._card.fixPriority(170); - setAnimationInfo(&_gameBoardSide[2]._handCard[i]); - setCursorData(5, 1, 4); - _currentPlayerNumb--; - _showPlayerTurn = false; - handleNextTurn(); - return; - } else { - actionDisplay(1330, 127, 159, 10, 1, 200, 0, 7, 0, 154, 154); - found = true; - } - break; - } - } - - if (!found) { - if (_discardPile.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - discardCard(&_selectedCard); - return; - } else if (_selectedCard._cardId == 1) { - bool isInCardFl = false; - int i; - for (i = 0; i <= 7; i++) { - if (_gameBoardSide[2]._outpostStation[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - isInCardFl = true; - break; - } - } - - if ((isInCardFl) && (_gameBoardSide[2]._outpostStation[i]._cardId == 0)) { - if (isDelayCard(_gameBoardSide[2]._delayCard._cardId) != -1) { - actionDisplay(1330, 55, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else { - playPlatformCard(&_selectedCard, &_gameBoardSide[2]._outpostStation[i]); - return; - } - } else { - actionDisplay(1330, 56, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else if (_selectedCard._cardId <= 9) { - bool isInCardFl = false; - int i; - for (i = 0; i <= 7; i++) { - if (_gameBoardSide[2]._outpostStation[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - isInCardFl = true; - break; - } - } - if ((isInCardFl) && (_gameBoardSide[2]._outpostStation[i]._cardId == 1)) { - isInCardFl = false; - for (int j = 0; j <= 7; j++) { - if (_selectedCard._cardId == _gameBoardSide[2]._outpostStation[j]._cardId) { - isInCardFl = true; - break; - } - } - if (isInCardFl) { - // This station is already in place - actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (isDelayCard(_gameBoardSide[2]._delayCard._cardId) != -1) { - // You must eliminate your delay before you can play a station - actionDisplay(1330, 35, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else { - int stationCount = 0; - for (int k = 0; k <= 7; k++) { - if ((_gameBoardSide[2]._outpostStation[k]._cardId > 1) && (_gameBoardSide[2]._outpostStation[k]._cardId <= 9)) - ++stationCount; - } - - if (stationCount == 7) - _winnerId = 2; - - playStationCard(&_selectedCard, &_gameBoardSide[2]._outpostStation[i]); - return; - } - } else { - actionDisplay(1330, 37, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else if ((_selectedCard._cardId == 26) || (_selectedCard._cardId == 30) ||(_selectedCard._cardId == 32) || (_selectedCard._cardId == 28)) { - // Check anti-delay card - if (_gameBoardSide[2]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - actionDisplay(1330, 42, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (checkAntiDelayCard(_gameBoardSide[2]._delayCard._cardId, _selectedCard._cardId)) { - playAntiDelayCard(&_selectedCard, &_gameBoardSide[2]._delayCard); - return; - } else { - if (_gameBoardSide[2]._delayCard._cardId != 0) { - switch (_gameBoardSide[2]._delayCard._cardId) { - case 11: - actionDisplay(1330, 68, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 14: - actionDisplay(1330, 80, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 16: - actionDisplay(1330, 84, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 24: - actionDisplay(1330, 96, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } else { - actionDisplay(1330, 41, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } - } else if ((getStationCardId(_selectedCard._cardId) == -1) && (isDelayCard(_selectedCard._cardId) == -1)) { - if (_selectedCard._cardId == 13) { - if (_gameBoardSide[0]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - for (int k = 0; k <= 7; k++) { - if (_gameBoardSide[0]._outpostStation[k]._cardId != 0) { - playCounterTrickCard(&_selectedCard, 0); - return; - } - } - actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (_gameBoardSide[3]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - for (int k = 0; k <= 7; k++) { - if (_gameBoardSide[3]._outpostStation[k]._cardId != 0) { - playCounterTrickCard(&_selectedCard, 3); - return; - } - } - actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (_gameBoardSide[1]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - for (int k = 0; k <= 7; k++) { - if (_gameBoardSide[1]._outpostStation[k]._cardId == 0) { - playCounterTrickCard(&_selectedCard, 1); - return; - } - } - actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else { - actionDisplay(1330, 128, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else if (_selectedCard._cardId == 25) { - if (_gameBoardSide[0]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if ( (_gameBoardSide[0]._handCard[0]._cardId != 0) - || (_gameBoardSide[0]._handCard[1]._cardId != 0) - || (_gameBoardSide[0]._handCard[2]._cardId != 0) - || (_gameBoardSide[0]._handCard[3]._cardId != 0) ) { - int k; - for (k = 0; k <= 3; k++){ - if (_gameBoardSide[2]._handCard[k]._cardId == 0) - break; - } - playThieftCard(2, &_gameBoardSide[2]._handCard[k], 0); - return; - } else { - actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else if (_gameBoardSide[1]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if ( (_gameBoardSide[1]._handCard[0]._cardId != 0) - || (_gameBoardSide[1]._handCard[1]._cardId != 0) - || (_gameBoardSide[1]._handCard[2]._cardId != 0) - || (_gameBoardSide[1]._handCard[3]._cardId != 0) ) { - int k; - for (k = 0; k <= 3; k++){ - if (_gameBoardSide[2]._handCard[k]._cardId == 0) - break; - } - playThieftCard(2, &_gameBoardSide[2]._handCard[k], 1); - return; - } else { - actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } - - if (_gameBoardSide[3]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if ( (_gameBoardSide[3]._handCard[0]._cardId != 0) - || (_gameBoardSide[3]._handCard[1]._cardId != 0) - || (_gameBoardSide[3]._handCard[2]._cardId != 0) - || (_gameBoardSide[3]._handCard[3]._cardId != 0) ) { - int k; - for (k = 0; k <= 3; k++){ - if (_gameBoardSide[2]._handCard[k]._cardId == 0) - break; - } - playThieftCard(2, &_gameBoardSide[2]._handCard[k], 3); - return; - } else { - actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else { - actionDisplay(1330, 129, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else if (_selectedCard._cardId == 29) { - // Interceptor cards are used to prevent collision - actionDisplay(1330, 136, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (_selectedCard._cardId == 27) { - actionDisplay(1330, 137, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } else if (_gameBoardSide[0]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if (_gameBoardSide[0]._delayCard._cardId != 0) { - actionDisplay(1330, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (!isAttackPossible(0, _selectedCard._cardId)) { - switch (_selectedCard._cardId) { - case 10: - actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 12: - actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 17: - actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 18: - actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 19: - actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 21: - actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } else { - playDelayCard(&_selectedCard, &_gameBoardSide[0]._delayCard); - return; - } - } else if (_gameBoardSide[3]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if (_gameBoardSide[3]._delayCard._cardId != 0) { - actionDisplay(1330, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (!isAttackPossible(3, _selectedCard._cardId)) { - switch (_selectedCard._cardId) { - case 10: - actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 12: - actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 17: - actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 18: - actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 19: - actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 21: - actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } else { - playDelayCard(&_selectedCard, &_gameBoardSide[3]._delayCard); - return; - } - } else if (_gameBoardSide[1]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) { - if (_gameBoardSide[1]._delayCard._cardId != 0) { - actionDisplay(1330, 19, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } else if (!isAttackPossible(1, _selectedCard._cardId)) { - switch (_selectedCard._cardId) { - case 10: - actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 12: - actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 15: - actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 17: - actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 18: - actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 19: - actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 20: - actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - case 21: - actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154); - break; - default: - break; - } - } else { - playDelayCard(&_selectedCard, &_gameBoardSide[1]._delayCard); - return; - } - } else { - actionDisplay(1330, 38, 159, 10, 1, 200, 0, 7, 0, 154, 154); - } - } - } else { - g_globals->_scenePalette.signalListeners(); - R2_GLOBALS._sceneObjects->draw(); - g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks); - } - - g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); - } -} - -void Scene1337::updateCursorId(int cursorId, bool updateFl) { - if ((R2_GLOBALS._v57709 != 0) || (R2_GLOBALS._v5780C != 0)) - return; - - R2_GLOBALS._mouseCursorId = cursorId; - - if (updateFl) { - R2_GLOBALS._mouseCursorId++; - - if (R2_GLOBALS._mouseCursorId < 1) - R2_GLOBALS._mouseCursorId = 2; - - if (R2_GLOBALS._mouseCursorId > 2) - R2_GLOBALS._mouseCursorId = 1; - } - - // The original was using an intermediate function to call setCursorData. - // It has been removed to improve readability - if (R2_GLOBALS._mouseCursorId == 1) { - R2_GLOBALS._v57810 = 200; - setCursorData(5, 1, 4); - } else if (R2_GLOBALS._mouseCursorId == 2) { - R2_GLOBALS._v57810 = 300; - setCursorData(5, 1, 5); - } else { - R2_GLOBALS._v57810 = 0; - setCursorData(5, 0, 0); - } -} - -void Scene1337::setCursorData(int resNum, int rlbNum, int frameNum) { - _cursorCurRes = resNum; - _cursorCurStrip = rlbNum; - _cursorCurFrame = frameNum; - - if (!frameNum) { - // Should be a hardcoded cursor displaying only a dot. - // FIXME: Use another cursor when possible - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - } else { - // TODO: The original was using some ressource caching, which was useless and complex - // and which has been removed. This cursor behavior clearly made intensive use of this caching... - // We now have to find a way to cache these cursor pointers and avoid loading them multiple times per seconds - uint size; - byte *cursor = g_resourceManager->getSubResource(resNum, rlbNum, frameNum, &size); - // Decode the cursor - GfxSurface s = surfaceFromRes(cursor); - - Graphics::Surface surface = s.lockSurface(); - const byte *cursorData = (const byte *)surface.getPixels(); - CursorMan.replaceCursor(cursorData, surface.w, surface.h, s._centroid.x, s._centroid.y, s._transColor); - s.unlockSurface(); - - DEALLOCATE(cursor); - } -} - -void Scene1337::subD18F5() { - if (R2_GLOBALS._v57709 == 0) - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - - ++R2_GLOBALS._v57709; -} - -void Scene1337::subD1917() { - if (R2_GLOBALS._v57709 != 0) { - R2_GLOBALS._v57709--; - if (R2_GLOBALS._v57709 != 0) { - // The original was using an intermediate function to call setCursorData. - // It has been removed to improve readability - setCursorData(5, _cursorCurStrip, _cursorCurFrame); - } - } -} - -void Scene1337::subD1940(bool flag) { - if (flag) - ++R2_GLOBALS._v5780C; - else if (R2_GLOBALS._v5780C != 0) - --R2_GLOBALS._v5780C; -} - -void Scene1337::subD1975(int arg1, int arg2) { - warning("STUBBED lvl2 Scene1337::subD1975()"); -} - -void Scene1337::OptionsDialog::show() { - OptionsDialog *dlg = new OptionsDialog(); - dlg->draw(); - - // Show the dialog - GfxButton *btn = dlg->execute(NULL); - - // Figure out the new selected character - if (btn == &dlg->_quitGame) - R2_GLOBALS._sceneManager.changeScene(125); - else if (btn == &dlg->_restartGame) - R2_GLOBALS._sceneManager.changeScene(1330); - - // Remove the dialog - dlg->remove(); - delete dlg; -} - -Scene1337::OptionsDialog::OptionsDialog() { - // Set the elements text - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - _autoplay.setText(scene->_autoplay ? AUTO_PLAY_ON : AUTO_PLAY_OFF); - _restartGame.setText(START_NEW_CARD_GAME); - _quitGame.setText(QUIT_CARD_GAME); - _continueGame.setText(CONTINUE_CARD_GAME); - - // Set position of the elements - _autoplay._bounds.moveTo(5, 2); - _restartGame._bounds.moveTo(5, _autoplay._bounds.bottom + 2); - _quitGame._bounds.moveTo(5, _restartGame._bounds.bottom + 2); - _continueGame._bounds.moveTo(5, _quitGame._bounds.bottom + 2); - - // Add the items to the dialog - addElements(&_autoplay, &_restartGame, &_quitGame, &_continueGame, NULL); - - // Set the dialog size and position - frame(); - _bounds.collapse(-6, -6); - setCenter(160, 100); -} - -GfxButton *Scene1337::OptionsDialog::execute(GfxButton *defaultButton) { - _gfxManager.activate(); - - // Event loop - GfxButton *selectedButton = NULL; - - bool breakFlag = false; - while (!g_vm->shouldQuit() && !breakFlag) { - Event event; - while (g_globals->_events.getEvent(event) && !breakFlag) { - // Adjust mouse positions to be relative within the dialog - event.mousePos.x -= _gfxManager._bounds.left; - event.mousePos.y -= _gfxManager._bounds.top; - - for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) { - if ((*i)->process(event)) - selectedButton = static_cast<GfxButton *>(*i); - } - - if (selectedButton == &_autoplay) { - // Toggle Autoplay - selectedButton = NULL; - Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene; - scene->_autoplay = !scene->_autoplay; - - _autoplay.setText(scene->_autoplay ? AUTO_PLAY_ON : AUTO_PLAY_OFF); - _autoplay.draw(); - } else if (selectedButton) { - breakFlag = true; - break; - } else if (!event.handled) { - if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { - selectedButton = NULL; - breakFlag = true; - break; - } - } - } - - g_system->delayMillis(10); - GLOBALS._screenSurface.updateScreen(); - } - - _gfxManager.deactivate(); - return selectedButton; -} - -/*-------------------------------------------------------------------------- * Scene 1500 - Cutscene: Ship landing * *--------------------------------------------------------------------------*/ @@ -13433,1796 +7970,5 @@ void Scene1945::signal() { R2_GLOBALS._player._canWalk = false; } -/*-------------------------------------------------------------------------- - * Scene 1950 - Flup Tube Corridor Maze - * - *--------------------------------------------------------------------------*/ - -Scene1950::KeypadWindow::KeypadWindow() { - _buttonIndex = 0; -} - -void Scene1950::KeypadWindow::synchronize(Serializer &s) { - SceneArea::synchronize(s); - - s.syncAsSint16LE(_buttonIndex); -} - -Scene1950::KeypadWindow::KeypadButton::KeypadButton() { - _buttonIndex = 0; - _pressed = false; - _toggled = false; -} - -void Scene1950::KeypadWindow::KeypadButton::synchronize(Serializer &s) { - SceneActor::synchronize(s); - - s.syncAsSint16LE(_buttonIndex); - s.syncAsSint16LE(_pressed); - s.syncAsSint16LE(_toggled); -} - -void Scene1950::KeypadWindow::KeypadButton::init(int indx) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _buttonIndex = indx; - _pressed = false; - _toggled = false; - - postInit(); - setup(1971, 2, 1); - fixPriority(249); - setPosition(Common::Point(((_buttonIndex % 4) * 22) + 127, ((_buttonIndex / 4) * 19) + 71)); - scene->_sceneAreas.push_front(this); -} - -void Scene1950::KeypadWindow::KeypadButton::process(Event &event) { - if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) - && (_bounds.contains(event.mousePos)) && !_pressed) { - R2_GLOBALS._sound2.play(227); - if (!_toggled) { - setFrame(2); - _toggled = true; - } else { - setFrame(1); - _toggled = false; - } - _pressed = true; - event.handled = true; - } - - if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { - _pressed = false; - event.handled = true; - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - scene->doButtonPress(_buttonIndex); - } -} - -bool Scene1950::KeypadWindow::KeypadButton::startAction(CursorType action, Event &event) { - if (action == CURSOR_USE) - return false; - return SceneActor::startAction(action, event); -} - -void Scene1950::KeypadWindow::remove() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - for (_buttonIndex = 0; _buttonIndex < 16; ++_buttonIndex) { - scene->_sceneAreas.remove(&_buttons[_buttonIndex]); - _buttons[_buttonIndex].remove(); - } - - ModalWindow::remove(); - - if (!R2_GLOBALS.getFlag(37)) - R2_GLOBALS._sound2.play(278); - - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->_eastExit._enabled = true; - - if (!R2_GLOBALS.getFlag(37)) { - if (R2_GLOBALS.getFlag(36)) { - scene->_sceneMode = 1964; - scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL); - } else { - scene->_sceneMode = 1965; - scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL); - } - } -} - -void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - if (R2_GLOBALS._player._mover) - R2_GLOBALS._player.addMover(NULL); - R2_GLOBALS._player._canWalk = false; - - ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY); - - _object1.fixPriority(248); - scene->_eastExit._enabled = false; - setup3(1950, 27, 28, 27); - - for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++) - _buttons[_buttonIndex].init(_buttonIndex); -} - -void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { - // Copy of Scene1200::LaserPanel::proc13() - _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL); -} - -/*--------------------------------------------------------------------------*/ - -bool Scene1950::Keypad::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37))) - return SceneHotspot::startAction(action, event); - - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS.getFlag(36)) { - scene->_sceneMode = 1962; - scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL); - } else { - scene->_sceneMode = 1963; - scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL); - } - return true; -} - -bool Scene1950::Door::startAction(CursorType action, Event &event) { - if (action != R2_SCRITH_KEY) - return SceneActor::startAction(action, event); - - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 0); - scene->_sceneMode = 1958; - scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_door, NULL); - return true; -} - -bool Scene1950::Scrolls::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) != 1950)) - return SceneActor::startAction(action, event); - - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1968; - scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL); - - return true; -} - -bool Scene1950::Gem::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37))) - return SceneActor::startAction(action, event); - - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1967; - scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL); - - return true; -} - -/*--------------------------------------------------------------------------*/ - -Scene1950::Vampire::Vampire() { - _deadPosition = Common::Point(0, 0); - _deltaX = 0; - _deltaY = 0; - _vampireMode = 0; -} - -void Scene1950::Vampire::synchronize(Serializer &s) { - SceneActor::synchronize(s); - - s.syncAsSint16LE(_deadPosition.x); - s.syncAsSint16LE(_deadPosition.y); - s.syncAsSint16LE(_deltaX); - s.syncAsSint16LE(_deltaY); - s.syncAsSint16LE(_vampireMode); -} - -void Scene1950::Vampire::signal() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - switch (_vampireMode) { - case 19: { - _vampireMode = 0; - setVisage(1960); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - setStrip(2); - else - setStrip(1); - - NpcMover *mover = new NpcMover(); - addMover(mover, &scene->_vampireDestPos, scene); - } - break; - case 20: { - // Non fatal shot - _vampireMode = 19; - R2_GLOBALS._player.setVisage(22); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - R2_GLOBALS._player.setStrip(1); - else - R2_GLOBALS._player.setStrip(2); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; - - if (R2_GLOBALS._flubMazeEntryDirection == 3) - _deadPosition.x = _position.x + 10; - else - _deadPosition.x = _position.x - 10; - _deadPosition.y = _position.y - 4; - - setVisage(1961); - - if (R2_GLOBALS._flubMazeEntryDirection == 3) - setStrip(2); - else - setStrip(1); - - animate(ANIM_MODE_2, NULL); - Common::Point pt = _deadPosition; - PlayerMover *mover = new PlayerMover(); - addMover(mover, &pt, this); - - R2_GLOBALS._player.enableControl(); - } - break; - case 21: { - // Fatal shot - R2_GLOBALS._player.setVisage(22); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - R2_GLOBALS._player.setStrip(1); - else - R2_GLOBALS._player.setStrip(2); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - - setVisage(1961); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - setStrip(4); - else - setStrip(3); - setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); - addMover(NULL); - _numFrames = 8; - R2_GLOBALS._sound2.play(226); - animate(ANIM_MODE_5, NULL); - fixPriority(10); - - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false; - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position; - _deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2; - _deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2; - - byte vampireCount = 0; - for (byte i = 0; i < 18; ++i) { - if (!R2_GLOBALS._vampireData[i]._isAlive) - ++vampireCount; - } - - if (vampireCount == 18) { - R2_GLOBALS.setFlag(36); - _vampireMode = 23; - Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else if (vampireCount == 1) { - _vampireMode = 22; - Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - R2_GLOBALS._player.enableControl(CURSOR_WALK); - } - - if (R2_GLOBALS._flubMazeEntryDirection == 3) - scene->_eastExit._enabled = true; - else - scene->_westExit._enabled = true; - - scene->_vampireActive = false; - } - break; - case 22: - SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - case 23: - SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection; - scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL); - break; - default: - break; - } -} - -bool Scene1950::Vampire::startAction(CursorType action, Event &event) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive || - (action != R2_PHOTON_STUNNER)) - return SceneActor::startAction(action, event); - - R2_GLOBALS._player.disableControl(); - - if (R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired <= 1) - _vampireMode = 21; - else - _vampireMode = 20; - - R2_GLOBALS._player.setVisage(25); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - R2_GLOBALS._player.setStrip(2); - else - R2_GLOBALS._player.setStrip(1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - R2_GLOBALS._sound3.play(99); - - return true; -} - -/*--------------------------------------------------------------------------*/ - -void Scene1950::NorthExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 1; - scene->_sceneMode = 11; - - Common::Point pt(160, 127); - PlayerMover *mover = new PlayerMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} - -void Scene1950::UpExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 2; - scene->_sceneMode = 12; - - if (!scene->_upExitStyle) { - if (R2_GLOBALS.getFlag(36)) - scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL); - } else { - if (R2_GLOBALS.getFlag(36)) - scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL); - } -} - -void Scene1950::EastExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 3; - scene->_sceneMode = 13; - - if (scene->_vampireActive) - R2_GLOBALS._player.animate(ANIM_MODE_9); - - Common::Point pt(340, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} - -void Scene1950::DownExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 4; - scene->_sceneMode = 14; - - if (R2_GLOBALS.getFlag(36)) - scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL); -} - -void Scene1950::SouthExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 5; - scene->_sceneMode = 15; - - Common::Point pt(160, 213); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} - -void Scene1950::WestExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 6; - - if (R2_GLOBALS._flubMazeArea == 2) { - // In the very first corridor area after the Scrith Door - if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 2) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)) { - scene->_sceneMode = 1961; - Common::Point pt(-20, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - } else { - if (!R2_GLOBALS.getFlag(36)) - SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950)) - SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - scene->_sceneMode = 0; - Common::Point pt(30, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - } - } else { - if (scene->_vampireActive) - R2_GLOBALS._player.animate(ANIM_MODE_9); - - scene->_sceneMode = 16; - Common::Point pt(-20, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - } -} - -void Scene1950::ShaftExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 0; - scene->_sceneMode = 1951; - scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL); -} - -void Scene1950::DoorExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 3; - if (R2_GLOBALS._player._visage == 22) { - scene->_sceneMode = 1975; - scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL); - } else { - SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._flubMazeEntryDirection = 0; - scene->_sceneMode = 0; - Common::Point pt(250, 150); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - _enabled = true; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene1950::Scene1950() { - _upExitStyle = false; - _removeFlag = false; - _vampireActive = false; - _vampireDestPos = Common::Point(0, 0); - _vampireIndex = 0; -} - -void Scene1950::synchronize(Serializer &s) { - SceneExt::synchronize(s); - - s.syncAsSint16LE(_upExitStyle); - s.syncAsSint16LE(_removeFlag); - s.syncAsSint16LE(_vampireActive); - s.syncAsSint16LE(_vampireDestPos.x); - s.syncAsSint16LE(_vampireDestPos.y); - s.syncAsSint16LE(_vampireIndex); -} - -void Scene1950::initArea() { - _northExit._enabled = false; - _upExit._enabled = false; - _eastExit._enabled = false; - _downExit._enabled = false; - _southExit._enabled = false; - _westExit._enabled = false; - _shaftExit._enabled = false; - _doorExit._enabled = false; - _northExit._insideArea = false; - _upExit._insideArea = false; - _eastExit._insideArea = false; - _downExit._insideArea = false; - _southExit._insideArea = false; - _westExit._insideArea = false; - _shaftExit._insideArea = false; - _doorExit._insideArea = false; - _northExit._moving = false; - _upExit._moving = false; - _eastExit._moving = false; - _downExit._moving = false; - _southExit._moving = false; - _westExit._moving = false; - _shaftExit._moving = false; - _doorExit._moving = false; - _upExitStyle = false; - - switch (R2_GLOBALS._flubMazeArea - 1) { - case 0: - loadScene(1948); - break; - case 1: - // No break on purpose - case 8: - // No break on purpose - case 10: - // No break on purpose - case 12: - // No break on purpose - case 16: - // No break on purpose - case 19: - // No break on purpose - case 23: - // No break on purpose - case 30: - // No break on purpose - case 44: - // No break on purpose - case 72: - // No break on purpose - case 74: - // No break on purpose - case 86: - // No break on purpose - case 96: - // No break on purpose - case 103: - loadScene(1950); - break; - case 2: - // No break on purpose - case 29: - loadScene(1965); - break; - case 3: - // No break on purpose - case 9: - // No break on purpose - case 11: - // No break on purpose - case 15: - // No break on purpose - case 24: - // No break on purpose - case 39: - // No break on purpose - case 45: - // No break on purpose - case 71: - // No break on purpose - case 73: - // No break on purpose - case 75: - // No break on purpose - case 79: - // No break on purpose - case 85: - // No break on purpose - case 87: - // No break on purpose - case 95: - loadScene(1955); - break; - case 4: - // No break on purpose - case 6: - // No break on purpose - case 13: - // No break on purpose - case 27: - // No break on purpose - case 41: - // No break on purpose - case 48: - // No break on purpose - case 50: - // No break on purpose - case 54: - // No break on purpose - case 76: - // No break on purpose - case 80: - // No break on purpose - case 90: - // No break on purpose - case 104: - loadScene(1975); - break; - case 5: - // No break on purpose - case 7: - // No break on purpose - case 14: - // No break on purpose - case 28: - // No break on purpose - case 32: - // No break on purpose - case 47: - // No break on purpose - case 53: - loadScene(1997); - break; - case 17: - // No break on purpose - case 20: - // No break on purpose - case 25: - // No break on purpose - case 31: - // No break on purpose - case 33: - // No break on purpose - case 46: - loadScene(1995); - break; - case 18: - // No break on purpose - case 22: - // No break on purpose - case 26: - // No break on purpose - case 36: - // No break on purpose - case 38: - // No break on purpose - case 43: - // No break on purpose - case 51: - // No break on purpose - case 70: - // No break on purpose - case 78: - // No break on purpose - case 84: - // No break on purpose - case 89: - // No break on purpose - case 101: - loadScene(1970); - break; - case 21: - // No break on purpose - case 34: - // No break on purpose - case 57: - // No break on purpose - case 58: - // No break on purpose - case 59: - // No break on purpose - case 62: - // No break on purpose - case 65: - loadScene(1980); - break; - case 35: - // No break on purpose - case 61: - // No break on purpose - case 77: - // No break on purpose - case 83: - loadScene(1982); - break; - case 37: - // No break on purpose - case 52: - // No break on purpose - case 82: - // No break on purpose - case 88: - // No break on purpose - case 92: - // No break on purpose - case 97: - // No break on purpose - case 100: - loadScene(1962); - break; - case 40: - // No break on purpose - case 102: - loadScene(1960); - break; - case 42: - // No break on purpose - case 55: - // No break on purpose - case 60: - // No break on purpose - case 66: - // No break on purpose - case 68: - // No break on purpose - case 69: - // No break on purpose - case 93: - // No break on purpose - case 98: - loadScene(1990); - break; - case 49: - // No break on purpose - case 81: - // No break on purpose - case 91: - // No break on purpose - case 94: - // No break on purpose - case 99: - loadScene(1967); - break; - case 56: - // No break on purpose - case 63: - // No break on purpose - case 64: - // No break on purpose - case 67: - loadScene(1985); - _upExitStyle = true; - break; - default: - break; - } - - if (R2_GLOBALS._flubMazeArea != 1) - R2_GLOBALS._walkRegions.load(1950); - - switch (R2_GLOBALS._flubMazeArea - 1) { - case 0: - _shaftExit._enabled = true; - if ((R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950)) - _doorExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(2); - R2_GLOBALS._walkRegions.disableRegion(3); - R2_GLOBALS._walkRegions.disableRegion(4); - R2_GLOBALS._walkRegions.disableRegion(5); - R2_GLOBALS._walkRegions.disableRegion(6); - break; - case 1: - // No break on purpose - case 2: - // No break on purpose - case 3: - // No break on purpose - case 8: - // No break on purpose - case 9: - // No break on purpose - case 10: - // No break on purpose - case 11: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 16: - // No break on purpose - case 19: - // No break on purpose - case 23: - // No break on purpose - case 24: - // No break on purpose - case 29: - // No break on purpose - case 30: - // No break on purpose - case 39: - // No break on purpose - case 40: - // No break on purpose - case 44: - // No break on purpose - case 45: - // No break on purpose - case 71: - // No break on purpose - case 72: - // No break on purpose - case 73: - // No break on purpose - case 74: - // No break on purpose - case 75: - // No break on purpose - case 79: - // No break on purpose - case 85: - // No break on purpose - case 86: - // No break on purpose - case 87: - // No break on purpose - case 95: - // No break on purpose - case 96: - // No break on purpose - case 102: - // No break on purpose - case 103: - _eastExit._enabled = true; - _westExit._enabled = true; - break; - case 4: - // No break on purpose - case 6: - // No break on purpose - case 13: - // No break on purpose - case 17: - // No break on purpose - case 20: - // No break on purpose - case 25: - // No break on purpose - case 27: - // No break on purpose - case 31: - // No break on purpose - case 33: - // No break on purpose - case 37: - // No break on purpose - case 41: - // No break on purpose - case 46: - // No break on purpose - case 48: - // No break on purpose - case 50: - // No break on purpose - case 52: - // No break on purpose - case 54: - // No break on purpose - case 76: - // No break on purpose - case 80: - // No break on purpose - case 82: - // No break on purpose - case 88: - // No break on purpose - case 90: - // No break on purpose - case 92: - // No break on purpose - case 97: - // No break on purpose - case 100: - // No break on purpose - case 104: - _westExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(9); - break; - case 5: - // No break on purpose - case 7: - // No break on purpose - case 14: - // No break on purpose - case 18: - // No break on purpose - case 22: - // No break on purpose - case 26: - // No break on purpose - case 28: - // No break on purpose - case 32: - // No break on purpose - case 36: - // No break on purpose - case 38: - // No break on purpose - case 43: - // No break on purpose - case 47: - // No break on purpose - case 49: - // No break on purpose - case 51: - // No break on purpose - case 53: - // No break on purpose - case 70: - // No break on purpose - case 78: - // No break on purpose - case 81: - // No break on purpose - case 84: - // No break on purpose - case 89: - // No break on purpose - case 91: - // No break on purpose - case 94: - // No break on purpose - case 99: - // No break on purpose - case 101: - _eastExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(1); - R2_GLOBALS._walkRegions.disableRegion(7); - R2_GLOBALS._walkRegions.disableRegion(13); - break; - default: - R2_GLOBALS._walkRegions.disableRegion(1); - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(7); - R2_GLOBALS._walkRegions.disableRegion(9); - R2_GLOBALS._walkRegions.disableRegion(13); - break; - } - - _northDoorway.remove(); - _northDoorway.removeObject(); - _southDoorway.remove(); - - switch (R2_GLOBALS._flubMazeArea - 4) { - case 0: - // No break on purpose - case 3: - // No break on purpose - case 16: - // No break on purpose - case 22: - // No break on purpose - case 24: - // No break on purpose - case 32: - // No break on purpose - case 33: - // No break on purpose - case 45: - // No break on purpose - case 46: - // No break on purpose - case 48: - // No break on purpose - case 51: - // No break on purpose - case 56: - // No break on purpose - case 59: - // No break on purpose - case 67: - // No break on purpose - case 68: - // No break on purpose - case 70: - // No break on purpose - case 73: - // No break on purpose - case 82: - // No break on purpose - case 90: - _northExit._enabled = true; - _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); - //visage,strip,frame,px,py,priority,effect - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); - _southDoorway.setFrame(2); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - R2_GLOBALS._walkRegions.disableRegion(3); - R2_GLOBALS._walkRegions.disableRegion(4); - break; - case 7: - // No break on purpose - case 10: - // No break on purpose - case 23: - // No break on purpose - case 29: - // No break on purpose - case 31: - // No break on purpose - case 39: - // No break on purpose - case 40: - // No break on purpose - case 52: - // No break on purpose - case 53: - // No break on purpose - case 55: - // No break on purpose - case 63: - // No break on purpose - case 65: - // No break on purpose - case 66: - // No break on purpose - case 75: - // No break on purpose - case 77: - // No break on purpose - case 81: - // No break on purpose - case 87: - // No break on purpose - case 89: - // No break on purpose - case 97: - _southExit._enabled = true; - - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); - _southDoorway.setFrame(3); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - break; - case 58: - // No break on purpose - case 74: - // No break on purpose - case 80: - _northExit._enabled = true; - _southExit._enabled = true; - - _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); - - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); - _southDoorway.setFrame(3); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - R2_GLOBALS._walkRegions.disableRegion(3); - R2_GLOBALS._walkRegions.disableRegion(4); - break; - default: - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip(((R2_GLOBALS._flubMazeArea - 1) / 35) % 2 + 1); - _southDoorway.setFrame(2); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - break; - } - - switch (R2_GLOBALS._flubMazeArea - 3) { - case 0: - // No break on purpose - case 3: - // No break on purpose - case 5: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 23: - // No break on purpose - case 26: - // No break on purpose - case 27: - // No break on purpose - case 29: - // No break on purpose - case 30: - // No break on purpose - case 31: - // No break on purpose - case 32: - // No break on purpose - case 44: - // No break on purpose - case 45: - // No break on purpose - case 51: - // No break on purpose - case 55: - // No break on purpose - case 56: - // No break on purpose - case 57: - // No break on purpose - case 60: - // No break on purpose - case 63: - _upExit._enabled = true; - break; - case 54: - // No break on purpose - case 61: - // No break on purpose - case 62: - // No break on purpose - case 65: - _upExit._enabled = true; - // No break on purpose - case 35: - // No break on purpose - case 38: - // No break on purpose - case 40: - // No break on purpose - case 47: - // No break on purpose - case 50: - // No break on purpose - case 53: - // No break on purpose - case 58: - // No break on purpose - case 64: - // No break on purpose - case 66: - // No break on purpose - case 67: - // No break on purpose - case 79: - // No break on purpose - case 80: - // No break on purpose - case 86: - // No break on purpose - case 89: - // No break on purpose - case 90: - // No break on purpose - case 91: - // No break on purpose - case 92: - // No break on purpose - case 95: - // No break on purpose - case 96: - // No break on purpose - case 97: - // No break on purpose - case 98: - // No break on purpose - case 100: - _downExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(4); - R2_GLOBALS._walkRegions.disableRegion(5); - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(10); - R2_GLOBALS._walkRegions.disableRegion(11); - default: - break; - } - R2_GLOBALS._uiElements.draw(); -} - -void Scene1950::enterArea() { - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - - _vampire.remove(); - _door.remove(); - _scrolls.remove(); - - _vampireActive = false; - _vampireIndex = 0; - - // Certain areas have a vampire in them - switch (R2_GLOBALS._flubMazeArea) { - case 10: - _vampireIndex = 1; - break; - case 13: - _vampireIndex = 2; - break; - case 16: - _vampireIndex = 3; - break; - case 17: - _vampireIndex = 4; - break; - case 24: - _vampireIndex = 5; - break; - case 25: - _vampireIndex = 6; - break; - case 31: - _vampireIndex = 7; - break; - case 40: - _vampireIndex = 8; - break; - case 45: - _vampireIndex = 9; - break; - case 46: - _vampireIndex = 10; - break; - case 73: - _vampireIndex = 11; - break; - case 75: - _vampireIndex = 12; - break; - case 80: - _vampireIndex = 13; - break; - case 87: - _vampireIndex = 14; - break; - case 88: - _vampireIndex = 15; - break; - case 96: - _vampireIndex = 16; - break; - case 97: - _vampireIndex = 17; - break; - case 104: - _vampireIndex = 18; - break; - default: - break; - } - - if (_vampireIndex != 0) { - _vampire.postInit(); - _vampire._numFrames = 6; - _vampire._moveRate = 6; - _vampire._moveDiff = Common::Point(3, 2); - _vampire._effect = EFFECT_SHADED; - - if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) { - // Show vampire ashes - _vampire.setPosition(Common::Point(R2_GLOBALS._vampireData[_vampireIndex - 1]._position)); - _vampire.animate(ANIM_MODE_NONE, NULL); - _vampire.addMover(NULL); - _vampire.setVisage(1961); - _vampire.setStrip(4); - _vampire.setFrame(10); - _vampire.fixPriority(10); - _vampire.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); - } else { - // Start the vampire - _vampire.setVisage(1960); - _vampire.setPosition(Common::Point(160, 130)); - _vampire.animate(ANIM_MODE_2, NULL); - _vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL); - _vampireActive = true; - } - } - if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) { - // Show doorway at the right hand side of the very first flub corridor - _door.postInit(); - _door.setVisage(1948); - _door.setStrip(3); - _door.setPosition(Common::Point(278, 155)); - _door.fixPriority(100); - _door.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL); - } - - if (R2_GLOBALS._flubMazeArea == 102) { - R2_GLOBALS._walkRegions.load(1951); - R2_GLOBALS._walkRegions.disableRegion(1); - R2_GLOBALS._walkRegions.disableRegion(5); - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(7); - - _cube.postInit(); - _cube.setVisage(1970); - _cube.setStrip(1); - if (R2_GLOBALS.getFlag(37)) - _cube.setFrame(3); - else - _cube.setFrame(1); - _cube.setPosition(Common::Point(193, 158)); - _cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL); - - _pulsingLights.postInit(); - _pulsingLights.setVisage(1970); - _pulsingLights.setStrip(3); - _pulsingLights.animate(ANIM_MODE_2, NULL); - _pulsingLights._numFrames = 6; - _pulsingLights.setPosition(Common::Point(194, 158)); - _pulsingLights.fixPriority(159); - - _keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL); - - if (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) { - _gem.postInit(); - _gem.setVisage(1970); - _gem.setStrip(1); - _gem.setFrame(2); - _gem.fixPriority(160); - } - - if (R2_GLOBALS.getFlag(37)) { - _gem.setPosition(Common::Point(192, 118)); - _gem.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL); - } else { - _containmentField.postInit(); - _containmentField.setVisage(1970); - _containmentField.setStrip(4); - _containmentField._numFrames = 4; - _containmentField.animate(ANIM_MODE_8, 0, NULL); - _containmentField.setPosition(Common::Point(192, 121)); - _containmentField.fixPriority(159); - _containmentField.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL); - - _gem.setPosition(Common::Point(192, 109)); - _gem.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL); - } - - _scrolls.postInit(); - _scrolls.setVisage(1972); - _scrolls.setStrip(1); - _scrolls.setPosition(Common::Point(76, 94)); - _scrolls.fixPriority(25); - _scrolls.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL); - if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2) - _scrolls.setFrame(2); - else - _scrolls.setFrame(1); - - _removeFlag = true; - } else if (_removeFlag) { - _cube.remove(); - _containmentField.remove(); - _gem.remove(); - _pulsingLights.remove(); - _scrolls.remove(); - - R2_GLOBALS._sceneItems.remove(&_background); - _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL); - - _removeFlag = false; - } - - switch (R2_GLOBALS._flubMazeEntryDirection) { - case 0: - _sceneMode = 1950; - if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) - // The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent - R2_GLOBALS._player.enableControl(CURSOR_WALK); - else - setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL); - - break; - case 1: { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - R2_GLOBALS._player.setPosition(Common::Point(160, 213)); - Common::Point pt(160, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 2: - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - if (R2_GLOBALS.getFlag(36)) - setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL); - else - setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL); - break; - case 3: - // Entering from the left - if (!_vampireActive) { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); - Common::Point pt(30, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - _sceneMode = 18; - _eastExit._enabled = false; - _vampireDestPos = Common::Point(60, 152); - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - - _vampire.setStrip(2); - NpcMover *mover = new NpcMover(); - _vampire.addMover(mover, &_vampireDestPos, this); - - R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); - Common::Point pt2(30, 160); - NpcMover *mover2 = new NpcMover(); - R2_GLOBALS._player.addMover(mover2, &pt2, NULL); - } - break; - case 4: - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - if (!_upExitStyle) { - if (R2_GLOBALS.getFlag(36)) - setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL); - else - setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL); - } else { - if (R2_GLOBALS.getFlag(36)) - setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL); - else - setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL); - } - break; - case 5: { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - R2_GLOBALS._player.setPosition(Common::Point(160, 127)); - Common::Point pt(160, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 6: - // Entering from the right - if (!_vampireActive) { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - if (R2_GLOBALS._flubMazeArea == 1) { - setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL); - } else { - R2_GLOBALS._player.setPosition(Common::Point(340, 160)); - Common::Point pt(289, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - } else { - _sceneMode = 17; - _westExit._enabled = false; - _vampireDestPos = Common::Point(259, 152); - - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - - _vampire.setStrip(1); - NpcMover *mover = new NpcMover(); - _vampire.addMover(mover, &_vampireDestPos, this); - - R2_GLOBALS._player.setPosition(Common::Point(340, 160)); - Common::Point pt2(289, 160); - NpcMover *mover2 = new NpcMover(); - R2_GLOBALS._player.addMover(mover2, &pt2, NULL); - } - break; - default: - break; - } -} - -void Scene1950::doButtonPress(int indx) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - - int prevIndex = indx - 1; - if ((indx / 4) == (prevIndex / 4)) { - if (prevIndex < 0) - prevIndex = 3; - } else { - prevIndex += 4; - } - - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; - } - - prevIndex = indx + 1; - if ((indx / 4) == (prevIndex / 4)) { - if (prevIndex > 15) - prevIndex = 12; - } else { - prevIndex -= 4; - } - - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; - } - - prevIndex = indx - 4; - if (prevIndex < 0) - prevIndex += 16; - - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; - } - - prevIndex = indx + 4; - if (prevIndex > 15) - prevIndex -= 16; - - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; - } - - // Check whether all the buttons are highlighted - int cpt = 0; - for (prevIndex = 0; prevIndex < 16; prevIndex++) { - if (_KeypadWindow._buttons[prevIndex]._toggled) - ++cpt; - } - - if (cpt != 16) { - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; - } else { - R2_GLOBALS.setFlag(37); - _sceneMode = 24; - setAction(&_sequenceManager, scene, 1976, NULL); - } -} - -void Scene1950::postInit(SceneObjectList *OwnerList) { - _upExitStyle = false; - _removeFlag = false; - _vampireActive = false; - _vampireIndex = 0; - if (R2_GLOBALS._sceneManager._previousScene == 300) - R2_GLOBALS._flubMazeArea = 103; - - initArea(); - SceneExt::postInit(); - R2_GLOBALS._sound1.play(105); - - _northExit.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950); - _northExit.setDest(Common::Point(160, 145)); - - _upExit.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950); - _upExit.setDest(Common::Point(200, 151)); - - _eastExit.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950); - _eastExit.setDest(Common::Point(312, 160)); - - _downExit.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950); - _downExit.setDest(Common::Point(200, 151)); - - _southExit.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950); - _southExit.setDest(Common::Point(160, 165)); - - _westExit.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950); - _westExit.setDest(Common::Point(7, 160)); - - _shaftExit.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950); - _shaftExit.setDest(Common::Point(120, 140)); - - _doorExit.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950); - _doorExit.setDest(Common::Point(268, 149)); - - R2_GLOBALS._player.postInit(); - if ( (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 0) && (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 0) - && (R2_INVENTORY.getObjectScene(R2_SOAKED_FACEMASK) == 0) && (!R2_GLOBALS.getFlag(36)) ) - R2_GLOBALS._player.setVisage(22); - else - R2_GLOBALS._player.setVisage(20); - - R2_GLOBALS._player._moveDiff = Common::Point(5, 3); - _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL); - - enterArea(); -} - -void Scene1950::remove() { - R2_GLOBALS._sound1.stop(); - R2_GLOBALS._sound2.fadeOut2(NULL); - SceneExt::remove(); -} - -void Scene1950::signal() { - switch (_sceneMode) { - case 11: - R2_GLOBALS._flubMazeArea += 7; - initArea(); - enterArea(); - break; - case 12: - // Moving up a ladder within the Flub maze - R2_GLOBALS._flubMazeArea += 35; - initArea(); - enterArea(); - break; - case 1975: - SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, - SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END); - // No break on purpose - case 13: - // Moving east within the Flub maze - ++R2_GLOBALS._flubMazeArea; - initArea(); - enterArea(); - break; - case 14: - // Moving down a ladder within the Flub maze - R2_GLOBALS._flubMazeArea -= 35; - initArea(); - enterArea(); - break; - case 15: - R2_GLOBALS._flubMazeArea -= 7; - initArea(); - enterArea(); - break; - case 16: - // Moving west within the Flub maze - // No break on purpose - case 1961: - --R2_GLOBALS._flubMazeArea; - initArea(); - enterArea(); - break; - case 17: { - _sceneMode = 13; - R2_GLOBALS._flubMazeEntryDirection = 3; - _vampireActive = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._player._canWalk = true; - R2_GLOBALS._player.setVisage(22); - R2_GLOBALS._player.animate(ANIM_MODE_9); - Common::Point pt(340, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - Common::Point pt2(289, 160); - NpcMover *mover2 = new NpcMover(); - _vampire.addMover(mover2, &pt2, NULL); - } - break; - case 18: { - _sceneMode = 16; - R2_GLOBALS._flubMazeEntryDirection = 6; - _vampireActive = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._player._canWalk = true; - R2_GLOBALS._player.setVisage(22); - R2_GLOBALS._player.animate(ANIM_MODE_9); - Common::Point pt(-20, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - Common::Point pt2(30, 160); - NpcMover *mover2 = new NpcMover(); - _vampire.addMover(mover2, &pt2, NULL); - } - break; - case 24: - _KeypadWindow.remove(); - _sceneMode = 1966; - _cube.setFrame(3); - setAction(&_sequenceManager, this, 1966, &_containmentField, &_gem, NULL); - break; - case 1951: - R2_GLOBALS._sound1.fadeOut2(NULL); - R2_GLOBALS._sceneManager.changeScene(1945); - break; - case 1958: - SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - _doorExit._enabled = true; - break; - case 1959: - R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - _doorExit._enabled = true; - break; - case 1962: - // No break on purpose - case 1963: - R2_GLOBALS._player.enableControl(); - _KeypadWindow.setup2(1971, 1, 1, 160, 135); - break; - case 1964: - // No break on purpose - case 1965: - if (!R2_GLOBALS.getFlag(37)) - SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - - R2_GLOBALS._player.enableControl(); - break; - case 1966: - _containmentField.remove(); - if (R2_GLOBALS.getFlag(36)) { - _sceneMode = 1964; - setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL); - } else { - _sceneMode = 1965; - setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL); - } - _gem.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL); - break; - case 1967: { - _sceneMode = 0; - R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 2); - _gem.remove(); - if (R2_GLOBALS.getFlag(36)) - R2_GLOBALS._player.setVisage(20); - else - R2_GLOBALS._player.setVisage(22); - - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - // This is a hack to work around a pathfinding issue. original destination is (218, 165) - Common::Point pt(128, 165); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 1968: - R2_GLOBALS._player.enableControl(); - R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2); - _scrolls.setFrame(2); - if (R2_GLOBALS.getFlag(36)) - R2_GLOBALS._player.setVisage(20); - else - R2_GLOBALS._player.setVisage(22); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - break; - default: - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - } -} - -void Scene1950::process(Event &event) { - if ( (event.eventType == EVENT_BUTTON_DOWN) - && (R2_GLOBALS._player._uiEnabled) - && (R2_GLOBALS._events.getCursor() == R2_SOAKED_FACEMASK) - && (R2_GLOBALS._player._bounds.contains(event.mousePos)) - && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)) { - event.handled = true; - R2_GLOBALS._player.disableControl(); - _shaftExit._enabled = false; - _doorExit._enabled = false; - _sceneMode = 1959; - setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL); - } - - Scene::process(event); -} - } // End of namespace Ringworld2 } // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h index 91c4b88391..e6f5e0ab97 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.h +++ b/engines/tsage/ringworld2/ringworld2_scenes1.h @@ -135,270 +135,6 @@ public: virtual void saveCharacter(int characterIndex); }; -class Scene1200 : public SceneExt { - enum CrawlDirection { CRAWL_EAST = 1, CRAWL_WEST = 2, CRAWL_SOUTH = 3, CRAWL_NORTH = 4 }; - - class LaserPanel: public ModalWindow { - public: - class Jumper : public SceneActorExt { - public: - void init(int state); - virtual bool startAction(CursorType action, Event &event); - }; - - Jumper _jumper1; - Jumper _jumper2; - Jumper _jumper3; - - LaserPanel(); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void remove(); - }; - -public: - NamedHotspot _item1; - SceneActor _actor1; - LaserPanel _laserPanel; - MazeUI _mazeUI; - SequenceManager _sequenceManager; - - int _nextCrawlDirection; - int _field414; - int _field416; - int _field418; - int _field41A; - bool _fixupMaze; - - Scene1200(); - void synchronize(Serializer &s); - - void startCrawling(CrawlDirection dir); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void process(Event &event); - virtual void dispatch(); - virtual void saveCharacter(int characterIndex); -}; - -class Scene1337 : public SceneExt { - class OptionsDialog: public GfxDialog { - private: - GfxButton _autoplay; - GfxButton _restartGame; - GfxButton _quitGame; - GfxButton _continueGame; - - OptionsDialog(); - virtual ~OptionsDialog() {} - virtual GfxButton *execute(GfxButton *defaultButton); - public: - static void show(); - }; - - class Card: public SceneHotspot { - public: - SceneObject _card; - - int _cardId; - Common::Point _stationPos; - - Card(); - void synchronize(Serializer &s); - bool isIn(Common::Point pt); - }; - - class GameBoardSide: public SceneHotspot { - public: - Card _handCard[4]; - Card _outpostStation[8]; - Card _delayCard; - Card _emptyStationPos; - - Common::Point _card1Pos; - Common::Point _card2Pos; - Common::Point _card3Pos; - Common::Point _card4Pos; - int _frameNum; - - GameBoardSide(); - void synchronize(Serializer &s); - }; - - class Action1337: public Action { - public: - void waitFrames(int32 frameCount); - }; - - class Action1: public Action1337 { - public: - void signal(); - }; - class Action2: public Action1337 { - public: - void signal(); - }; - class Action3: public Action1337 { - public: - void signal(); - }; - class Action4: public Action1337 { - public: - void signal(); - }; - class Action5: public Action1337 { - public: - void signal(); - }; - class Action6: public Action1337 { - public: - void signal(); - }; - class Action7: public Action1337 { - public: - void signal(); - }; - class Action8: public Action1337 { - public: - void signal(); - }; - class Action9: public Action1337 { - public: - void signal(); - }; - class Action10: public Action1337 { - public: - void signal(); - }; - class Action11: public Action1337 { - public: - void signal(); - }; - class Action12: public Action1337 { - public: - void signal(); - }; - class Action13: public Action1337 { - public: - void signal(); - }; -public: - Action1 _action1; - Action2 _action2; - Action3 _action3; - Action4 _action4; - Action5 _action5; - Action6 _action6; - Action7 _action7; - Action8 _action8; - Action9 _action9; - Action10 _action10; - Action11 _action11; - Action12 _action12; - Action13 _action13; - - typedef void (Scene1337::*FunctionPtrType)(); - FunctionPtrType _delayedFunction; - - bool _autoplay; - bool _shuffleEndedFl; - bool _showPlayerTurn; - bool _displayHelpFl; - bool _instructionsDisplayedFl; - - // Discarded cards are put in the available cards pile, with an higher index so there no conflict - int _currentDiscardIndex; - int _availableCardsPile[100]; - int _cardsAvailableNumb; - int _currentPlayerNumb; - int _actionIdx1; - int _actionIdx2; - int _winnerId; - int _instructionsWaitCount; - int _cursorCurRes; - int _cursorCurStrip; - int _cursorCurFrame; - - ASound _aSound1; - ASound _aSound2; - GameBoardSide _gameBoardSide[4]; - SceneActor _helpIcon; - SceneActor _stockPile; - SceneItem _actionItem; - SceneObject _currentPlayerArrow; - - Card *_actionCard1; - Card *_actionCard2; - Card *_actionCard3; - Card _animatedCard; - Card _shuffleAnimation; - Card _discardedPlatformCard; - Card _selectedCard; - Card _discardPile; - Card _stockCard; - - SceneObject _upperDisplayCard[8]; - SceneObject _lowerDisplayCard[8]; - - Scene1337(); - virtual void synchronize(Serializer &s); - - void actionDisplay(int resNum, int lineNum, int x, int y, int keepOnScreen, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt); - void setAnimationInfo(Card *card); - void handleNextTurn(); - void handlePlayerTurn(); - bool isStationCard(int cardId); - bool isStopConstructionCard(int cardId); - int getStationId(int playerId, int handCardId); - int findPlatformCardInHand(int playerId); - int findCard13InHand(int playerId); - int checkThieftCard(int playerId); - int isDelayCard(int cardId); - int getStationCardId(int cardId); - void handlePlayer01Discard(int playerId); - void playThieftCard(int playerId, Card *card, int victimId); - int getPreventionCardId(int cardId); - bool isAttackPossible(int victimId, int cardId); - int getPlayerWithOutpost(int playerId); - bool checkAntiDelayCard(int delayCardId, int cardId); - void playStationCard(Card *station, Card *platform); - void playDelayCard(Card *card, Card *dest); - void playPlatformCard(Card *card, Card *dest); - void playAntiDelayCard(Card *card, Card *dest); - Card *getStationCard(int arg1); - void playCounterTrickCard(Card *card, int playerId); - int getFreeHandCard(int playerId); - void discardCard(Card *card); - void subC4CD2(); - void subC4CEC(); - void subC51A0(Card *subObj1, Card *subObj2); - void displayDialog(int dialogNumb); - void subPostInit(); - void displayInstructions(); - void suggestInstructions(); - void shuffleCards(); - void dealCards(); - void showOptionsDialog(); - void handleClick(int arg1, Common::Point pt); - void handlePlayer0(); - void handlePlayer1(); - void handlePlayer2(); - void handlePlayer3(); - void handleAutoplayPlayer2(); - void updateCursorId(int arg1, bool arg2); - void setCursorData(int resNum, int rlbNum, int frameNum); - void subD18F5(); - void subD1917(); - void subD1940(bool flag); - void subD1975(int arg1, int arg2); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void remove(); - virtual void process(Event &event); - virtual void dispatch(); -}; - class Scene1500 : public SceneExt { public: SceneActor _starship; @@ -1097,143 +833,6 @@ public: virtual void signal(); }; -class Scene1950 : public SceneExt { - /* Windows */ - class KeypadWindow: public ModalWindow { - public: - class KeypadButton : public SceneActor { - public: - int _buttonIndex; - bool _pressed; - bool _toggled; - - KeypadButton(); - void synchronize(Serializer &s); - - void init(int indx); - virtual void process(Event &event); - virtual bool startAction(CursorType action, Event &event); - }; - - SceneActor _areaActor; - KeypadButton _buttons[16]; - - int _buttonIndex; - - KeypadWindow(); - virtual void synchronize(Serializer &s); - virtual void remove(); - virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY); - virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum); - }; - - class Keypad : public NamedHotspot { - public: - virtual bool startAction(CursorType action, Event &event); - }; - - /* Actors */ - class Door : public SceneActor { - public: - virtual bool startAction(CursorType action, Event &event); - }; - class Scrolls : public SceneActor { - public: - virtual bool startAction(CursorType action, Event &event); - }; - class Gem : public SceneActor { - public: - virtual bool startAction(CursorType action, Event &event); - }; - class Vampire : public SceneActor { - public: - Common::Point _deadPosition; - int _deltaX; - int _deltaY; - int _vampireMode; - - Vampire(); - void synchronize(Serializer &s); - - virtual void signal(); - virtual bool startAction(CursorType action, Event &event); - }; - - /* Exits */ - class NorthExit : public SceneExit { - public: - virtual void changeScene(); - }; - class UpExit : public SceneExit { - public: - virtual void changeScene(); - }; - class EastExit : public SceneExit { - public: - virtual void changeScene(); - }; - class DownExit : public SceneExit { - public: - virtual void changeScene(); - }; - class SouthExit : public SceneExit { - public: - virtual void changeScene(); - }; - class WestExit : public SceneExit { - public: - virtual void changeScene(); - }; - class ShaftExit : public SceneExit { - public: - virtual void changeScene(); - }; - class DoorExit : public SceneExit { - public: - virtual void changeScene(); - }; -private: - void initArea(); - void enterArea(); - void doButtonPress(int indx); -public: - NamedHotspot _background; - Keypad _keypad; - SceneActor _southDoorway; - SceneObject _northDoorway; - Door _door; - Scrolls _scrolls; - SceneActor _containmentField; - Gem _gem; - SceneActor _cube; - SceneActor _pulsingLights; - Vampire _vampire; - KeypadWindow _KeypadWindow; - NorthExit _northExit; - UpExit _upExit; - EastExit _eastExit; - DownExit _downExit; - SouthExit _southExit; - WestExit _westExit; - ShaftExit _shaftExit; - DoorExit _doorExit; - SequenceManager _sequenceManager; - - bool _upExitStyle; - bool _removeFlag; - bool _vampireActive; - Common::Point _vampireDestPos; - int _vampireIndex; - - Scene1950(); - void synchronize(Serializer &s); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void remove(); - virtual void signal(); - virtual void process(Event &event); -}; - } // End of namespace Ringworld2 } // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp index 9eaead630b..8610e0c8bc 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes3.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp @@ -3878,7 +3878,7 @@ void Scene3500::dispatch() { Scene::dispatch(); // WORKAROUND: The _mazeUI wasn't originally added to the scene in postInit. - // This is only needed to fix old savegames + // This is only needed to fix old savegames if (!R2_GLOBALS._sceneObjects->contains(&_mazeUI)) _mazeUI.draw(); diff --git a/engines/tsage/ringworld2/ringworld2_vampire.cpp b/engines/tsage/ringworld2/ringworld2_vampire.cpp new file mode 100644 index 0000000000..9d3b7f91a5 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_vampire.cpp @@ -0,0 +1,1821 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/ringworld2/ringworld2_vampire.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 1950 - Flup Tube Corridor Maze + * + *--------------------------------------------------------------------------*/ + +Scene1950::KeypadWindow::KeypadWindow() { + _buttonIndex = 0; +} + +void Scene1950::KeypadWindow::synchronize(Serializer &s) { + SceneArea::synchronize(s); + + s.syncAsSint16LE(_buttonIndex); +} + +Scene1950::KeypadWindow::KeypadButton::KeypadButton() { + _buttonIndex = 0; + _pressed = false; + _toggled = false; +} + +void Scene1950::KeypadWindow::KeypadButton::synchronize(Serializer &s) { + SceneActor::synchronize(s); + + s.syncAsSint16LE(_buttonIndex); + s.syncAsSint16LE(_pressed); + s.syncAsSint16LE(_toggled); +} + +void Scene1950::KeypadWindow::KeypadButton::init(int indx) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _buttonIndex = indx; + _pressed = false; + _toggled = false; + + postInit(); + setup(1971, 2, 1); + fixPriority(249); + setPosition(Common::Point(((_buttonIndex % 4) * 22) + 127, ((_buttonIndex / 4) * 19) + 71)); + scene->_sceneAreas.push_front(this); +} + +void Scene1950::KeypadWindow::KeypadButton::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) + && (_bounds.contains(event.mousePos)) && !_pressed) { + R2_GLOBALS._sound2.play(227); + if (!_toggled) { + setFrame(2); + _toggled = true; + } else { + setFrame(1); + _toggled = false; + } + _pressed = true; + event.handled = true; + } + + if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { + _pressed = false; + event.handled = true; + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + scene->doButtonPress(_buttonIndex); + } +} + +bool Scene1950::KeypadWindow::KeypadButton::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) + return false; + return SceneActor::startAction(action, event); +} + +void Scene1950::KeypadWindow::remove() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + for (_buttonIndex = 0; _buttonIndex < 16; ++_buttonIndex) { + scene->_sceneAreas.remove(&_buttons[_buttonIndex]); + _buttons[_buttonIndex].remove(); + } + + ModalWindow::remove(); + + if (!R2_GLOBALS.getFlag(37)) + R2_GLOBALS._sound2.play(278); + + R2_GLOBALS._player.disableControl(CURSOR_WALK); + scene->_eastExit._enabled = true; + + if (!R2_GLOBALS.getFlag(37)) { + if (R2_GLOBALS.getFlag(36)) { + scene->_sceneMode = 1964; + scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 1965; + scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL); + } + } +} + +void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + if (R2_GLOBALS._player._mover) + R2_GLOBALS._player.addMover(NULL); + R2_GLOBALS._player._canWalk = false; + + ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY); + + _object1.fixPriority(248); + scene->_eastExit._enabled = false; + setup3(1950, 27, 28, 27); + + for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++) + _buttons[_buttonIndex].init(_buttonIndex); +} + +void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + // Copy of Scene1200::LaserPanel::proc13() + _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene1950::Keypad::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37))) + return SceneHotspot::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS.getFlag(36)) { + scene->_sceneMode = 1962; + scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 1963; + scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL); + } + return true; +} + +bool Scene1950::Door::startAction(CursorType action, Event &event) { + if (action != R2_SCRITH_KEY) + return SceneActor::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 0); + scene->_sceneMode = 1958; + scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_door, NULL); + return true; +} + +bool Scene1950::Scrolls::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) != 1950)) + return SceneActor::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1968; + scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL); + + return true; +} + +bool Scene1950::Gem::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37))) + return SceneActor::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1967; + scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL); + + return true; +} + +/*--------------------------------------------------------------------------*/ + +Scene1950::Vampire::Vampire() { + _deadPosition = Common::Point(0, 0); + _deltaX = 0; + _deltaY = 0; + _vampireMode = 0; +} + +void Scene1950::Vampire::synchronize(Serializer &s) { + SceneActor::synchronize(s); + + s.syncAsSint16LE(_deadPosition.x); + s.syncAsSint16LE(_deadPosition.y); + s.syncAsSint16LE(_deltaX); + s.syncAsSint16LE(_deltaY); + s.syncAsSint16LE(_vampireMode); +} + +void Scene1950::Vampire::signal() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + switch (_vampireMode) { + case 19: { + _vampireMode = 0; + setVisage(1960); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + setStrip(2); + else + setStrip(1); + + NpcMover *mover = new NpcMover(); + addMover(mover, &scene->_vampireDestPos, scene); + } + break; + case 20: { + // Non fatal shot + _vampireMode = 19; + R2_GLOBALS._player.setVisage(22); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + R2_GLOBALS._player.setStrip(1); + else + R2_GLOBALS._player.setStrip(2); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; + + if (R2_GLOBALS._flubMazeEntryDirection == 3) + _deadPosition.x = _position.x + 10; + else + _deadPosition.x = _position.x - 10; + _deadPosition.y = _position.y - 4; + + setVisage(1961); + + if (R2_GLOBALS._flubMazeEntryDirection == 3) + setStrip(2); + else + setStrip(1); + + animate(ANIM_MODE_2, NULL); + Common::Point pt = _deadPosition; + PlayerMover *mover = new PlayerMover(); + addMover(mover, &pt, this); + + R2_GLOBALS._player.enableControl(); + } + break; + case 21: { + // Fatal shot + R2_GLOBALS._player.setVisage(22); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + R2_GLOBALS._player.setStrip(1); + else + R2_GLOBALS._player.setStrip(2); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + setVisage(1961); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + setStrip(4); + else + setStrip(3); + setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); + addMover(NULL); + _numFrames = 8; + R2_GLOBALS._sound2.play(226); + animate(ANIM_MODE_5, NULL); + fixPriority(10); + + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false; + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position; + _deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2; + _deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2; + + byte vampireCount = 0; + for (byte i = 0; i < 18; ++i) { + if (!R2_GLOBALS._vampireData[i]._isAlive) + ++vampireCount; + } + + if (vampireCount == 18) { + R2_GLOBALS.setFlag(36); + _vampireMode = 23; + Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if (vampireCount == 1) { + _vampireMode = 22; + Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.enableControl(CURSOR_WALK); + } + + if (R2_GLOBALS._flubMazeEntryDirection == 3) + scene->_eastExit._enabled = true; + else + scene->_westExit._enabled = true; + + scene->_vampireActive = false; + } + break; + case 22: + SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + case 23: + SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection; + scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL); + break; + default: + break; + } +} + +bool Scene1950::Vampire::startAction(CursorType action, Event &event) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive || + (action != R2_PHOTON_STUNNER)) + return SceneActor::startAction(action, event); + + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired <= 1) + _vampireMode = 21; + else + _vampireMode = 20; + + R2_GLOBALS._player.setVisage(25); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + R2_GLOBALS._player.setStrip(2); + else + R2_GLOBALS._player.setStrip(1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + R2_GLOBALS._sound3.play(99); + + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene1950::NorthExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 1; + scene->_sceneMode = 11; + + Common::Point pt(160, 127); + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene1950::UpExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 2; + scene->_sceneMode = 12; + + if (!scene->_upExitStyle) { + if (R2_GLOBALS.getFlag(36)) + scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL); + } else { + if (R2_GLOBALS.getFlag(36)) + scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL); + } +} + +void Scene1950::EastExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 3; + scene->_sceneMode = 13; + + if (scene->_vampireActive) + R2_GLOBALS._player.animate(ANIM_MODE_9); + + Common::Point pt(340, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene1950::DownExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 4; + scene->_sceneMode = 14; + + if (R2_GLOBALS.getFlag(36)) + scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL); +} + +void Scene1950::SouthExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 5; + scene->_sceneMode = 15; + + Common::Point pt(160, 213); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene1950::WestExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 6; + + if (R2_GLOBALS._flubMazeArea == 2) { + // In the very first corridor area after the Scrith Door + if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 2) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)) { + scene->_sceneMode = 1961; + Common::Point pt(-20, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } else { + if (!R2_GLOBALS.getFlag(36)) + SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950)) + SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + scene->_sceneMode = 0; + Common::Point pt(30, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } + } else { + if (scene->_vampireActive) + R2_GLOBALS._player.animate(ANIM_MODE_9); + + scene->_sceneMode = 16; + Common::Point pt(-20, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } +} + +void Scene1950::ShaftExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 0; + scene->_sceneMode = 1951; + scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL); +} + +void Scene1950::DoorExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 3; + if (R2_GLOBALS._player._visage == 22) { + scene->_sceneMode = 1975; + scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL); + } else { + SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._flubMazeEntryDirection = 0; + scene->_sceneMode = 0; + Common::Point pt(250, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + _enabled = true; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene1950::Scene1950() { + _upExitStyle = false; + _removeFlag = false; + _vampireActive = false; + _vampireDestPos = Common::Point(0, 0); + _vampireIndex = 0; +} + +void Scene1950::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_upExitStyle); + s.syncAsSint16LE(_removeFlag); + s.syncAsSint16LE(_vampireActive); + s.syncAsSint16LE(_vampireDestPos.x); + s.syncAsSint16LE(_vampireDestPos.y); + s.syncAsSint16LE(_vampireIndex); +} + +void Scene1950::initArea() { + _northExit._enabled = false; + _upExit._enabled = false; + _eastExit._enabled = false; + _downExit._enabled = false; + _southExit._enabled = false; + _westExit._enabled = false; + _shaftExit._enabled = false; + _doorExit._enabled = false; + _northExit._insideArea = false; + _upExit._insideArea = false; + _eastExit._insideArea = false; + _downExit._insideArea = false; + _southExit._insideArea = false; + _westExit._insideArea = false; + _shaftExit._insideArea = false; + _doorExit._insideArea = false; + _northExit._moving = false; + _upExit._moving = false; + _eastExit._moving = false; + _downExit._moving = false; + _southExit._moving = false; + _westExit._moving = false; + _shaftExit._moving = false; + _doorExit._moving = false; + _upExitStyle = false; + + switch (R2_GLOBALS._flubMazeArea - 1) { + case 0: + loadScene(1948); + break; + case 1: + // No break on purpose + case 8: + // No break on purpose + case 10: + // No break on purpose + case 12: + // No break on purpose + case 16: + // No break on purpose + case 19: + // No break on purpose + case 23: + // No break on purpose + case 30: + // No break on purpose + case 44: + // No break on purpose + case 72: + // No break on purpose + case 74: + // No break on purpose + case 86: + // No break on purpose + case 96: + // No break on purpose + case 103: + loadScene(1950); + break; + case 2: + // No break on purpose + case 29: + loadScene(1965); + break; + case 3: + // No break on purpose + case 9: + // No break on purpose + case 11: + // No break on purpose + case 15: + // No break on purpose + case 24: + // No break on purpose + case 39: + // No break on purpose + case 45: + // No break on purpose + case 71: + // No break on purpose + case 73: + // No break on purpose + case 75: + // No break on purpose + case 79: + // No break on purpose + case 85: + // No break on purpose + case 87: + // No break on purpose + case 95: + loadScene(1955); + break; + case 4: + // No break on purpose + case 6: + // No break on purpose + case 13: + // No break on purpose + case 27: + // No break on purpose + case 41: + // No break on purpose + case 48: + // No break on purpose + case 50: + // No break on purpose + case 54: + // No break on purpose + case 76: + // No break on purpose + case 80: + // No break on purpose + case 90: + // No break on purpose + case 104: + loadScene(1975); + break; + case 5: + // No break on purpose + case 7: + // No break on purpose + case 14: + // No break on purpose + case 28: + // No break on purpose + case 32: + // No break on purpose + case 47: + // No break on purpose + case 53: + loadScene(1997); + break; + case 17: + // No break on purpose + case 20: + // No break on purpose + case 25: + // No break on purpose + case 31: + // No break on purpose + case 33: + // No break on purpose + case 46: + loadScene(1995); + break; + case 18: + // No break on purpose + case 22: + // No break on purpose + case 26: + // No break on purpose + case 36: + // No break on purpose + case 38: + // No break on purpose + case 43: + // No break on purpose + case 51: + // No break on purpose + case 70: + // No break on purpose + case 78: + // No break on purpose + case 84: + // No break on purpose + case 89: + // No break on purpose + case 101: + loadScene(1970); + break; + case 21: + // No break on purpose + case 34: + // No break on purpose + case 57: + // No break on purpose + case 58: + // No break on purpose + case 59: + // No break on purpose + case 62: + // No break on purpose + case 65: + loadScene(1980); + break; + case 35: + // No break on purpose + case 61: + // No break on purpose + case 77: + // No break on purpose + case 83: + loadScene(1982); + break; + case 37: + // No break on purpose + case 52: + // No break on purpose + case 82: + // No break on purpose + case 88: + // No break on purpose + case 92: + // No break on purpose + case 97: + // No break on purpose + case 100: + loadScene(1962); + break; + case 40: + // No break on purpose + case 102: + loadScene(1960); + break; + case 42: + // No break on purpose + case 55: + // No break on purpose + case 60: + // No break on purpose + case 66: + // No break on purpose + case 68: + // No break on purpose + case 69: + // No break on purpose + case 93: + // No break on purpose + case 98: + loadScene(1990); + break; + case 49: + // No break on purpose + case 81: + // No break on purpose + case 91: + // No break on purpose + case 94: + // No break on purpose + case 99: + loadScene(1967); + break; + case 56: + // No break on purpose + case 63: + // No break on purpose + case 64: + // No break on purpose + case 67: + loadScene(1985); + _upExitStyle = true; + break; + default: + break; + } + + if (R2_GLOBALS._flubMazeArea != 1) + R2_GLOBALS._walkRegions.load(1950); + + switch (R2_GLOBALS._flubMazeArea - 1) { + case 0: + _shaftExit._enabled = true; + if ((R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950)) + _doorExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(2); + R2_GLOBALS._walkRegions.disableRegion(3); + R2_GLOBALS._walkRegions.disableRegion(4); + R2_GLOBALS._walkRegions.disableRegion(5); + R2_GLOBALS._walkRegions.disableRegion(6); + break; + case 1: + // No break on purpose + case 2: + // No break on purpose + case 3: + // No break on purpose + case 8: + // No break on purpose + case 9: + // No break on purpose + case 10: + // No break on purpose + case 11: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 16: + // No break on purpose + case 19: + // No break on purpose + case 23: + // No break on purpose + case 24: + // No break on purpose + case 29: + // No break on purpose + case 30: + // No break on purpose + case 39: + // No break on purpose + case 40: + // No break on purpose + case 44: + // No break on purpose + case 45: + // No break on purpose + case 71: + // No break on purpose + case 72: + // No break on purpose + case 73: + // No break on purpose + case 74: + // No break on purpose + case 75: + // No break on purpose + case 79: + // No break on purpose + case 85: + // No break on purpose + case 86: + // No break on purpose + case 87: + // No break on purpose + case 95: + // No break on purpose + case 96: + // No break on purpose + case 102: + // No break on purpose + case 103: + _eastExit._enabled = true; + _westExit._enabled = true; + break; + case 4: + // No break on purpose + case 6: + // No break on purpose + case 13: + // No break on purpose + case 17: + // No break on purpose + case 20: + // No break on purpose + case 25: + // No break on purpose + case 27: + // No break on purpose + case 31: + // No break on purpose + case 33: + // No break on purpose + case 37: + // No break on purpose + case 41: + // No break on purpose + case 46: + // No break on purpose + case 48: + // No break on purpose + case 50: + // No break on purpose + case 52: + // No break on purpose + case 54: + // No break on purpose + case 76: + // No break on purpose + case 80: + // No break on purpose + case 82: + // No break on purpose + case 88: + // No break on purpose + case 90: + // No break on purpose + case 92: + // No break on purpose + case 97: + // No break on purpose + case 100: + // No break on purpose + case 104: + _westExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(9); + break; + case 5: + // No break on purpose + case 7: + // No break on purpose + case 14: + // No break on purpose + case 18: + // No break on purpose + case 22: + // No break on purpose + case 26: + // No break on purpose + case 28: + // No break on purpose + case 32: + // No break on purpose + case 36: + // No break on purpose + case 38: + // No break on purpose + case 43: + // No break on purpose + case 47: + // No break on purpose + case 49: + // No break on purpose + case 51: + // No break on purpose + case 53: + // No break on purpose + case 70: + // No break on purpose + case 78: + // No break on purpose + case 81: + // No break on purpose + case 84: + // No break on purpose + case 89: + // No break on purpose + case 91: + // No break on purpose + case 94: + // No break on purpose + case 99: + // No break on purpose + case 101: + _eastExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(1); + R2_GLOBALS._walkRegions.disableRegion(7); + R2_GLOBALS._walkRegions.disableRegion(13); + break; + default: + R2_GLOBALS._walkRegions.disableRegion(1); + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(7); + R2_GLOBALS._walkRegions.disableRegion(9); + R2_GLOBALS._walkRegions.disableRegion(13); + break; + } + + _northDoorway.remove(); + _northDoorway.removeObject(); + _southDoorway.remove(); + + switch (R2_GLOBALS._flubMazeArea - 4) { + case 0: + // No break on purpose + case 3: + // No break on purpose + case 16: + // No break on purpose + case 22: + // No break on purpose + case 24: + // No break on purpose + case 32: + // No break on purpose + case 33: + // No break on purpose + case 45: + // No break on purpose + case 46: + // No break on purpose + case 48: + // No break on purpose + case 51: + // No break on purpose + case 56: + // No break on purpose + case 59: + // No break on purpose + case 67: + // No break on purpose + case 68: + // No break on purpose + case 70: + // No break on purpose + case 73: + // No break on purpose + case 82: + // No break on purpose + case 90: + _northExit._enabled = true; + _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); + //visage,strip,frame,px,py,priority,effect + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); + _southDoorway.setFrame(2); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + R2_GLOBALS._walkRegions.disableRegion(3); + R2_GLOBALS._walkRegions.disableRegion(4); + break; + case 7: + // No break on purpose + case 10: + // No break on purpose + case 23: + // No break on purpose + case 29: + // No break on purpose + case 31: + // No break on purpose + case 39: + // No break on purpose + case 40: + // No break on purpose + case 52: + // No break on purpose + case 53: + // No break on purpose + case 55: + // No break on purpose + case 63: + // No break on purpose + case 65: + // No break on purpose + case 66: + // No break on purpose + case 75: + // No break on purpose + case 77: + // No break on purpose + case 81: + // No break on purpose + case 87: + // No break on purpose + case 89: + // No break on purpose + case 97: + _southExit._enabled = true; + + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); + _southDoorway.setFrame(3); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + break; + case 58: + // No break on purpose + case 74: + // No break on purpose + case 80: + _northExit._enabled = true; + _southExit._enabled = true; + + _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); + + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); + _southDoorway.setFrame(3); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + R2_GLOBALS._walkRegions.disableRegion(3); + R2_GLOBALS._walkRegions.disableRegion(4); + break; + default: + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip(((R2_GLOBALS._flubMazeArea - 1) / 35) % 2 + 1); + _southDoorway.setFrame(2); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + break; + } + + switch (R2_GLOBALS._flubMazeArea - 3) { + case 0: + // No break on purpose + case 3: + // No break on purpose + case 5: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 23: + // No break on purpose + case 26: + // No break on purpose + case 27: + // No break on purpose + case 29: + // No break on purpose + case 30: + // No break on purpose + case 31: + // No break on purpose + case 32: + // No break on purpose + case 44: + // No break on purpose + case 45: + // No break on purpose + case 51: + // No break on purpose + case 55: + // No break on purpose + case 56: + // No break on purpose + case 57: + // No break on purpose + case 60: + // No break on purpose + case 63: + _upExit._enabled = true; + break; + case 54: + // No break on purpose + case 61: + // No break on purpose + case 62: + // No break on purpose + case 65: + _upExit._enabled = true; + // No break on purpose + case 35: + // No break on purpose + case 38: + // No break on purpose + case 40: + // No break on purpose + case 47: + // No break on purpose + case 50: + // No break on purpose + case 53: + // No break on purpose + case 58: + // No break on purpose + case 64: + // No break on purpose + case 66: + // No break on purpose + case 67: + // No break on purpose + case 79: + // No break on purpose + case 80: + // No break on purpose + case 86: + // No break on purpose + case 89: + // No break on purpose + case 90: + // No break on purpose + case 91: + // No break on purpose + case 92: + // No break on purpose + case 95: + // No break on purpose + case 96: + // No break on purpose + case 97: + // No break on purpose + case 98: + // No break on purpose + case 100: + _downExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(4); + R2_GLOBALS._walkRegions.disableRegion(5); + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(10); + R2_GLOBALS._walkRegions.disableRegion(11); + default: + break; + } + R2_GLOBALS._uiElements.draw(); +} + +void Scene1950::enterArea() { + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + _vampire.remove(); + _door.remove(); + _scrolls.remove(); + + _vampireActive = false; + _vampireIndex = 0; + + // Certain areas have a vampire in them + switch (R2_GLOBALS._flubMazeArea) { + case 10: + _vampireIndex = 1; + break; + case 13: + _vampireIndex = 2; + break; + case 16: + _vampireIndex = 3; + break; + case 17: + _vampireIndex = 4; + break; + case 24: + _vampireIndex = 5; + break; + case 25: + _vampireIndex = 6; + break; + case 31: + _vampireIndex = 7; + break; + case 40: + _vampireIndex = 8; + break; + case 45: + _vampireIndex = 9; + break; + case 46: + _vampireIndex = 10; + break; + case 73: + _vampireIndex = 11; + break; + case 75: + _vampireIndex = 12; + break; + case 80: + _vampireIndex = 13; + break; + case 87: + _vampireIndex = 14; + break; + case 88: + _vampireIndex = 15; + break; + case 96: + _vampireIndex = 16; + break; + case 97: + _vampireIndex = 17; + break; + case 104: + _vampireIndex = 18; + break; + default: + break; + } + + if (_vampireIndex != 0) { + _vampire.postInit(); + _vampire._numFrames = 6; + _vampire._moveRate = 6; + _vampire._moveDiff = Common::Point(3, 2); + _vampire._effect = EFFECT_SHADED; + + if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) { + // Show vampire ashes + _vampire.setPosition(Common::Point(R2_GLOBALS._vampireData[_vampireIndex - 1]._position)); + _vampire.animate(ANIM_MODE_NONE, NULL); + _vampire.addMover(NULL); + _vampire.setVisage(1961); + _vampire.setStrip(4); + _vampire.setFrame(10); + _vampire.fixPriority(10); + _vampire.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); + } else { + // Start the vampire + _vampire.setVisage(1960); + _vampire.setPosition(Common::Point(160, 130)); + _vampire.animate(ANIM_MODE_2, NULL); + _vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL); + _vampireActive = true; + } + } + if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) { + // Show doorway at the right hand side of the very first flub corridor + _door.postInit(); + _door.setVisage(1948); + _door.setStrip(3); + _door.setPosition(Common::Point(278, 155)); + _door.fixPriority(100); + _door.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL); + } + + if (R2_GLOBALS._flubMazeArea == 102) { + R2_GLOBALS._walkRegions.load(1951); + R2_GLOBALS._walkRegions.disableRegion(1); + R2_GLOBALS._walkRegions.disableRegion(5); + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(7); + + _cube.postInit(); + _cube.setVisage(1970); + _cube.setStrip(1); + if (R2_GLOBALS.getFlag(37)) + _cube.setFrame(3); + else + _cube.setFrame(1); + _cube.setPosition(Common::Point(193, 158)); + _cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL); + + _pulsingLights.postInit(); + _pulsingLights.setVisage(1970); + _pulsingLights.setStrip(3); + _pulsingLights.animate(ANIM_MODE_2, NULL); + _pulsingLights._numFrames = 6; + _pulsingLights.setPosition(Common::Point(194, 158)); + _pulsingLights.fixPriority(159); + + _keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL); + + if (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) { + _gem.postInit(); + _gem.setVisage(1970); + _gem.setStrip(1); + _gem.setFrame(2); + _gem.fixPriority(160); + } + + if (R2_GLOBALS.getFlag(37)) { + _gem.setPosition(Common::Point(192, 118)); + _gem.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL); + } else { + _containmentField.postInit(); + _containmentField.setVisage(1970); + _containmentField.setStrip(4); + _containmentField._numFrames = 4; + _containmentField.animate(ANIM_MODE_8, 0, NULL); + _containmentField.setPosition(Common::Point(192, 121)); + _containmentField.fixPriority(159); + _containmentField.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL); + + _gem.setPosition(Common::Point(192, 109)); + _gem.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL); + } + + _scrolls.postInit(); + _scrolls.setVisage(1972); + _scrolls.setStrip(1); + _scrolls.setPosition(Common::Point(76, 94)); + _scrolls.fixPriority(25); + _scrolls.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL); + if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2) + _scrolls.setFrame(2); + else + _scrolls.setFrame(1); + + _removeFlag = true; + } else if (_removeFlag) { + _cube.remove(); + _containmentField.remove(); + _gem.remove(); + _pulsingLights.remove(); + _scrolls.remove(); + + R2_GLOBALS._sceneItems.remove(&_background); + _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL); + + _removeFlag = false; + } + + switch (R2_GLOBALS._flubMazeEntryDirection) { + case 0: + _sceneMode = 1950; + if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) + // The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent + R2_GLOBALS._player.enableControl(CURSOR_WALK); + else + setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL); + + break; + case 1: { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + R2_GLOBALS._player.setPosition(Common::Point(160, 213)); + Common::Point pt(160, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + break; + case 2: + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + if (R2_GLOBALS.getFlag(36)) + setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL); + break; + case 3: + // Entering from the left + if (!_vampireActive) { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); + Common::Point pt(30, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + _sceneMode = 18; + _eastExit._enabled = false; + _vampireDestPos = Common::Point(60, 152); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + + _vampire.setStrip(2); + NpcMover *mover = new NpcMover(); + _vampire.addMover(mover, &_vampireDestPos, this); + + R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); + Common::Point pt2(30, 160); + NpcMover *mover2 = new NpcMover(); + R2_GLOBALS._player.addMover(mover2, &pt2, NULL); + } + break; + case 4: + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + if (!_upExitStyle) { + if (R2_GLOBALS.getFlag(36)) + setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL); + } else { + if (R2_GLOBALS.getFlag(36)) + setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL); + } + break; + case 5: { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + R2_GLOBALS._player.setPosition(Common::Point(160, 127)); + Common::Point pt(160, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + break; + case 6: + // Entering from the right + if (!_vampireActive) { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + if (R2_GLOBALS._flubMazeArea == 1) { + setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL); + } else { + R2_GLOBALS._player.setPosition(Common::Point(340, 160)); + Common::Point pt(289, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + } else { + _sceneMode = 17; + _westExit._enabled = false; + _vampireDestPos = Common::Point(259, 152); + + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + + _vampire.setStrip(1); + NpcMover *mover = new NpcMover(); + _vampire.addMover(mover, &_vampireDestPos, this); + + R2_GLOBALS._player.setPosition(Common::Point(340, 160)); + Common::Point pt2(289, 160); + NpcMover *mover2 = new NpcMover(); + R2_GLOBALS._player.addMover(mover2, &pt2, NULL); + } + break; + default: + break; + } +} + +void Scene1950::doButtonPress(int indx) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + + int prevIndex = indx - 1; + if ((indx / 4) == (prevIndex / 4)) { + if (prevIndex < 0) + prevIndex = 3; + } else { + prevIndex += 4; + } + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + prevIndex = indx + 1; + if ((indx / 4) == (prevIndex / 4)) { + if (prevIndex > 15) + prevIndex = 12; + } else { + prevIndex -= 4; + } + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + prevIndex = indx - 4; + if (prevIndex < 0) + prevIndex += 16; + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + prevIndex = indx + 4; + if (prevIndex > 15) + prevIndex -= 16; + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + // Check whether all the buttons are highlighted + int cpt = 0; + for (prevIndex = 0; prevIndex < 16; prevIndex++) { + if (_KeypadWindow._buttons[prevIndex]._toggled) + ++cpt; + } + + if (cpt != 16) { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + } else { + R2_GLOBALS.setFlag(37); + _sceneMode = 24; + setAction(&_sequenceManager, scene, 1976, NULL); + } +} + +void Scene1950::postInit(SceneObjectList *OwnerList) { + _upExitStyle = false; + _removeFlag = false; + _vampireActive = false; + _vampireIndex = 0; + if (R2_GLOBALS._sceneManager._previousScene == 300) + R2_GLOBALS._flubMazeArea = 103; + + initArea(); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(105); + + _northExit.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950); + _northExit.setDest(Common::Point(160, 145)); + + _upExit.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950); + _upExit.setDest(Common::Point(200, 151)); + + _eastExit.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950); + _eastExit.setDest(Common::Point(312, 160)); + + _downExit.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950); + _downExit.setDest(Common::Point(200, 151)); + + _southExit.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950); + _southExit.setDest(Common::Point(160, 165)); + + _westExit.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950); + _westExit.setDest(Common::Point(7, 160)); + + _shaftExit.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950); + _shaftExit.setDest(Common::Point(120, 140)); + + _doorExit.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950); + _doorExit.setDest(Common::Point(268, 149)); + + R2_GLOBALS._player.postInit(); + if ( (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 0) && (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 0) + && (R2_INVENTORY.getObjectScene(R2_SOAKED_FACEMASK) == 0) && (!R2_GLOBALS.getFlag(36)) ) + R2_GLOBALS._player.setVisage(22); + else + R2_GLOBALS._player.setVisage(20); + + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL); + + enterArea(); +} + +void Scene1950::remove() { + R2_GLOBALS._sound1.stop(); + R2_GLOBALS._sound2.fadeOut2(NULL); + SceneExt::remove(); +} + +void Scene1950::signal() { + switch (_sceneMode) { + case 11: + R2_GLOBALS._flubMazeArea += 7; + initArea(); + enterArea(); + break; + case 12: + // Moving up a ladder within the Flub maze + R2_GLOBALS._flubMazeArea += 35; + initArea(); + enterArea(); + break; + case 1975: + SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, + SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END); + // No break on purpose + case 13: + // Moving east within the Flub maze + ++R2_GLOBALS._flubMazeArea; + initArea(); + enterArea(); + break; + case 14: + // Moving down a ladder within the Flub maze + R2_GLOBALS._flubMazeArea -= 35; + initArea(); + enterArea(); + break; + case 15: + R2_GLOBALS._flubMazeArea -= 7; + initArea(); + enterArea(); + break; + case 16: + // Moving west within the Flub maze + // No break on purpose + case 1961: + --R2_GLOBALS._flubMazeArea; + initArea(); + enterArea(); + break; + case 17: { + _sceneMode = 13; + R2_GLOBALS._flubMazeEntryDirection = 3; + _vampireActive = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._player._canWalk = true; + R2_GLOBALS._player.setVisage(22); + R2_GLOBALS._player.animate(ANIM_MODE_9); + Common::Point pt(340, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + Common::Point pt2(289, 160); + NpcMover *mover2 = new NpcMover(); + _vampire.addMover(mover2, &pt2, NULL); + } + break; + case 18: { + _sceneMode = 16; + R2_GLOBALS._flubMazeEntryDirection = 6; + _vampireActive = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._player._canWalk = true; + R2_GLOBALS._player.setVisage(22); + R2_GLOBALS._player.animate(ANIM_MODE_9); + Common::Point pt(-20, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + Common::Point pt2(30, 160); + NpcMover *mover2 = new NpcMover(); + _vampire.addMover(mover2, &pt2, NULL); + } + break; + case 24: + _KeypadWindow.remove(); + _sceneMode = 1966; + _cube.setFrame(3); + setAction(&_sequenceManager, this, 1966, &_containmentField, &_gem, NULL); + break; + case 1951: + R2_GLOBALS._sound1.fadeOut2(NULL); + R2_GLOBALS._sceneManager.changeScene(1945); + break; + case 1958: + SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + _doorExit._enabled = true; + break; + case 1959: + R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + _doorExit._enabled = true; + break; + case 1962: + // No break on purpose + case 1963: + R2_GLOBALS._player.enableControl(); + _KeypadWindow.setup2(1971, 1, 1, 160, 135); + break; + case 1964: + // No break on purpose + case 1965: + if (!R2_GLOBALS.getFlag(37)) + SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + + R2_GLOBALS._player.enableControl(); + break; + case 1966: + _containmentField.remove(); + if (R2_GLOBALS.getFlag(36)) { + _sceneMode = 1964; + setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL); + } else { + _sceneMode = 1965; + setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL); + } + _gem.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL); + break; + case 1967: { + _sceneMode = 0; + R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 2); + _gem.remove(); + if (R2_GLOBALS.getFlag(36)) + R2_GLOBALS._player.setVisage(20); + else + R2_GLOBALS._player.setVisage(22); + + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + // This is a hack to work around a pathfinding issue. original destination is (218, 165) + Common::Point pt(128, 165); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + break; + case 1968: + R2_GLOBALS._player.enableControl(); + R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2); + _scrolls.setFrame(2); + if (R2_GLOBALS.getFlag(36)) + R2_GLOBALS._player.setVisage(20); + else + R2_GLOBALS._player.setVisage(22); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + break; + default: + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + } +} + +void Scene1950::process(Event &event) { + if ( (event.eventType == EVENT_BUTTON_DOWN) + && (R2_GLOBALS._player._uiEnabled) + && (R2_GLOBALS._events.getCursor() == R2_SOAKED_FACEMASK) + && (R2_GLOBALS._player._bounds.contains(event.mousePos)) + && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)) { + event.handled = true; + R2_GLOBALS._player.disableControl(); + _shaftExit._enabled = false; + _doorExit._enabled = false; + _sceneMode = 1959; + setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL); + } + + Scene::process(event); +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_vampire.h b/engines/tsage/ringworld2/ringworld2_vampire.h new file mode 100644 index 0000000000..ca7aa34544 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_vampire.h @@ -0,0 +1,179 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_VAMPIRE_H +#define TSAGE_RINGWORLD2_VAMPIRE_H + +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene1950 : public SceneExt { + /* Windows */ + class KeypadWindow: public ModalWindow { + public: + class KeypadButton : public SceneActor { + public: + int _buttonIndex; + bool _pressed; + bool _toggled; + + KeypadButton(); + void synchronize(Serializer &s); + + void init(int indx); + virtual void process(Event &event); + virtual bool startAction(CursorType action, Event &event); + }; + + SceneActor _areaActor; + KeypadButton _buttons[16]; + + int _buttonIndex; + + KeypadWindow(); + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY); + virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum); + }; + + class Keypad : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actors */ + class Door : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Scrolls : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Gem : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Vampire : public SceneActor { + public: + Common::Point _deadPosition; + int _deltaX; + int _deltaY; + int _vampireMode; + + Vampire(); + void synchronize(Serializer &s); + + virtual void signal(); + virtual bool startAction(CursorType action, Event &event); + }; + + /* Exits */ + class NorthExit : public SceneExit { + public: + virtual void changeScene(); + }; + class UpExit : public SceneExit { + public: + virtual void changeScene(); + }; + class EastExit : public SceneExit { + public: + virtual void changeScene(); + }; + class DownExit : public SceneExit { + public: + virtual void changeScene(); + }; + class SouthExit : public SceneExit { + public: + virtual void changeScene(); + }; + class WestExit : public SceneExit { + public: + virtual void changeScene(); + }; + class ShaftExit : public SceneExit { + public: + virtual void changeScene(); + }; + class DoorExit : public SceneExit { + public: + virtual void changeScene(); + }; +private: + void initArea(); + void enterArea(); + void doButtonPress(int indx); +public: + NamedHotspot _background; + Keypad _keypad; + SceneActor _southDoorway; + SceneObject _northDoorway; + Door _door; + Scrolls _scrolls; + SceneActor _containmentField; + Gem _gem; + SceneActor _cube; + SceneActor _pulsingLights; + Vampire _vampire; + KeypadWindow _KeypadWindow; + NorthExit _northExit; + UpExit _upExit; + EastExit _eastExit; + DownExit _downExit; + SouthExit _southExit; + WestExit _westExit; + ShaftExit _shaftExit; + DoorExit _doorExit; + SequenceManager _sequenceManager; + + bool _upExitStyle; + bool _removeFlag; + bool _vampireActive; + Common::Point _vampireDestPos; + int _vampireIndex; + + Scene1950(); + void synchronize(Serializer &s); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); +}; + +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index fee1bd752b..b95b614f09 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -164,7 +164,7 @@ Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { sd._status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; sd._field2 = 0; sd._field6 = 15000; - sd._shortDescription = "Adlib or SoundBlaster"; + sd._shortDescription = "AdLib or SoundBlaster"; sd._longDescription = "3812fm"; _availableDrivers.push_back(sd); |