diff options
Diffstat (limited to 'saga/script.h')
-rw-r--r-- | saga/script.h | 637 |
1 files changed, 0 insertions, 637 deletions
diff --git a/saga/script.h b/saga/script.h deleted file mode 100644 index bc11013b3f..0000000000 --- a/saga/script.h +++ /dev/null @@ -1,637 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2004-2006 The ScummVM project - * - * The ReInherit Engine is (C)2000-2003 by Daniel Balsom. - * - * 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$ - * - */ - -// Scripting module private header - -#ifndef SAGA_SCRIPT_H -#define SAGA_SCRIPT_H - -#include "saga/font.h" -#include "saga/list.h" - -namespace Saga { - -#define COMMON_BUFFER_SIZE 1024 // Why 1024? - -#define S_LUT_ENTRYLEN_ITECD 22 -#define S_LUT_ENTRYLEN_ITEDISK 16 - -#define SCRIPT_TBLENTRY_LEN 4 - -#define SCRIPT_MAX 5000 - -#define ITE_SCRIPT_FUNCTION_MAX 78 -#define IHNM_SCRIPT_FUNCTION_MAX 105 -#define DEFAULT_THREAD_STACK_SIZE 256 - -enum AddressTypes { - kAddressCommon = 0, // offset from global variables - kAddressStatic = 1, // offset from global variables - kAddressModule = 2, // offset from start of module - kAddressStack = 3, // offset from stack - kAddressThread = 4 // offset from thread structure -/* kAddressId = 5, // offset from const id object - kAddressIdIndirect = 6, // offset from stack id object - kAddressIndex = 7 // index from id*/ -}; - -enum VerbTypeIds { - kVerbITENone = 0, - kVerbITEPickUp = 1, - kVerbITELookAt = 2, - kVerbITEWalkTo = 3, - kVerbITETalkTo = 4, - kVerbITEOpen = 5, - kVerbITEClose = 6, - kVerbITEGive = 7, - kVerbITEUse = 8, - kVerbITEOptions = 9, - kVerbITEEnter = 10, - kVerbITELeave = 11, - kVerbITEBegin = 12, - kVerbITEWalkOnly = 13, - kVerbITELookOnly = 14, - - - kVerbIHNMNone = 0, - kVerbIHNMWalk = 1, - kVerbIHNMLookAt = 2, - kVerbIHNMTake = 3, - kVerbIHNMUse = 4, - kVerbIHNMTalkTo = 5, - kVerbIHNMSwallow = 6, - kVerbIHNMGive = 7, - kVerbIHNMPush = 8, - kVerbIHNMOptions = 9, - kVerbIHNMEnter = 10, - kVerbIHNMLeave = 11, - kVerbIHNMBegin = 12, - kVerbIHNMWalkOnly = 13, - kVerbIHNMLookOnly = 14, - - kVerbTypeIdsMax = kVerbITELookOnly + 1 -}; - -enum VerbTypes { - kVerbNone, - kVerbWalkTo, - kVerbGive, - kVerbUse, - kVerbEnter, - kVerbLookAt, - kVerbPickUp, - kVerbOpen, - kVerbClose, - kVerbTalkTo, - kVerbWalkOnly, - kVerbLookOnly, - kVerbOptions -}; - -#define STHREAD_TIMESLICE 8 - -enum ThreadVarTypes { - kThreadVarObject = 0, - kThreadVarWithObject = 1, - kThreadVarAction = 2, - kThreadVarActor = 3, - - kThreadVarMax = kThreadVarActor + 1 -}; - -enum ThreadFlags { - kTFlagNone = 0, - kTFlagWaiting = 1, // wait for even denoted in waitType - kTFlagFinished = 2, - kTFlagAborted = 4, - kTFlagAsleep = kTFlagWaiting | kTFlagFinished | kTFlagAborted // Combination of all flags which can halt a thread -}; - -enum ThreadWaitTypes { - kWaitTypeNone = 0, // waiting for nothing - kWaitTypeDelay = 1, // waiting for a timer - kWaitTypeSpeech = 2, // waiting for speech to finish - kWaitTypeDialogEnd = 3, // waiting for my dialog to finish - kWaitTypeDialogBegin = 4, // waiting for other dialog to finish - kWaitTypeWalk = 5, // waiting to finish walking - kWaitTypeRequest = 6, // a request is up - kWaitTypePause = 7, - kWaitTypePlacard = 8, - kWaitTypeStatusTextInput = 9, - kWaitTypeWaitFrames = 10 // IHNM. waiting for a frame count -}; - -enum OpCodes { - opNextBlock = 0x01, - opDup = 0x02, - opDrop = 0x03, - opZero = 0x04, - opOne = 0x05, - opConstint = 0x06, -//... - opStrlit = 0x08, -//... - opGetFlag = 0x0B, - opGetInt = 0x0C, -//... - opPutFlag = 0x0F, - opPutInt = 0x10, - //... - opPutFlagV = 0x13, - opPutIntV = 0x14, -//... - opCall = 0x17, - opCcall = 0x18, - opCcallV = 0x19, - opEnter = 0x1A, - opReturn = 0x1B, - opReturnV = 0x1C, - opJmp = 0x1D, - opJmpTrueV = 0x1E, - opJmpFalseV = 0x1F, - opJmpTrue = 0x20, - opJmpFalse = 0x21, - opJmpSwitch = 0x22, -//... - opJmpRandom = 0x24, - opNegate = 0x25, - opNot = 0x26, - opCompl = 0x27, - opIncV = 0x28, - opDecV = 0x29, - opPostInc = 0x2A, - opPostDec = 0x2B, - opAdd = 0x2C, - opSub = 0x2D, - opMul = 0x2E, - opDiv = 0x2F, - opMod = 0x30, -//... - opEq = 0x33, - opNe = 0x34, - opGt = 0x35, - opLt = 0x36, - opGe = 0x37, - opLe = 0x38, -//... - opRsh = 0x3F, - opLsh = 0x40, - opAnd = 0x41, - opOr = 0x42, - opXor = 0x43, - opLAnd = 0x44, - opLOr = 0x45, - opLXor = 0x46, -//... - opSpeak = 0x53, - opDialogBegin = 0x54, - opDialogEnd = 0x55, - opReply = 0x56, - opAnimate = 0x57 -}; - -enum CycleFlags { - kCyclePong = 1 << 0, - kCycleOnce = 1 << 1, - kCycleRandom = 1 << 2, - kCycleReverse = 1 << 3 -}; - -enum WalkFlags { - kWalkBackPedal = 1 << 0, - kWalkAsync = 1 << 1, - kWalkUseAngle = 1 << 2, - kWalkFace = 1 << 5 -}; - -enum ReplyFlags { - kReplyOnce = 1 << 0, - kReplySummary = 1 << 1, - kReplyCondition = 1 << 2 -}; - -struct EntryPoint { - uint16 nameOffset; - uint16 offset; -}; - -struct VoiceLUT { - uint16 voicesCount; - uint16 *voices; - void freeMem() { - voicesCount = 0; - free(voices); - } - VoiceLUT() { - memset(this, 0, sizeof(*this)); - } -}; - -struct ModuleData { - bool loaded; // is it loaded or not? - int scriptResourceId; - int stringsResourceId; - int voicesResourceId; - - byte *moduleBase; // all base module - uint16 moduleBaseSize; // base module size - uint16 staticSize; // size of static data - uint staticOffset; // offset of static data begining in _commonBuffer - - uint16 entryPointsTableOffset; // offset of entrypoint table in moduleBase - uint16 entryPointsCount; - EntryPoint *entryPoints; - - StringsTable strings; - VoiceLUT voiceLUT; - void freeMem() { - strings.freeMem(); - voiceLUT.freeMem(); - free(moduleBase); - free(entryPoints); - memset(this, 0x0, sizeof(*this)); - } -}; - -class ScriptThread { -public: - uint16 *_stackBuf; - uint16 _stackSize; // stack size in uint16 - - uint16 _stackTopIndex; - uint16 _frameIndex; - - uint16 _threadVars[kThreadVarMax]; - - byte *_moduleBase; // - uint16 _moduleBaseSize; - - byte *_commonBase; // - byte *_staticBase; // - VoiceLUT *_voiceLUT; // - StringsTable *_strings; // - - int _flags; // ThreadFlags - int _waitType; // ThreadWaitTypes - uint _sleepTime; - void *_threadObj; // which object we're handling - - int16 _returnValue; - - uint16 _instructionOffset; // Instruction offset - - int32 _frameWait; - -public: - byte *baseAddress(byte addrMode) { - switch (addrMode) { - case kAddressCommon: - return _commonBase; - case kAddressStatic: - return _staticBase; - case kAddressModule: - return _moduleBase; - case kAddressStack: - return (byte*)&_stackBuf[_frameIndex]; - case kAddressThread: - return (byte*)_threadVars; - default: - return _commonBase; - } - } - - int16 stackTop() { - return (int16)_stackBuf[_stackTopIndex]; - } - - uint pushedSize() { - return _stackSize - _stackTopIndex - 2; - } - - void push(int16 value) { - if (_stackTopIndex <= 0) { - error("ScriptThread::push() stack overflow"); - } - _stackBuf[--_stackTopIndex] = (uint16)value; - } - - int16 pop() { - if (_stackTopIndex >= _stackSize) { - error("ScriptThread::pop() stack underflow"); - } - return (int16)_stackBuf[_stackTopIndex++]; - } - - -// wait stuff - void wait(int waitType) { - _waitType = waitType; - _flags |= kTFlagWaiting; - } - - void waitWalk(void *threadObj) { - wait(kWaitTypeWalk); - _threadObj = threadObj; - } - - void waitDelay(int sleepTime) { - wait(kWaitTypeDelay); - _sleepTime = sleepTime; - } - - ScriptThread() { - memset(this, 0xFE, sizeof(*this)); - _stackBuf = NULL; - } - ~ScriptThread() { - free(_stackBuf); - } -}; - -typedef SortedList<ScriptThread> ScriptThreadList; - - -#define SCRIPTFUNC_PARAMS ScriptThread *thread, int nArgs, bool &disContinue - -class Script { -public: - StringsTable _mainStrings; - - Script(SagaEngine *vm); - ~Script(); - - void loadModule(int scriptModuleNumber); - void freeModules(); - - void doVerb(); - void showVerb(int statusColor = -1); - void setVerb(int verb); - int getCurrentVerb() const { return _currentVerb; } - void setPointerVerb(); - void whichObject(const Point& mousePoint); - void hitObject(bool leftButton); - void playfieldClick(const Point& mousePoint, bool leftButton); - - void setLeftButtonVerb(int verb); - int getLeftButtonVerb() const { return _leftButtonVerb; } - void setRightButtonVerb(int verb); - int getRightButtonVerb() const { return _rightButtonVerb; } - void setNonPlayfieldVerb() { - setRightButtonVerb(getVerbType(kVerbNone)); - _pointerObject = ID_NOTHING; - _currentObject[_firstObjectSet ? 1 : 0] = ID_NOTHING; - } - void setNoPendingVerb() { - _pendingVerb = getVerbType(kVerbNone); - _currentObject[0] = _currentObject[0] = ID_NOTHING; - setPointerVerb(); - } - int getVerbType(VerbTypes verbType); - -private: - // When reading or writing data to the common buffer, we have to use a - // well-defined byte order since it's stored in savegames. Otherwise, - // we use native byte ordering since that data may be accessed in other - // ways than through these functions. - // - // The "module" area is a special case, which possibly never ever - // happens. But if it does, we need well-defined byte ordering. - - uint16 readUint16(byte *addr, byte addrMode) { - switch (addrMode) { - case kAddressCommon: - case kAddressStatic: - case kAddressModule: - return READ_LE_UINT16(addr); - default: - return READ_UINT16(addr); - } - } - - void writeUint16(byte *addr, uint16 value, byte addrMode) { - switch (addrMode) { - case kAddressCommon: - case kAddressStatic: - case kAddressModule: - WRITE_LE_UINT16(addr, value); - break; - default: - WRITE_UINT16(addr, value); - break; - } - } - - SagaEngine *_vm; - ResourceContext *_scriptContext; - - uint16 _modulesLUTEntryLen; - ModuleData *_modules; - int _modulesCount; - TextListEntry *_placardTextEntry; - -protected: - friend class SagaEngine; - byte *_commonBuffer; - uint _commonBufferSize; - -private: - uint _staticSize; - - ScriptThreadList _threadList; - - ScriptThread *_conversingThread; - -//verb - bool _firstObjectSet; - bool _secondObjectNeeded; - uint16 _currentObject[2]; - int16 _currentObjectFlags[2]; - int _currentVerb; - int _stickyVerb; - int _leftButtonVerb; - int _rightButtonVerb; - -public: - uint16 _pendingObject[2]; - int _pendingVerb; - uint16 _pointerObject; - - bool _skipSpeeches; - bool _abortEnabled; - - VoiceLUT _globalVoiceLUT; - -public: - ScriptThread *createThread(uint16 scriptModuleNumber, uint16 scriptEntryPointNumber); - int executeThread(ScriptThread *thread, int entrypointNumber); - void executeThreads(uint msec); - void completeThread(void); - void abortAllThreads(void); - - void wakeUpActorThread(int waitType, void *threadObj); - void wakeUpThreads(int waitType); - void wakeUpThreadsDelayed(int waitType, int sleepTime); - - void loadVoiceLUT(VoiceLUT &voiceLUT, const byte *resourcePointer, size_t resourceLength); - -private: - void loadModuleBase(ModuleData &module, const byte *resourcePointer, size_t resourceLength); - - // runThread returns true if we should break running of other threads - bool runThread(ScriptThread *thread, uint instructionLimit); - void setThreadEntrypoint(ScriptThread *thread, int entrypointNumber); - -public: - void finishDialog(int replyID, int flags, int bitOffset); - -private: - - typedef void (Script::*ScriptFunctionType)(SCRIPTFUNC_PARAMS); - - struct ScriptFunctionDescription { - ScriptFunctionType scriptFunction; - const char *scriptFunctionName; - }; - const ScriptFunctionDescription *_scriptFunctionsList; - - void setupScriptFuncList(void); - - void sfPutString(SCRIPTFUNC_PARAMS); - void sfWait(SCRIPTFUNC_PARAMS); - void sfTakeObject(SCRIPTFUNC_PARAMS); - void sfIsCarried(SCRIPTFUNC_PARAMS); - void sfStatusBar(SCRIPTFUNC_PARAMS); - void sfMainMode(SCRIPTFUNC_PARAMS); - void sfScriptWalkTo(SCRIPTFUNC_PARAMS); - void sfScriptDoAction(SCRIPTFUNC_PARAMS); - void sfSetActorFacing(SCRIPTFUNC_PARAMS); - void sfStartBgdAnim(SCRIPTFUNC_PARAMS); - void sfStopBgdAnim(SCRIPTFUNC_PARAMS); - void sfLockUser(SCRIPTFUNC_PARAMS); - void sfPreDialog(SCRIPTFUNC_PARAMS); - void sfKillActorThreads(SCRIPTFUNC_PARAMS); - void sfFaceTowards(SCRIPTFUNC_PARAMS); - void sfSetFollower(SCRIPTFUNC_PARAMS); - void sfScriptGotoScene(SCRIPTFUNC_PARAMS); - - void sfSetObjImage(SCRIPTFUNC_PARAMS); - void sfSetObjName(SCRIPTFUNC_PARAMS); - void sfGetObjImage(SCRIPTFUNC_PARAMS); - void sfGetNumber(SCRIPTFUNC_PARAMS); - void sfScriptOpenDoor(SCRIPTFUNC_PARAMS); - void sfScriptCloseDoor(SCRIPTFUNC_PARAMS); - void sfSetBgdAnimSpeed(SCRIPTFUNC_PARAMS); - void SF_cycleColors(SCRIPTFUNC_PARAMS); - void sfDoCenterActor(SCRIPTFUNC_PARAMS); - void sfStartBgdAnimSpeed(SCRIPTFUNC_PARAMS); - void sfScriptWalkToAsync(SCRIPTFUNC_PARAMS); - void sfEnableZone(SCRIPTFUNC_PARAMS); - void sfSetActorState(SCRIPTFUNC_PARAMS); - void sfScriptMoveTo(SCRIPTFUNC_PARAMS); - void sfSceneEq(SCRIPTFUNC_PARAMS); - void sfDropObject(SCRIPTFUNC_PARAMS); - void sfFinishBgdAnim(SCRIPTFUNC_PARAMS); - void sfSwapActors(SCRIPTFUNC_PARAMS); - void sfSimulSpeech(SCRIPTFUNC_PARAMS); - void sfScriptWalk(SCRIPTFUNC_PARAMS); - void sfCycleFrames(SCRIPTFUNC_PARAMS); - void sfSetFrame(SCRIPTFUNC_PARAMS); - void sfSetPortrait(SCRIPTFUNC_PARAMS); - void sfSetProtagPortrait(SCRIPTFUNC_PARAMS); - void sfChainBgdAnim(SCRIPTFUNC_PARAMS); - void sfScriptSpecialWalk(SCRIPTFUNC_PARAMS); - void sfPlaceActor(SCRIPTFUNC_PARAMS); - void sfCheckUserInterrupt(SCRIPTFUNC_PARAMS); - void sfScriptWalkRelative(SCRIPTFUNC_PARAMS); - void sfScriptMoveRelative(SCRIPTFUNC_PARAMS); - void sfSimulSpeech2(SCRIPTFUNC_PARAMS); - void sfPlacard(SCRIPTFUNC_PARAMS); - void sfPlacardOff(SCRIPTFUNC_PARAMS); - void sfSetProtagState(SCRIPTFUNC_PARAMS); - void sfResumeBgdAnim(SCRIPTFUNC_PARAMS); - void sfThrowActor(SCRIPTFUNC_PARAMS); - void sfWaitWalk(SCRIPTFUNC_PARAMS); - void sfScriptSceneID(SCRIPTFUNC_PARAMS); - void sfChangeActorScene(SCRIPTFUNC_PARAMS); - void sfScriptClimb(SCRIPTFUNC_PARAMS); - void sfSetDoorState(SCRIPTFUNC_PARAMS); - void sfSetActorZ(SCRIPTFUNC_PARAMS); - void sfScriptText(SCRIPTFUNC_PARAMS); - void sfGetActorX(SCRIPTFUNC_PARAMS); - void sfGetActorY(SCRIPTFUNC_PARAMS); - void sfEraseDelta(SCRIPTFUNC_PARAMS); - void sfPlayMusic(SCRIPTFUNC_PARAMS); - void sfPickClimbOutPos(SCRIPTFUNC_PARAMS); - void sfTossRif(SCRIPTFUNC_PARAMS); - void sfShowControls(SCRIPTFUNC_PARAMS); - void sfShowMap(SCRIPTFUNC_PARAMS); - void sfPuzzleWon(SCRIPTFUNC_PARAMS); - void sfEnableEscape(SCRIPTFUNC_PARAMS); - void sfPlaySound(SCRIPTFUNC_PARAMS); - void sfPlayLoopedSound(SCRIPTFUNC_PARAMS); - void sfGetDeltaFrame(SCRIPTFUNC_PARAMS); - void sfShowProtect(SCRIPTFUNC_PARAMS); - void sfProtectResult(SCRIPTFUNC_PARAMS); - void sfRand(SCRIPTFUNC_PARAMS); - void sfFadeMusic(SCRIPTFUNC_PARAMS); - void sfScriptStartCutAway(SCRIPTFUNC_PARAMS); - void sfReturnFromCutAway(SCRIPTFUNC_PARAMS); - void sfEndCutAway(SCRIPTFUNC_PARAMS); - void sfGetMouseClicks(SCRIPTFUNC_PARAMS); - void sfResetMouseClicks(SCRIPTFUNC_PARAMS); - void sfWaitFrames(SCRIPTFUNC_PARAMS); - void sfScriptFade(SCRIPTFUNC_PARAMS); - void sfPlayVoice(SCRIPTFUNC_PARAMS); - void sfVstopFX(SCRIPTFUNC_PARAMS); - void sfVstopLoopedFX(SCRIPTFUNC_PARAMS); - void sfDemoIsInteractive(SCRIPTFUNC_PARAMS); - void sfVsetTrack(SCRIPTFUNC_PARAMS); - void sfDebugShowData(SCRIPTFUNC_PARAMS); - void sfNull(SCRIPTFUNC_PARAMS); - void sfWaitFramesEsc(SCRIPTFUNC_PARAMS); - void sfPsychicProfile(SCRIPTFUNC_PARAMS); - void sfPsychicProfileOff(SCRIPTFUNC_PARAMS); - void sfSetSpeechBox(SCRIPTFUNC_PARAMS); - void sfSetChapterPoints(SCRIPTFUNC_PARAMS); - void sfSetPortraitBgColor(SCRIPTFUNC_PARAMS); - void sfScriptStartVideo(SCRIPTFUNC_PARAMS); - void sfScriptReturnFromVideo(SCRIPTFUNC_PARAMS); - void sfScriptEndVideo(SCRIPTFUNC_PARAMS); - void sf87(SCRIPTFUNC_PARAMS); - void sf88(SCRIPTFUNC_PARAMS); - void sf89(SCRIPTFUNC_PARAMS); - void sfGetPoints(SCRIPTFUNC_PARAMS); - void sfSetGlobalFlag(SCRIPTFUNC_PARAMS); - void sfClearGlobalFlag(SCRIPTFUNC_PARAMS); - void sfTestGlobalFlag(SCRIPTFUNC_PARAMS); - void sfSetPoints(SCRIPTFUNC_PARAMS); - void sf103(SCRIPTFUNC_PARAMS); - void sfDisableAbortSpeeches(SCRIPTFUNC_PARAMS); - - void SF_stub(const char *name, ScriptThread *thread, int nArgs); -}; - -} // End of namespace Saga - -#endif |