MOHAWK: Move Riven's Card to a separate object

This commit is contained in:
Bastien Bouclet 2016-08-03 07:19:11 +02:00 committed by Eugene Sandulenko
parent 3c2ca08877
commit 0aaa3760c2
6 changed files with 158 additions and 51 deletions

View File

@ -53,6 +53,7 @@ endif
ifdef ENABLE_RIVEN
MODULE_OBJS += \
riven.o \
riven_card.o \
riven_external.o \
riven_graphics.o \
riven_saveload.o \

View File

@ -31,6 +31,7 @@
#include "mohawk/installer_archive.h"
#include "mohawk/resource.h"
#include "mohawk/riven.h"
#include "mohawk/riven_card.h"
#include "mohawk/riven_external.h"
#include "mohawk/riven_graphics.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) {
_showHotspots = false;
_cardData.hasData = false;
_gameOver = false;
_activatedSLST = false;
_ignoreNextMouseUp = false;
@ -67,6 +67,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
_saveLoad = nullptr;
_optionsDialog = nullptr;
_curCard = 0;
_card = nullptr;
_hotspotCount = 0;
_curHotspot = -1;
removeTimer();
@ -94,6 +95,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
}
MohawkEngine_Riven::~MohawkEngine_Riven() {
delete _card;
delete _sound;
delete _gfx;
delete _console;
@ -392,10 +394,12 @@ void MohawkEngine_Riven::changeToCard(uint16 dest) {
}
}
if (_cardData.hasData)
runCardScript(kCardLeaveScript);
if (_card)
_card->runScript(kCardLeaveScript);
delete _card;
_card = new RivenCard(this, dest);
loadCard(_curCard);
refreshCard(); // Handles hotspots and scripts
}
@ -412,9 +416,10 @@ void MohawkEngine_Riven::refreshCard() {
_gfx->drawPLST(1);
_activatedSLST = false;
runCardScript(kCardLoadScript);
_card->runScript(kCardLoadScript);
_gfx->updateScreen();
runCardScript(kCardOpenScript);
_card->runScript(kCardOpenScript);
_card->open();
// Activate the first sound list if none have been activated
if (!_activatedSLST)
@ -431,30 +436,6 @@ void MohawkEngine_Riven::refreshCard() {
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) {
// Clear old hotspots
delete[] _hotspots;
@ -693,16 +674,6 @@ uint32 MohawkEngine_Riven::getCurCardRMAP() {
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) {
assert(hotspot < _hotspotCount);
for (uint16 i = 0; i < _hotspots[hotspot].scripts.size(); i++)
@ -1022,6 +993,21 @@ void MohawkEngine_Riven::checkSunnerAlertClick() {
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 {
return z.name == name && z.id == id;
}

View File

@ -41,6 +41,7 @@ class RivenExternal;
class RivenConsole;
class RivenSaveLoad;
class RivenOptionsDialog;
class RivenCard;
class RivenSoundManager;
// Riven Stack Types
@ -99,13 +100,6 @@ struct RivenHotspot {
bool enabled;
};
struct Card {
int16 name;
uint16 zipModePlace;
bool hasData;
RivenScriptList scripts;
};
struct ZipMode {
Common::String name;
uint16 id;
@ -128,7 +122,7 @@ public:
Common::RandomSource *_rnd;
RivenScriptManager *_scriptMan;
Card _cardData;
RivenCard *_card;
GUI::Debugger *getDebugger();
@ -152,7 +146,6 @@ private:
// Stack/Card-related functions and variables
uint16 _curCard;
uint16 _curStack;
void loadCard(uint16);
void handleEvents();
// Hotspot related functions and variables
@ -182,8 +175,7 @@ public:
void refreshCard();
Common::String getName(uint16 nameResource, uint16 nameID);
Common::String getStackName(uint16 stack) const;
void runCardScript(uint16 scriptType);
void runUpdateScreenScript() { runCardScript(kCardUpdateScript); }
void runUpdateScreenScript();
uint16 getCurCard() const { return _curCard; }
uint16 getCurStack() const { return _curStack; }
uint16 matchRMAPToCard(uint32);
@ -198,6 +190,7 @@ public:
int32 getCurHotspot() const { return _curHotspot; }
Common::String getHotspotName(uint16 hotspot);
void updateCurrentHotspot();
void addZipVisitedCard(uint16 cardId, uint16 cardNameId);
// Variables
RivenVariableMap _vars;

View 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

View 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

View File

@ -29,6 +29,10 @@
#define DECLARE_OPCODE(x) void x(uint16 op, uint16 argc, uint16 *argv)
namespace Common {
class ReadStream;
}
namespace Mohawk {
// Script Types