Files
2026-02-02 04:50:13 +01:00

128 lines
3.6 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 GOT_GAME_SCRIPT_H
#define GOT_GAME_SCRIPT_H
#include "got/data/defines.h"
#include "got/gfx/gfx_pics.h"
namespace Got {
typedef void (*ScriptEndFn)();
enum ScriptPause {
SCRIPT_READY, SCRIPT_PAUSED, SCRIPT_RESUMING
};
class Scripts {
public:
Scripts();
~Scripts();
void executeScript(long index, const Gfx::Pics &speakerIcon, ScriptEndFn endFn = nullptr);
void pause();
void resume();
void setAskResponse(int option);
void runIfResuming();
private:
ScriptEndFn _endFn = nullptr;
long _numVar[26] = {}; // numeric variables
char _strVar[26][81] = {}; // string vars
char _lineLabel[32][9] = {}; // line label look up table
char *_linePtr[32] = {}; // line label pointers
char *_newPtr = nullptr;
int _numLabels = 0; // number of labels
char *_gosubStack[32] = {}; // stack for GOSUB return addresses
int _gosubPtr = 0; // GOSUB stack pointer
char *_forStack[11] = {}; // FOR stack
long _forVal[11] = {}; // current FOR value
int8 _forVar[11] = {}; // ending FOR value (target var)
int8 _forPtr = 0; // FOR stack pointer
char *_buffPtr = nullptr; // pointer to current command
char *_buffEnd = nullptr; // pointer to end of buffer
char *_buffer = nullptr; // buffer space (alloc'ed)
long _scrIndex = 0;
Gfx::Pics _scrPic;
long _lValue = 0;
long _lTemp = 0;
char _tempS[255] = {};
ScriptPause _paused = SCRIPT_READY;
int _askVar = -1;
private:
int readScriptFile();
void scriptError(int err_num);
int getCommand();
int skipColon();
int calcValue();
int getNextValue();
int calcString(int mode);
void getStr();
int getInternalVariable();
int execCommand(int num);
int getLine(char *src, char *dst);
void scriptEntry() {}
void scriptExit();
int cmd_goto();
int cmd_if();
int cmd_run();
int cmd_addJewels();
int cmd_addHealth();
int cmd_addMagic();
int cmd_addKeys();
int cmd_addScore();
int cmd_say(int mode, int type);
int cmd_ask();
int cmd_sound();
int cmd_setTile();
int cmd_itemGive();
int cmd_itemTake();
int cmd_setFlag();
int cmd_ltoa();
int cmd_pause();
int cmd_visible();
int cmd_random();
int cmd_exec();
void scr_func1();
void scr_func2();
void scr_func3();
void scr_func4();
void scr_func5();
typedef void (Scripts:: *ScrFunction)();
static ScrFunction scr_func[5];
void runScript(bool firstTime = true);
void scriptLoop();
};
extern void executeScript(long index, const Gfx::Pics &speakerIcon,
ScriptEndFn endFn = nullptr);
} // namespace Got
#endif