MOHAWK: Move Riven's Card to a separate object
This commit is contained in:
parent
3c2ca08877
commit
0aaa3760c2
6 changed files with 158 additions and 51 deletions
|
@ -53,6 +53,7 @@ endif
|
||||||
ifdef ENABLE_RIVEN
|
ifdef ENABLE_RIVEN
|
||||||
MODULE_OBJS += \
|
MODULE_OBJS += \
|
||||||
riven.o \
|
riven.o \
|
||||||
|
riven_card.o \
|
||||||
riven_external.o \
|
riven_external.o \
|
||||||
riven_graphics.o \
|
riven_graphics.o \
|
||||||
riven_saveload.o \
|
riven_saveload.o \
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "mohawk/installer_archive.h"
|
#include "mohawk/installer_archive.h"
|
||||||
#include "mohawk/resource.h"
|
#include "mohawk/resource.h"
|
||||||
#include "mohawk/riven.h"
|
#include "mohawk/riven.h"
|
||||||
|
#include "mohawk/riven_card.h"
|
||||||
#include "mohawk/riven_external.h"
|
#include "mohawk/riven_external.h"
|
||||||
#include "mohawk/riven_graphics.h"
|
#include "mohawk/riven_graphics.h"
|
||||||
#include "mohawk/riven_saveload.h"
|
#include "mohawk/riven_saveload.h"
|
||||||
|
@ -51,7 +52,6 @@ Common::Rect *g_demoExitRect;
|
||||||
|
|
||||||
MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescription *gamedesc) : MohawkEngine(syst, gamedesc) {
|
MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescription *gamedesc) : MohawkEngine(syst, gamedesc) {
|
||||||
_showHotspots = false;
|
_showHotspots = false;
|
||||||
_cardData.hasData = false;
|
|
||||||
_gameOver = false;
|
_gameOver = false;
|
||||||
_activatedSLST = false;
|
_activatedSLST = false;
|
||||||
_ignoreNextMouseUp = false;
|
_ignoreNextMouseUp = false;
|
||||||
|
@ -67,6 +67,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
|
||||||
_saveLoad = nullptr;
|
_saveLoad = nullptr;
|
||||||
_optionsDialog = nullptr;
|
_optionsDialog = nullptr;
|
||||||
_curCard = 0;
|
_curCard = 0;
|
||||||
|
_card = nullptr;
|
||||||
_hotspotCount = 0;
|
_hotspotCount = 0;
|
||||||
_curHotspot = -1;
|
_curHotspot = -1;
|
||||||
removeTimer();
|
removeTimer();
|
||||||
|
@ -94,6 +95,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
|
||||||
}
|
}
|
||||||
|
|
||||||
MohawkEngine_Riven::~MohawkEngine_Riven() {
|
MohawkEngine_Riven::~MohawkEngine_Riven() {
|
||||||
|
delete _card;
|
||||||
delete _sound;
|
delete _sound;
|
||||||
delete _gfx;
|
delete _gfx;
|
||||||
delete _console;
|
delete _console;
|
||||||
|
@ -392,10 +394,12 @@ void MohawkEngine_Riven::changeToCard(uint16 dest) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_cardData.hasData)
|
if (_card)
|
||||||
runCardScript(kCardLeaveScript);
|
_card->runScript(kCardLeaveScript);
|
||||||
|
|
||||||
|
delete _card;
|
||||||
|
_card = new RivenCard(this, dest);
|
||||||
|
|
||||||
loadCard(_curCard);
|
|
||||||
refreshCard(); // Handles hotspots and scripts
|
refreshCard(); // Handles hotspots and scripts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,9 +416,10 @@ void MohawkEngine_Riven::refreshCard() {
|
||||||
_gfx->drawPLST(1);
|
_gfx->drawPLST(1);
|
||||||
_activatedSLST = false;
|
_activatedSLST = false;
|
||||||
|
|
||||||
runCardScript(kCardLoadScript);
|
_card->runScript(kCardLoadScript);
|
||||||
_gfx->updateScreen();
|
_gfx->updateScreen();
|
||||||
runCardScript(kCardOpenScript);
|
_card->runScript(kCardOpenScript);
|
||||||
|
_card->open();
|
||||||
|
|
||||||
// Activate the first sound list if none have been activated
|
// Activate the first sound list if none have been activated
|
||||||
if (!_activatedSLST)
|
if (!_activatedSLST)
|
||||||
|
@ -431,30 +436,6 @@ void MohawkEngine_Riven::refreshCard() {
|
||||||
installCardTimer();
|
installCardTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MohawkEngine_Riven::loadCard(uint16 id) {
|
|
||||||
// NOTE: The card scripts are cleared by the RivenScriptManager automatically.
|
|
||||||
|
|
||||||
Common::SeekableReadStream* inStream = getResource(ID_CARD, id);
|
|
||||||
|
|
||||||
_cardData.name = inStream->readSint16BE();
|
|
||||||
_cardData.zipModePlace = inStream->readUint16BE();
|
|
||||||
_cardData.scripts = _scriptMan->readScripts(inStream);
|
|
||||||
_cardData.hasData = true;
|
|
||||||
|
|
||||||
delete inStream;
|
|
||||||
|
|
||||||
if (_cardData.zipModePlace) {
|
|
||||||
Common::String cardName = getName(CardNames, _cardData.name);
|
|
||||||
if (cardName.empty())
|
|
||||||
return;
|
|
||||||
ZipMode zip;
|
|
||||||
zip.name = cardName;
|
|
||||||
zip.id = id;
|
|
||||||
if (!(Common::find(_zipModeData.begin(), _zipModeData.end(), zip) != _zipModeData.end()))
|
|
||||||
_zipModeData.push_back(zip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MohawkEngine_Riven::loadHotspots(uint16 id) {
|
void MohawkEngine_Riven::loadHotspots(uint16 id) {
|
||||||
// Clear old hotspots
|
// Clear old hotspots
|
||||||
delete[] _hotspots;
|
delete[] _hotspots;
|
||||||
|
@ -693,16 +674,6 @@ uint32 MohawkEngine_Riven::getCurCardRMAP() {
|
||||||
return rmapCode;
|
return rmapCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MohawkEngine_Riven::runCardScript(uint16 scriptType) {
|
|
||||||
assert(_cardData.hasData);
|
|
||||||
for (uint16 i = 0; i < _cardData.scripts.size(); i++)
|
|
||||||
if (_cardData.scripts[i].type == scriptType) {
|
|
||||||
RivenScriptPtr script = _cardData.scripts[i].script;
|
|
||||||
_scriptMan->runScript(script, false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) {
|
void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) {
|
||||||
assert(hotspot < _hotspotCount);
|
assert(hotspot < _hotspotCount);
|
||||||
for (uint16 i = 0; i < _hotspots[hotspot].scripts.size(); i++)
|
for (uint16 i = 0; i < _hotspots[hotspot].scripts.size(); i++)
|
||||||
|
@ -1022,6 +993,21 @@ void MohawkEngine_Riven::checkSunnerAlertClick() {
|
||||||
sunners = 1;
|
sunners = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MohawkEngine_Riven::addZipVisitedCard(uint16 cardId, uint16 cardNameId) {
|
||||||
|
Common::String cardName = getName(CardNames, cardNameId);
|
||||||
|
if (cardName.empty())
|
||||||
|
return;
|
||||||
|
ZipMode zip;
|
||||||
|
zip.name = cardName;
|
||||||
|
zip.id = cardId;
|
||||||
|
if (!(Common::find(_zipModeData.begin(), _zipModeData.end(), zip) != _zipModeData.end()))
|
||||||
|
_zipModeData.push_back(zip);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MohawkEngine_Riven::runUpdateScreenScript() {
|
||||||
|
_card->runScript(kCardUpdateScript);
|
||||||
|
}
|
||||||
|
|
||||||
bool ZipMode::operator== (const ZipMode &z) const {
|
bool ZipMode::operator== (const ZipMode &z) const {
|
||||||
return z.name == name && z.id == id;
|
return z.name == name && z.id == id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ class RivenExternal;
|
||||||
class RivenConsole;
|
class RivenConsole;
|
||||||
class RivenSaveLoad;
|
class RivenSaveLoad;
|
||||||
class RivenOptionsDialog;
|
class RivenOptionsDialog;
|
||||||
|
class RivenCard;
|
||||||
class RivenSoundManager;
|
class RivenSoundManager;
|
||||||
|
|
||||||
// Riven Stack Types
|
// Riven Stack Types
|
||||||
|
@ -99,13 +100,6 @@ struct RivenHotspot {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Card {
|
|
||||||
int16 name;
|
|
||||||
uint16 zipModePlace;
|
|
||||||
bool hasData;
|
|
||||||
RivenScriptList scripts;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ZipMode {
|
struct ZipMode {
|
||||||
Common::String name;
|
Common::String name;
|
||||||
uint16 id;
|
uint16 id;
|
||||||
|
@ -128,7 +122,7 @@ public:
|
||||||
Common::RandomSource *_rnd;
|
Common::RandomSource *_rnd;
|
||||||
RivenScriptManager *_scriptMan;
|
RivenScriptManager *_scriptMan;
|
||||||
|
|
||||||
Card _cardData;
|
RivenCard *_card;
|
||||||
|
|
||||||
GUI::Debugger *getDebugger();
|
GUI::Debugger *getDebugger();
|
||||||
|
|
||||||
|
@ -152,7 +146,6 @@ private:
|
||||||
// Stack/Card-related functions and variables
|
// Stack/Card-related functions and variables
|
||||||
uint16 _curCard;
|
uint16 _curCard;
|
||||||
uint16 _curStack;
|
uint16 _curStack;
|
||||||
void loadCard(uint16);
|
|
||||||
void handleEvents();
|
void handleEvents();
|
||||||
|
|
||||||
// Hotspot related functions and variables
|
// Hotspot related functions and variables
|
||||||
|
@ -182,8 +175,7 @@ public:
|
||||||
void refreshCard();
|
void refreshCard();
|
||||||
Common::String getName(uint16 nameResource, uint16 nameID);
|
Common::String getName(uint16 nameResource, uint16 nameID);
|
||||||
Common::String getStackName(uint16 stack) const;
|
Common::String getStackName(uint16 stack) const;
|
||||||
void runCardScript(uint16 scriptType);
|
void runUpdateScreenScript();
|
||||||
void runUpdateScreenScript() { runCardScript(kCardUpdateScript); }
|
|
||||||
uint16 getCurCard() const { return _curCard; }
|
uint16 getCurCard() const { return _curCard; }
|
||||||
uint16 getCurStack() const { return _curStack; }
|
uint16 getCurStack() const { return _curStack; }
|
||||||
uint16 matchRMAPToCard(uint32);
|
uint16 matchRMAPToCard(uint32);
|
||||||
|
@ -198,6 +190,7 @@ public:
|
||||||
int32 getCurHotspot() const { return _curHotspot; }
|
int32 getCurHotspot() const { return _curHotspot; }
|
||||||
Common::String getHotspotName(uint16 hotspot);
|
Common::String getHotspotName(uint16 hotspot);
|
||||||
void updateCurrentHotspot();
|
void updateCurrentHotspot();
|
||||||
|
void addZipVisitedCard(uint16 cardId, uint16 cardNameId);
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
RivenVariableMap _vars;
|
RivenVariableMap _vars;
|
||||||
|
|
69
engines/mohawk/riven_card.cpp
Normal file
69
engines/mohawk/riven_card.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/* 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 "mohawk/riven_card.h"
|
||||||
|
|
||||||
|
#include "mohawk/resource.h"
|
||||||
|
#include "mohawk/riven.h"
|
||||||
|
|
||||||
|
namespace Mohawk {
|
||||||
|
|
||||||
|
RivenCard::RivenCard(MohawkEngine_Riven *vm, uint16 id) :
|
||||||
|
_vm(vm),
|
||||||
|
_id(id) {
|
||||||
|
loadCardResource(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
RivenCard::~RivenCard() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void RivenCard::loadCardResource(uint16 id) {
|
||||||
|
Common::SeekableReadStream *inStream = _vm->getResource(ID_CARD, id);
|
||||||
|
|
||||||
|
_name = inStream->readSint16BE();
|
||||||
|
_zipModePlace = inStream->readUint16BE();
|
||||||
|
_scripts = _vm->_scriptMan->readScripts(inStream);
|
||||||
|
|
||||||
|
delete inStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RivenCard::open() {
|
||||||
|
initializeZipMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RivenCard::initializeZipMode() {
|
||||||
|
if (_zipModePlace) {
|
||||||
|
_vm->addZipVisitedCard(_id, _name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RivenCard::runScript(uint16 scriptType) {
|
||||||
|
for (uint16 i = 0; i < _scripts.size(); i++)
|
||||||
|
if (_scripts[i].type == scriptType) {
|
||||||
|
RivenScriptPtr script = _scripts[i].script;
|
||||||
|
_vm->_scriptMan->runScript(script, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of namespace Mohawk
|
54
engines/mohawk/riven_card.h
Normal file
54
engines/mohawk/riven_card.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/* 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 RIVEN_CARD_H
|
||||||
|
#define RIVEN_CARD_H
|
||||||
|
|
||||||
|
#include "mohawk/riven_scripts.h"
|
||||||
|
|
||||||
|
#include "common/system.h"
|
||||||
|
|
||||||
|
namespace Mohawk {
|
||||||
|
|
||||||
|
class RivenCard {
|
||||||
|
public:
|
||||||
|
RivenCard(MohawkEngine_Riven *vm, uint16 id);
|
||||||
|
~RivenCard();
|
||||||
|
|
||||||
|
void open();
|
||||||
|
void initializeZipMode();
|
||||||
|
void runScript(uint16 scriptType);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void loadCardResource(uint16 id);
|
||||||
|
|
||||||
|
MohawkEngine_Riven *_vm;
|
||||||
|
|
||||||
|
uint16 _id;
|
||||||
|
int16 _name;
|
||||||
|
uint16 _zipModePlace;
|
||||||
|
RivenScriptList _scripts;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // End of namespace Mohawk
|
||||||
|
|
||||||
|
#endif
|
|
@ -29,6 +29,10 @@
|
||||||
|
|
||||||
#define DECLARE_OPCODE(x) void x(uint16 op, uint16 argc, uint16 *argv)
|
#define DECLARE_OPCODE(x) void x(uint16 op, uint16 argc, uint16 *argv)
|
||||||
|
|
||||||
|
namespace Common {
|
||||||
|
class ReadStream;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Mohawk {
|
namespace Mohawk {
|
||||||
|
|
||||||
// Script Types
|
// Script Types
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue