Split initScummVars and overload it; this makes it possible to define more VARS in subclasses

svn-id: r17721
This commit is contained in:
Max Horn 2005-04-20 20:34:44 +00:00
parent 9216ca4ed5
commit b724929466
4 changed files with 123 additions and 81 deletions

View File

@ -61,6 +61,7 @@ protected:
virtual const char *getOpcodeDesc(byte i);
virtual void setupScummVars();
virtual void initScummVars();
virtual void decodeParseString();
virtual void readMAXS(int blockSize);
@ -256,6 +257,7 @@ protected:
virtual const char *getOpcodeDesc(byte i);
virtual void setupScummVars();
virtual void initScummVars();
virtual void decodeParseString();
virtual void readIndexFile();
@ -694,6 +696,8 @@ protected:
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
virtual void initScummVars();
virtual void readRoomsOffsets();
virtual void readGlobalObjects();
virtual void readIndexBlock(uint32 blocktype, uint32 itemsize);
@ -763,7 +767,7 @@ protected:
WizParameters _wizParams;
public:
ScummEngine_v72he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) : ScummEngine_v70he(detector, syst, gs, md5sum) {}
ScummEngine_v72he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]);
virtual void scummInit();
@ -773,6 +777,7 @@ protected:
virtual const char *getOpcodeDesc(byte i);
virtual void setupScummVars();
virtual void initScummVars();
virtual void readArrayFromIndexFile();
virtual byte *getStringAddress(int i);
@ -861,6 +866,20 @@ protected:
void o72_getResourceSize();
void o72_setFilePath();
void o72_setWindowCaption();
byte VAR_NUM_ROOMS;
byte VAR_NUM_SCRIPTS;
byte VAR_NUM_SOUNDS;
byte VAR_NUM_COSTUMES;
byte VAR_NUM_IMAGES;
byte VAR_NUM_CHARSETS;
byte VAR_NUM_SPRITE_GROUPS;
byte VAR_NUM_SPRITES;
byte VAR_NUM_PALETTES;
byte VAR_NUM_UNK;
byte VAR_POLYGONS_ONLY;
byte VAR_WINDOWS_VERSION;
byte VAR_WIZ_TCOLOR;
};
class ScummEngine_v80he : public ScummEngine_v72he {
@ -881,6 +900,8 @@ protected:
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
virtual void initScummVars();
void loadImgSpot(int resId, int state, int16 &x, int16 &y);
void loadWizCursor(int resId);
void unknownE0(int x1, int y1, int x, int unk1, int unk2, int type, int id);
@ -949,6 +970,8 @@ protected:
virtual void setupOpcodes();
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
virtual void initScummVars();
virtual void readMAXS(int blockSize);
@ -1126,6 +1149,8 @@ public:
virtual void scummInit();
protected:
virtual void initScummVars();
virtual void readMAXS(int blockSize);
virtual void copyPalColor(int dst, int src);
@ -1197,6 +1222,7 @@ public:
protected:
virtual void setupScummVars();
virtual void initScummVars();
virtual void readMAXS(int blockSize);
virtual void readGlobalObjects();

View File

@ -1046,22 +1046,9 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS
VAR_NUM_SCRIPT_CYCLES = 0xFF;
VAR_SCRIPT_CYCLE = 0xFF;
VAR_NUM_ROOMS = 0xFF;
VAR_NUM_SCRIPTS = 0xFF;
VAR_NUM_SOUNDS = 0xFF;
VAR_NUM_COSTUMES = 0xFF;
VAR_NUM_IMAGES = 0xFF;
VAR_NUM_CHARSETS = 0xFF;
VAR_NUM_GLOBAL_OBJS = 0xFF;
VAR_NUM_SPRITE_GROUPS = 0xFF;
VAR_NUM_SPRITES = 0xFF;
VAR_NUM_PALETTES = 0xFF;
VAR_NUM_UNK = 0xFF;
VAR_MOUSE_STATE = 0xFF;
VAR_POLYGONS_ONLY = 0xFF;
VAR_WINDOWS_VERSION = 0xFF;
VAR_KEY_STATE = 0xFF;
VAR_WIZ_TCOLOR = 0xFF;
VAR_MOUSE_STATE = 0xFF;
// Use g_scumm from error() ONLY
g_scumm = this;
@ -1276,6 +1263,23 @@ ScummEngine_v70he::~ScummEngine_v70he() {
free(_heV7RoomOffsets);
}
ScummEngine_v72he::ScummEngine_v72he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16])
: ScummEngine_v70he(detector, syst, gs, md5sum) {
VAR_NUM_ROOMS = 0xFF;
VAR_NUM_SCRIPTS = 0xFF;
VAR_NUM_SOUNDS = 0xFF;
VAR_NUM_COSTUMES = 0xFF;
VAR_NUM_IMAGES = 0xFF;
VAR_NUM_CHARSETS = 0xFF;
VAR_NUM_SPRITE_GROUPS = 0xFF;
VAR_NUM_SPRITES = 0xFF;
VAR_NUM_PALETTES = 0xFF;
VAR_NUM_UNK = 0xFF;
VAR_POLYGONS_ONLY = 0xFF;
VAR_WINDOWS_VERSION = 0xFF;
VAR_WIZ_TCOLOR = 0xFF;
}
#pragma mark -
#pragma mark --- Initialization ---
#pragma mark -

