[Scummvm-cvs-logs] SF.net SVN: scummvm: [25856] scummvm/trunk/engines/scumm
sev at users.sourceforge.net
sev at users.sourceforge.net
Sun Feb 25 15:47:52 CET 2007
Revision: 25856
http://scummvm.svn.sourceforge.net/scummvm/?rev=25856&view=rev
Author: sev
Date: 2007-02-25 06:47:51 -0800 (Sun, 25 Feb 2007)
Log Message:
-----------
Rename C64 file to V0 as well.
Modified Paths:
--------------
scummvm/trunk/engines/scumm/module.mk
Added Paths:
-----------
scummvm/trunk/engines/scumm/script_v0.cpp
Removed Paths:
-------------
scummvm/trunk/engines/scumm/script_c64.cpp
Modified: scummvm/trunk/engines/scumm/module.mk
===================================================================
--- scummvm/trunk/engines/scumm/module.mk 2007-02-25 14:34:21 UTC (rev 25855)
+++ scummvm/trunk/engines/scumm/module.mk 2007-02-25 14:47:51 UTC (rev 25856)
@@ -41,7 +41,7 @@
resource.o \
room.o \
saveload.o \
- script_c64.o \
+ script_v0.o \
script_v2.o \
script_v5.o \
script_v6.o \
Deleted: scummvm/trunk/engines/scumm/script_c64.cpp
===================================================================
--- scummvm/trunk/engines/scumm/script_c64.cpp 2007-02-25 14:34:21 UTC (rev 25855)
+++ scummvm/trunk/engines/scumm/script_c64.cpp 2007-02-25 14:47:51 UTC (rev 25856)
@@ -1,1050 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001 Ludvig Strigeus
- * Copyright (C) 2001-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/stdafx.h"
-#include "scumm/actor.h"
-#include "scumm/charset.h"
-#include "scumm/intern.h"
-#include "scumm/object.h"
-#include "scumm/scumm.h"
-#include "scumm/verbs.h"
-
-namespace Scumm {
-
-#define OPCODE(x) _OPCODE(ScummEngine_v0, x)
-
-void ScummEngine_v0::setupOpcodes() {
- static const OpcodeEntryC64 opcodes[256] = {
- /* 00 */
- OPCODE(o5_stopObjectCode),
- OPCODE(o2_putActor),
- OPCODE(o5_startMusic),
- OPCODE(o_doSentence),
- /* 04 */
- OPCODE(o_isGreaterEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o5_getDist),
- OPCODE(o5_getActorRoom),
- /* 08 */
- OPCODE(o_isNotEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_setActorBitVar),
- /* 0C */
- OPCODE(o_loadSound),
- OPCODE(o_printEgo_c64),
- OPCODE(o_putActorAtObject),
- OPCODE(o2_clearState02),
- /* 10 */
- OPCODE(o5_breakHere),
- OPCODE(o_animateActor),
- OPCODE(o2_panCameraTo),
- OPCODE(o_lockCostume),
- /* 14 */
- OPCODE(o_print_c64),
- OPCODE(o5_walkActorToActor),
- OPCODE(o5_getRandomNr),
- OPCODE(o_clearState08),
- /* 18 */
- OPCODE(o_jumpRelative),
- OPCODE(o_stopCurrentScript),
- OPCODE(o5_move),
- OPCODE(o_getActorBitVar),
- /* 1C */
- OPCODE(o5_startSound),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifState04),
- /* 20 */
- OPCODE(o5_stopMusic),
- OPCODE(o2_putActor),
- OPCODE(o5_saveLoadGame),
- OPCODE(o_stopCurrentScript),
- /* 24 */
- OPCODE(o_unknown2),
- OPCODE(o5_loadRoom),
- OPCODE(o_getClosestObjActor),
- OPCODE(o2_getActorY),
- /* 28 */
- OPCODE(o_equalZero),
- OPCODE(o_setOwnerOf),
- OPCODE(o2_delay),
- OPCODE(o_setActorBitVar),
- /* 2C */
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_putActorInRoom),
- OPCODE(o_print_c64),
- OPCODE(o2_ifState08),
- /* 30 */
- OPCODE(o_loadCostume),
- OPCODE(o_getBitVar),
- OPCODE(o2_setCameraAt),
- OPCODE(o_lockScript),
- /* 34 */
- OPCODE(o5_getDist),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_walkActorToObject),
- OPCODE(o2_clearState04),
- /* 38 */
- OPCODE(o_isLessEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_subtract),
- OPCODE(o_stopCurrentScript),
- /* 3C */
- OPCODE(o5_stopSound),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifState02),
- /* 40 */
- OPCODE(o_cutscene),
- OPCODE(o2_putActor),
- OPCODE(o2_startScript),
- OPCODE(o_doSentence),
- /* 44 */
- OPCODE(o_isLess),
- OPCODE(o_stopCurrentScript),
- OPCODE(o5_increment),
- OPCODE(o2_getActorX),
- /* 48 */
- OPCODE(o_isEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_loadRoom),
- OPCODE(o_setActorBitVar),
- /* 4C */
- OPCODE(o_loadScript),
- OPCODE(o_lockRoom),
- OPCODE(o_putActorAtObject),
- OPCODE(o2_clearState02),
- /* 50 */
- OPCODE(o_nop),
- OPCODE(o_animateActor),
- OPCODE(o5_actorFollowCamera),
- OPCODE(o_lockSound),
- /* 54 */
- OPCODE(o_setObjectName),
- OPCODE(o5_walkActorToActor),
- OPCODE(o_getActorMoving),
- OPCODE(o_clearState08),
- /* 58 */
- OPCODE(o_beginOverride),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_add),
- OPCODE(o_getActorBitVar),
- /* 5C */
- OPCODE(o5_startSound),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifState04),
- /* 60 */
- OPCODE(o_cursorCommand),
- OPCODE(o2_putActor),
- OPCODE(o2_stopScript),
- OPCODE(o_stopCurrentScript),
- /* 64 */
- OPCODE(o_ifActiveObject),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_getClosestObjActor),
- OPCODE(o5_getActorFacing),
- /* 68 */
- OPCODE(o5_isScriptRunning),
- OPCODE(o_setOwnerOf),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_setActorBitVar),
- /* 6C */
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_putActorInRoom),
- OPCODE(o2_dummy),
- OPCODE(o2_ifState08),
- /* 70 */
- OPCODE(o_lights),
- OPCODE(o_getBitVar),
- OPCODE(o_nop),
- OPCODE(o5_getObjectOwner),
- /* 74 */
- OPCODE(o5_getDist),
- OPCODE(o_printEgo_c64),
- OPCODE(o2_walkActorToObject),
- OPCODE(o2_clearState04),
- /* 78 */
- OPCODE(o_isGreater),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- /* 7C */
- OPCODE(o5_isSoundRunning),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifNotState02),
- /* 80 */
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_putActor),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_doSentence),
- /* 84 */
- OPCODE(o_isGreaterEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_nop),
- OPCODE(o5_getActorRoom),
- /* 88 */
- OPCODE(o_isNotEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_setActorBitVar),
- /* 8C */
- OPCODE(o_loadSound),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_putActorAtObject),
- OPCODE(o2_setState02),
- /* 90 */
- OPCODE(o_pickupObject),
- OPCODE(o_animateActor),
- OPCODE(o2_panCameraTo),
- OPCODE(o_unlockCostume),
- /* 94 */
- OPCODE(o5_print),
- OPCODE(o2_actorFromPos),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_setState08),
- /* 98 */
- OPCODE(o2_restart),
- OPCODE(o_stopCurrentScript),
- OPCODE(o5_move),
- OPCODE(o_getActorBitVar),
- /* 9C */
- OPCODE(o5_startSound),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifNotState04),
- /* A0 */
- OPCODE(o5_stopObjectCode),
- OPCODE(o2_putActor),
- OPCODE(o5_saveLoadGame),
- OPCODE(o_stopCurrentScript),
- /* A4 */
- OPCODE(o_unknown2),
- OPCODE(o5_loadRoom),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_getActorY),
- /* A8 */
- OPCODE(o_notEqualZero),
- OPCODE(o_setOwnerOf),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_setActorBitVar),
- /* AC */
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_putActorInRoom),
- OPCODE(o_print_c64),
- OPCODE(o2_ifNotState08),
- /* B0 */
- OPCODE(o_loadCostume),
- OPCODE(o_getBitVar),
- OPCODE(o2_setCameraAt),
- OPCODE(o_unlockScript),
- /* B4 */
- OPCODE(o5_getDist),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_walkActorToObject),
- OPCODE(o2_setState04),
- /* B8 */
- OPCODE(o_isLessEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_subtract),
- OPCODE(o_stopCurrentScript),
- /* BC */
- OPCODE(o5_stopSound),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifNotState02),
- /* C0 */
- OPCODE(o_endCutscene),
- OPCODE(o2_putActor),
- OPCODE(o2_startScript),
- OPCODE(o_doSentence),
- /* C4 */
- OPCODE(o_isLess),
- OPCODE(o_stopCurrentScript),
- OPCODE(o5_decrement),
- OPCODE(o2_getActorX),
- /* C8 */
- OPCODE(o_isEqual),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_loadRoom),
- OPCODE(o_setActorBitVar),
- /* CC */
- OPCODE(o_loadScript),
- OPCODE(o_unlockRoom),
- OPCODE(o_putActorAtObject),
- OPCODE(o2_setState02),
- /* D0 */
- OPCODE(o_nop),
- OPCODE(o_animateActor),
- OPCODE(o5_actorFollowCamera),
- OPCODE(o_unlockSound),
- /* D4 */
- OPCODE(o_setObjectName),
- OPCODE(o2_actorFromPos),
- OPCODE(o_getActorMoving),
- OPCODE(o_setState08),
- /* D8 */
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_add),
- OPCODE(o_getActorBitVar),
- /* DC */
- OPCODE(o5_startSound),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifNotState04),
- /* E0 */
- OPCODE(o_cursorCommand),
- OPCODE(o2_putActor),
- OPCODE(o2_stopScript),
- OPCODE(o_stopCurrentScript),
- /* E4 */
- OPCODE(o_ifActiveObject),
- OPCODE(o_loadRoomWithEgo),
- OPCODE(o_stopCurrentScript),
- OPCODE(o5_getActorFacing),
- /* E8 */
- OPCODE(o5_isScriptRunning),
- OPCODE(o_setOwnerOf),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_setActorBitVar),
- /* EC */
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_putActorInRoom),
- OPCODE(o2_dummy),
- OPCODE(o2_ifNotState08),
- /* F0 */
- OPCODE(o_lights),
- OPCODE(o_getBitVar),
- OPCODE(o_nop),
- OPCODE(o5_getObjectOwner),
- /* F4 */
- OPCODE(o5_getDist),
- OPCODE(o_stopCurrentScript),
- OPCODE(o2_walkActorToObject),
- OPCODE(o2_setState04),
- /* F8 */
- OPCODE(o_isGreater),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- OPCODE(o_stopCurrentScript),
- /* FC */
- OPCODE(o5_isSoundRunning),
- OPCODE(o_setBitVar),
- OPCODE(o2_walkActorTo),
- OPCODE(o2_ifState02)
- };
-
- _opcodesC64 = opcodes;
-}
-
-#define SENTENCE_SCRIPT 2
-
-#define PARAM_1 0x80
-#define PARAM_2 0x40
-#define PARAM_3 0x20
-
-void ScummEngine_v0::executeOpcode(byte i) {
- OpcodeProcC64 op = _opcodesC64[i].proc;
- (this->*op) ();
-}
-
-int ScummEngine_v0::getVarOrDirectWord(byte mask) {
- return getVarOrDirectByte(mask);
-}
-
-uint ScummEngine_v0::fetchScriptWord() {
- return fetchScriptByte();
-}
-
-const char *ScummEngine_v0::getOpcodeDesc(byte i) {
- return _opcodesC64[i].desc;
-}
-
-int ScummEngine_v0::getObjectFlag() {
- if (_opcode & 0x40)
- return _activeObject;
-
- return fetchScriptByte();
-}
-
-void ScummEngine_v0::decodeParseString() {
- byte buffer[512];
- byte *ptr = buffer;
- byte c;
- bool insertSpace = false;
-
- while ((c = fetchScriptByte())) {
-
- insertSpace = (c & 0x80) != 0;
- c &= 0x7f;
-
- if (c == '/') {
- *ptr++ = 13;
- } else {
- *ptr++ = c;
- }
-
- if (insertSpace)
- *ptr++ = ' ';
-
- }
- *ptr = 0;
-
- int textSlot = 0;
- _string[textSlot].xpos = 0;
- _string[textSlot].ypos = 0;
- _string[textSlot].right = _screenWidth - 1;
- _string[textSlot].center = false;
- _string[textSlot].overhead = false;
-
- if (_actorToPrintStrFor == 0xFF)
- _string[textSlot].color = 14;
-
- actorTalk(buffer);
-}
-
-void ScummEngine_v0::setStateCommon(byte type) {
- int obj = getObjectFlag();
- putState(obj, getState(obj) | type);
-}
-
-void ScummEngine_v0::clearStateCommon(byte type) {
- int obj = getObjectFlag();
- putState(obj, getState(obj) & ~type);
-}
-
-void ScummEngine_v0::ifStateCommon(byte type) {
- int obj = getObjectFlag();
-
- if ((getState(obj) & type) != 0)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::ifNotStateCommon(byte type) {
- int obj = getObjectFlag();
-
- if ((getState(obj) & type) == 0)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::drawSentence() {
- Common::Rect sentenceline;
- const byte *temp;
- int sentencePrep = 0;
-
- if (!(_userState & 32))
- return;
-
- if (getResourceAddress(rtVerb, _activeVerb)) {
- strcpy(_sentenceBuf, (char*)getResourceAddress(rtVerb, _activeVerb));
- } else {
- return;
- }
-
- if (_activeObject > 0) {
- temp = getObjOrActorName(_activeObject);
- if (temp) {
- strcat(_sentenceBuf, " ");
- strcat(_sentenceBuf, (const char*)temp);
- }
-
- if (_verbs[_activeVerb].prep == 0xFF) {
- byte *ptr = getOBCDFromObject(_activeObject);
- assert(ptr);
- sentencePrep = (*(ptr + 11) >> 5);
- } else {
- sentencePrep = _verbs[_activeVerb].prep;
- }
- }
-
- if (sentencePrep > 0 && sentencePrep <= 4) {
- // The prepositions, like the fonts, were hard code in the engine. Thus
- // we have to do that, too, and provde localized versions for all the
- // languages MM/Zak are available in.
- const char *prepositions[][5] = {
- { " ", " in", " with", " on", " to" }, // English
- { " ", " mit", " mit", " mit", " zu" }, // German
- { " ", " dans", " avec", " sur", " <" }, // French
- { " ", " in", " con", " su", " a" }, // Italian
- { " ", " en", " con", " en", " a" }, // Spanish
- };
- int lang;
- switch (_language) {
- case Common::DE_DEU:
- lang = 1;
- break;
- case Common::FR_FRA:
- lang = 2;
- break;
- case Common::IT_ITA:
- lang = 3;
- break;
- case Common::ES_ESP:
- lang = 4;
- break;
- default:
- lang = 0; // Default to english
- }
-
- strcat(_sentenceBuf, prepositions[lang][sentencePrep]);
- }
-
- if (_activeInventory > 0) {
- temp = getObjOrActorName(_activeInventory);
- if (temp) {
- strcat(_sentenceBuf, " ");
- strcat(_sentenceBuf, (const char*)temp);
- }
- }
-
- _string[2].charset = 1;
- _string[2].ypos = virtscr[kVerbVirtScreen].topline;
- _string[2].xpos = 0;
- _string[2].right = virtscr[kVerbVirtScreen].w - 1;
- _string[2].color = 16;
-
- byte string[80];
- char *ptr = _sentenceBuf;
- int i = 0, len = 0;
-
- // Maximum length of printable characters
- int maxChars = 40;
- while (*ptr) {
- if (*ptr != '@')
- len++;
- if (len > maxChars) {
- break;
- }
-
- string[i++] = *ptr++;
-
- }
- string[i] = 0;
-
- sentenceline.top = virtscr[kVerbVirtScreen].topline;
- sentenceline.bottom = virtscr[kVerbVirtScreen].topline + 8;
- sentenceline.left = 0;
- sentenceline.right = virtscr[kVerbVirtScreen].w - 1;
- restoreBackground(sentenceline);
-
- drawString(2, (byte*)string);
-}
-
-void ScummEngine_v0::o_setState08() {
- int obj = getObjectFlag();
- putState(obj, getState(obj) | kObjectState_08);
- markObjectRectAsDirty(obj);
- clearDrawObjectQueue();
-}
-
-void ScummEngine_v0::o_clearState08() {
- int obj = getObjectFlag();
- putState(obj, getState(obj) & ~kObjectState_08);
- markObjectRectAsDirty(obj);
- clearDrawObjectQueue();
-}
-
-void ScummEngine_v0::o_stopCurrentScript() {
- int script;
-
- script = vm.slot[_currentScript].number;
-
- if (_currentScript != 0 && vm.slot[_currentScript].number == script)
- stopObjectCode();
- else
- stopScript(script);
-}
-
-void ScummEngine_v0::o_loadSound() {
- int resid = fetchScriptByte();
- ensureResourceLoaded(rtSound, resid);
-}
-
-void ScummEngine_v0::o_lockSound() {
- int resid = fetchScriptByte();
- _res->lock(rtSound, resid);
-}
-
-void ScummEngine_v0::o_unlockSound() {
- int resid = fetchScriptByte();
- _res->unlock(rtSound, resid);
-}
-
-void ScummEngine_v0::o_loadCostume() {
- int resid = getVarOrDirectByte(PARAM_1);
- ensureResourceLoaded(rtCostume, resid);
-}
-
-void ScummEngine_v0::o_lockCostume() {
- int resid = fetchScriptByte();
- _res->lock(rtCostume, resid);
-}
-
-void ScummEngine_v0::o_unlockCostume() {
- int resid = fetchScriptByte();
- _res->unlock(rtCostume, resid);
-}
-
-void ScummEngine_v0::o_loadScript() {
- int resid = getVarOrDirectByte(PARAM_1);
- ensureResourceLoaded(rtScript, resid);
-}
-
-void ScummEngine_v0::o_lockScript() {
- int resid = fetchScriptByte();
- _res->lock(rtScript, resid);
-}
-
-void ScummEngine_v0::o_unlockScript() {
- int resid = fetchScriptByte();
- _res->unlock(rtScript, resid);
-}
-
-void ScummEngine_v0::o_loadRoom() {
- int resid = getVarOrDirectByte(PARAM_1);
- ensureResourceLoaded(rtRoom, resid);
-}
-
-void ScummEngine_v0::o_loadRoomWithEgo() {
- Actor *a;
- int obj, room, x, y, dir;
-
- obj = fetchScriptByte();
- room = fetchScriptByte();
-
- a = derefActor(VAR(VAR_EGO), "o_loadRoomWithEgo");
-
- a->putActor(0, 0, room);
- _egoPositioned = false;
-
- startScene(a->_room, a, obj);
-
- getObjectXYPos(obj, x, y, dir);
- a->putActor(x, y, _currentRoom);
- a->setDirection(dir + 180);
-
- camera._dest.x = camera._cur.x = a->getPos().x;
- setCameraAt(a->getPos().x, a->getPos().y);
- setCameraFollows(a);
-
- _fullRedraw = true;
-
- resetSentence();
-
- if (x >= 0 && y >= 0) {
- a->startWalkActor(x, y, -1);
- }
-}
-
-void ScummEngine_v0::o_lockRoom() {
- int resid = fetchScriptByte();
- _res->lock(rtRoom, resid);
-}
-
-void ScummEngine_v0::o_unlockRoom() {
- int resid = fetchScriptByte();
- _res->unlock(rtRoom, resid);
-}
-
-void ScummEngine_v0::o_cursorCommand() {
- // TODO
- int state = 0;
-
- _currentMode = fetchScriptByte();
- switch (_currentMode) {
- case 0:
- state = 15;
- break;
- case 1:
- state = 31;
- break;
- case 2:
- break;
- case 3:
- state = 247;
- break;
- }
-
- setUserState(state);
- debug(0, "o_cursorCommand(%d)", _currentMode);
-}
-
-void ScummEngine_v0::o_lights() {
- int a;
-
- a = getVarOrDirectByte(PARAM_1);
- // Convert older light mode values into
- // equivalent values.of later games
- // 0 Darkness
- // 1 Flashlight
- // 2 Lighted area
- if (a == 2)
- _currentLights = 11;
- else if (a == 1)
- _currentLights = 4;
- else
- _currentLights = 0;
-
- _fullRedraw = true;
-}
-
-void ScummEngine_v0::o_animateActor() {
- int act = getVarOrDirectByte(PARAM_1);
- int anim = getVarOrDirectByte(PARAM_2);
- int unk = fetchScriptByte();
- debug(0,"o_animateActor: unk %d", unk);
-
- Actor *a = derefActor(act, "o_animateActor");
- a->animateActor(anim);
-}
-
-void ScummEngine_v0::o_getActorMoving() {
- getResultPos();
- int act = getVarOrDirectByte(PARAM_1);
- Actor *a = derefActor(act, "o_getActorMoving");
- if (a->_moving)
- setResult(1);
- else
- setResult(2);
-}
-
-void ScummEngine_v0::o_putActorAtObject() {
- int obj, x, y;
- Actor *a;
-
- a = derefActor(getVarOrDirectByte(PARAM_1), "o_putActorAtObject");
-
- obj = fetchScriptByte();
- if (whereIsObject(obj) != WIO_NOT_FOUND)
- getObjectXYPos(obj, x, y);
- else {
- x = 30;
- y = 60;
- }
-
- a->putActor(x, y);
-}
-
-void ScummEngine_v0::o_pickupObject() {
- int obj = fetchScriptByte();
- if (obj == 0) {
- obj = _activeObject;
- }
-
- if (obj < 1) {
- error("pickupObject received invalid index %d (script %d)", obj, vm.slot[_currentScript].number);
- }
-
- if (getObjectIndex(obj) == -1)
- return;
-
- if (whereIsObject(obj) == WIO_INVENTORY) /* Don't take an */
- return; /* object twice */
-
- addObjectToInventory(obj, _roomResource);
- markObjectRectAsDirty(obj);
- putOwner(obj, VAR(VAR_EGO));
- putState(obj, getState(obj) | kObjectState_08 | kObjectStateUntouchable);
- clearDrawObjectQueue();
-
- runInventoryScript(1);
-}
-
-void ScummEngine_v0::o_setObjectName() {
- int obj = fetchScriptByte();
- setObjectName(obj);
-}
-
-void ScummEngine_v0::o_nop() {
-}
-
-// TODO: Maybe translate actor flags in future.
-void ScummEngine_v0::o_setActorBitVar() {
- byte act = getVarOrDirectByte(PARAM_1);
- byte mask = getVarOrDirectByte(PARAM_2);
- byte mod = getVarOrDirectByte(PARAM_3);
-
- ActorC64 *a = (ActorC64 *)derefActor(act, "o_setActorBitVar");
- if (mod)
- a->_miscflags |= mask;
- else
- a->_miscflags &= ~mask;
-
- debug(0, "o_setActorBitVar(%d, %d, %d)", act, mask, mod);
-}
-
-void ScummEngine_v0::o_getActorBitVar() {
- getResultPos();
- byte act = getVarOrDirectByte(PARAM_1);
- byte mask = getVarOrDirectByte(PARAM_2);
-
- ActorC64 *a = (ActorC64 *)derefActor(act, "o_getActorBitVar");
- setResult((a->_miscflags & mask) ? 1 : 0);
-
- debug(0, "o_getActorBitVar(%d, %d, %d)", act, mask, (a->_miscflags & mask));
-}
-
-void ScummEngine_v0::o_setBitVar() {
- byte flag = getVarOrDirectByte(PARAM_1);
- byte mask = getVarOrDirectByte(PARAM_2);
- byte mod = getVarOrDirectByte(PARAM_3);
-
- if (mod)
- _bitVars[flag] |= (1 << mask);
- else
- _bitVars[flag] &= ~(1 << mask);
-
- debug(0, "o_setBitVar (%d, %d %d)", flag, mask, mod);
-}
-
-void ScummEngine_v0::o_getBitVar() {
- getResultPos();
- byte flag = getVarOrDirectByte(PARAM_1);
- byte mask = getVarOrDirectByte(PARAM_2);
-
- setResult((_bitVars[flag] & (1 << mask)) ? 1 : 0);
-
- debug(0, "o_getBitVar (%d, %d %d)", flag, mask, _bitVars[flag] & (1 << mask));
-}
-
-void ScummEngine_v0::o_print_c64() {
- _actorToPrintStrFor = fetchScriptByte();
- decodeParseString();
-}
-
-void ScummEngine_v0::o_printEgo_c64() {
- _actorToPrintStrFor = (byte)VAR(VAR_EGO);
- decodeParseString();
-}
-
-void ScummEngine_v0::o_doSentence() {
- byte entry = fetchScriptByte();
- byte obj = fetchScriptByte();
- fetchScriptByte();
-
- runObjectScript(obj, entry, false, false, NULL);
-}
-
-void ScummEngine_v0::o_unknown2() {
- byte var1 = fetchScriptByte();
- error("STUB: o_unknown2(%d)", var1);
-}
-
-void ScummEngine_v0::o_ifActiveObject() {
- byte obj = fetchScriptByte();
-
- if (obj == _activeInventory)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_getClosestObjActor() {
- int obj;
- int act;
- int dist;
-
- // This code can't detect any actors farther away than 255 units
- // (pixels in newer games, characters in older ones.) But this is
- // perfectly OK, as it is exactly how the original behaved.
-
- int closest_obj = 0xFF, closest_dist = 0xFF;
-
- getResultPos();
-
- act = getVarOrDirectByte(PARAM_1);
- obj = (_opcode & 0x40) ? 25 : 7;
-
- do {
- dist = getObjActToObjActDist(act, obj);
- if (dist < closest_dist) {
- closest_dist = dist;
- closest_obj = obj;
- }
- } while (--obj);
-
- setResult(closest_obj);
-}
-
-void ScummEngine_v0::o_cutscene() {
- vm.cutSceneData[0] = _userState | (_userPut ? 16 : 0);
- vm.cutSceneData[2] = _currentRoom;
- vm.cutSceneData[3] = camera._mode;
-
- // Hide inventory, freeze scripts, hide cursor
- setUserState(15);
-
- _sentenceNum = 0;
- stopScript(SENTENCE_SCRIPT);
- resetSentence();
-
- vm.cutScenePtr[0] = 0;
-}
-
-void ScummEngine_v0::o_endCutscene() {
- vm.cutSceneStackPointer = 0;
-
- VAR(VAR_OVERRIDE) = 0;
- vm.cutSceneScript[0] = 0;
- vm.cutScenePtr[0] = 0;
-
- // Reset user state to values before cutscene
- setUserState(vm.cutSceneData[0] | 7);
-
- camera._mode = (byte) vm.cutSceneData[3];
- if (camera._mode == kFollowActorCameraMode) {
- actorFollowCamera(VAR(VAR_EGO));
- } else if (vm.cutSceneData[2] != _currentRoom) {
- startScene(vm.cutSceneData[2], 0, 0);
- }
-}
-
-void ScummEngine_v0::o_beginOverride() {
- const int idx = vm.cutSceneStackPointer;
- assert(0 <= idx && idx < 5);
-
- vm.cutScenePtr[idx] = _scriptPointer - _scriptOrgPointer;
- vm.cutSceneScript[idx] = _currentScript;
-
- // Skip the jump instruction following the override instruction
- // (the jump is responsible for "skipping" cutscenes, and the reason
- // why we record the current script position in vm.cutScenePtr).
- fetchScriptByte();
- ScummEngine::fetchScriptWord();
-
- // This is based on disassembly
- VAR(VAR_OVERRIDE) = 0;
-}
-
-void ScummEngine_v0::o_isEqual() {
- int16 a, b;
- int var;
-
- var = fetchScriptByte();
- a = readVar(var);
- b = getVarOrDirectByte(PARAM_1);
-
- if (b == a)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-
-}
-
-void ScummEngine_v0::o_isGreater() {
- int16 a = getVar();
- int16 b = getVarOrDirectByte(PARAM_1);
- if (b > a)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_isGreaterEqual() {
- int16 a = getVar();
- int16 b = getVarOrDirectByte(PARAM_1);
- if (b >= a)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_isLess() {
- int16 a = getVar();
- int16 b = getVarOrDirectByte(PARAM_1);
- if (b < a)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_isLessEqual() {
- int16 a = getVar();
- int16 b = getVarOrDirectByte(PARAM_1);
-
- if (b <= a)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_isNotEqual() {
- int16 a = getVar();
- int16 b = getVarOrDirectByte(PARAM_1);
- if (b != a)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_notEqualZero() {
- int a = getVar();
- if (a != 0)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_equalZero() {
- int a = getVar();
- if (a == 0)
- ScummEngine::fetchScriptWord();
- else
- o_jumpRelative();
-}
-
-void ScummEngine_v0::o_jumpRelative() {
- int16 offset = (int16)ScummEngine::fetchScriptWord();
- _scriptPointer += offset;
-}
-
-void ScummEngine_v0::o_setOwnerOf() {
- int obj, owner;
-
- obj = getVarOrDirectWord(PARAM_1);
- owner = getVarOrDirectByte(PARAM_2);
-
- if (obj == 0)
- obj = _activeInventory;
-
- setOwnerOf(obj, owner);
-}
-
-void ScummEngine_v0::resetSentence() {
- _activeInventory = 0;
- _activeObject = 0;
- _activeVerb = 13;
-}
-
-#undef PARAM_1
-#undef PARAM_2
-#undef PARAM_3
-
-} // End of namespace Scumm
Copied: scummvm/trunk/engines/scumm/script_v0.cpp (from rev 25852, scummvm/trunk/engines/scumm/script_c64.cpp)
===================================================================
--- scummvm/trunk/engines/scumm/script_v0.cpp (rev 0)
+++ scummvm/trunk/engines/scumm/script_v0.cpp 2007-02-25 14:47:51 UTC (rev 25856)
@@ -0,0 +1,1050 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/stdafx.h"
+#include "scumm/actor.h"
+#include "scumm/charset.h"
+#include "scumm/intern.h"
+#include "scumm/object.h"
+#include "scumm/scumm.h"
+#include "scumm/verbs.h"
+
+namespace Scumm {
+
+#define OPCODE(x) _OPCODE(ScummEngine_v0, x)
+
+void ScummEngine_v0::setupOpcodes() {
+ static const OpcodeEntryC64 opcodes[256] = {
+ /* 00 */
+ OPCODE(o5_stopObjectCode),
+ OPCODE(o2_putActor),
+ OPCODE(o5_startMusic),
+ OPCODE(o_doSentence),
+ /* 04 */
+ OPCODE(o_isGreaterEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o5_getDist),
+ OPCODE(o5_getActorRoom),
+ /* 08 */
+ OPCODE(o_isNotEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_setActorBitVar),
+ /* 0C */
+ OPCODE(o_loadSound),
+ OPCODE(o_printEgo_c64),
+ OPCODE(o_putActorAtObject),
+ OPCODE(o2_clearState02),
+ /* 10 */
+ OPCODE(o5_breakHere),
+ OPCODE(o_animateActor),
+ OPCODE(o2_panCameraTo),
+ OPCODE(o_lockCostume),
+ /* 14 */
+ OPCODE(o_print_c64),
+ OPCODE(o5_walkActorToActor),
+ OPCODE(o5_getRandomNr),
+ OPCODE(o_clearState08),
+ /* 18 */
+ OPCODE(o_jumpRelative),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o5_move),
+ OPCODE(o_getActorBitVar),
+ /* 1C */
+ OPCODE(o5_startSound),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifState04),
+ /* 20 */
+ OPCODE(o5_stopMusic),
+ OPCODE(o2_putActor),
+ OPCODE(o5_saveLoadGame),
+ OPCODE(o_stopCurrentScript),
+ /* 24 */
+ OPCODE(o_unknown2),
+ OPCODE(o5_loadRoom),
+ OPCODE(o_getClosestObjActor),
+ OPCODE(o2_getActorY),
+ /* 28 */
+ OPCODE(o_equalZero),
+ OPCODE(o_setOwnerOf),
+ OPCODE(o2_delay),
+ OPCODE(o_setActorBitVar),
+ /* 2C */
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_putActorInRoom),
+ OPCODE(o_print_c64),
+ OPCODE(o2_ifState08),
+ /* 30 */
+ OPCODE(o_loadCostume),
+ OPCODE(o_getBitVar),
+ OPCODE(o2_setCameraAt),
+ OPCODE(o_lockScript),
+ /* 34 */
+ OPCODE(o5_getDist),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_walkActorToObject),
+ OPCODE(o2_clearState04),
+ /* 38 */
+ OPCODE(o_isLessEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_subtract),
+ OPCODE(o_stopCurrentScript),
+ /* 3C */
+ OPCODE(o5_stopSound),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifState02),
+ /* 40 */
+ OPCODE(o_cutscene),
+ OPCODE(o2_putActor),
+ OPCODE(o2_startScript),
+ OPCODE(o_doSentence),
+ /* 44 */
+ OPCODE(o_isLess),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o5_increment),
+ OPCODE(o2_getActorX),
+ /* 48 */
+ OPCODE(o_isEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_loadRoom),
+ OPCODE(o_setActorBitVar),
+ /* 4C */
+ OPCODE(o_loadScript),
+ OPCODE(o_lockRoom),
+ OPCODE(o_putActorAtObject),
+ OPCODE(o2_clearState02),
+ /* 50 */
+ OPCODE(o_nop),
+ OPCODE(o_animateActor),
+ OPCODE(o5_actorFollowCamera),
+ OPCODE(o_lockSound),
+ /* 54 */
+ OPCODE(o_setObjectName),
+ OPCODE(o5_walkActorToActor),
+ OPCODE(o_getActorMoving),
+ OPCODE(o_clearState08),
+ /* 58 */
+ OPCODE(o_beginOverride),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_add),
+ OPCODE(o_getActorBitVar),
+ /* 5C */
+ OPCODE(o5_startSound),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifState04),
+ /* 60 */
+ OPCODE(o_cursorCommand),
+ OPCODE(o2_putActor),
+ OPCODE(o2_stopScript),
+ OPCODE(o_stopCurrentScript),
+ /* 64 */
+ OPCODE(o_ifActiveObject),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_getClosestObjActor),
+ OPCODE(o5_getActorFacing),
+ /* 68 */
+ OPCODE(o5_isScriptRunning),
+ OPCODE(o_setOwnerOf),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_setActorBitVar),
+ /* 6C */
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_putActorInRoom),
+ OPCODE(o2_dummy),
+ OPCODE(o2_ifState08),
+ /* 70 */
+ OPCODE(o_lights),
+ OPCODE(o_getBitVar),
+ OPCODE(o_nop),
+ OPCODE(o5_getObjectOwner),
+ /* 74 */
+ OPCODE(o5_getDist),
+ OPCODE(o_printEgo_c64),
+ OPCODE(o2_walkActorToObject),
+ OPCODE(o2_clearState04),
+ /* 78 */
+ OPCODE(o_isGreater),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ /* 7C */
+ OPCODE(o5_isSoundRunning),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifNotState02),
+ /* 80 */
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_putActor),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_doSentence),
+ /* 84 */
+ OPCODE(o_isGreaterEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_nop),
+ OPCODE(o5_getActorRoom),
+ /* 88 */
+ OPCODE(o_isNotEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_setActorBitVar),
+ /* 8C */
+ OPCODE(o_loadSound),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_putActorAtObject),
+ OPCODE(o2_setState02),
+ /* 90 */
+ OPCODE(o_pickupObject),
+ OPCODE(o_animateActor),
+ OPCODE(o2_panCameraTo),
+ OPCODE(o_unlockCostume),
+ /* 94 */
+ OPCODE(o5_print),
+ OPCODE(o2_actorFromPos),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_setState08),
+ /* 98 */
+ OPCODE(o2_restart),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o5_move),
+ OPCODE(o_getActorBitVar),
+ /* 9C */
+ OPCODE(o5_startSound),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifNotState04),
+ /* A0 */
+ OPCODE(o5_stopObjectCode),
+ OPCODE(o2_putActor),
+ OPCODE(o5_saveLoadGame),
+ OPCODE(o_stopCurrentScript),
+ /* A4 */
+ OPCODE(o_unknown2),
+ OPCODE(o5_loadRoom),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_getActorY),
+ /* A8 */
+ OPCODE(o_notEqualZero),
+ OPCODE(o_setOwnerOf),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_setActorBitVar),
+ /* AC */
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_putActorInRoom),
+ OPCODE(o_print_c64),
+ OPCODE(o2_ifNotState08),
+ /* B0 */
+ OPCODE(o_loadCostume),
+ OPCODE(o_getBitVar),
+ OPCODE(o2_setCameraAt),
+ OPCODE(o_unlockScript),
+ /* B4 */
+ OPCODE(o5_getDist),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_walkActorToObject),
+ OPCODE(o2_setState04),
+ /* B8 */
+ OPCODE(o_isLessEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_subtract),
+ OPCODE(o_stopCurrentScript),
+ /* BC */
+ OPCODE(o5_stopSound),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifNotState02),
+ /* C0 */
+ OPCODE(o_endCutscene),
+ OPCODE(o2_putActor),
+ OPCODE(o2_startScript),
+ OPCODE(o_doSentence),
+ /* C4 */
+ OPCODE(o_isLess),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o5_decrement),
+ OPCODE(o2_getActorX),
+ /* C8 */
+ OPCODE(o_isEqual),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_loadRoom),
+ OPCODE(o_setActorBitVar),
+ /* CC */
+ OPCODE(o_loadScript),
+ OPCODE(o_unlockRoom),
+ OPCODE(o_putActorAtObject),
+ OPCODE(o2_setState02),
+ /* D0 */
+ OPCODE(o_nop),
+ OPCODE(o_animateActor),
+ OPCODE(o5_actorFollowCamera),
+ OPCODE(o_unlockSound),
+ /* D4 */
+ OPCODE(o_setObjectName),
+ OPCODE(o2_actorFromPos),
+ OPCODE(o_getActorMoving),
+ OPCODE(o_setState08),
+ /* D8 */
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_add),
+ OPCODE(o_getActorBitVar),
+ /* DC */
+ OPCODE(o5_startSound),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifNotState04),
+ /* E0 */
+ OPCODE(o_cursorCommand),
+ OPCODE(o2_putActor),
+ OPCODE(o2_stopScript),
+ OPCODE(o_stopCurrentScript),
+ /* E4 */
+ OPCODE(o_ifActiveObject),
+ OPCODE(o_loadRoomWithEgo),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o5_getActorFacing),
+ /* E8 */
+ OPCODE(o5_isScriptRunning),
+ OPCODE(o_setOwnerOf),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_setActorBitVar),
+ /* EC */
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_putActorInRoom),
+ OPCODE(o2_dummy),
+ OPCODE(o2_ifNotState08),
+ /* F0 */
+ OPCODE(o_lights),
+ OPCODE(o_getBitVar),
+ OPCODE(o_nop),
+ OPCODE(o5_getObjectOwner),
+ /* F4 */
+ OPCODE(o5_getDist),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o2_walkActorToObject),
+ OPCODE(o2_setState04),
+ /* F8 */
+ OPCODE(o_isGreater),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ OPCODE(o_stopCurrentScript),
+ /* FC */
+ OPCODE(o5_isSoundRunning),
+ OPCODE(o_setBitVar),
+ OPCODE(o2_walkActorTo),
+ OPCODE(o2_ifState02)
+ };
+
+ _opcodesC64 = opcodes;
+}
+
+#define SENTENCE_SCRIPT 2
+
+#define PARAM_1 0x80
+#define PARAM_2 0x40
+#define PARAM_3 0x20
+
+void ScummEngine_v0::executeOpcode(byte i) {
+ OpcodeProcC64 op = _opcodesC64[i].proc;
+ (this->*op) ();
+}
+
+int ScummEngine_v0::getVarOrDirectWord(byte mask) {
+ return getVarOrDirectByte(mask);
+}
+
+uint ScummEngine_v0::fetchScriptWord() {
+ return fetchScriptByte();
+}
+
+const char *ScummEngine_v0::getOpcodeDesc(byte i) {
+ return _opcodesC64[i].desc;
+}
+
+int ScummEngine_v0::getObjectFlag() {
+ if (_opcode & 0x40)
+ return _activeObject;
+
+ return fetchScriptByte();
+}
+
+void ScummEngine_v0::decodeParseString() {
+ byte buffer[512];
+ byte *ptr = buffer;
+ byte c;
+ bool insertSpace = false;
+
+ while ((c = fetchScriptByte())) {
+
+ insertSpace = (c & 0x80) != 0;
+ c &= 0x7f;
+
+ if (c == '/') {
+ *ptr++ = 13;
+ } else {
+ *ptr++ = c;
+ }
+
+ if (insertSpace)
+ *ptr++ = ' ';
+
+ }
+ *ptr = 0;
+
+ int textSlot = 0;
+ _string[textSlot].xpos = 0;
+ _string[textSlot].ypos = 0;
+ _string[textSlot].right = _screenWidth - 1;
+ _string[textSlot].center = false;
+ _string[textSlot].overhead = false;
+
+ if (_actorToPrintStrFor == 0xFF)
+ _string[textSlot].color = 14;
+
+ actorTalk(buffer);
+}
+
+void ScummEngine_v0::setStateCommon(byte type) {
+ int obj = getObjectFlag();
+ putState(obj, getState(obj) | type);
+}
+
+void ScummEngine_v0::clearStateCommon(byte type) {
+ int obj = getObjectFlag();
+ putState(obj, getState(obj) & ~type);
+}
+
+void ScummEngine_v0::ifStateCommon(byte type) {
+ int obj = getObjectFlag();
+
+ if ((getState(obj) & type) != 0)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::ifNotStateCommon(byte type) {
+ int obj = getObjectFlag();
+
+ if ((getState(obj) & type) == 0)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::drawSentence() {
+ Common::Rect sentenceline;
+ const byte *temp;
+ int sentencePrep = 0;
+
+ if (!(_userState & 32))
+ return;
+
+ if (getResourceAddress(rtVerb, _activeVerb)) {
+ strcpy(_sentenceBuf, (char*)getResourceAddress(rtVerb, _activeVerb));
+ } else {
+ return;
+ }
+
+ if (_activeObject > 0) {
+ temp = getObjOrActorName(_activeObject);
+ if (temp) {
+ strcat(_sentenceBuf, " ");
+ strcat(_sentenceBuf, (const char*)temp);
+ }
+
+ if (_verbs[_activeVerb].prep == 0xFF) {
+ byte *ptr = getOBCDFromObject(_activeObject);
+ assert(ptr);
+ sentencePrep = (*(ptr + 11) >> 5);
+ } else {
+ sentencePrep = _verbs[_activeVerb].prep;
+ }
+ }
+
+ if (sentencePrep > 0 && sentencePrep <= 4) {
+ // The prepositions, like the fonts, were hard code in the engine. Thus
+ // we have to do that, too, and provde localized versions for all the
+ // languages MM/Zak are available in.
+ const char *prepositions[][5] = {
+ { " ", " in", " with", " on", " to" }, // English
+ { " ", " mit", " mit", " mit", " zu" }, // German
+ { " ", " dans", " avec", " sur", " <" }, // French
+ { " ", " in", " con", " su", " a" }, // Italian
+ { " ", " en", " con", " en", " a" }, // Spanish
+ };
+ int lang;
+ switch (_language) {
+ case Common::DE_DEU:
+ lang = 1;
+ break;
+ case Common::FR_FRA:
+ lang = 2;
+ break;
+ case Common::IT_ITA:
+ lang = 3;
+ break;
+ case Common::ES_ESP:
+ lang = 4;
+ break;
+ default:
+ lang = 0; // Default to english
+ }
+
+ strcat(_sentenceBuf, prepositions[lang][sentencePrep]);
+ }
+
+ if (_activeInventory > 0) {
+ temp = getObjOrActorName(_activeInventory);
+ if (temp) {
+ strcat(_sentenceBuf, " ");
+ strcat(_sentenceBuf, (const char*)temp);
+ }
+ }
+
+ _string[2].charset = 1;
+ _string[2].ypos = virtscr[kVerbVirtScreen].topline;
+ _string[2].xpos = 0;
+ _string[2].right = virtscr[kVerbVirtScreen].w - 1;
+ _string[2].color = 16;
+
+ byte string[80];
+ char *ptr = _sentenceBuf;
+ int i = 0, len = 0;
+
+ // Maximum length of printable characters
+ int maxChars = 40;
+ while (*ptr) {
+ if (*ptr != '@')
+ len++;
+ if (len > maxChars) {
+ break;
+ }
+
+ string[i++] = *ptr++;
+
+ }
+ string[i] = 0;
+
+ sentenceline.top = virtscr[kVerbVirtScreen].topline;
+ sentenceline.bottom = virtscr[kVerbVirtScreen].topline + 8;
+ sentenceline.left = 0;
+ sentenceline.right = virtscr[kVerbVirtScreen].w - 1;
+ restoreBackground(sentenceline);
+
+ drawString(2, (byte*)string);
+}
+
+void ScummEngine_v0::o_setState08() {
+ int obj = getObjectFlag();
+ putState(obj, getState(obj) | kObjectState_08);
+ markObjectRectAsDirty(obj);
+ clearDrawObjectQueue();
+}
+
+void ScummEngine_v0::o_clearState08() {
+ int obj = getObjectFlag();
+ putState(obj, getState(obj) & ~kObjectState_08);
+ markObjectRectAsDirty(obj);
+ clearDrawObjectQueue();
+}
+
+void ScummEngine_v0::o_stopCurrentScript() {
+ int script;
+
+ script = vm.slot[_currentScript].number;
+
+ if (_currentScript != 0 && vm.slot[_currentScript].number == script)
+ stopObjectCode();
+ else
+ stopScript(script);
+}
+
+void ScummEngine_v0::o_loadSound() {
+ int resid = fetchScriptByte();
+ ensureResourceLoaded(rtSound, resid);
+}
+
+void ScummEngine_v0::o_lockSound() {
+ int resid = fetchScriptByte();
+ _res->lock(rtSound, resid);
+}
+
+void ScummEngine_v0::o_unlockSound() {
+ int resid = fetchScriptByte();
+ _res->unlock(rtSound, resid);
+}
+
+void ScummEngine_v0::o_loadCostume() {
+ int resid = getVarOrDirectByte(PARAM_1);
+ ensureResourceLoaded(rtCostume, resid);
+}
+
+void ScummEngine_v0::o_lockCostume() {
+ int resid = fetchScriptByte();
+ _res->lock(rtCostume, resid);
+}
+
+void ScummEngine_v0::o_unlockCostume() {
+ int resid = fetchScriptByte();
+ _res->unlock(rtCostume, resid);
+}
+
+void ScummEngine_v0::o_loadScript() {
+ int resid = getVarOrDirectByte(PARAM_1);
+ ensureResourceLoaded(rtScript, resid);
+}
+
+void ScummEngine_v0::o_lockScript() {
+ int resid = fetchScriptByte();
+ _res->lock(rtScript, resid);
+}
+
+void ScummEngine_v0::o_unlockScript() {
+ int resid = fetchScriptByte();
+ _res->unlock(rtScript, resid);
+}
+
+void ScummEngine_v0::o_loadRoom() {
+ int resid = getVarOrDirectByte(PARAM_1);
+ ensureResourceLoaded(rtRoom, resid);
+}
+
+void ScummEngine_v0::o_loadRoomWithEgo() {
+ Actor *a;
+ int obj, room, x, y, dir;
+
+ obj = fetchScriptByte();
+ room = fetchScriptByte();
+
+ a = derefActor(VAR(VAR_EGO), "o_loadRoomWithEgo");
+
+ a->putActor(0, 0, room);
+ _egoPositioned = false;
+
+ startScene(a->_room, a, obj);
+
+ getObjectXYPos(obj, x, y, dir);
+ a->putActor(x, y, _currentRoom);
+ a->setDirection(dir + 180);
+
+ camera._dest.x = camera._cur.x = a->getPos().x;
+ setCameraAt(a->getPos().x, a->getPos().y);
+ setCameraFollows(a);
+
+ _fullRedraw = true;
+
+ resetSentence();
+
+ if (x >= 0 && y >= 0) {
+ a->startWalkActor(x, y, -1);
+ }
+}
+
+void ScummEngine_v0::o_lockRoom() {
+ int resid = fetchScriptByte();
+ _res->lock(rtRoom, resid);
+}
+
+void ScummEngine_v0::o_unlockRoom() {
+ int resid = fetchScriptByte();
+ _res->unlock(rtRoom, resid);
+}
+
+void ScummEngine_v0::o_cursorCommand() {
+ // TODO
+ int state = 0;
+
+ _currentMode = fetchScriptByte();
+ switch (_currentMode) {
+ case 0:
+ state = 15;
+ break;
+ case 1:
+ state = 31;
+ break;
+ case 2:
+ break;
+ case 3:
+ state = 247;
+ break;
+ }
+
+ setUserState(state);
+ debug(0, "o_cursorCommand(%d)", _currentMode);
+}
+
+void ScummEngine_v0::o_lights() {
+ int a;
+
+ a = getVarOrDirectByte(PARAM_1);
+ // Convert older light mode values into
+ // equivalent values.of later games
+ // 0 Darkness
+ // 1 Flashlight
+ // 2 Lighted area
+ if (a == 2)
+ _currentLights = 11;
+ else if (a == 1)
+ _currentLights = 4;
+ else
+ _currentLights = 0;
+
+ _fullRedraw = true;
+}
+
+void ScummEngine_v0::o_animateActor() {
+ int act = getVarOrDirectByte(PARAM_1);
+ int anim = getVarOrDirectByte(PARAM_2);
+ int unk = fetchScriptByte();
+ debug(0,"o_animateActor: unk %d", unk);
+
+ Actor *a = derefActor(act, "o_animateActor");
+ a->animateActor(anim);
+}
+
+void ScummEngine_v0::o_getActorMoving() {
+ getResultPos();
+ int act = getVarOrDirectByte(PARAM_1);
+ Actor *a = derefActor(act, "o_getActorMoving");
+ if (a->_moving)
+ setResult(1);
+ else
+ setResult(2);
+}
+
+void ScummEngine_v0::o_putActorAtObject() {
+ int obj, x, y;
+ Actor *a;
+
+ a = derefActor(getVarOrDirectByte(PARAM_1), "o_putActorAtObject");
+
+ obj = fetchScriptByte();
+ if (whereIsObject(obj) != WIO_NOT_FOUND)
+ getObjectXYPos(obj, x, y);
+ else {
+ x = 30;
+ y = 60;
+ }
+
+ a->putActor(x, y);
+}
+
+void ScummEngine_v0::o_pickupObject() {
+ int obj = fetchScriptByte();
+ if (obj == 0) {
+ obj = _activeObject;
+ }
+
+ if (obj < 1) {
+ error("pickupObject received invalid index %d (script %d)", obj, vm.slot[_currentScript].number);
+ }
+
+ if (getObjectIndex(obj) == -1)
+ return;
+
+ if (whereIsObject(obj) == WIO_INVENTORY) /* Don't take an */
+ return; /* object twice */
+
+ addObjectToInventory(obj, _roomResource);
+ markObjectRectAsDirty(obj);
+ putOwner(obj, VAR(VAR_EGO));
+ putState(obj, getState(obj) | kObjectState_08 | kObjectStateUntouchable);
+ clearDrawObjectQueue();
+
+ runInventoryScript(1);
+}
+
+void ScummEngine_v0::o_setObjectName() {
+ int obj = fetchScriptByte();
+ setObjectName(obj);
+}
+
+void ScummEngine_v0::o_nop() {
+}
+
+// TODO: Maybe translate actor flags in future.
+void ScummEngine_v0::o_setActorBitVar() {
+ byte act = getVarOrDirectByte(PARAM_1);
+ byte mask = getVarOrDirectByte(PARAM_2);
+ byte mod = getVarOrDirectByte(PARAM_3);
+
+ ActorC64 *a = (ActorC64 *)derefActor(act, "o_setActorBitVar");
+ if (mod)
+ a->_miscflags |= mask;
+ else
+ a->_miscflags &= ~mask;
+
+ debug(0, "o_setActorBitVar(%d, %d, %d)", act, mask, mod);
+}
+
+void ScummEngine_v0::o_getActorBitVar() {
+ getResultPos();
+ byte act = getVarOrDirectByte(PARAM_1);
+ byte mask = getVarOrDirectByte(PARAM_2);
+
+ ActorC64 *a = (ActorC64 *)derefActor(act, "o_getActorBitVar");
+ setResult((a->_miscflags & mask) ? 1 : 0);
+
+ debug(0, "o_getActorBitVar(%d, %d, %d)", act, mask, (a->_miscflags & mask));
+}
+
+void ScummEngine_v0::o_setBitVar() {
+ byte flag = getVarOrDirectByte(PARAM_1);
+ byte mask = getVarOrDirectByte(PARAM_2);
+ byte mod = getVarOrDirectByte(PARAM_3);
+
+ if (mod)
+ _bitVars[flag] |= (1 << mask);
+ else
+ _bitVars[flag] &= ~(1 << mask);
+
+ debug(0, "o_setBitVar (%d, %d %d)", flag, mask, mod);
+}
+
+void ScummEngine_v0::o_getBitVar() {
+ getResultPos();
+ byte flag = getVarOrDirectByte(PARAM_1);
+ byte mask = getVarOrDirectByte(PARAM_2);
+
+ setResult((_bitVars[flag] & (1 << mask)) ? 1 : 0);
+
+ debug(0, "o_getBitVar (%d, %d %d)", flag, mask, _bitVars[flag] & (1 << mask));
+}
+
+void ScummEngine_v0::o_print_c64() {
+ _actorToPrintStrFor = fetchScriptByte();
+ decodeParseString();
+}
+
+void ScummEngine_v0::o_printEgo_c64() {
+ _actorToPrintStrFor = (byte)VAR(VAR_EGO);
+ decodeParseString();
+}
+
+void ScummEngine_v0::o_doSentence() {
+ byte entry = fetchScriptByte();
+ byte obj = fetchScriptByte();
+ fetchScriptByte();
+
+ runObjectScript(obj, entry, false, false, NULL);
+}
+
+void ScummEngine_v0::o_unknown2() {
+ byte var1 = fetchScriptByte();
+ error("STUB: o_unknown2(%d)", var1);
+}
+
+void ScummEngine_v0::o_ifActiveObject() {
+ byte obj = fetchScriptByte();
+
+ if (obj == _activeInventory)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_getClosestObjActor() {
+ int obj;
+ int act;
+ int dist;
+
+ // This code can't detect any actors farther away than 255 units
+ // (pixels in newer games, characters in older ones.) But this is
+ // perfectly OK, as it is exactly how the original behaved.
+
+ int closest_obj = 0xFF, closest_dist = 0xFF;
+
+ getResultPos();
+
+ act = getVarOrDirectByte(PARAM_1);
+ obj = (_opcode & 0x40) ? 25 : 7;
+
+ do {
+ dist = getObjActToObjActDist(act, obj);
+ if (dist < closest_dist) {
+ closest_dist = dist;
+ closest_obj = obj;
+ }
+ } while (--obj);
+
+ setResult(closest_obj);
+}
+
+void ScummEngine_v0::o_cutscene() {
+ vm.cutSceneData[0] = _userState | (_userPut ? 16 : 0);
+ vm.cutSceneData[2] = _currentRoom;
+ vm.cutSceneData[3] = camera._mode;
+
+ // Hide inventory, freeze scripts, hide cursor
+ setUserState(15);
+
+ _sentenceNum = 0;
+ stopScript(SENTENCE_SCRIPT);
+ resetSentence();
+
+ vm.cutScenePtr[0] = 0;
+}
+
+void ScummEngine_v0::o_endCutscene() {
+ vm.cutSceneStackPointer = 0;
+
+ VAR(VAR_OVERRIDE) = 0;
+ vm.cutSceneScript[0] = 0;
+ vm.cutScenePtr[0] = 0;
+
+ // Reset user state to values before cutscene
+ setUserState(vm.cutSceneData[0] | 7);
+
+ camera._mode = (byte) vm.cutSceneData[3];
+ if (camera._mode == kFollowActorCameraMode) {
+ actorFollowCamera(VAR(VAR_EGO));
+ } else if (vm.cutSceneData[2] != _currentRoom) {
+ startScene(vm.cutSceneData[2], 0, 0);
+ }
+}
+
+void ScummEngine_v0::o_beginOverride() {
+ const int idx = vm.cutSceneStackPointer;
+ assert(0 <= idx && idx < 5);
+
+ vm.cutScenePtr[idx] = _scriptPointer - _scriptOrgPointer;
+ vm.cutSceneScript[idx] = _currentScript;
+
+ // Skip the jump instruction following the override instruction
+ // (the jump is responsible for "skipping" cutscenes, and the reason
+ // why we record the current script position in vm.cutScenePtr).
+ fetchScriptByte();
+ ScummEngine::fetchScriptWord();
+
+ // This is based on disassembly
+ VAR(VAR_OVERRIDE) = 0;
+}
+
+void ScummEngine_v0::o_isEqual() {
+ int16 a, b;
+ int var;
+
+ var = fetchScriptByte();
+ a = readVar(var);
+ b = getVarOrDirectByte(PARAM_1);
+
+ if (b == a)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+
+}
+
+void ScummEngine_v0::o_isGreater() {
+ int16 a = getVar();
+ int16 b = getVarOrDirectByte(PARAM_1);
+ if (b > a)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_isGreaterEqual() {
+ int16 a = getVar();
+ int16 b = getVarOrDirectByte(PARAM_1);
+ if (b >= a)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_isLess() {
+ int16 a = getVar();
+ int16 b = getVarOrDirectByte(PARAM_1);
+ if (b < a)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_isLessEqual() {
+ int16 a = getVar();
+ int16 b = getVarOrDirectByte(PARAM_1);
+
+ if (b <= a)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_isNotEqual() {
+ int16 a = getVar();
+ int16 b = getVarOrDirectByte(PARAM_1);
+ if (b != a)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_notEqualZero() {
+ int a = getVar();
+ if (a != 0)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_equalZero() {
+ int a = getVar();
+ if (a == 0)
+ ScummEngine::fetchScriptWord();
+ else
+ o_jumpRelative();
+}
+
+void ScummEngine_v0::o_jumpRelative() {
+ int16 offset = (int16)ScummEngine::fetchScriptWord();
+ _scriptPointer += offset;
+}
+
+void ScummEngine_v0::o_setOwnerOf() {
+ int obj, owner;
+
+ obj = getVarOrDirectWord(PARAM_1);
+ owner = getVarOrDirectByte(PARAM_2);
+
+ if (obj == 0)
+ obj = _activeInventory;
+
+ setOwnerOf(obj, owner);
+}
+
+void ScummEngine_v0::resetSentence() {
+ _activeInventory = 0;
+ _activeObject = 0;
+ _activeVerb = 13;
+}
+
+#undef PARAM_1
+#undef PARAM_2
+#undef PARAM_3
+
+} // End of namespace Scumm
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list