scummvm/engines/mohawk/riven.h
2011-08-11 13:14:03 -04:00

215 lines
5.5 KiB
C++

/* 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 MOHAWK_RIVEN_H
#define MOHAWK_RIVEN_H
#include "mohawk/installer_archive.h"
#include "mohawk/mohawk.h"
#include "mohawk/riven_scripts.h"
#include "gui/saveload.h"
#include "common/hashmap.h"
#include "common/hash-str.h"
#include "common/random.h"
#include "common/rect.h"
namespace Mohawk {
struct MohawkGameDescription;
class MohawkArchive;
class RivenGraphics;
class RivenExternal;
class RivenConsole;
class RivenSaveLoad;
class RivenOptionsDialog;
#define RIVEN_STACKS 8
// Riven Stack Types
enum {
aspit = 0, // Main Menu, Books, Setup
bspit = 1, // Book-Making Island
gspit = 2, // Garden Island
jspit = 3, // Jungle Island
ospit = 4, // 233rd Age (Gehn's Office)
pspit = 5, // Prison Island
rspit = 6, // Rebel Age (Tay)
tspit = 7 // Temple Island
};
// NAME Resource ID's
enum {
CardNames = 1,
HotspotNames = 2,
ExternalCommandNames = 3,
VariableNames = 4,
StackNames = 5
};
// Rects for the inventory object positions (initialized in
// MohawkEngine_Riven's constructor).
extern Common::Rect *g_atrusJournalRect1;
extern Common::Rect *g_atrusJournalRect2;
extern Common::Rect *g_cathJournalRect2;
extern Common::Rect *g_atrusJournalRect3;
extern Common::Rect *g_cathJournalRect3;
extern Common::Rect *g_trapBookRect3;
extern Common::Rect *g_demoExitRect;
struct RivenHotspot {
uint16 blstID;
int16 name_resource;
Common::Rect rect;
uint16 u0;
uint16 mouse_cursor;
uint16 index;
int16 u1;
int16 zipModeHotspot;
RivenScriptList scripts;
bool enabled;
};
struct Card {
int16 name;
uint16 zipModePlace;
bool hasData;
RivenScriptList scripts;
};
struct ZipMode {
Common::String name;
uint16 id;
bool operator== (const ZipMode& z) const;
};
typedef Common::HashMap<Common::String, uint32, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> RivenVariableMap;
class MohawkEngine_Riven : public MohawkEngine {
protected:
Common::Error run();
public:
MohawkEngine_Riven(OSystem *syst, const MohawkGameDescription *gamedesc);
virtual ~MohawkEngine_Riven();
RivenGraphics *_gfx;
RivenExternal *_externalScriptHandler;
Common::RandomSource *_rnd;
RivenScriptManager *_scriptMan;
Card _cardData;
GUI::Debugger *getDebugger();
bool canLoadGameStateCurrently() { return true; }
bool canSaveGameStateCurrently() { return true; }
Common::Error loadGameState(int slot);
Common::Error saveGameState(int slot, const Common::String &desc);
bool hasFeature(EngineFeature f) const;
typedef void (*TimerProc)(MohawkEngine_Riven *vm);
void doVideoTimer(VideoHandle handle, bool force);
private:
MohawkArchive *_extrasFile; // We need a separate handle for the extra data
RivenConsole *_console;
RivenSaveLoad *_saveLoad;
RivenOptionsDialog *_optionsDialog;
InstallerArchive _installerArchive;
// Stack/Card-related functions and variables
uint16 _curCard;
uint16 _curStack;
void loadCard(uint16);
void handleEvents();
// Hotspot related functions and variables
uint16 _hotspotCount;
void loadHotspots(uint16);
void checkInventoryClick();
bool _showHotspots;
void updateZipMode();
void checkHotspotChange();
// Variables
void initVars();
// Timer
TimerProc _timerProc;
uint32 _timerTime;
// Miscellaneous
bool _gameOver;
bool _ignoreNextMouseUp;
void checkSunnerAlertClick();
public:
// Stack/card/script funtions
void changeToCard(uint16 dest);
void changeToStack(uint16);
void refreshCard();
Common::String getName(uint16 nameResource, uint16 nameID);
Common::String getStackName(uint16 stack) const;
void runCardScript(uint16 scriptType);
void runUpdateScreenScript() { runCardScript(kCardUpdateScript); }
uint16 getCurCard() const { return _curCard; }
uint16 getCurStack() const { return _curStack; }
uint16 matchRMAPToCard(uint32);
uint32 getCurCardRMAP();
// Hotspot functions/variables
RivenHotspot *_hotspots;
int32 _curHotspot;
Common::Array<ZipMode> _zipModeData;
uint16 getHotspotCount() const { return _hotspotCount; }
void runHotspotScript(uint16 hotspot, uint16 scriptType);
int32 getCurHotspot() const { return _curHotspot; }
Common::String getHotspotName(uint16 hotspot);
void updateCurrentHotspot();
// Variables
RivenVariableMap _vars;
uint32 &getStackVar(uint32 index);
// Miscellaneous
void setGameOver() { _gameOver = true; }
void ignoreNextMouseUp() { _ignoreNextMouseUp = true; }
Common::SeekableReadStream *getExtrasResource(uint32 tag, uint16 id);
bool _activatedSLST;
void runLoadDialog();
void delayAndUpdate(uint32 ms);
// Timer
void installTimer(TimerProc proc, uint32 time);
void installCardTimer();
void checkTimer();
void removeTimer();
};
} // End of namespace Mohawk
#endif