Split game engines, to allow further cleanups.

svn-id: r26481
This commit is contained in:
Travis Howell 2007-04-15 05:04:48 +00:00
parent 1c00843f2b
commit 2d3e77db85
20 changed files with 192 additions and 90 deletions

View file

@ -72,6 +72,35 @@ static const GameSpecificSettings puzzlepack_settings = {
};
#endif
AGOSEngine_PuzzlePack::AGOSEngine_PuzzlePack(OSystem *system)
: AGOSEngine_Feeble(system) {
}
AGOSEngine_Feeble::AGOSEngine_Feeble(OSystem *system)
: AGOSEngine_Simon2(system) {
}
AGOSEngine_Simon2::AGOSEngine_Simon2(OSystem *system)
: AGOSEngine_Simon1(system) {
}
AGOSEngine_Simon1::AGOSEngine_Simon1(OSystem *system)
: AGOSEngine_Waxworks(system) {
}
AGOSEngine_Waxworks::AGOSEngine_Waxworks(OSystem *system)
: AGOSEngine_Elvira2(system) {
}
AGOSEngine_Elvira2::AGOSEngine_Elvira2(OSystem *system)
: AGOSEngine_Elvira1(system) {
}
AGOSEngine_Elvira1::AGOSEngine_Elvira1(OSystem *system)
: AGOSEngine(system) {
}
AGOSEngine::AGOSEngine(OSystem *syst)
: Engine(syst) {
_vcPtr = 0;

View file

@ -130,17 +130,10 @@ class AGOSEngine : public Engine {
GUI::Debugger *getDebugger();
public:
typedef void (AGOSEngine::*OpcodeProc) ();
void setupCommonOpcodes(OpcodeProc *op);
void setupElvira1Opcodes(OpcodeProc *op);
void setupElvira2Opcodes(OpcodeProc *op);
void setupWaxworksOpcodes(OpcodeProc *op);
void setupSimon1Opcodes(OpcodeProc *op);
void setupSimon2Opcodes(OpcodeProc *op);
void setupFeebleOpcodes(OpcodeProc *op);
void setupPuzzleOpcodes(OpcodeProc *op);
virtual void setupOpcodes(OpcodeProc *op);
void setupOpcodes();
OpcodeProc _opcode_table[300];
@ -152,16 +145,8 @@ class AGOSEngine : public Engine {
VgaOpcodeProc _vga_opcode_table[100];
uint _numVideoOpcodes;
void setupCommonVideoOpcodes(VgaOpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
void setupElvira1VideoOpcodes(VgaOpcodeProc *op);
void setupElvira2VideoOpcodes(VgaOpcodeProc *op);
void setupWaxworksVideoOpcodes(VgaOpcodeProc *op);
void setupSimon1VideoOpcodes(VgaOpcodeProc *op);
void setupSimon2VideoOpcodes(VgaOpcodeProc *op);
void setupFeebleVideoOpcodes(VgaOpcodeProc *op);
public:
const AGOSGameDescription *_gameDescription;
bool initGame(void);
@ -777,8 +762,7 @@ protected:
void handleMouseMoved();
void initMouse();
void loadMouseImage();
void drawMousePointer();
void drawMousePointer_FF();
virtual void drawMousePointer();
void drawMousePart(int image, byte x, byte y);
void addArrows(WindowBlock *window);
@ -788,9 +772,10 @@ protected:
bool hasIcon(Item *item);
uint itemGetIconNumber(Item *item);
uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);
void drawIconArray(uint i, Item *item_ptr, int line, int classMask);
void drawIconArray_FF(uint i, Item *item_ptr, int line, int classMask);
void drawIconArray_Simon(uint i, Item *item_ptr, int line, int classMask);
virtual void drawIconArray(uint i, Item *item_ptr, int line, int classMask);
void removeIconArray(uint num);
void loadIconData();
@ -1425,6 +1410,82 @@ protected:
char *genSaveName(int slot);
};
class AGOSEngine_Elvira1 : public AGOSEngine {
public:
AGOSEngine_Elvira1(OSystem *system);
//~AGOSEngine_Elvira1();
virtual void setupOpcodes(OpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
private:
};
class AGOSEngine_Elvira2 : public AGOSEngine_Elvira1 {
public:
AGOSEngine_Elvira2(OSystem *system);
//~AGOSEngine_Elvira2();
virtual void setupOpcodes(OpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
private:
};
class AGOSEngine_Waxworks : public AGOSEngine_Elvira2 {
public:
AGOSEngine_Waxworks(OSystem *system);
//~AGOSEngine_Waxworks();
virtual void setupOpcodes(OpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
private:
};
class AGOSEngine_Simon1 : public AGOSEngine_Waxworks {
public:
AGOSEngine_Simon1(OSystem *system);
//~AGOSEngine_Simon1();
virtual void setupOpcodes(OpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
private:
};
class AGOSEngine_Simon2 : public AGOSEngine_Simon1 {
public:
AGOSEngine_Simon2(OSystem *system);
//~AGOSEngine_Simon2();
virtual void setupOpcodes(OpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
private:
};
class AGOSEngine_Feeble : public AGOSEngine_Simon2 {
public:
AGOSEngine_Feeble(OSystem *system);
//~AGOSEngine_Feeble();
virtual void setupOpcodes(OpcodeProc *op);
virtual void setupVideoOpcodes(VgaOpcodeProc *op);
virtual void drawMousePointer();
protected:
virtual void drawIconArray(uint i, Item *item_ptr, int line, int classMask);
private:
};
class AGOSEngine_PuzzlePack : public AGOSEngine_Feeble {
public:
AGOSEngine_PuzzlePack(OSystem *system);
//~AGOSEngine_PuzzlePack();
virtual void setupOpcodes(OpcodeProc *op);
private:
};
} // End of namespace AGOS
#endif

View file

@ -436,10 +436,7 @@ boxstuff:
_lastHitArea3 = (HitArea *) -1;
get_out:
if (getGameType() == GType_FF)
drawMousePointer_FF();
else
drawMousePointer();
drawMousePointer();
_needHitAreaRecalc = 0;
_litBoxFlag = 0;
@ -545,7 +542,7 @@ void AGOSEngine::drawMousePointer() {
}
}
void AGOSEngine::drawMousePointer_FF() {
void AGOSEngine_Feeble::drawMousePointer() {
uint cursor;
int image, offs;

View file

@ -96,7 +96,6 @@ void AGOSEngine::animateSprites() {
void AGOSEngine::animateSpritesDebug() {
VgaSprite *vsp;
VgaPointersEntry *vpe;
VC10_state state;
if (_paletteFlag == 2)
_paletteFlag = 1;
@ -127,7 +126,6 @@ void AGOSEngine::animateSpritesDebug() {
void AGOSEngine::animateSpritesByY() {
VgaSprite *vsp;
VgaPointersEntry *vpe;
VC10_state state;
int16 spriteTable[180][2];
byte *src;

View file

@ -26,6 +26,7 @@
#include "base/plugins.h"
#include "common/advancedDetector.h"
#include "common/config-manager.h"
#include "agos/agos.h"
@ -102,8 +103,54 @@ static const Common::ADParams detectionParams = {
Common::kADFlagAugmentPreferredTarget
};
ADVANCED_DETECTOR_DEFINE_PLUGIN(AGOS, AGOS::AGOSEngine, detectionParams);
GameList Engine_AGOS_gameIDList() {
return GameList(simonGames);
}
GameDescriptor Engine_AGOS_findGameID(const char *gameid) {
return Common::AdvancedDetector::findGameID(gameid, detectionParams);
}
GameList Engine_AGOS_detectGames(const FSList &fslist) {
return Common::AdvancedDetector::detectAllGames(fslist, detectionParams);
}
PluginError Engine_AGOS_create(OSystem *syst, Engine **engine) {
assert(engine);
const char *gameid = ConfMan.get("gameid").c_str();
//const AGOSGameDescription gd = (const AGOSGameDescription *)Common::AdvancedDetector::detectBestMatchingGame(detectionParams);
//if (gd == 0) {
// return kNoGameDataFoundError;
//}
if (!scumm_stricmp("elvira1", gameid)) {
*engine = new AGOS::AGOSEngine_Elvira1(syst);
} else if (!scumm_stricmp("elvira2", gameid)) {
*engine = new AGOS::AGOSEngine_Elvira2(syst);
} else if (!scumm_stricmp("waxworks", gameid)) {
*engine = new AGOS::AGOSEngine_Waxworks(syst);
} else if (!scumm_stricmp("simon1", gameid)) {
*engine = new AGOS::AGOSEngine_Simon1(syst);
} else if (!scumm_stricmp("simon2", gameid)) {
*engine = new AGOS::AGOSEngine_Simon2(syst);
} else if (!scumm_stricmp("feeble", gameid)) {
*engine = new AGOS::AGOSEngine_Feeble(syst);
} else if (!scumm_stricmp("jumble", gameid)) {
*engine = new AGOS::AGOSEngine_PuzzlePack(syst);
} else if (!scumm_stricmp("puzzle", gameid)) {
*engine = new AGOS::AGOSEngine_PuzzlePack(syst);
} else if (!scumm_stricmp("swampy", gameid)) {
*engine = new AGOS::AGOSEngine_PuzzlePack(syst);
} else {
error("AGOS engine created with invalid gameid");
}
return kNoError;
}
REGISTER_PLUGIN(AGOS, "AGOS", "AGOS (C) Adventure Soft");
namespace AGOS {

View file

@ -243,14 +243,6 @@ void AGOSEngine::drawIcon(WindowBlock *window, uint icon, uint x, uint y) {
}
void AGOSEngine::drawIconArray(uint num, Item *itemRef, int line, int classMask) {
if (getGameType() == GType_FF) {
drawIconArray_FF(num, itemRef, line, classMask);
} else {
drawIconArray_Simon(num, itemRef, line, classMask);
}
}
void AGOSEngine::drawIconArray_Simon(uint num, Item *itemRef, int line, int classMask) {
Item *item_ptr_org = itemRef;
WindowBlock *window;
uint width, height;
@ -350,7 +342,7 @@ void AGOSEngine::drawIconArray_Simon(uint num, Item *itemRef, int line, int clas
}
}
void AGOSEngine::drawIconArray_FF(uint num, Item *itemRef, int line, int classMask) {
void AGOSEngine_Feeble::drawIconArray(uint num, Item *itemRef, int line, int classMask) {
Item *item_ptr_org = itemRef;
WindowBlock *window;
uint16 flagnumber = 201;

View file

@ -36,7 +36,7 @@ extern bool isSmartphone(void);
namespace AGOS {
void AGOSEngine::setupCommonOpcodes(OpcodeProc *op) {
void AGOSEngine::setupOpcodes(OpcodeProc *op) {
// A common set of opcodes for Elvira 2 and later.
op[1] = &AGOSEngine::o_at;
@ -147,25 +147,13 @@ void AGOSEngine::setupOpcodes() {
switch (getGameType()) {
case GType_ELVIRA1:
setupElvira1Opcodes(_opcode_table);
break;
case GType_ELVIRA2:
setupElvira2Opcodes(_opcode_table);
break;
case GType_WW:
setupWaxworksOpcodes(_opcode_table);
break;
case GType_SIMON1:
setupSimon1Opcodes(_opcode_table);
break;
case GType_SIMON2:
setupSimon2Opcodes(_opcode_table);
break;
case GType_FF:
setupFeebleOpcodes(_opcode_table);
break;
case GType_PP:
setupPuzzleOpcodes(_opcode_table);
setupOpcodes(_opcode_table);
break;
default:
error("setupOpcodes: Unknown game");

View file

@ -28,7 +28,7 @@
namespace AGOS {
void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) {
void AGOSEngine_Elvira1::setupOpcodes(OpcodeProc *op) {
op[0] = &AGOSEngine::o_at;
op[1] = &AGOSEngine::o_notAt;
op[2] = &AGOSEngine::oe1_present;

View file

@ -27,8 +27,8 @@
namespace AGOS {
void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) {
setupCommonOpcodes(op);
void AGOSEngine_Elvira2::setupOpcodes(OpcodeProc *op) {
AGOSEngine::setupOpcodes(op);
op[8] = &AGOSEngine::oe1_isNotAt;
op[9] = &AGOSEngine::oe1_sibling;

View file

@ -30,8 +30,8 @@
namespace AGOS {
void AGOSEngine::setupFeebleOpcodes(OpcodeProc *op) {
setupCommonOpcodes(op);
void AGOSEngine_Feeble::setupOpcodes(OpcodeProc *op) {
AGOSEngine::setupOpcodes(op);
op[23] = &AGOSEngine::off_chance;
op[37] = &AGOSEngine::off_jumpOut;

View file

@ -29,8 +29,8 @@
namespace AGOS {
void AGOSEngine::setupPuzzleOpcodes(OpcodeProc *op) {
setupCommonOpcodes(op);
void AGOSEngine_PuzzlePack::setupOpcodes(OpcodeProc *op) {
AGOSEngine::setupOpcodes(op);
op[23] = &AGOSEngine::off_chance;
op[30] = &AGOSEngine::opp_iconifyWindow;

View file

@ -33,8 +33,8 @@ extern bool isSmartphone(void);
namespace AGOS {
void AGOSEngine::setupSimon1Opcodes(OpcodeProc *op) {
setupCommonOpcodes(op);
void AGOSEngine_Simon1::setupOpcodes(OpcodeProc *op) {
AGOSEngine::setupOpcodes(op);
op[65] = &AGOSEngine::oww_addTextBox;
op[66] = &AGOSEngine::oww_setShortText;

View file

@ -27,8 +27,8 @@
namespace AGOS {
void AGOSEngine::setupSimon2Opcodes(OpcodeProc *op) {
setupCommonOpcodes(op);
void AGOSEngine_Simon2::setupOpcodes(OpcodeProc *op) {
AGOSEngine::setupOpcodes(op);
op[65] = &AGOSEngine::oww_addTextBox;
op[66] = &AGOSEngine::oww_setShortText;

View file

@ -29,8 +29,8 @@
namespace AGOS {
void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) {
setupCommonOpcodes(op);
void AGOSEngine_Waxworks::setupOpcodes(OpcodeProc *op) {
AGOSEngine::setupOpcodes(op);
op[8] = &AGOSEngine::oe1_isNotAt;
op[9] = &AGOSEngine::oe1_sibling;

View file

@ -33,7 +33,7 @@
namespace AGOS {
// Opcode tables
void AGOSEngine::setupCommonVideoOpcodes(VgaOpcodeProc *op) {
void AGOSEngine::setupVideoOpcodes(VgaOpcodeProc *op) {
op[1] = &AGOSEngine::vc1_fadeOut;
op[2] = &AGOSEngine::vc2_call;
op[3] = &AGOSEngine::vc3_loadSprite;
@ -81,7 +81,7 @@ void AGOSEngine::setupCommonVideoOpcodes(VgaOpcodeProc *op) {
op[55] = &AGOSEngine::vc55_moveBox;
}
void AGOSEngine::setupElvira1VideoOpcodes(VgaOpcodeProc *op) {
void AGOSEngine_Elvira1::setupVideoOpcodes(VgaOpcodeProc *op) {
op[1] = &AGOSEngine::vc1_fadeOut;
op[2] = &AGOSEngine::vc2_call;
op[3] = &AGOSEngine::vc3_loadSprite;
@ -130,23 +130,13 @@ void AGOSEngine::setupVgaOpcodes() {
switch (getGameType()) {
case GType_ELVIRA1:
setupElvira1VideoOpcodes(_vga_opcode_table);
break;
case GType_ELVIRA2:
setupElvira2VideoOpcodes(_vga_opcode_table);
break;
case GType_WW:
setupWaxworksVideoOpcodes(_vga_opcode_table);
break;
case GType_SIMON1:
setupSimon1VideoOpcodes(_vga_opcode_table);
break;
case GType_SIMON2:
setupSimon2VideoOpcodes(_vga_opcode_table);
break;
case GType_FF:
case GType_PP:
setupFeebleVideoOpcodes(_vga_opcode_table);
setupVideoOpcodes(_vga_opcode_table);
break;
default:
error("setupVgaOpcodes: Unknown game");

View file

@ -31,8 +31,8 @@
namespace AGOS {
void AGOSEngine::setupElvira2VideoOpcodes(VgaOpcodeProc *op) {
setupCommonVideoOpcodes(op);
void AGOSEngine_Elvira2::setupVideoOpcodes(VgaOpcodeProc *op) {
AGOSEngine::setupVideoOpcodes(op);
op[17] = &AGOSEngine::vc17_waitEnd;
op[19] = &AGOSEngine::vc19_loop;

View file

@ -28,8 +28,8 @@
namespace AGOS {
void AGOSEngine::setupFeebleVideoOpcodes(VgaOpcodeProc *op) {
setupSimon2VideoOpcodes(op);
void AGOSEngine_Feeble::setupVideoOpcodes(VgaOpcodeProc *op) {
AGOSEngine_Simon2::setupVideoOpcodes(op);
op[75] = &AGOSEngine::vc75_setScale;
op[76] = &AGOSEngine::vc76_setScaleXOffs;

View file

@ -29,8 +29,8 @@
namespace AGOS {
void AGOSEngine::setupSimon1VideoOpcodes(VgaOpcodeProc *op) {
setupCommonVideoOpcodes(op);
void AGOSEngine_Simon1::setupVideoOpcodes(VgaOpcodeProc *op) {
AGOSEngine::setupVideoOpcodes(op);
op[11] = &AGOSEngine::vc11_clearPathFinder;
op[17] = &AGOSEngine::vc17_setPathfinderItem;

View file

@ -28,8 +28,8 @@
namespace AGOS {
void AGOSEngine::setupSimon2VideoOpcodes(VgaOpcodeProc *op) {
setupSimon1VideoOpcodes(op);
void AGOSEngine_Simon2::setupVideoOpcodes(VgaOpcodeProc *op) {
AGOSEngine_Simon1::setupVideoOpcodes(op);
op[56] = &AGOSEngine::vc56_delayLong;
op[58] = &AGOSEngine::vc58_changePriority;

View file

@ -31,8 +31,8 @@
namespace AGOS {
void AGOSEngine::setupWaxworksVideoOpcodes(VgaOpcodeProc *op) {
setupElvira2VideoOpcodes(op);
void AGOSEngine_Waxworks::setupVideoOpcodes(VgaOpcodeProc *op) {
AGOSEngine_Elvira2::setupVideoOpcodes(op);
op[58] = &AGOSEngine::vc58_checkCodeWheel;
op[60] = &AGOSEngine::vc60_stopAnimation;