diff options
| author | Eugene Sandulenko | 2004-03-01 05:57:30 +0000 | 
|---|---|---|
| committer | Eugene Sandulenko | 2004-03-01 05:57:30 +0000 | 
| commit | 9e894f6bf39aaa9780fd3f27d68e0ce1b5886df8 (patch) | |
| tree | cb970a72bd07ffcb68daf587e45c49781ae93ce5 | |
| parent | b77231a9a365cdcbb268101141b99200e11173b7 (diff) | |
| download | scummvm-rg350-9e894f6bf39aaa9780fd3f27d68e0ce1b5886df8.tar.gz scummvm-rg350-9e894f6bf39aaa9780fd3f27d68e0ce1b5886df8.tar.bz2 scummvm-rg350-9e894f6bf39aaa9780fd3f27d68e0ce1b5886df8.zip | |
Started work on Freddi Fish. Since it is SPU version 7, added new class.
Implemented some SPUv7 specific opcodes
svn-id: r13108
| -rw-r--r-- | scumm/intern.h | 23 | ||||
| -rw-r--r-- | scumm/module.mk | 1 | ||||
| -rw-r--r-- | scumm/script_v7he.cpp | 409 | ||||
| -rw-r--r-- | scumm/scummvm.cpp | 11 | 
4 files changed, 441 insertions, 3 deletions
| diff --git a/scumm/intern.h b/scumm/intern.h index f35638ad7b..9f472177e9 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -597,6 +597,29 @@ protected:  	void o6_readFilePos();  }; +class ScummEngine_v7he : public ScummEngine_v6he { +protected: +	typedef void (ScummEngine_v7he::*OpcodeProcV7he)(); +	struct OpcodeEntryV7he { +		OpcodeProcV7he proc; +		const char *desc; +	}; +	 +	const OpcodeEntryV7he *_opcodesV7he; + +public: +	ScummEngine_v7he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs) : ScummEngine_v6he(detector, syst, gs) {} + +protected: +	virtual void setupOpcodes(); +	virtual void executeOpcode(byte i); +	virtual const char *getOpcodeDesc(byte i); + +	/* Version 7 script opcodes */ +	void o7_objectX(); +	void o7_objectY(); +}; +  class ScummEngine_v7 : public ScummEngine_v6 {  public:  	ScummEngine_v7(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs) : ScummEngine_v6(detector, syst, gs) {} diff --git a/scumm/module.mk b/scumm/module.mk index 9191b03813..c1e61263e4 100644 --- a/scumm/module.mk +++ b/scumm/module.mk @@ -37,6 +37,7 @@ MODULE_OBJS := \  	scumm/script_v5.o \  	scumm/script_v6.o \  	scumm/script_v6he.o \ +	scumm/script_v7he.o \  	scumm/script_v8.o \  	scumm/scummvm.o \  	scumm/sound.o \ diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp new file mode 100644 index 0000000000..e83e8d67f0 --- /dev/null +++ b/scumm/script_v7he.cpp @@ -0,0 +1,409 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001  Ludvig Strigeus + * Copyright (C) 2001-2004 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * $Header + * + */ + + +#include "stdafx.h" + +#include "common/config-manager.h" + +#include "scumm/actor.h" +#include "scumm/charset.h" +#include "scumm/imuse.h" +#include "scumm/imuse_digi/dimuse.h" +#include "scumm/intern.h" +#include "scumm/object.h" +#include "scumm/resource.h" +#include "scumm/scumm.h" +#include "scumm/sound.h" +#include "scumm/verbs.h" +#include "scumm/smush/smush_player.h" + +#include "sound/mididrv.h" +#include "sound/mixer.h" + +namespace Scumm { + +#define OPCODE(x)	{ &ScummEngine_v7he::x, #x } + +void ScummEngine_v7he::setupOpcodes() { +	static const OpcodeEntryV7he opcodes[256] = { +		/* 00 */ +		OPCODE(o6_pushByte), +		OPCODE(o6_pushWord), +		OPCODE(o6_pushByteVar), +		OPCODE(o6_pushWordVar), +		/* 04 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteArrayRead), +		OPCODE(o6_wordArrayRead), +		/* 08 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteArrayIndexedRead), +		OPCODE(o6_wordArrayIndexedRead), +		/* 0C */ +		OPCODE(o6_dup), +		OPCODE(o6_not), +		OPCODE(o6_eq), +		OPCODE(o6_neq), +		/* 10 */ +		OPCODE(o6_gt), +		OPCODE(o6_lt), +		OPCODE(o6_le), +		OPCODE(o6_ge), +		/* 14 */ +		OPCODE(o6_add), +		OPCODE(o6_sub), +		OPCODE(o6_mul), +		OPCODE(o6_div), +		/* 18 */ +		OPCODE(o6_land), +		OPCODE(o6_lor), +		OPCODE(o6_pop), +		OPCODE(o6_invalid), +		/* 1C */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 20 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 24 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 28 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 2C */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 30 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 34 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 38 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 3C */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* 40 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_writeByteVar), +		OPCODE(o6_writeWordVar), +		/* 44 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteArrayWrite), +		OPCODE(o6_wordArrayWrite), +		/* 48 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteArrayIndexedWrite), +		OPCODE(o6_wordArrayIndexedWrite), +		/* 4C */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteVarInc), +		OPCODE(o6_wordVarInc), +		/* 50 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteArrayInc), +		OPCODE(o6_wordArrayInc), +		/* 54 */ +		OPCODE(o7_objectX), +		OPCODE(o7_objectY), +		OPCODE(o6_byteVarDec), +		OPCODE(o6_wordVarDec), +		/* 58 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_byteArrayDec), +		OPCODE(o6_wordArrayDec), +		/* 5C */ +		OPCODE(o6_if), +		OPCODE(o6_ifNot), +		OPCODE(o6_startScript), +		OPCODE(o6_startScriptQuick), +		/* 60 */ +		OPCODE(o6_startObject), +		OPCODE(o6_drawObject), +		OPCODE(o6_drawObjectAt), +		OPCODE(o6_drawBlastObject), +		/* 64 */ +		OPCODE(o6_setBlastObjectWindow), +		OPCODE(o6_stopObjectCode), +		OPCODE(o6_stopObjectCode), +		OPCODE(o6_endCutscene), +		/* 68 */ +		OPCODE(o6_cutscene), +		OPCODE(o6_stopMusic), +		OPCODE(o6_freezeUnfreeze), +		OPCODE(o6_cursorCommand), +		/* 6C */ +		OPCODE(o6_breakHere), +		OPCODE(o6_ifClassOfIs), +		OPCODE(o6_setClass), +		OPCODE(o6_getState), +		/* 70 */ +		OPCODE(o6_setState), +		OPCODE(o6_setOwner), +		OPCODE(o6_getOwner), +		OPCODE(o6_jump), +		/* 74 */ +		OPCODE(o6_startSound), +		OPCODE(o6_stopSound), +		OPCODE(o6_startMusic), +		OPCODE(o6_stopObjectScript), +		/* 78 */ +		OPCODE(o6_panCameraTo), +		OPCODE(o6_actorFollowCamera), +		OPCODE(o6_setCameraAt), +		OPCODE(o6_loadRoom), +		/* 7C */ +		OPCODE(o6_stopScript), +		OPCODE(o6_walkActorToObj), +		OPCODE(o6_walkActorTo), +		OPCODE(o6_putActorAtXY), +		/* 80 */ +		OPCODE(o6_putActorAtObject), +		OPCODE(o6_faceActor), +		OPCODE(o6_animateActor), +		OPCODE(o6_doSentence), +		/* 84 */ +		OPCODE(o6_pickupObject), +		OPCODE(o6_loadRoomWithEgo), +		OPCODE(o6_invalid), +		OPCODE(o6_getRandomNumber), +		/* 88 */ +		OPCODE(o6_getRandomNumberRange), +		OPCODE(o6_invalid), +		OPCODE(o6_getActorMoving), +		OPCODE(o6_isScriptRunning), +		/* 8C */ +		OPCODE(o6_getActorRoom), +		OPCODE(o6_getObjectX), +		OPCODE(o6_getObjectY), +		OPCODE(o6_getObjectOldDir), +		/* 90 */ +		OPCODE(o6_getActorWalkBox), +		OPCODE(o6_getActorCostume), +		OPCODE(o6_findInventory), +		OPCODE(o6_getInventoryCount), +		/* 94 */ +		OPCODE(o6_getVerbFromXY), +		OPCODE(o6_beginOverride), +		OPCODE(o6_endOverride), +		OPCODE(o6_setObjectName), +		/* 98 */ +		OPCODE(o6_isSoundRunning), +		OPCODE(o6_setBoxFlags), +		OPCODE(o6_createBoxMatrix), +		OPCODE(o6_resourceRoutines), +		/* 9C */ +		OPCODE(o6_roomOps), +		OPCODE(o6_actorOps), +		OPCODE(o6_verbOps), +		OPCODE(o6_getActorFromXY), +		/* A0 */ +		OPCODE(o6_findObject), +		OPCODE(o6_pseudoRoom), +		OPCODE(o6_getActorElevation), +		OPCODE(o6_getVerbEntrypoint), +		/* A4 */ +		OPCODE(o6_arrayOps), +		OPCODE(o6_saveRestoreVerbs), +		OPCODE(o6_drawBox), +		OPCODE(o6_pop), +		/* A8 */ +		OPCODE(o6_getActorWidth), +		OPCODE(o6_wait), +		OPCODE(o6_getActorScaleX), +		OPCODE(o6_getActorAnimCounter1), +		/* AC */ +		OPCODE(o6_soundKludge), +		OPCODE(o6_isAnyOf), +		OPCODE(o6_quitPauseRestart), +		OPCODE(o6_isActorInBox), +		/* B0 */ +		OPCODE(o6_delay), +		OPCODE(o6_delaySeconds), +		OPCODE(o6_delayMinutes), +		OPCODE(o6_stopSentence), +		/* B4 */ +		OPCODE(o6_printLine), +		OPCODE(o6_printCursor), +		OPCODE(o6_printDebug), +		OPCODE(o6_printSystem), +		/* B8 */ +		OPCODE(o6_printActor), +		OPCODE(o6_printEgo), +		OPCODE(o6_talkActor), +		OPCODE(o6_talkEgo), +		/* BC */ +		OPCODE(o6_dimArray), +		OPCODE(o6_dummy), +		OPCODE(o6_startObjectQuick), +		OPCODE(o6_startScriptQuick2), +		/* C0 */ +		OPCODE(o6_dim2dimArray), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* C4 */ +		OPCODE(o6_abs), +		OPCODE(o6_distObjectObject), +		OPCODE(o6_distObjectPt), +		OPCODE(o6_distPtPt), +		/* C8 */ +		OPCODE(o6_kernelGetFunctions), +		OPCODE(o6_kernelSetFunctions), +		OPCODE(o6_delayFrames), +		OPCODE(o6_pickOneOf), +		/* CC */ +		OPCODE(o6_pickOneOfDefault), +		OPCODE(o6_stampObject), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* D0 */ +		OPCODE(o6_getDateTime), +		OPCODE(o6_stopTalking), +		OPCODE(o6_getAnimateVariable), +		OPCODE(o6_invalid), +		/* D4 */ +		OPCODE(o6_shuffle), +		OPCODE(o6_jumpToScript), +		OPCODE(o6_band), +		OPCODE(o6_bor), +		/* D8 */ +		OPCODE(o6_isRoomScriptRunning), +		OPCODE(o6_closeFile), +		OPCODE(o6_openFile), +		OPCODE(o6_readFile), +		/* DC */ +		OPCODE(o6_writeFile), +		OPCODE(o6_findAllObjects), +		OPCODE(o6_deleteFile), +		OPCODE(o6_rename), +		/* E0 */ +		OPCODE(o6_setVolume), +		OPCODE(o6_unknownE1), +		OPCODE(o6_localizeArray), +		OPCODE(o6_pickVarRandom), +		/* E4 */ +		OPCODE(o6_setBoxSet), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* E8 */ +		OPCODE(o6_invalid), +		OPCODE(o6_seekFilePos), +		OPCODE(o6_redimArray), +		OPCODE(o6_readFilePos), +		/* EC */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_unknownEE), +		OPCODE(o6_invalid), +		/* F0 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_readINI), +		/* F4 */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		/* F8 */ +		OPCODE(o6_invalid), +		OPCODE(o6_unknownF9), +		OPCODE(o6_unknownFA), +		OPCODE(o6_invalid), +		/* FC */ +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +		OPCODE(o6_invalid), +	}; + +	_opcodesV7he = opcodes; +} + +void ScummEngine_v7he::executeOpcode(byte i) { +	OpcodeProcV7he op = _opcodesV7he[i].proc; +	(this->*op) (); +} + +const char *ScummEngine_v7he::getOpcodeDesc(byte i) { +	return _opcodesV7he[i].desc; +} + + +void ScummEngine_v7he::o7_objectX() { +	int object = pop(); +	int objnum = getObjectIndex(object); + +	if (objnum == -1) { +		push(0); +		return; +	} + +	push(_objs[objnum].x_pos); +} + + +void ScummEngine_v7he::o7_objectY() { +	int object = pop(); +	int objnum = getObjectIndex(object); + +	if (objnum == -1) { +		push(0); +		return; +	} + +	push(_objs[objnum].y_pos); +} + +} // End of namespace Scumm diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index 4eeba5780b..e59d57e6e8 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -2957,10 +2957,15 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst) {  		engine = new ScummEngine_v5(detector, syst, game);  		break;  	case 6: -		if (game.features & GF_HUMONGOUS) -			engine = new ScummEngine_v6he(detector, syst, game); -		else +		if (game.features & GF_HUMONGOUS) { +			// TODO: probably use another variable with version number +			if (game.features & GF_AFTER_HEV7) +				engine = new ScummEngine_v7he(detector, syst, game); +			else +				engine = new ScummEngine_v6he(detector, syst, game); +		} else {  			engine = new ScummEngine_v6(detector, syst, game); +		}  		break;  	case 7:  		engine = new ScummEngine_v7(detector, syst, game); | 
