22 #ifndef MACS2_SCRIPTEXECUTOR_H 23 #define MACS2_SCRIPTEXECUTOR_H 25 #include "common/array.h" 26 #include "common/rect.h" 27 #include "common/scummsys.h" 28 #include "common/str-array.h" 31 class MemoryReadStream;
50 enum class MouseMode {
61 enum class ExecutorState {
70 enum class ExecutionResult {
78 enum class ScriptExecutionState {
105 void scriptSetVarOr();
107 void scriptIfFalse();
108 bool scriptCompare();
109 void scriptIfInteraction();
113 void scriptPrintStringLeft();
114 void scriptMoveObject();
115 ExecutionResult scriptChangeScene();
116 ExecutionResult scriptShowDialogue();
117 void scriptWalkToPosition();
118 ExecutionResult scriptWaitForWalk();
119 void scriptSkipWord();
120 void scriptClearDialogueChoices();
121 void scriptAddDialogueChoice();
122 ExecutionResult scriptShowDialogueChoice();
123 ExecutionResult scriptDismissPanel();
124 void scriptWalkToAndPickup();
125 bool scriptSetPickupFrames();
126 void scriptSetupObject();
127 void scriptSetSkippable();
128 void scriptClearSkippable();
129 void scriptPlayAnimation();
130 void scriptTestPathfinding();
131 void scriptSetYOffset();
132 void scriptSetMotion();
133 bool scriptSetOrientation();
134 void scriptMoveToPosition();
135 void scriptAddValues();
136 void scriptSubValues();
137 void scriptLoadSpecialAnim();
138 void scriptSetDirection();
139 void scriptStopAnimation();
140 void scriptOpenInventory();
141 void scriptLoadObjectAnim();
142 void scriptCheckObjectData();
143 void scriptCheckInventory();
144 void scriptSetSnapToTarget();
145 void scriptTestObjectAnimFrame();
146 void scriptPrintStringRight();
147 void scriptSetPaletteDarkness();
148 void scriptSetObjectShading();
149 void scriptSetObjectScaling();
150 void scriptSetHotspotOverride();
151 void scriptSetObjectBounds();
152 void scriptDismissAllPanels();
153 void scriptResetToSceneScript();
154 void scriptLoadOverlayFont();
155 void scriptAddOverlayTextEntry();
156 void scriptClearOverlayText();
157 void scriptFadeToBlack();
158 void scriptLoadPcmSound();
159 void scriptPlayPcmSound();
160 bool scriptWaitForSound();
161 void scriptStopPcmSound();
162 void scriptLoadMusicSlot();
163 void scriptPlayMusicSlot();
164 void scriptStopMusicSlot();
165 bool scriptWaitForMusic();
166 void scriptFreeMusicSlot();
167 void scriptGetObjectX();
168 void scriptGetObjectY();
169 void scriptGetObjectField8();
170 void scriptGetObjectOrientation();
171 void scriptClearActorInventory();
172 void scriptSetPathfindingRemap();
173 bool scriptWaitForAdlib();
174 void scriptSkipUntil14();
175 void scriptChangeAnimation();
176 void scriptFrameWait();
177 void scriptSetPathfinding();
178 void scriptTestSceneAnimFrame();
179 void scriptEndOverlayText();
180 void scriptFadeFromBlack();
181 void scriptFreePcmSound();
183 inline void scriptUnimplementedOpcode(
const char *source, uint16 opcode) {
184 debug(
"Unimplemented opcode (%s): %.2x.", source, opcode);
193 ExecutorState _state = ExecutorState::Idle;
201 bool _isSceneInitRun =
false;
206 bool _repeatRunFlag =
false;
211 bool _initPassComplete =
false;
212 bool _deferredRepeatAfterInit =
false;
213 bool _terminateOuterScriptBeforeRepeat =
false;
215 uint16 _executingObjectIndex = 0;
217 ScriptExecutionState _scriptExecutionState = ScriptExecutionState::ExecutingSceneScript;
220 bool isRelevantObject(
const GameObject *obj)
const;
230 bool loadNextScript();
232 bool _isTimerActive =
false;
233 uint32 _timerEndMillis = 0;
234 bool _isFrameWaitActive =
false;
235 uint16 _frameWaitTicksRemaining = 0;
246 uint32 _expectedEndLocation = 0;
247 uint8 _lastOpcode = 0;
248 uint32 _lastOpcodeStreamPos = 0;
251 void scriptSkipBlock();
253 void scriptSkipAlternate();
255 bool loadIndexedResource(
Common::Array<uint8> &outData, uint8 resourceIndex, uint16 objectTableOffset = 0x189);
260 void scriptReadValuePair(uint16 &out1, uint16 &out2);
263 uint32 scriptReadValue32();
266 uint16 scriptReadValue16();
269 void scriptSaveVariableHelper(uint32 value);
271 void scriptPrintString(
bool alignRight =
false);
274 bool _lastOpcodeTriggeredSkip =
false;
275 void beginBuffering();
276 void endBuffering(
bool shouldMark =
false);
283 uint16 _executingScriptObjectId = 0;
289 void setIdle() { _state = ExecutorState::Idle; }
296 uint32 _savedOpenInventoryScriptPos = 0;
297 uint32 _savedOpenInventoryScriptEndPos = 0;
298 uint16 _savedOpenInventoryExecutingObjectId = 0;
300 uint32 _secondaryInventoryLocation = 0;
301 bool _hasPendingExternalInventoryResume =
false;
302 uint16 _externalInventorySourceObjectID = 0;
303 MouseMode _savedExternalInventoryMouseMode = MouseMode::Use;
309 bool _pathWalkableResult =
false;
310 bool _isRepeatRun =
false;
313 int _chosenDialogueOption = 0;
314 uint16 _dialogueSpeakerObjectID = 0;
321 MouseMode _cursorMode = MouseMode::Walk;
322 MouseMode _cursorModeBeforeWait = MouseMode::Walk;
325 bool _waitingForUiClick =
false;
327 uint16 _interactedObjectID = 0;
330 uint16 _interactedInventoryItemId = 0;
331 uint16 _walkTargetObjectIndex = 0;
334 uint16 _scriptClickFlag = 0;
335 uint16 _scriptClickX = 0;
336 uint16 _scriptClickY = 0;
337 uint16 _scriptClickResult = 0;
338 uint16 _savedScriptClickFlag = 0;
339 uint16 _savedScriptClickX = 0;
340 uint16 _savedScriptClickY = 0;
341 uint16 _savedScriptClickResult = 0;
344 bool _inventoryCheckResult =
false;
345 bool _animBlobRangeTestResult =
false;
346 bool _soundEnabled =
true;
350 bool _scriptSkippable =
false;
351 bool _musicEnabled =
true;
352 bool _soundSystemActive =
true;
353 bool _overlayTextStageActive =
false;
354 bool _inventoryActionFlag =
false;
355 bool _inventoryCombineFlag =
false;
357 uint16 _activeMusicSlot = 0;
358 uint16 _musicControlMode = 0;
360 uint16 _musicControlStep = 0;
361 uint16 _musicControlVolume = 0;
365 bool _waitForPcmSound =
false;
366 bool _waitForMusicControl =
false;
367 bool _waitForAdlibReady =
false;
368 bool _debugPaused =
false;
369 bool _pickupInProgress =
false;
370 uint16 _pickupActorObjectID = 0;
371 uint16 _pickupTargetObjectID = 0;
373 bool _isRunningScript =
false;
375 bool _isSkipping =
false;
380 bool skipToEndOfSkippableSection();
383 uint16 getAreaAtPoint(uint16 x, uint16 y);
385 void setVariableValue(uint16 index, uint16 a, uint16 b);
387 void setVariableValue(uint16 index, uint32 value);
392 ExecutionResult executeOpcodes();
397 void run(
bool firstRun =
false);
400 void releaseObjectStream();
402 void setCurrentSceneScriptAt(uint32 offset);
406 void startTimer(uint32 duration);
408 void startFrameWait(uint16 duration);
412 bool isScriptWaitDeferred()
const {
413 return _state == ExecutorState::WaitingForCallback ||
414 _frameWaitTicksRemaining != 0 || _walkTargetObjectIndex != 0 ||
415 _waitForPcmSound || _waitForMusicControl || _waitForAdlibReady;
418 bool isExecuting()
const {
419 return _state != ExecutorState::Idle;
422 uint32 getScriptPosition()
const;
424 uint32 getDebugOpcodePosition()
const;
425 bool isWaitingForCallback()
const {
return _state == ExecutorState::WaitingForCallback; }
426 uint32 getScriptEndPosition()
const;
427 uint16 getExecutingObjectId()
const {
return _executingObjectIndex; }
428 void setExecutingObjectId(uint16
id) { _executingObjectIndex = id; }
429 uint16 getFrameWaitCounter()
const {
return _frameWaitTicksRemaining; }
430 void setFrameWaitCounter(uint16 val) { _frameWaitTicksRemaining = val; }
431 bool isFrameWaitActive()
const {
return _isFrameWaitActive; }
432 bool getRepeatRunFlag()
const {
return _repeatRunFlag; }
433 void setRepeatRunFlag(
bool val) { _repeatRunFlag = val; }
434 uint32 getVariableValue(
int index)
const;
437 void debugLogActorWalkState(
const char *context);
441 uint32 getSpecialValue(uint16 value);
444 bool canOpenSaveMenu()
const {
445 return !_isSceneInitRun && !_isFrameWaitActive && !_isTimerActive;
449 uint16 _scriptErrorCode = 0;
450 Character *getOrCreateCharacter(uint16 objectID);
455 void seedMotionState(
GameObject *
object,
Character *c, uint16 targetVerticalOffset, uint16 verticalOffsetDelta, uint16 motionDistance);
456 void saveOpenInventoryScriptContext();
457 void restoreOpenInventoryScriptContext();
458 void setScriptError(uint16 code);
459 bool hasScriptError()
const {
return _scriptErrorCode != 0; }
460 void clearScriptError() { _scriptErrorCode = 0; }
461 uint16 getScriptErrorCode()
const {
return _scriptErrorCode; }
464 uint32 _errorScriptPosition = 0;
465 uint16 _errorScriptContext = 0;
466 void recordScriptErrorPosition();
469 void beginSceneEntryInitPass();
470 void finishSceneEntryRepeatPass(
bool terminateOuterScript);
471 void runSceneEntryScriptPasses();
472 void runSceneScriptPass(
bool initRun,
bool repeatRun);
475 void enterBlockingWaitCursor();
476 void clearScriptUiWaitState();
Definition: gameobjects.h:86
Definition: scriptexecutor.h:99
void debug(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: scriptexecutor.h:41
Definition: algorithm.h:29
Definition: memstream.h:43
Definition: debugtools.h:25