ScummVM API documentation
Macs2::Script::ScriptExecutor Class Reference

#include <scriptexecutor.h>

Classes

struct  OpcodeEntry
 

Public Types

typedef OpcodeResult(ScriptExecutor::* OpcodeHandler) ()
 

Public Member Functions

void setOpcodeTable (const OpcodeEntry *table, uint size)
 
const char * opcodeName (uint8 opcode) const
 
 ScriptExecutor (Macs2::Macs2Engine *engine)
 
void syncScriptIsExecutingFlag ()
 
void setIdle ()
 
void restoreScriptExecutionAfterLoad (bool isExecuting, uint16 executingObjectId, uint16 scriptPosition, uint16 scriptEndPosition)
 
void prepareScriptStateForSave ()
 
bool skipToEndOfSkippableSection ()
 
uint16 getAreaAtPoint (uint16 x, uint16 y)
 
void setVariableValue (uint16 index, uint16 a, uint16 b)
 
void setVariableValue (uint16 index, uint32 value)
 
Common::Point getCharPosition ()
 
OpcodeResult executeOpcodes ()
 
void run (bool firstRun=false)
 
void setScript (Common::MemoryReadStream *stream)
 
void releaseObjectStream ()
 
void setCurrentSceneScriptAt (uint32 offset)
 
void tick ()
 
void startTimer (uint32 duration)
 
void endTimer ()
 
void startFrameWait (uint16 duration)
 
void endFrameWait ()
 
bool isScriptWaitDeferred () const
 
bool isExecuting () const
 
bool isScriptMidExecution () const
 
uint32 getScriptPosition () const
 
uint32 getDebugOpcodePosition () const
 
bool isWaitingForCallback () const
 
uint32 getScriptEndPosition () const
 
uint16 getExecutingObjectId () const
 
void setExecutingObjectId (uint16 id)
 
uint16 getFrameWaitCounter () const
 
void setFrameWaitCounter (uint16 val)
 
bool isFrameWaitActive () const
 
bool getRepeatRunFlag () const
 
void setRepeatRunFlag (bool val)
 
uint32 getVariableValue (int index) const
 
void debugLogActorWalkState (const char *context)
 
uint32 getSpecialValue (uint16 value)
 
bool canOpenSaveMenu () const
 
CharactergetOrCreateCharacter (uint16 objectID)
 
void saveWalkRuntime (const Character *c, GameObject *o) const
 
void restoreWalkRuntime (Character *c, const GameObject *o)
 
void clearStoredWalkRuntime (GameObject *o)
 
void seedMoveToPositionState (GameObject *object, Character *c, const Common::Point &target, uint16 targetVerticalOffset)
 
void seedMotionState (GameObject *object, Character *c, uint16 targetVerticalOffset, uint16 verticalOffsetDelta, uint16 motionDistance)
 
void saveOpenInventoryScriptContext ()
 
void restoreOpenInventoryScriptContext ()
 
void setScriptError (uint16 code)
 
bool hasScriptError () const
 
void clearScriptError ()
 
uint16 getScriptErrorCode () const
 
void recordScriptErrorPosition ()
 
void beginSceneEntryInitPass ()
 
void finishSceneEntryRepeatPass (bool terminateOuterScript)
 
void runSceneEntryScriptPasses ()
 
void runSceneScriptPass (bool initRun, bool repeatRun)
 
void enterBlockingWaitCursor ()
 
void clearScriptUiWaitState ()
 
void rewind ()
 

Static Public Member Functions

static Common::String stripAudioExtension (const Common::String &fileName)
 

Public Attributes

Common::Array< uint16 > _dialogueChoiceScriptIndices
 
Common::Array< Common::StringArray_dialogueChoices
 
uint32 _savedOpenInventoryScriptPos = 0
 
uint32 _savedOpenInventoryScriptEndPos = 0
 
uint16 _savedOpenInventoryExecutingObjectId = 0
 
uint32 _secondaryInventoryLocation = 0
 
bool _hasPendingExternalInventoryResume = false
 
uint16 _externalInventorySourceObjectID = 0
 
MouseMode _savedExternalInventoryMouseMode = MouseMode::Use
 
bool _pathWalkableResult = false
 
bool _isRepeatRun = false
 
int _chosenDialogueOption = 0
 
uint16 _dialogueSpeakerObjectID = 0
 
Common::Array< ScriptVariable_variables
 
MouseMode _cursorMode = MouseMode::Walk
 
MouseMode _cursorModeBeforeWait = MouseMode::Walk
 
bool _waitingForUiClick = false
 
uint16 _interactedObjectID = 0
 
uint16 _interactedInventoryItemId = 0
 
uint16 _walkTargetObjectIndex = 0
 
uint16 _scriptClickFlag = 0
 
uint16 _scriptClickX = 0
 
