ScummVM API documentation
script.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef HARVESTER_SCRIPT_H
23 #define HARVESTER_SCRIPT_H
24 
25 #include "common/array.h"
26 #include "common/str.h"
27 #include "harvester/monster.h"
28 
29 namespace Common {
30 class Serializer;
31 }
32 
33 namespace Harvester {
34 
35 class ResourceManager;
36 
38  int posX = 0;
39  int posY = 0;
40  int posZ = 0;
41  int facing = -1;
42  Common::String direction;
43  Common::String roomName;
44  Common::String entranceName;
45 };
46 
48  int mapX = 0;
49  int mapY = 0;
50  int initialPanelIndex = 0;
51  Common::String entryName;
52 };
53 
55  int minX = 0;
56  int minY = 0;
57  int maxX = 0;
58  int maxY = 0;
59  int panelIndex = 0;
60  int labelX = 0;
61  int labelY = 0;
62  Common::String labelText;
63  Common::String destinationEntranceName;
64 };
65 
66 struct RoomRecord {
67  int minZ = 0;
68  int maxZ = 0;
69  int maxZScreenY = 0;
70  int minZScreenY = 0;
71  int fullScaleZ = 0;
72  int maxZScalePercent = 100;
73  float perspectiveScale = 0.0f;
74  float zVelocityStep = 1.0f;
75  Common::String roomName;
76  Common::String musicPath;
77  Common::String reservedString38;
78  Common::String reservedString3c;
79  Common::String reservedString40;
80  Common::String palettePath;
81  Common::String onEnterCommand;
82  Common::String onExitCommand;
83  bool dimmable = false;
84 };
85 
86 struct ObjectRecord {
87  int initialX = 0;
88  int initialY = 0;
89  int initialZ = 0;
90  int currentX = 0;
91  int currentY = 0;
92  int currentZ = 0;
93  int boundsX2 = 0;
94  int boundsY2 = 0;
95  int zExtent = 0;
96  Common::String actionTag;
97  Common::String spritePath;
98  Common::String altSpritePath;
99  Common::String objectName;
100  Common::String reservedXFlag;
101  Common::String identTextKey;
102  Common::String currentOwnerOrRoom;
103  Common::String reservedString40;
104  Common::String inventoryTextKey;
105  Common::String initialOwnerOrRoom;
106  Common::String interactionLabel;
107  bool operatable = false;
108  bool visible = false;
109  bool runtimeVisible = false;
110  bool identShown = false;
111 };
112 
113 struct AnimRecord {
114  int x = 0;
115  int y = 0;
116  int z = 0;
117  int frameDelay = 0;
118  Common::String roomName;
119  Common::String resourcePath;
120  Common::String animName;
121  bool active = false;
122  bool visible = false;
123  bool looping = false;
124  bool backward = false;
125  bool pingPong = false;
126  bool remove = false;
127  bool runtimeActive = false;
128  bool runtimeVisible = false;
129  int runtimeState = -1;
130 };
131 
132 struct NpcRecord {
133  int posX = 0;
134  int posY = 0;
135  int posZ = 0;
136  int frameDelay = 0;
137  Common::String onDeathActionTag;
138  Common::String modelPath;
139  Common::String npcName;
140  Common::String monsterfyTargetName;
141  Common::String roomName;
142  bool deathOrMonsterfyFlag = false;
143  bool runtimeSpawned = false;
144  int runtimeState = -1;
145  bool active = false;
146  bool visible = false;
147  bool savedVisible = false;
148  int deathDamageType = 0;
149  Common::String audioPath;
150  Common::String entityInitArg;
151 };
152 
153 struct TimerRecord {
154  int initialValue = 0;
155  int currentValue = 0;
156  Common::String timerName;
157  Common::String arg1;
158  Common::String arg2;
159  bool enabled = false;
160  bool looping = false;
161  bool global = false;
162 };
163 
164 struct RegionRecord {
165  int left = 0;
166  int top = 0;
167  int right = 0;
168  int bottom = 0;
169  int minZ = 0;
170  int maxZ = 0;
171  int desiredFacing = -1;
172  Common::String regionName;
173  Common::String direction;
174  Common::String roomName;
175  Common::String actionTag;
176  bool startEnabled = false;
177  bool cursorEnabled = false;
178 };
179 
180 struct FlagRecord {
181  Common::String name;
182  bool value = false;
183 };
184 
186  Common::String triggerTag;
187  Common::String opcodeName;
188  Common::String arg1;
189  Common::String arg2;
190  Common::String arg3;
191  Common::String arg4;
192 };
193 
195  Common::String listName;
197 };
198 
199 struct TextRecord {
200  Common::String key;
201  Common::String boxName;
202  Common::String value;
203 };
204 
205 struct HeadRecord {
206  Common::String headId;
207  Common::String portraitPath;
208 };
209 
211  Common::String itemName;
212  Common::String ownerOrRoom;
213  Common::String targetName;
214  Common::String actionTag;
215 };
216 
217 enum StartupDialogueTextMode {
218  kStartupDialogueTextNone = 0,
219  kStartupDialogueTextYes = 1,
220  kStartupDialogueTextClick = 2
221 };
222 
223 enum StartupAudioCommandType {
224  kStartupAudioCommandStartWav,
225  kStartupAudioCommandStartSingleWav,
226  kStartupAudioCommandLoadWav,
227  kStartupAudioCommandPlayWav,
228  kStartupAudioCommandDeleteWav
229 };
230 
231 struct AudioCommand {
232  StartupAudioCommandType type = kStartupAudioCommandStartWav;
233  Common::String path;
234  int slot = -1;
235 };
236 
238  Common::String entranceName;
239  Common::String roomName;
240  Common::String backgroundObjectName;
241  Common::String palettePath;
242  Common::String backgroundPath;
243  Common::String musicPath;
244  int discNumber = 0;
245  int roomMinZ = 0;
246  int roomMaxZ = 0;
247  int roomMaxZScreenY = 0;
248  int roomMinZScreenY = 0;
249  int roomFullScaleZ = 0;
250  int roomMaxZScalePercent = 100;
251  float roomPerspectiveScale = 0.0f;
252  float roomZVelocityStep = 1.0f;
253  bool hasEntrance = false;
254  int playerSpawnX = 0;
255  int playerSpawnY = 0;
256  int playerSpawnZ = 0;
257  int playerFacing = -1;
258  float paletteBrightness = 1.0f;
259  Common::Array<ObjectRecord> activeObjects;
260  Common::Array<ObjectRecord> roomObjects;
261  Common::Array<AnimRecord> roomAnimations;
262  Common::Array<NpcRecord> roomNpcs;
263  Common::Array<MonsterRecord> roomMonsters;
264  Common::Array<TimerRecord> roomTimers;
265  Common::Array<RegionRecord> roomRegions;
266  Common::Array<AudioCommand> audioCommands;
267 };
268 
270 public:
271  ScriptExecutionContext() = default;
272 
273  static ScriptExecutionContext forNpcDeath(const NpcRecord &npc) {
274  return ScriptExecutionContext(npc.roomName);
275  }
276  static ScriptExecutionContext forMonsterDeath(const MonsterRecord &monster) {
277  return ScriptExecutionContext(monster.roomName);
278  }
279 
280  const char *roomName() const {
281  return _roomName ? _roomName->c_str() : "";
282  }
283 
284 private:
285  friend struct SceneState;
286 
287  explicit ScriptExecutionContext(const Common::String &roomName) : _roomName(&roomName) {}
288 
289  const Common::String *const _roomName = nullptr;
290 };
291 
292 enum StartupRoomTransitionKind {
293  kStartupRoomTransitionNone = 0,
294  kStartupRoomTransitionChangeRoom,
295  kStartupRoomTransitionCloseup
296 };
297 
298 enum StartupLightingCommand {
299  kStartupLightingCommandNone = 0,
300  kStartupLightingCommandDim,
301  kStartupLightingCommandNormal,
302  kStartupLightingCommandBlack,
303  kStartupLightingCommandFadeIn
304 };
305 
306 struct ResolvedText {
307  Common::String boxName;
308  Common::String value;
309 };
310 
312  Common::String musicPath;
313  Common::String nextRoomName;
314  Common::String cutscenePath;
315  Common::String deathFlicPath;
316  Common::String dialogueNpcName;
317  Common::String dialogueContinuationTag;
318  Common::String continuationTag;
319  Common::String moveEntityToPlayerZName;
320  ResolvedText modalText;
321  Common::Array<AudioCommand> audioCommands;
322  Common::Array<TimerRecord> previousTimerRecords;
323  StartupRoomTransitionKind roomTransition = kStartupRoomTransitionNone;
324  StartupLightingCommand lightingCommand = kStartupLightingCommandNone;
325  int cdChangeDisc = 0;
326  int playerDeathDamageType = 0;
327  int playerGotoX = 0;
328  int playerGotoZ = 0;
329  bool requestPlayerDeath = false;
330  bool requestPlayerGotoXZ = false;
331  bool requestPlayerGotoZ = false;
332  bool requestRoomRestart = false;
333  Common::String roomRestartTargetName;
334  bool requestCloseupExit = false;
335  bool requestMainMenu = false;
336  bool requestDemoEnding = false;
337  bool abortRemainingCommandChain = false;
338  bool mutatedRuntimeState = false;
339  bool visualRuntimeStateChanged = false;
340 };
341 
342 class Script {
343 public:
344  static const int kDefaultPlayerHitPoints = 30;
345 
346  bool load(ResourceManager &resources);
347  bool reloadTownWorld(ResourceManager &resources);
348 
349  const Common::String &getPath() const { return _path; }
350  const Common::Array<byte> &getData() const { return _data; }
351  const Common::Array<EntranceRecord> &getEntrances() const { return _entrances; }
352  const Common::Array<MapEntranceRecord> &getMapEntrances() const { return _mapEntrances; }
353  const Common::Array<MapLocationRecord> &getMapLocations() const { return _mapLocations; }
354  const Common::Array<RoomRecord> &getRooms() const { return _rooms; }
355  const Common::Array<ObjectRecord> &getObjects() const { return _objects; }
356  const Common::Array<AnimRecord> &getAnimations() const { return _animations; }
357  const Common::Array<NpcRecord> &getNpcs() const { return _npcs; }
358  const Common::Array<MonsterRecord> &getMonsters() const { return _monsters; }
359  const Common::Array<TimerRecord> &getTimers() const { return _timers; }
360  const Common::Array<RegionRecord> &getRegions() const { return _regions; }
361  const Common::Array<FlagRecord> &getFlags() const { return _flags; }
362  const Common::Array<CommandRecord> &getCommands() const { return _commands; }
363  const Common::Array<ExecListRecord> &getExecLists() const { return _execLists; }
364  const Common::Array<TextRecord> &getTexts() const { return _texts; }
365  const Common::Array<HeadRecord> &getHeads() const { return _heads; }
366  const Common::Array<UseItemRecord> &getUseItems() const { return _useItems; }
367  bool isQuickTipsEnabled() const { return _quickTipsEnabled; }
368  void setQuickTipsEnabled(bool enabled) { _quickTipsEnabled = enabled; }
369  const Common::String &getVoicePath() const { return _voicePath; }
370  bool isGoreEnabled() const { return _goreEnabled; }
371  void setGoreEnabled(bool enabled) { _goreEnabled = enabled; }
372  StartupDialogueTextMode getDialogueTextMode() const { return _dialogueTextMode; }
373  void setDialogueTextMode(StartupDialogueTextMode mode) { _dialogueTextMode = mode; }
374  int getFxVolumeLevel() const { return _fxVolumeLevel; }
375  void setFxVolumeLevel(int level);
376  int getMusicVolumeLevel() const { return _musicVolumeLevel; }
377  void setMusicVolumeLevel(int level);
378  int getGammaLevel() const { return _gammaLevel; }
379  void setGammaLevel(int level);
380  const Common::String &getParentalPassword() const { return _parentalPassword; }
381  void setParentalPassword(const Common::String &password) { _parentalPassword = password; }
382  bool saveConfig() const;
383  void resetRuntimeState();
384  void syncRuntimeSaveState(Common::Serializer &s);
385  bool resolveRoomSetupState(const Common::String &entranceName, RoomSetupState &state,
386  ResourceManager &resources);
387  bool resolveRoomSetupStateByRoomName(const Common::String &roomName, RoomSetupState &state,
388  ResourceManager &resources);
389  bool materializeRoomState(const Common::String &entranceName, const Common::String &roomName,
390  RoomSetupState &state, ResourceManager &resources) const;
391  bool hasRoomSetupTarget(const Common::String &entranceName, const Common::String &roomName) const;
392  bool executeRoomEnterCommands(const Common::String &roomName, InteractionResult &result);
393  bool executeRoomExitCommands(const Common::String &roomName, InteractionResult &result);
394  bool resolveObjectInteraction(const ObjectRecord &object, InteractionResult &result,
395  const ScriptExecutionContext &executionContext);
396  bool resolveRegionInteraction(const RegionRecord &region, InteractionResult &result,
397  const ScriptExecutionContext &executionContext);
398  bool resolveUseItemInteraction(const Common::String &itemName, const ObjectRecord &target,
399  InteractionResult &result, const ScriptExecutionContext &executionContext);
400  bool executeDebugCommand(const CommandRecord &command, InteractionResult &result,
401  bool allowTransitions = true);
402  bool executeActionTag(const Common::String &tag, InteractionResult &result,
403  bool allowTransitions, const ScriptExecutionContext &executionContext);
404  bool executeTimerAction(const Common::String &timerName, InteractionResult &result,
405  bool allowTransitions, const ScriptExecutionContext &executionContext);
406  bool executeNestedActionTag(const Common::String &tag, InteractionResult &result,
407  bool allowTransitions = true);
408  bool isPickupObject(const ObjectRecord &object) const;
409  bool isPickupBlockedByAction(const ObjectRecord &object,
410  InteractionResult *result = nullptr) const;
411  bool hasObjectInteraction(const ObjectRecord &object) const;
412  bool hasUseItemInteraction(const Common::String &itemName, const ObjectRecord &target) const;
413  void getVisibleInventoryObjects(Common::Array<ObjectRecord> &objects) const;
414  bool isObjectInInventory(const Common::String &objectName) const;
415  void markObjectIdentShown(const ObjectRecord &object);
416  bool resolveObjectInspectText(const ObjectRecord &object, ResolvedText &text) const;
417  bool resolveTextRecord(const Common::String &key, ResolvedText &text) const;
418  Common::String resolveInventoryTooltipText(const ObjectRecord &object) const;
419  Common::String resolveObjectLabel(const ObjectRecord &object) const;
420  Common::String resolveTextValue(const Common::String &key) const;
421  const HeadRecord *findHeadRecord(const Common::String &headId) const;
422  const EntranceRecord *findEntranceRecord(const Common::String &entranceName) const;
423  const MapEntranceRecord *findMapEntranceRecord(const Common::String &entryName) const;
424  bool getFlagValue(const Common::String &flagName) const;
425  const TimerRecord *findRuntimeTimerRecord(const Common::String &timerName) const;
426  const NpcRecord *findRuntimeNpcRecord(const Common::String &npcName) const;
427  bool setRuntimeFlagValue(const Common::String &flagName, bool value);
428  bool resetRuntimeObjectToInitialState(const Common::String &objectName);
429  bool addRuntimeObjectToInventory(const Common::String &objectName);
430  bool syncRuntimeObjectRecord(const ObjectRecord &object);
431  bool setRuntimeObjectVisible(const Common::String &ownerOrRoom, const Common::String &objectName,
432  bool visible);
433  bool setRuntimeNpcState(const Common::String &npcName, bool active, bool visible);
434  bool queueRuntimeNpcDeathOrMonsterfy(const Common::String &npcName, int deathDamageType = 0);
435  enum { kNoMonsterfyPosZOverride = 0x7fffffff };
436  bool finalizeRuntimeNpcDeathOrMonsterfy(const Common::String &npcName, int deathDamageType = 0,
437  bool preserveCorpse = false, int corpseFrame = -1,
438  int monsterfyPosZ = kNoMonsterfyPosZOverride);
439  void pushDeferredLiveNpcDeathTransitions();
440  void popDeferredLiveNpcDeathTransitions();
441  bool isNamedNpcDeathTypeClear(const Common::String &npcName) const;
442  int getCurrentStoryDayIndex() const;
443  int getPlayerCurrentHitPoints() const { return _playerCurrentHitPoints; }
444  int getPlayerCombatLoadout() const { return _playerCombatLoadout; }
445  int getPlayerCombatResourceCount(int loadout) const;
446  bool consumePlayerCombatResourceUnit(int loadout);
447  bool isPlayerControlPaused() const { return _playerControlPaused; }
448  bool setPlayerCurrentHitPoints(int hitPoints);
449  bool adjustPlayerCurrentHitPoints(int delta);
450  bool setPlayerCombatResourceCount(int loadout, int count);
451  bool setPlayerCombatLoadout(int loadout);
452  bool setPlayerControlPaused(bool paused);
453  bool syncRuntimeAnimState(const Common::String &animName, bool active, bool visible, int currentFrame);
454  bool syncRuntimeMonsterRecord(const MonsterRecord &monster);
455  bool syncRuntimeTimerRecord(const TimerRecord &timer);
456  bool setRuntimeRegionEnabled(const Common::String &regionName, bool enabled);
457  bool setRuntimeTimerEnabled(const Common::String &timerName, bool enabled);
458 
459 private:
460  static const char *const kInventoryOwnerName;
461  static const int kDefaultPlayerCombatLoadout;
462 
463  struct CommandExecutionContext {
464  const char *label;
465  const Common::String &name;
466  const Common::String &roomName;
467  bool allowTransitions;
468  };
469 
470  enum CommandOutputPolicy {
471  kCommandOutputsInteraction,
472  // Suppress destination rooms, death movies and main-menu requests.
473  kCommandOutputsRoomExit
474  };
475 
476  enum CommandStepResult {
477  kCommandUnhandled,
478  kCommandContinue,
479  kCommandStop
480  };
481 
482  bool loadConfig(ResourceManager &resources);
483  void decode();
484  void parseTownRecords(ResourceManager &resources);
485  void parseTownRecordLine(ResourceManager &resources,
486  const Common::String &rawLine, uint32 &anonymousObjectId);
487  void parseFlagRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
488  void parseCommandRecord(ResourceManager &resources,
489  const Common::Array<Common::String> &tokens, uint tagIndex);
490  void parseExecListRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
491  void parseTextRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
492  void parseHeadRecord(ResourceManager &resources,
493  const Common::Array<Common::String> &tokens, uint tagIndex);
494  void parseUseItemRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
495  void parseEntranceRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
496  void parseMapEntranceRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
497  void parseMapLocationRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
498  void parseRoomRecord(ResourceManager &resources,
499  const Common::Array<Common::String> &tokens, uint tagIndex);
500  void parseNpcRecord(ResourceManager &resources,
501  const Common::Array<Common::String> &tokens, uint tagIndex);
502  void parseMonsterRecord(ResourceManager &resources,
503  const Common::Array<Common::String> &tokens, uint tagIndex);
504  void parseTimerRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
505  void parseRegionRecord(const Common::Array<Common::String> &tokens, uint tagIndex);
506  void parseAnimRecord(ResourceManager &resources,
507  const Common::Array<Common::String> &tokens, uint tagIndex);
508  void parseObjectRecord(ResourceManager &resources,
509  const Common::Array<Common::String> &tokens, uint tagIndex, uint32 &anonymousObjectId);
510  static int parseDeathDamageType(const Common::String &value);
511  const RoomRecord *findRoomRecord(const Common::String &roomName) const;
512  const CommandRecord *findCommandRecord(const Common::String &tag) const;
513  const ExecListRecord *findExecListRecord(const Common::String &name) const;
514  const TextRecord *findTextRecord(const Common::String &key) const;
515  const UseItemRecord *findUseItemRecord(const Common::String &itemName,
516  const ObjectRecord &target) const;
517  const FlagRecord *findRuntimeFlag(const Common::String &flagName) const;
518  FlagRecord *findRuntimeFlag(const Common::String &flagName);
519  ObjectRecord *findRuntimeObject(const Common::String &ownerOrRoom, const Common::String &objectName);
520  AnimRecord *findRuntimeAnim(const Common::String &animName);
521  RegionRecord *findRuntimeRegion(const Common::String &regionName);
522  NpcRecord *findRuntimeNpc(const Common::String &npcName);
523  const NpcRecord *findRuntimeNpc(const Common::String &npcName) const;
524  MonsterRecord *findRuntimeMonster(const Common::String &monsterName);
525  const MonsterRecord *findRuntimeMonster(const Common::String &monsterName) const;
526  MonsterRecord *findRuntimeMonster(const MonsterRecord &monster);
527  const MonsterRecord *findRuntimeMonster(const MonsterRecord &monster) const;
528  const MonsterRecord *findBaseMonster(const MonsterRecord &monster) const;
529  TimerRecord *findRuntimeTimer(const Common::String &timerName);
530  const TimerRecord *findRuntimeTimer(const Common::String &timerName) const;
531  const ObjectRecord *findRoomBackground(const RoomRecord &room, ResourceManager &resources) const;
532  void collectRuntimeRoomRecords(const RoomRecord &room, RoomSetupState &state) const;
533  bool buildRuntimeRoomState(const RoomRecord &room, const EntranceRecord *entrance,
534  ResourceManager &resources, RoomSetupState &state) const;
535  void executeCommandChain(const Common::String &initialTag, const CommandExecutionContext &context,
536  CommandOutputPolicy outputPolicy, InteractionResult &result);
537  CommandStepResult executeCommand(const CommandRecord &command,
538  const CommandExecutionContext &context, CommandOutputPolicy outputPolicy,
539  InteractionResult &result, Common::String &nextTag);
540  CommandStepResult executeBranchCommand(const CommandRecord &command,
541  const CommandExecutionContext &context, InteractionResult &result, Common::String &nextTag);
542  CommandStepResult executeAudioCommand(const CommandRecord &command,
543  const CommandExecutionContext &context, InteractionResult &result);
544  CommandStepResult executeObjectCommand(const CommandRecord &command,
545  const CommandExecutionContext &context, InteractionResult &result);
546  CommandStepResult executeAnimationCommand(const CommandRecord &command,
547  const CommandExecutionContext &context, InteractionResult &result);
548  CommandStepResult executeRegionCommand(const CommandRecord &command,
549  const CommandExecutionContext &context, InteractionResult &result);
550  CommandStepResult executeNpcCommand(const CommandRecord &command,
551  const CommandExecutionContext &context, InteractionResult &result);
552  CommandStepResult executeMonsterCommand(const CommandRecord &command,
553  const CommandExecutionContext &context, InteractionResult &result);
554  CommandStepResult executeTimerCommand(const CommandRecord &command,
555  const CommandExecutionContext &context, InteractionResult &result);
556  CommandStepResult executeExecListCommand(const CommandRecord &command,
557  const CommandExecutionContext &context, CommandOutputPolicy outputPolicy, InteractionResult &result);
558  CommandStepResult executeModalCommand(const CommandRecord &command,
559  const CommandExecutionContext &context, InteractionResult &result);
560  CommandStepResult executePlayerCommand(const CommandRecord &command,
561  InteractionResult &result);
562  CommandStepResult executeMovementCommand(const CommandRecord &command,
563  InteractionResult &result);
564  CommandStepResult executeTransitionCommand(const CommandRecord &command,
565  const CommandExecutionContext &context, CommandOutputPolicy outputPolicy, InteractionResult &result);
566  static bool hasDeferredInteractionOutputs(const InteractionResult &result, CommandOutputPolicy outputPolicy);
567  static int resolveCombatResourcePickupMax(int loadout);
568  bool probePickupBlockingCommandChain(const Common::String &initialTag,
569  const Common::String &contextName, InteractionResult &result, uint recursionDepth) const;
570  bool hasActionableCommandChain(const Common::String &initialTag) const;
571  int *getPlayerCombatResourceCountPtr(int loadout);
572  const int *getPlayerCombatResourceCountPtr(int loadout) const;
573  bool adjustPlayerCombatResourceCount(int loadout, int delta, int maxCount,
574  const Common::String &reason);
575  void restoreRuntimeFlags(const Common::Array<FlagRecord> &currentFlags);
576  void restoreRuntimeObjects(const Common::Array<ObjectRecord> &currentObjects);
577  void restoreRuntimeAnimations(const Common::Array<AnimRecord> &currentAnimations);
578  void restoreRuntimeRegions(const Common::Array<RegionRecord> &currentRegions);
579  void restoreRuntimeNpcs(const Common::Array<NpcRecord> &currentNpcs);
580  void restoreRuntimeMonsters(const Common::Array<MonsterRecord> &currentMonsters);
581  void restoreRuntimeTimers(const Common::Array<TimerRecord> &currentTimers);
582  void logRuntimeSaveFlags(const char *operation) const;
583  void logRuntimeSaveObjects(const char *operation) const;
584  void logRuntimeSaveNpcs(const char *operation) const;
585  void logRuntimeSaveMonsters(const char *operation) const;
586  void logRuntimeSaveTimers(const char *operation) const;
587  static int clampPlayerHitPoints(int hitPoints);
588  static int clampPlayerCombatLoadout(int loadout);
589  static int clampCombatResourceCount(int loadout, int count);
590  static int validatePlayerCombatLoadoutAgainstInventory(const Common::Array<ObjectRecord> &currentObjects,
591  int loadout, const char *contextLabel);
592  void logRuntimeSaveState(const char *operation) const;
593 
594  Common::String _path;
595  Common::Array<byte> _data;
597  Common::Array<MapEntranceRecord> _mapEntrances;
598  Common::Array<MapLocationRecord> _mapLocations;
601  Common::Array<AnimRecord> _animations;
612  Common::Array<FlagRecord> _currentFlags;
613  Common::Array<ObjectRecord> _currentObjects;
614  Common::Array<AnimRecord> _currentAnimations;
615  Common::Array<RegionRecord> _currentRegions;
616  Common::Array<NpcRecord> _currentNpcs;
617  Common::Array<MonsterRecord> _currentMonsters;
618  Common::Array<TimerRecord> _currentTimers;
619  int _nailgunAmmoCount = 0;
620  int _shotgunShellCount = 0;
621  int _nineGunBulletCount = 0;
622  int _thirtyEightGunBulletCount = 0;
623  int _chainsawFuelCount = 0;
624  int _playerCurrentHitPoints = 30;
625  int _playerCombatLoadout = 0;
626  bool _playerControlPaused = false;
627  int _fxVolumeLevel = 9;
628  int _musicVolumeLevel = 3;
629  int _gammaLevel = 0;
630  bool _quickTipsEnabled = true;
631  bool _goreEnabled = true;
632  Common::String _voicePath = "SOUND/VOICE/";
633  Common::String _parentalPassword;
634  Common::String _savePath = "./";
635  Common::String _townPath = "HARVEST.SCR";
636  Common::String _cdRomPath;
637  Common::String _drive1Path;
638  Common::String _drive2Path;
639  Common::String _drive3Path;
640  StartupDialogueTextMode _dialogueTextMode = kStartupDialogueTextYes;
641  int _deferredLiveNpcDeathTransitionDepth = 0;
642 };
643 
644 } // End of namespace Harvester
645 
646 #endif // HARVESTER_SCRIPT_H
Definition: script.h:237
Definition: str.h:59
Definition: script.h:37
Definition: art.h:31
Definition: script.h:132
Definition: script.h:342
Definition: room_support.h:46
Definition: script.h:185
Definition: script.h:153
Definition: script.h:210
Definition: script.h:86
Definition: script.h:66
Definition: script.h:199
Definition: serializer.h:80
Definition: script.h:194
Definition: script.h:205
Definition: script.h:306
Definition: algorithm.h:29
Definition: script.h:231
Definition: script.h:47
Definition: script.h:113
Definition: script.h:180
Definition: resources.h:32
Definition: script.h:164
Definition: script.h:269
Definition: monster.h:31
Definition: script.h:311
Definition: script.h:54