scummvm/engines/stark/resources/script.h
2021-12-26 21:19:38 +01:00

180 lines
4.4 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef STARK_RESOURCES_SCRIPT_H
#define STARK_RESOURCES_SCRIPT_H
#include "common/str.h"
#include "engines/stark/resources/object.h"
namespace Stark {
namespace Formats {
class XRCReadStream;
}
namespace Resources {
class Command;
/**
* A script resource
*
* Scripts are made of a collection of Command resources. Commands
* return the next command to be executed, allowing for branches.
*/
class Script : public Object {
public:
static const Type::ResourceType TYPE = Type::kScript;
enum SubType {
kSubTypeGameEvent = 4,
kSubTypePlayerAction = 5,
kSubTypeDialog = 6
};
enum ScriptType {
kScriptTypeOnGameEvent = 0,
kScriptTypePassiveDialog = 1,
kScriptTypeOnPlayerAction = 2,
kScriptType3 = 3,
kScriptType4 = 4
};
enum GameEvent {
kGameEventOnGameLoop = 0,
kGameEventOnEnterLocation = 1,
kGameEventOnExitLocation = 2
};
/**
* Script call modes.
*
* Most script types are only meaningful for a call mode.
* The shouldExecute method checks the consistency between
* the script type and the call mode.
*/
enum CallMode {
kCallModeGameLoop = 1,
kCallModeExitLocation = 2,
kCallModeEnterLocation = 3,
kCallModePlayerAction = 4,
kCallModeDialogCreateSelections = 5,
kCallModeDialogAnswer = 6
};
enum ResumeStatus {
kResumeComplete,
kResumeAbort,
kResumeSuspend
};
Script(Object *parent, byte subType, uint16 index, const Common::String &name);
virtual ~Script();
// Resource API
void readData(Formats::XRCReadStream *stream) override;
void saveLoad(ResourceSerializer *serializer) override;
void saveLoadCurrent(ResourceSerializer *serializer) override;
void onAllLoaded() override;
void onGameLoop() override;
/** Reset the script so that it can be executed again from the beginning */
void reset();
/** Is the script enabled? */
bool isEnabled();
/** Enable the script */
void enable(bool value);
/** Disable and reset the script */
void stop();
/** Is the script on its Begin command? */
bool isOnBegin();
/** Has the script ended? */
bool isOnEnd();
/** Get the script's startup command */
Command *getBeginCommand();
/** Attempt to run the script using the specified call mode */
void execute(uint32 callMode);
/** Pause the script for the specified time */
void pause(int32 msecs);
/** Suspend the script while the specified resource is running */
void suspend(Object *cause);
/** Is the script paused, or waiting for a resource to complete? */
bool isSuspended();
/** Get the resource the script is waiting to complete, if any */
Object *getSuspendingResource() const;
/** Returns true if the script is enabled and valid for this call mode */
bool shouldExecute(uint32 callMode);
/** Step the script to the next command, overriding all checks */
void goToNextCommand();
/**
* Add an object to the return list.
*
* The script will resume execution of this object once it reaches an End opcode
*/
void addReturnObject(Object *object);
/** Set the outcome of a suspension (completion or abortion) */
void setResumeStatus(ResumeStatus status);
protected:
void print(uint depth) override;
void printData() override;
void updateSuspended();
void resumeCallerExecution(Object *callerObject);
uint32 _scriptType;
uint32 _runEvent;
uint32 _minChapter;
uint32 _maxChapter;
bool _shouldResetGameSpeed;
bool _enabled;
Command *_nextCommand;
int32 _pauseTimeLeft;
Object *_suspendingResource;
ResumeStatus _resumeStatus;
Common::Array<Object *> _returnObjects;
};
} // End of namespace Resources
} // End of namespace Stark
#endif // STARK_RESOURCES_SCRIPT_H