uint16 _scriptClickY = 0
 
uint16 _scriptClickResult = 0
 
uint16 _savedScriptClickFlag = 0
 
uint16 _savedScriptClickX = 0
 
uint16 _savedScriptClickY = 0
 
uint16 _savedScriptClickResult = 0
 
bool _inventoryCheckResult = false
 
bool _animBlobRangeTestResult = false
 
bool _soundEnabled = true
 
bool _scriptSkippable = false
 
bool _musicEnabled = true
 
bool _soundSystemActive = true
 
bool _textEnabled = true
 
bool _overlayTextStageActive = false
 
bool _inventoryActionFlag = false
 
bool _inventoryCombineFlag = false
 
Common::Array< uint8 > _musicSlots [2]
 
uint16 _activeMusicSlot = 0
 
uint16 _musicControlMode = 0
 
uint16 _musicControlStep = 0
 
uint16 _musicControlVolume = 0
 
bool _waitForPcmSound = false
 
bool _waitForMusicControl = false
 
bool _waitForAdlibReady = false
 
bool _waitForObjectAnimStep = false
 
uint16 _waitObjectAnimObjectId = 0
 
uint16 _waitObjectAnimSlot = 0
 
uint16 _waitObjectAnimTargetStep = 0
 
bool _waitForSpecialAnimStep = false
 
uint16 _waitSpecialAnimIndex = 0
 
uint16 _waitSpecialAnimTargetStep = 0
 
bool _waitForDeltaAnim = false
 
bool _waitForDeltaSpeed = false
 
bool _debugPaused = false
 
bool _pickupInProgress = false
 
uint16 _pickupActorObjectID = 0
 
uint16 _pickupTargetObjectID = 0
 
Macs2::Macs2Engine_engine
 
uint16 _scriptErrorCode = 0
 
uint32 _errorScriptPosition = 0
 
uint16 _errorScriptContext = 0
 

Static Public Attributes

static const OpcodeEntry kV1OpcodeTable []
 
static const uint kV1OpcodeTableSize
 
static const OpcodeEntry kV2OpcodeTable []
 
static const uint kV2OpcodeTableSize
 

Detailed Description

Here is how the state of the script executor works We can have a scheduled run (which will execute the next tick) or we can run it right away A run can have the two global variables set on it, and therefore might require being run a second time A run can remain within one function call or it can have time-dependent phases during which execution is paused and we wait (e.g. a timed wait event) After the scene script, we iterate executingObjectId from 1 to 0x200, executing the script of each object that has runtime data allocated (confirmed from runScriptExecutor at 1008:e3e7).

Member Function Documentation

◆ setOpcodeTable()

void Macs2::Script::ScriptExecutor::setOpcodeTable ( const OpcodeEntry table,
uint  size 
)

Install the active opcode table (use when a platform/version remaps opcodes).

◆ opcodeName()

const char* Macs2::Script::ScriptExecutor::opcodeName ( uint8  opcode) const

Name for opcode, or "?" if unset/out of range.

◆ stripAudioExtension()

static Common::String Macs2::Script::ScriptExecutor::stripAudioExtension ( const Common::String fileName)
static

Strip a trailing audio extension (.wav/.ogg/...) if present.

◆ restoreScriptExecutionAfterLoad()

void Macs2::Script::ScriptExecutor::restoreScriptExecutionAfterLoad ( bool  isExecuting,
uint16  executingObjectId,
uint16  scriptPosition,
uint16  scriptEndPosition 
)

Restore mid-script execution after loadGameFromFile (1008:747e). When isExecuting, mirrors binary: reattach scene/object script at saved position and leave the executor resumable (WaitingForCallback) so the next runScriptExecutor continues instead of rewinding to a fresh scene pass.

◆ prepareScriptStateForSave()

void Macs2::Script::ScriptExecutor::prepareScriptStateForSave ( )

Align executing object id / end position with the active script stream before save.

◆ isScriptMidExecution()

bool Macs2::Script::ScriptExecutor::isScriptMidExecution ( ) const
inline

Binary g_wScriptIsExecuting: script VM paused mid-bytecode (incl. UI waits).

Member Data Documentation

◆ kV1OpcodeTable

const OpcodeEntry Macs2::Script::ScriptExecutor::kV1OpcodeTable[]
static

Script dialect v1 opcode table (MCS / Amiga demo bytecode).

◆ kV2OpcodeTable

const OpcodeEntry Macs2::Script::ScriptExecutor::kV2OpcodeTable[]
static

Script dialect v2 opcode table (extends v1 through 0x6D). Remaps a few audio slots and adds 0x4F..0x6D

◆ _textEnabled

bool Macs2::Script::ScriptExecutor::_textEnabled = true

Dialogue/subtitle text display toggle (native options HUD).


The documentation for this class was generated from the following file: