From 3d9784f94d3bc6c425d3180e59d322ab715e6306 Mon Sep 17 00:00:00 2001 From: Andrew Kurushin Date: Wed, 22 Dec 2004 21:04:50 +0000 Subject: - rewriten actors action handling (now uses all original flags etc) - added some script functions (swapactors...) - many things were renamed according scummvm covention - resource id definintions should begin with "RID_" prefix - intro temporary broken - work in progress todo: - walking hanling also should be rewriten - timings for speech and actor cycling should be more accurate svn-id: r16263 --- saga/script.h | 82 +++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 25 deletions(-) (limited to 'saga/script.h') diff --git a/saga/script.h b/saga/script.h index 0019c6a5a8..78c42779bf 100644 --- a/saga/script.h +++ b/saga/script.h @@ -47,9 +47,9 @@ namespace Saga { #define S_ERROR_PREFIX "SError: " #define S_WARN_PREFIX "SWarning: " -#define SFUNC_NUM 78 +#define SCRIPT_FUNCTION_MAX 78 -typedef unsigned int SDataWord_T; +typedef unsigned int ScriptDataWord; enum SCRIPT_VERBS { S_VERB_WALKTO = 0, @@ -95,9 +95,20 @@ enum ThreadWaitTypes { }; enum OpCodes { + +//... + opCcall = 0x18, + opCcallV = 0x19, +//... opSpeak = 0x53 }; +enum CycleFlags { + kCyclePong = (1 << 0), + kCycleOnce = (1 << 1), + kCycleRandom = (1 << 2), + kCycleReverse = (1 << 3) +}; struct SCRIPT_THREAD { int flags; // ThreadFlags int waitType; // ThreadWaitTypes @@ -113,16 +124,16 @@ struct SCRIPT_THREAD { // area. It's therefore probably quite important that our stacks work // the same as in the original interpreter. - SDataWord_T stackBuf[64]; + ScriptDataWord stackBuf[64]; int stackPtr; int framePtr; - SDataWord_T threadVars[4]; + ScriptDataWord threadVars[4]; - SDataWord_T retVal; + ScriptDataWord retVal; - SDataWord_T stackTop() { + ScriptDataWord stackTop() { return stackBuf[stackPtr]; } @@ -130,12 +141,12 @@ struct SCRIPT_THREAD { return ARRAYSIZE(stackBuf) - stackPtr - 1; } - void push(SDataWord_T n) { + void push(ScriptDataWord n) { assert(stackPtr > 0); stackBuf[--stackPtr] = n; } - SDataWord_T pop() { + ScriptDataWord pop() { assert(stackPtr < ARRAYSIZE(stackBuf)); return stackBuf[stackPtr++]; } @@ -186,9 +197,9 @@ struct SCRIPT_LUT_ENTRY { int voice_lut_rn; }; -struct SCRIPT_DATABUF { - SDataWord_T *data; - int len; +struct ScriptDataBuf { + ScriptDataWord *data; + int length; }; #define SCRIPTFUNC_PARAMS SCRIPT_THREAD *thread, int nArgs @@ -210,8 +221,11 @@ public: bool isInitialized() const { return _initialized; } bool isVoiceLUTPresent() const { return _voiceLUTPresent; } SCRIPTDATA *currentScript() { return _currentScript; } - void setBuffer(int idx, SCRIPT_DATABUF *ptr) { _dataBuf[idx] = ptr; } - SCRIPT_DATABUF *dataBuffer(int idx) { return _dataBuf[idx]; } + ScriptDataBuf *dataBuffer(int idx) { return &_dataBuf[idx]; } + int getWord(int bufNumber, int wordNumber, ScriptDataWord *data); + int putWord(int bufNumber, int wordNumber, ScriptDataWord data); + int setBit(int bufNumber, ScriptDataWord bitNumber, int bitState); + int getBit(int bufNumber, ScriptDataWord bitNumber, int *bitState); const char *getString(int index); void scriptInfo(); @@ -225,7 +239,7 @@ protected: int _scriptLUTMax; uint16 _scriptLUTEntryLen; SCRIPTDATA *_currentScript; - SCRIPT_DATABUF *_dataBuf[SCRIPT_DATABUF_NUM]; + ScriptDataBuf _dataBuf[SCRIPT_DATABUF_NUM]; ScriptThreadList _threadList; @@ -260,29 +274,29 @@ private: int SThreadSetEntrypoint(SCRIPT_THREAD *thread, int ep_num); private: - typedef int (Script::*SFunc_T)(SCRIPTFUNC_PARAMS); + typedef int (Script::*ScriptFunctionType)(SCRIPTFUNC_PARAMS); - const SFunc_T *_SFuncList; + const ScriptFunctionType *_scriptFunctionsList; void setupScriptFuncList(void); int SDebugPrintInstr(SCRIPT_THREAD *thread); int SF_putString(SCRIPTFUNC_PARAMS); - int SF_sleep(SCRIPTFUNC_PARAMS); + int sfWait(SCRIPTFUNC_PARAMS); int SF_takeObject(SCRIPTFUNC_PARAMS); int SF_objectIsCarried(SCRIPTFUNC_PARAMS); int SF_setStatusText(SCRIPTFUNC_PARAMS); int SF_commandMode(SCRIPTFUNC_PARAMS); int SF_actorWalkTo(SCRIPTFUNC_PARAMS); int SF_doAction(SCRIPTFUNC_PARAMS); - int SF_setFacing(SCRIPTFUNC_PARAMS); + int sfSetActorFacing(SCRIPTFUNC_PARAMS); int SF_startBgdAnim(SCRIPTFUNC_PARAMS); int SF_stopBgdAnim(SCRIPTFUNC_PARAMS); int SF_freezeInterface(SCRIPTFUNC_PARAMS); int SF_dialogMode(SCRIPTFUNC_PARAMS); int SF_killActorThreads(SCRIPTFUNC_PARAMS); int SF_faceTowards(SCRIPTFUNC_PARAMS); - int SF_setFollower(SCRIPTFUNC_PARAMS); + int sfSetFollower(SCRIPTFUNC_PARAMS); int SF_gotoScene(SCRIPTFUNC_PARAMS); int SF_setObjImage(SCRIPTFUNC_PARAMS); int SF_setObjName(SCRIPTFUNC_PARAMS); @@ -297,20 +311,20 @@ private: int SF_actorWalkToAsync(SCRIPTFUNC_PARAMS); int SF_enableZone(SCRIPTFUNC_PARAMS); int SF_setActorState(SCRIPTFUNC_PARAMS); - int SF_moveTo(SCRIPTFUNC_PARAMS); + int scriptMoveTo(SCRIPTFUNC_PARAMS); int SF_sceneEq(SCRIPTFUNC_PARAMS); int SF_dropObject(SCRIPTFUNC_PARAMS); int SF_finishBgdAnim(SCRIPTFUNC_PARAMS); - int SF_swapActors(SCRIPTFUNC_PARAMS); - int SF_simulSpeech(SCRIPTFUNC_PARAMS); + int sfSwapActors(SCRIPTFUNC_PARAMS); + int sfSimulSpeech(SCRIPTFUNC_PARAMS); int SF_actorWalk(SCRIPTFUNC_PARAMS); - int SF_cycleActorFrames(SCRIPTFUNC_PARAMS); - int SF_setFrame(SCRIPTFUNC_PARAMS); + int sfCycleFrames(SCRIPTFUNC_PARAMS); + int sfSetFrame(SCRIPTFUNC_PARAMS); int SF_setRightPortrait(SCRIPTFUNC_PARAMS); int SF_setLeftPortrait(SCRIPTFUNC_PARAMS); int SF_linkAnim(SCRIPTFUNC_PARAMS); int SF_scriptSpecialWalk(SCRIPTFUNC_PARAMS); - int SF_placeActor(SCRIPTFUNC_PARAMS); + int sfPlaceActor(SCRIPTFUNC_PARAMS); int SF_checkUserInterrupt(SCRIPTFUNC_PARAMS); int SF_walkRelative(SCRIPTFUNC_PARAMS); int SF_moveRelative(SCRIPTFUNC_PARAMS); @@ -347,6 +361,24 @@ private: int SF_playVoice(SCRIPTFUNC_PARAMS); }; +inline int getSWord(ScriptDataWord word) { + uint16 uInt = word; + int sInt; + + if (uInt & 0x8000U) { + sInt = (int)(uInt - 0x8000U) - 0x7FFF - 1; + } else { + sInt = uInt; + } + + return sInt; +} + +inline uint getUWord(ScriptDataWord word) { + return (uint16) word; +} + + } // End of namespace Saga #endif -- cgit v1.2.3