From 42c5524a02a61a13fcefdc5a7d3f187c5b048bee Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Tue, 30 Dec 2003 21:06:22 +0000 Subject: interview mini-game support svn-id: r12037 --- queen/command.cpp | 40 ++++++++++++++------ queen/cutaway.cpp | 5 +++ queen/logic.cpp | 106 ++++++++++++++++++++++++++++++++++++++++++++++------- queen/logic.h | 2 + queen/resource.cpp | 4 +- queen/resource.h | 4 +- queen/talk.cpp | 14 +++++++ 7 files changed, 146 insertions(+), 29 deletions(-) (limited to 'queen') diff --git a/queen/command.cpp b/queen/command.cpp index 09b55651ef..494941259f 100644 --- a/queen/command.cpp +++ b/queen/command.cpp @@ -267,30 +267,46 @@ void Command::readCommandsFrom(byte *&ptr) { _numCmdArea = READ_BE_UINT16(ptr); ptr += 2; _cmdArea = new CmdArea[_numCmdArea + 1]; - memset(&_cmdArea[0], 0, sizeof(CmdArea)); - for (i = 1; i <= _numCmdArea; i++) { - _cmdArea[i].readFromBE(ptr); + if (_numCmdArea == 0) { + _cmdArea[0].readFromBE(ptr); + } else { + memset(&_cmdArea[0], 0, sizeof(CmdArea)); + for (i = 1; i <= _numCmdArea; i++) { + _cmdArea[i].readFromBE(ptr); + } } _numCmdObject = READ_BE_UINT16(ptr); ptr += 2; _cmdObject = new CmdObject[_numCmdObject + 1]; - memset(&_cmdObject[0], 0, sizeof(CmdObject)); - for (i = 1; i <= _numCmdObject; i++) { - _cmdObject[i].readFromBE(ptr); + if (_numCmdObject == 0) { + _cmdObject[0].readFromBE(ptr); + } else { + memset(&_cmdObject[0], 0, sizeof(CmdObject)); + for (i = 1; i <= _numCmdObject; i++) { + _cmdObject[i].readFromBE(ptr); + } } _numCmdInventory = READ_BE_UINT16(ptr); ptr += 2; _cmdInventory = new CmdInventory[_numCmdInventory + 1]; - memset(&_cmdInventory[0], 0, sizeof(CmdInventory)); - for (i = 1; i <= _numCmdInventory; i++) { - _cmdInventory[i].readFromBE(ptr); + if (_numCmdInventory == 0) { + _cmdInventory[0].readFromBE(ptr); + } else { + memset(&_cmdInventory[0], 0, sizeof(CmdInventory)); + for (i = 1; i <= _numCmdInventory; i++) { + _cmdInventory[i].readFromBE(ptr); + } } _numCmdGameState = READ_BE_UINT16(ptr); ptr += 2; _cmdGameState = new CmdGameState[_numCmdGameState + 1]; - memset(&_cmdGameState[0], 0, sizeof(CmdGameState)); - for (i = 1; i <= _numCmdGameState; i++) { - _cmdGameState[i].readFromBE(ptr); + if (_numCmdGameState == 0) { + _cmdGameState[0].readFromBE(ptr); + } else { + memset(&_cmdGameState[0], 0, sizeof(CmdGameState)); + for (i = 1; i <= _numCmdGameState; i++) { + _cmdGameState[i].readFromBE(ptr); + } } } diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index b67ebe2de7..e294a71ab4 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -1043,6 +1043,11 @@ void Cutaway::run(char *nextFilename) { joeBob->animating = 0; joeBob->moving = 0; + if (_vm->resource()->isInterview()) { + _vm->graphics()->bob(20)->box.y2 = 149; + _vm->graphics()->bob(21)->box.y2 = 149; + _vm->graphics()->bob(22)->box.y2 = 149; + } // Make sure Joe is clipped! joeBob->box.y2 = 149; diff --git a/queen/logic.cpp b/queen/logic.cpp index eac9eef359..bb8aae39bf 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -188,11 +188,15 @@ void Logic::initialise() { } _numGraphicAnim = READ_BE_UINT16(ptr); ptr += 2; - + _graphicAnim = new GraphicAnim[_numGraphicAnim + 1]; - memset(&_graphicAnim[0], 0, sizeof(GraphicAnim)); - for (i = 1; i <= _numGraphicAnim; i++) { - _graphicAnim[i].readFromBE(ptr); + if (_numGraphicAnim == 0) { + _graphicAnim[0].readFromBE(ptr); + } else { + memset(&_graphicAnim[0], 0, sizeof(GraphicAnim)); + for (i = 1; i <= _numGraphicAnim; i++) { + _graphicAnim[i].readFromBE(ptr); + } } _currentRoom = _objectData[_entryObj].room; @@ -1674,10 +1678,17 @@ uint16 Logic::findInventoryItem(int invSlot) const { void Logic::inventorySetup() { _vm->graphics()->bankLoad("objects.BBK", 14); - _inventoryItem[0] = ITEM_BAT; - _inventoryItem[1] = ITEM_JOURNAL; - _inventoryItem[2] = ITEM_NONE; - _inventoryItem[3] = ITEM_NONE; + if (_vm->resource()->isInterview()) { + _inventoryItem[0] = 1; + _inventoryItem[1] = 2; + _inventoryItem[2] = 3; + _inventoryItem[3] = 4; + } else { + _inventoryItem[0] = ITEM_BAT; + _inventoryItem[1] = ITEM_JOURNAL; + _inventoryItem[2] = ITEM_NONE; + _inventoryItem[3] = ITEM_NONE; + } } void Logic::inventoryRefresh() { @@ -2079,7 +2090,9 @@ void Logic::update() { _vm->input()->delay(); - _vm->display()->palCustomScroll(_currentRoom); + if (!_vm->resource()->isInterview()) { + _vm->display()->palCustomScroll(_currentRoom); + } if (_vm->debugger()->_drawAreas) { for(int i = 1; i < MAX_ZONES_NUMBER; ++i) { const ZoneSlot *pzs = &_zones[ZONE_ROOM][i]; @@ -2312,7 +2325,7 @@ void Logic::changeRoom() { void Logic::useJournal() { if (_vm->resource()->isDemo()) { makePersonSpeak("This is a demo, so I can't load or save games*14", NULL, ""); - } else { + } else if (!_vm->resource()->isInterview()) { _vm->command()->clear(false); Journal j(_vm); j.use(); @@ -2398,7 +2411,15 @@ bool Logic::preChangeRoom_Demo() { bool Logic::preChangeRoom_Interview() { - // XXX + if (currentRoom() == 2 && gameState(2) == 0) { + currentRoom(6); + roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true); + playCutaway("start.cut"); + gameState(2, 1); + inventorySetup(); + inventoryRefresh(); + return true; + } return false; } @@ -2456,8 +2477,17 @@ bool Logic::executeSpecialMove_Demo(uint16 sm) { bool Logic::executeSpecialMove_Interview(uint16 sm) { - // XXX - return false; + switch (sm) { + case 1: + asmInterviewIntro(); + break; + case 2: + asmEndInterview(); + break; + default: + return false; + } + return true; } @@ -3092,9 +3122,57 @@ void Logic::asmPanLeftToBomb() { void Logic::asmEndDemo() { debug(0, "Flight of the Amazon Queen, released January 95"); - OSystem::instance()->quit(); + OSystem::instance()->quit(); } +void Logic::asmInterviewIntro() { + // put camera on zeppelin + _vm->graphics()->cameraBob(5); + BobSlot *bzep = _vm->graphics()->bob(5); + + bzep->curPos(-30, 40); + + bzep->move(700, 10, 3); + int scale = 450; + while (bzep->moving && !_vm->input()->cutawayQuit()) { + bzep->scale = 256 * 100 / scale; + --scale; + if (scale < 256) { + scale = 256; + } + update(); + } + + bzep->scale = 90; + bzep->xflip = true; + + bzep->move(560, 25, 4); + while (bzep->moving && !_vm->input()->cutawayQuit()) { + update(); + } + + bzep->move(545, 65, 2); + while (bzep->moving && !_vm->input()->cutawayQuit()) { + update(); + } + + bzep->move(540, 75, 2); + while (bzep->moving && !_vm->input()->cutawayQuit()) { + update(); + } + + // put camera on Joe + _vm->graphics()->cameraBob(0); +} + + +void Logic::asmEndInterview() { + debug(0, "Interactive Interview copyright (c) 1995, IBI."); + OSystem::instance()->quit(); +} + + + } // End of namespace Queen diff --git a/queen/logic.h b/queen/logic.h index 09a8dae9f1..84463b0e36 100644 --- a/queen/logic.h +++ b/queen/logic.h @@ -293,6 +293,8 @@ public: void asmPanRightToJoeAndRita(); void asmPanLeftToBomb(); void asmEndDemo(); + void asmInterviewIntro(); + void asmEndInterview(); typedef bool (Logic::*ExecuteSpecialMoveProc)(uint16); typedef bool (Logic::*PreChangeRoomProc)(); diff --git a/queen/resource.cpp b/queen/resource.cpp index 5dbd488ef0..cf027c5e53 100644 --- a/queen/resource.cpp +++ b/queen/resource.cpp @@ -38,7 +38,8 @@ const GameVersion Resource::_gameVersions[] = { { "CIM10", 0x0008BEE2, 190795582 }, { "CSM10", 0x000B343C, 190730602 }, { "PE100", 0x000DA981, 3724538 }, - { "PE100", 0x000DB63A, 3732177 } + { "PE100", 0x000DB63A, 3732177 }, + { "PEint", 0x000DC2F3, 1915913 } }; @@ -112,6 +113,7 @@ ResourceEntry *Resource::resourceEntry(const char *filename) const { } char *Resource::getJAS2Line() { + assert(_JAS2Pos < resourceEntry("QUEEN2.JAS")->size); char *startOfLine = _JAS2Ptr + _JAS2Pos; char *curPos = startOfLine; while (*curPos++ != 0xd) ; diff --git a/queen/resource.h b/queen/resource.h index c79d6f25cd..c0833a9b00 100644 --- a/queen/resource.h +++ b/queen/resource.h @@ -43,9 +43,9 @@ enum Version { // VER_HEB_TALKIE VER_DEMO_PCGAMES = 9, VER_DEMO = 10, - // VER_INTERVIEW + VER_INTERVIEW = 11, - VER_COUNT = 11 + VER_COUNT = 12 }; struct ResourceEntry { diff --git a/queen/talk.cpp b/queen/talk.cpp index ed5a3a080d..4b401f76a8 100644 --- a/queen/talk.cpp +++ b/queen/talk.cpp @@ -1872,6 +1872,20 @@ const Talk::SpeechParameters Talk::_speechParameters[] = { //#endif + // Interview + { "JOHN", 0, 0, 1, 2, 2, 3, "", 1 }, + { "JOHN", 1, 0, 1, 15, -1, 0, "", 1 }, + { "JOHN", 2, 0, 1, 16, -1, 0, "", 1 }, + { "JOHN", 3, 0, 1, 17, -1, 0, "", 1 }, + + { "STEVE", 0, 0, 8, 2, 2, 3, "", 2 }, + { "STEVE", 1, 0, 8, 16, -1, 0, "", 2 }, + { "STEVE", 2, 0, 9, 18, -1, 0, "T016,017,017,016,008,000", 2 }, + { "STEVE", 3, 0, 8, 18, -1, 0, "", 2 }, + + { "TONY", 0, 0, 1, 2, 2, 3, "", 1 }, + { "TONY", 1, 0, 1, 12, -1, 0, "", 1 }, + { "*",0,0,0,0,0,0,"",0} }; -- cgit v1.2.3