View File

@ -405,7 +405,7 @@ public:
int init(GameDetector &detector);
virtual void setupScummVars();
void initScummVars();
virtual void initScummVars();
virtual void scummInit();
@ -1337,22 +1337,10 @@ public:
byte VAR_SCRIPT_CYCLE;
byte VAR_NUM_SCRIPT_CYCLES;
byte VAR_NUM_ROOMS;
byte VAR_NUM_SCRIPTS;
byte VAR_NUM_SOUNDS;
byte VAR_NUM_COSTUMES;
byte VAR_NUM_IMAGES;
byte VAR_NUM_CHARSETS;
byte VAR_NUM_GLOBAL_OBJS;
byte VAR_NUM_SPRITE_GROUPS;
byte VAR_NUM_SPRITES;
byte VAR_NUM_PALETTES;
byte VAR_NUM_UNK;
byte VAR_NUM_GLOBAL_OBJS; // Exists both in V7 and in V72HE
byte VAR_KEY_STATE; // Used in parseEvents()
byte VAR_MOUSE_STATE;
byte VAR_POLYGONS_ONLY;
byte VAR_WINDOWS_VERSION;
byte VAR_KEY_STATE;
byte VAR_WIZ_TCOLOR;
};
} // End of namespace Scumm

View File

@ -480,60 +480,97 @@ void ScummEngine_v8::setupScummVars() {
VAR_SYNC = 134;
}
void ScummEngine::initScummVars() {
void ScummEngine_v2::initScummVars() {
// This needs to be at least greater than 40 to get the more
// elaborate version of the EGA Zak into. I don't know where
// else it makes any difference.
if (_gameId == GID_ZAK)
VAR(VAR_MACHINE_SPEED) = 0x7FFF;
}
if (_version <= 2)
return;
void ScummEngine_v5::initScummVars() {
ScummEngine::initScummVars();
if (_version >= 4 && _version <= 5)
VAR(VAR_V5_TALK_STRING_Y) = -0x50;
if (_version == 8) { // Fixme: How do we deal with non-cd installs?
if (VAR_CURRENT_LIGHTS != 0xFF) {
// Setup light
VAR(VAR_CURRENT_LIGHTS) = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen;
}
if (_gameId == GID_MONKEY || _gameId == GID_MONKEY_SEGA)
_scummVars[74] = 1225;
}
void ScummEngine_v7::initScummVars() {
ScummEngine::initScummVars();
if (_version == 8) { // FIXME: How do we deal with non-cd installs?
VAR(VAR_CURRENTDISK) = 1;
VAR(VAR_LANGUAGE) = _language;
} else if (_version >= 7) {
} else {
VAR(VAR_V6_EMSSPACE) = 10000;
VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
} else if (_heversion >= 70) {
VAR(VAR_NUM_SOUND_CHANNELS) = 8;
VAR(VAR_MUSIC_CHANNEL) = 1;
VAR(VAR_SOUND_CHANNEL) = 2;
}
if (_heversion >= 72) {
VAR(VAR_NUM_ROOMS) = _numRooms - 1;
VAR(VAR_NUM_SCRIPTS) = _numScripts - 1;
VAR(VAR_NUM_SOUNDS) = _numSounds - 1;
VAR(VAR_NUM_COSTUMES) = _numCostumes - 1;
VAR(VAR_NUM_IMAGES) = _numImages - 1;
VAR(VAR_NUM_CHARSETS) = _numCharsets - 1;
VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
}
if (_heversion >= 80) {
VAR(78) = 1;
VAR(VAR_WINDOWS_VERSION) = 40;
VAR(VAR_DEFAULT_TALK_DELAY) = 60;
VAR(VAR_VOICE_MODE) = ConfMan.getBool("subtitles");
}
VAR(VAR_NUM_ACTIVE_SOUND_CHANNELS) = (_heversion >= 90) ? 8 : 4;
}
if (_heversion >= 90) {
VAR(VAR_SCRIPT_CYCLE) = 1;
VAR(VAR_NUM_SCRIPT_CYCLES) = 1;
}
if (_heversion >= 95) {
VAR(VAR_NUM_SPRITE_GROUPS) = MAX(64, _numSprites / 4) - 1;
VAR(VAR_NUM_SPRITES) = _numSprites - 1;
VAR(VAR_WIZ_TCOLOR) = 5;
}
if (_heversion >= 99) {
VAR(VAR_NUM_PALETTES) = _numPalettes;
VAR(VAR_NUM_UNK) = _numUnk;
}
} else {
void ScummEngine_v70he::initScummVars() {
ScummEngine::initScummVars();
VAR(VAR_NUM_SOUND_CHANNELS) = 8;
VAR(VAR_MUSIC_CHANNEL) = 1;
VAR(VAR_SOUND_CHANNEL) = 2;
}
void ScummEngine_v72he::initScummVars() {
ScummEngine_v70he::initScummVars();
VAR(VAR_NUM_ROOMS) = _numRooms - 1;
VAR(VAR_NUM_SCRIPTS) = _numScripts - 1;
VAR(VAR_NUM_SOUNDS) = _numSounds - 1;
VAR(VAR_NUM_COSTUMES) = _numCostumes - 1;
VAR(VAR_NUM_IMAGES) = _numImages - 1;
VAR(VAR_NUM_CHARSETS) = _numCharsets - 1;
VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
}
void ScummEngine_v80he::initScummVars() {
ScummEngine_v72he::initScummVars();
VAR(78) = 1;
VAR(VAR_WINDOWS_VERSION) = 40;
VAR(VAR_NUM_ACTIVE_SOUND_CHANNELS) = (_heversion >= 90) ? 8 : 4;
}
void ScummEngine_v90he::initScummVars() {
ScummEngine_v80he::initScummVars();
VAR(VAR_SCRIPT_CYCLE) = 1;
VAR(VAR_NUM_SCRIPT_CYCLES) = 1;
if (_heversion >= 95) {
VAR(VAR_NUM_SPRITE_GROUPS) = MAX(64, _numSprites / 4) - 1;
VAR(VAR_NUM_SPRITES) = _numSprites - 1;
VAR(VAR_WIZ_TCOLOR) = 5;
}
}
void ScummEngine_v99he::initScummVars() {
ScummEngine_v90he::initScummVars();
VAR(VAR_NUM_PALETTES) = _numPalettes;
VAR(VAR_NUM_UNK) = _numUnk;
}
void ScummEngine::initScummVars() {
if (_heversion < 70 && _version <= 6) {
switch (_midiDriver) {
case MD_NULL: VAR(VAR_SOUNDCARD) = 0; break;
case MD_PCSPK:
@ -610,19 +647,6 @@ void ScummEngine::initScummVars() {
VAR(VAR_V6_EMSSPACE) = 10000;
}
if (VAR_CURRENT_LIGHTS != 0xFF) {
// Setup light
VAR(VAR_CURRENT_LIGHTS) = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen;
}
if (_gameId == GID_MONKEY || _gameId == GID_MONKEY_SEGA)
_scummVars[74] = 1225;
if (_version >= 7) {
VAR(VAR_DEFAULT_TALK_DELAY) = 60;
VAR(VAR_VOICE_MODE) = ConfMan.getBool("subtitles");
}
if (VAR_FADE_DELAY != 0xFF)
VAR(VAR_FADE_DELAY) = 3;