Merge SDEBUG_*, SF_* and STHREAD_* into Script class.

svn-id: r14568
This commit is contained in:
Eugene Sandulenko 2004-08-12 23:57:45 +00:00
parent cdb88416a8
commit 3fe739efb2
16 changed files with 293 additions and 395 deletions

View file

@ -29,7 +29,7 @@
#include "saga/cvar_mod.h"
#include "saga/console.h"
#include "saga/rscfile_mod.h"
#include "saga/script_mod.h"
#include "saga/script.h"
#include "saga/sndres.h"
#include "saga/sprite.h"
#include "saga/font.h"
@ -282,7 +282,7 @@ int Actor::skipDialogue() {
if (a_dnode != NULL) {
a_dialogue = (R_ACTORDIALOGUE *)ys_dll_get_data(a_dnode);
if (a_dialogue->d_sem != NULL) {
STHREAD_ReleaseSem(a_dialogue->d_sem);
_vm->_script->SThreadReleaseSem(a_dialogue->d_sem);
}
ys_dll_delete(a_dnode);
// And stop any currently playing voices
@ -471,7 +471,7 @@ int Actor::speak(int index, const char *d_string, uint16 d_voice_rn, R_SEMAPHORE
}
if (sem != NULL) {
STHREAD_HoldSem(sem);
_vm->_script->SThreadHoldSem(sem);
}
return R_SUCCESS;
@ -513,7 +513,7 @@ int Actor::handleSpeakIntent(R_ACTOR *actor, R_SPEAKINTENT *a_speakint, int *com
//actor->action = ACTION_IDLE;
if (a_dialogue->d_sem != NULL) {
STHREAD_ReleaseSem(a_dialogue->d_sem);
_vm->_script->SThreadReleaseSem(a_dialogue->d_sem);
}
carry_time = a_dialogue->d_time;
@ -770,7 +770,7 @@ int Actor::walkTo(int id, R_POINT *walk_pt, uint16 flags, R_SEMAPHORE *sem) {
ys_dll_add_tail(actor->a_intentlist, &actor_intent, sizeof actor_intent);
if (sem != NULL) {
STHREAD_HoldSem(sem);
_vm->_script->SThreadHoldSem(sem);
}
return R_SUCCESS;
@ -848,7 +848,7 @@ int Actor::handleWalkIntent(R_ACTOR *actor, R_WALKINTENT *a_walkint, int *comple
// Release path semaphore
if ((a_walkint->sem != NULL) && a_walkint->sem_held) {
STHREAD_ReleaseSem(a_walkint->sem);
_vm->_script->SThreadReleaseSem(a_walkint->sem);
}
*complete_p = 1;
@ -915,7 +915,7 @@ int Actor::handleWalkIntent(R_ACTOR *actor, R_WALKINTENT *a_walkint, int *comple
// Release path semaphore
if (a_walkint->sem != NULL) {
STHREAD_ReleaseSem(a_walkint->sem);
_vm->_script->SThreadReleaseSem(a_walkint->sem);
}
actor->action_frame = 0;
@ -931,7 +931,7 @@ int Actor::handleWalkIntent(R_ACTOR *actor, R_WALKINTENT *a_walkint, int *comple
// Release path semaphore
if (a_walkint->sem != NULL) {
STHREAD_ReleaseSem(a_walkint->sem);
_vm->_script->SThreadReleaseSem(a_walkint->sem);
}
actor->action_frame = 0;

View file

@ -28,6 +28,7 @@
#include "saga/interface.h"
#include "saga/render.h"
#include "saga/scene.h"
#include "saga/script.h"
namespace Saga {
@ -90,7 +91,7 @@ int SagaEngine::processInput() {
_vm->_render->toggleFlag(RF_OBJECTMAP_TEST);
break;
case 9: // Tab
STHREAD_DebugStep();
_vm->_script->SThreadDebugStep();
break;
// Actual game keys

View file

@ -32,7 +32,7 @@
#include "saga/font.h"
#include "saga/objectmap.h"
#include "saga/rscfile_mod.h"
#include "saga/script_mod.h"
#include "saga/script.h"
#include "saga/sprite.h"
#include "saga/interface.h"
@ -142,7 +142,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
return;
}
_iThread = STHREAD_Create();
_iThread = _vm->_script->SThreadCreate();
if (_iThread == NULL) {
warning("Interface::Interface(): Error creating script thread for game interface module");
return;
@ -504,7 +504,7 @@ int Interface::handlePlayfieldClick(R_SURFACE *ds, R_POINT *imouse_pt) {
// Execute object script if present
if (script_num != 0) {
STHREAD_Execute(_iThread, script_num);
_vm->_script->SThreadExecute(_iThread, script_num);
}
}
} else {

View file

@ -27,7 +27,7 @@
#define SAGA_INTERFACE_H__
#include "saga/sprite.h"
#include "saga/script_mod.h"
#include "saga/script.h"
namespace Saga {

View file

@ -47,7 +47,6 @@
#include "saga/interface.h"
#include "saga/isomap.h"
#include "saga/script.h"
#include "saga/script_mod.h"
#include "saga/scene.h"
#include "saga/sdata.h"
#include "saga/sndres.h"
@ -228,8 +227,8 @@ void SagaEngine::go() {
msec = R_MAX_TIME_DELTA;
}
_actor->direct(msec);
_vm->_events->handleEvents(msec);
STHREAD_ExecThreads(msec);
_events->handleEvents(msec);
_script->SThreadExecThreads(msec);
}
// Per frame processing
_render->drawScene();

View file

@ -33,7 +33,6 @@
#include "saga/events.h"
#include "saga/actionmap.h"
#include "saga/isomap.h"
#include "saga/script_mod.h"
#include "saga/objectmap.h"
#include "saga/palanim.h"
#include "saga/render.h"
@ -953,13 +952,13 @@ int Scene::defaultScene(int param, R_SCENE_INFO *scene_info) {
debug(0, "Starting start script #%d", _desc.startScriptNum);
_startScriptThread= STHREAD_Create();
_startScriptThread = _vm->_script->SThreadCreate();
if (_startScriptThread == NULL) {
_vm->_console->print("Thread creation failed.");
break;
}
STHREAD_Execute(_startScriptThread, _desc.startScriptNum);
STHREAD_completeThread();
_vm->_script->SThreadExecute(_startScriptThread, _desc.startScriptNum);
_vm->_script->SThreadCompleteThread();
}
debug(0, "Scene started");

View file

@ -31,9 +31,7 @@
#include "saga/console.h"
#include "saga/cvar_mod.h"
#include "saga/script_mod.h"
#include "saga/script.h"
#include "saga/sthread.h"
namespace Saga {
@ -129,6 +127,8 @@ Script::Script() {
// Initialize script submodules
_threadList = ys_dll_create();
setupScriptFuncList();
_initialized = true;
}
@ -151,7 +151,7 @@ Script::~Script() {
for (thread_node = ys_dll_head(_threadList); thread_node != NULL;
thread_node = ys_dll_next(thread_node)) {
thread = (R_SCRIPT_THREAD *)ys_dll_get_data(thread_node);
STHREAD_Destroy(thread);
SThreadDestroy(thread);
}
_initialized = false;
@ -520,7 +520,7 @@ void Script::scriptExec(int argc, char *argv[]) {
if (_dbg_thread == NULL) {
_vm->_console->print("Creating debug thread...");
_dbg_thread = STHREAD_Create();
_dbg_thread = SThreadCreate();
if (_dbg_thread == NULL) {
_vm->_console->print("Thread creation failed.");
return;
@ -532,7 +532,7 @@ void Script::scriptExec(int argc, char *argv[]) {
return;
}
STHREAD_Execute(_dbg_thread, ep_num);
SThreadExecute(_dbg_thread, ep_num);
}
void CF_script_info(int argc, char *argv[], void *refCon) {

View file

@ -26,12 +26,15 @@
#ifndef SAGA_SCRIPT_H
#define SAGA_SCRIPT_H
#include "saga/sdata.h"
#include "saga/text.h"
#include "saga/yslib.h"
#include "common/stack.h"
namespace Saga {
#define R_SCRIPT_DATABUF_NUM 5
#define R_SCRIPT_DATABUF_LEN 1024
#define R_S_LUT_ENTRYLEN_ITECD 22
#define R_S_LUT_ENTRYLEN_ITEDISK 16
@ -47,6 +50,41 @@ namespace Saga {
#define S_ERROR_PREFIX "SError: "
#define S_WARN_PREFIX "SWarning: "
#define R_SFUNC_NUM 78
typedef unsigned int SDataWord_T;
enum R_SCRIPT_VERBS {
S_VERB_WALKTO = 0,
S_VERB_LOOKAT = 2,
S_VERB_PICKUP = 1,
S_VERB_TALKTO,
S_VERB_OPEN = 5,
S_VERB_CLOSE = 6,
S_VERB_USE = 8,
S_VERB_GIVE
};
#define STHREAD_DEF_INSTR_COUNT 8
struct R_SEMAPHORE {
int hold_count;
};
struct R_SCRIPT_THREAD_tag {
int executing;
int sleep_time;
int ep_num; // Entrypoint number
unsigned long ep_offset; // Entrypoint offset
unsigned long i_offset; // Instruction offset
R_SEMAPHORE sem;
Common::Stack<SDataWord_T> *stack;
};
typedef struct R_SCRIPT_THREAD_tag R_SCRIPT_THREAD;
struct R_PROC_TBLENTRY {
size_t name_offset;
size_t offset;
@ -89,6 +127,7 @@ struct R_SCRIPT_DATABUF {
int len;
};
#define R_SCRIPTFUNC_PARAMS R_SCRIPT_THREAD *thread
class Script {
public:
@ -129,6 +168,69 @@ public:
int _dbg_dostep;
R_SCRIPT_THREAD *_dbg_thread;
R_TEXTLIST_ENTRY *_dbg_txtentry;
public:
R_SCRIPT_THREAD *SThreadCreate();
int SThreadExecute(R_SCRIPT_THREAD *thread, int ep_num);
int SThreadExecThreads(int msec);
int SThreadHoldSem(R_SEMAPHORE *sem);
int SThreadReleaseSem(R_SEMAPHORE *sem);
int SThreadDebugStep();
void SThreadCompleteThread(void);
int SThreadDestroy(R_SCRIPT_THREAD *thread);
private:
unsigned char *SThreadGetReadPtr(R_SCRIPT_THREAD *thread);
unsigned long SThreadGetReadOffset(const byte *read_p);
size_t SThreadGetReadLen(R_SCRIPT_THREAD *thread);
int SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec);
int SThreadSetEntrypoint(R_SCRIPT_THREAD *thread, int ep_num);
private:
typedef int (Script::*SFunc_T)(R_SCRIPTFUNC_PARAMS);
struct R_SFUNC_ENTRY {
int sfunc_num;
int sfunc_argc;
SFunc_T sfunc_fp;
};
const R_SFUNC_ENTRY *_SFuncList;
void setupScriptFuncList(void);
int SDebugPrintInstr(R_SCRIPT_THREAD *thread);
int SF_sleep(R_SCRIPTFUNC_PARAMS);
int SF_3(R_SCRIPTFUNC_PARAMS);
int SF_setCommandText(R_SCRIPTFUNC_PARAMS);
int SF_actorWalkTo(R_SCRIPTFUNC_PARAMS);
int SF_setFacing(R_SCRIPTFUNC_PARAMS);
int SF_freezeInterface(R_SCRIPTFUNC_PARAMS);
int SF_startAnim(R_SCRIPTFUNC_PARAMS);
int SF_actorWalkToAsync(R_SCRIPTFUNC_PARAMS);
int SF_moveTo(R_SCRIPTFUNC_PARAMS);
int SF_actorWalk(R_SCRIPTFUNC_PARAMS);
int SF_cycleActorFrames(R_SCRIPTFUNC_PARAMS);
int SF_setFrame(R_SCRIPTFUNC_PARAMS);
int SF_linkAnim(R_SCRIPTFUNC_PARAMS);
int SF_placeActor(R_SCRIPTFUNC_PARAMS);
int SF_checkUserInterrupt(R_SCRIPTFUNC_PARAMS);
int SF_moveRelative(R_SCRIPTFUNC_PARAMS);
int SF_doAction(R_SCRIPTFUNC_PARAMS);
int SF_faceTowards(R_SCRIPTFUNC_PARAMS);
int SF_setFollower(R_SCRIPTFUNC_PARAMS);
int SF_centerActor(R_SCRIPTFUNC_PARAMS);
int SF_setActorState(R_SCRIPTFUNC_PARAMS);
int SF_swapActors(R_SCRIPTFUNC_PARAMS);
int SF_scriptSpecialWalk(R_SCRIPTFUNC_PARAMS);
int SF_walkRelative(R_SCRIPTFUNC_PARAMS);
int SF_throwActor(R_SCRIPTFUNC_PARAMS);
int SF_waitWalk(R_SCRIPTFUNC_PARAMS);
int SF_changeActorScene(R_SCRIPTFUNC_PARAMS);
int SF_climb(R_SCRIPTFUNC_PARAMS);
int SF_setActorZ(R_SCRIPTFUNC_PARAMS);
int SF_getActorX(R_SCRIPTFUNC_PARAMS);
int SF_getActorY(R_SCRIPTFUNC_PARAMS);
};
} // End of namespace Saga

View file

@ -1,56 +0,0 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2004 The ScummVM project
*
* The ReInherit Engine is (C)2000-2003 by Daniel Balsom.
*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header$
*
*/
// Scripting module public header
#ifndef SAGA_SCRIPT_MOD_H
#define SAGA_SCRIPT_MOD_H
namespace Saga {
typedef unsigned int SDataWord_T;
typedef struct R_SCRIPT_THREAD_tag R_SCRIPT_THREAD;
enum R_SCRIPT_VERBS {
S_VERB_WALKTO = 0,
S_VERB_LOOKAT = 2,
S_VERB_PICKUP = 1,
S_VERB_TALKTO,
S_VERB_OPEN = 5,
S_VERB_CLOSE = 6,
S_VERB_USE = 8,
S_VERB_GIVE
};
R_SCRIPT_THREAD *STHREAD_Create();
int STHREAD_Execute(R_SCRIPT_THREAD *thread, int ep_num);
int STHREAD_ExecThreads(int msec);
int STHREAD_HoldSem(R_SEMAPHORE *sem);
int STHREAD_ReleaseSem(R_SEMAPHORE *sem);
int STHREAD_DebugStep();
void STHREAD_completeThread(void);
} // End of namespace Saga
#endif

View file

@ -24,7 +24,6 @@
#include "saga/saga.h"
#include "saga/gfx.h"
#include "saga/script_mod.h"
#include "saga/script.h"
#include "saga/sdata.h"

View file

@ -28,9 +28,6 @@
namespace Saga {
#define R_SCRIPT_DATABUF_NUM 5
#define R_SCRIPT_DATABUF_LEN 1024
class SData {
public:
SData();

View file

@ -29,16 +29,14 @@
#include "saga/scene.h"
#include "saga/font.h"
#include "saga/script_mod.h"
#include "saga/script.h"
#include "saga/sthread.h"
namespace Saga {
#define SD_DISPLAY_LEN 128
#define SD_ADDTXT( x ) strncat( disp_buf, x, SD_DISPLAY_LEN );
int SDEBUG_PrintInstr(R_SCRIPT_THREAD *thread) {
int Script::SDebugPrintInstr(R_SCRIPT_THREAD *thread) {
R_TEXTLIST_ENTRY tl_e;
char tmp_buf[80] = { 0 };
static char disp_buf[SD_DISPLAY_LEN] = { 0 };
@ -52,9 +50,9 @@ int SDEBUG_PrintInstr(R_SCRIPT_THREAD *thread) {
disp_buf[0] = 0;
if (_vm->_script->_dbg_txtentry != NULL) {
_vm->textDeleteEntry(si.text_list, _vm->_script->_dbg_txtentry);
_vm->_script->_dbg_txtentry = NULL;
if (_dbg_txtentry != NULL) {
_vm->textDeleteEntry(si.text_list, _dbg_txtentry);
_dbg_txtentry = NULL;
}
tl_e.color = 1;
@ -66,9 +64,9 @@ int SDEBUG_PrintInstr(R_SCRIPT_THREAD *thread) {
tl_e.string = disp_buf;
tl_e.display = 1;
MemoryReadStream readS(_vm->_script->currentScript()->bytecode->bytecode_p
MemoryReadStream readS(currentScript()->bytecode->bytecode_p
+ thread->i_offset,
_vm->_script->currentScript()->bytecode->bytecode_len
currentScript()->bytecode->bytecode_len
- thread->i_offset);
in_char = readS.readByte();
sprintf(tmp_buf, "%04lX | %02X | ", thread->i_offset, in_char);
@ -514,8 +512,8 @@ int SDEBUG_PrintInstr(R_SCRIPT_THREAD *thread) {
break;
}
_vm->_script->_dbg_txtentry = _vm->textAddEntry(si.text_list, &tl_e);
_vm->textSetDisplay(_vm->_script->_dbg_txtentry, 1);
_dbg_txtentry = _vm->textAddEntry(si.text_list, &tl_e);
_vm->textSetDisplay(_dbg_txtentry, 1);
return R_SUCCESS;
}

View file

@ -32,28 +32,32 @@
#include "saga/interface.h"
#include "saga/script.h"
#include "saga/sfuncs.h"
#include "saga/sdata.h"
#include "common/stack.h"
namespace Saga {
R_SFUNC_ENTRY SFuncList[R_SFUNC_NUM] = {
#define OPCODE(x) &Script::x
void Script::setupScriptFuncList(void) {
static const R_SFUNC_ENTRY SFuncList[R_SFUNC_NUM] = {
{0, 0, NULL},
{1, 1, SF_sleep},
{1, 1, OPCODE(SF_sleep)},
{2, 0, NULL},
{3, 1, SF_3},
{4, 1, SF_setCommandText},
{3, 1, OPCODE(SF_3)},
{4, 1, OPCODE(SF_setCommandText)},
{5, 0, NULL},
{6, 3, SF_actorWalkTo},
{7, 0, SF_doAction},
{8, 2, SF_setFacing},
{6, 3, OPCODE(SF_actorWalkTo)},
{7, 0, OPCODE(SF_doAction)},
{8, 2, OPCODE(SF_setFacing)},
{9, 0, NULL},
{10, 0, NULL},
{11, 1, SF_freezeInterface},
{11, 1, OPCODE(SF_freezeInterface)},
{12, 0, NULL},
{13, 0, NULL},
{14, 0, SF_faceTowards},
{15, 0, SF_setFollower},
{14, 0, OPCODE(SF_faceTowards)},
{15, 0, OPCODE(SF_setFollower)},
{16, 0, NULL},
{17, 0, NULL},
{18, 0, NULL},
@ -63,43 +67,43 @@ R_SFUNC_ENTRY SFuncList[R_SFUNC_NUM] = {
{22, 0, NULL},
{23, 0, NULL},
{24, 0, NULL},
{25, 0, SF_centerActor},
{26, 3, SF_startAnim},
{27, 3, SF_actorWalkToAsync},
{25, 0, OPCODE(SF_centerActor)},
{26, 3, OPCODE(SF_startAnim)},
{27, 3, OPCODE(SF_actorWalkToAsync)},
{28, 0, NULL},
{29, 0, SF_setActorState},
{30, 3, SF_moveTo},
{29, 0, OPCODE(SF_setActorState)},
{30, 3, OPCODE(SF_moveTo)},
{31, 0, NULL},
{32, 0, NULL},
{33, 0, NULL},
{34, 0, SF_swapActors},
{34, 0, OPCODE(SF_swapActors)},
{35, 0, NULL},
{36, 4, SF_actorWalk},
{37, 4, SF_cycleActorFrames},
{38, 3, SF_setFrame},
{36, 4, OPCODE(SF_actorWalk)},
{37, 4, OPCODE(SF_cycleActorFrames)},
{38, 3, OPCODE(SF_setFrame)},
{39, 0, NULL},
{40, 0, NULL},
{41, 4, SF_linkAnim},
{42, 0, SF_scriptSpecialWalk},
{43, 6, SF_placeActor},
{44, 0, SF_checkUserInterrupt},
{45, 0, SF_walkRelative},
{46, 0, SF_moveRelative},
{41, 4, OPCODE(SF_linkAnim)},
{42, 0, OPCODE(SF_scriptSpecialWalk)},
{43, 6, OPCODE(SF_placeActor)},
{44, 0, OPCODE(SF_checkUserInterrupt)},
{45, 0, OPCODE(SF_walkRelative)},
{46, 0, OPCODE(SF_moveRelative)},
{47, 0, NULL},
{48, 0, NULL},
{49, 0, NULL},
{50, 0, NULL},
{51, 0, NULL},
{52, 0, SF_throwActor},
{53, 0, SF_waitWalk},
{52, 0, OPCODE(SF_throwActor)},
{53, 0, OPCODE(SF_waitWalk)},
{54, 0, NULL},
{55, 0, SF_changeActorScene},
{56, 0, SF_climb},
{55, 0, OPCODE(SF_changeActorScene)},
{56, 0, OPCODE(SF_climb)},
{57, 0, NULL},
{58, 0, SF_setActorZ},
{58, 0, OPCODE(SF_setActorZ)},
{59, 0, NULL},
{60, 0, SF_getActorX},
{61, 0, SF_getActorY},
{60, 0, OPCODE(SF_getActorX)},
{61, 0, OPCODE(SF_getActorY)},
{62, 0, NULL},
{63, 0, NULL},
{64, 0, NULL},
@ -116,12 +120,14 @@ R_SFUNC_ENTRY SFuncList[R_SFUNC_NUM] = {
{75, 0, NULL},
{76, 0, NULL},
{77, 0, NULL}
};
};
_SFuncList = SFuncList;
}
// Script function #1 (0x01) blocking
// Suspends thread execution for the specified time period
// Param1: time to suspend ( units? )
int SF_sleep(R_SCRIPTFUNC_PARAMS) {
int Script::SF_sleep(R_SCRIPTFUNC_PARAMS) {
SDataWord_T time_param;
int time;
@ -134,7 +140,7 @@ int SF_sleep(R_SCRIPTFUNC_PARAMS) {
// Script function #3 (0x03)
// Unknown function; pops a parameter and pushes a return value
// Param1: unknown
int SF_3(R_SCRIPTFUNC_PARAMS) {
int Script::SF_3(R_SCRIPTFUNC_PARAMS) {
// INCOMPLETE
SDataWord_T param1;
param1 = thread->stack->pop();
@ -147,7 +153,7 @@ int SF_3(R_SCRIPTFUNC_PARAMS) {
// Script function #4 (0x04) nonblocking
// Set the command display to the specified text string
// Param1: dialogue index of string
int SF_setCommandText(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setCommandText(R_SCRIPTFUNC_PARAMS) {
SDataWord_T s_idx_parm;
s_idx_parm = thread->stack->pop();
@ -161,7 +167,7 @@ int SF_setCommandText(R_SCRIPTFUNC_PARAMS) {
// Param1: actor id
// Param2: actor destination x
// Param3: actor destination y
int SF_actorWalkTo(R_SCRIPTFUNC_PARAMS) {
int Script::SF_actorWalkTo(R_SCRIPTFUNC_PARAMS) {
SDataWord_T actor_parm;
SDataWord_T x_parm;
SDataWord_T y_parm;
@ -189,7 +195,7 @@ int SF_actorWalkTo(R_SCRIPTFUNC_PARAMS) {
}
// Script function #7
int SF_doAction(R_SCRIPTFUNC_PARAMS) {
int Script::SF_doAction(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
@ -197,7 +203,7 @@ int SF_doAction(R_SCRIPTFUNC_PARAMS) {
// Sets the orientation of the specified actor.
// Param1: actor id
// Param2: actor orientation
int SF_setFacing(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setFacing(R_SCRIPTFUNC_PARAMS) {
SDataWord_T actor_parm;
SDataWord_T orient_parm;
int actor_id;
@ -224,7 +230,7 @@ int SF_setFacing(R_SCRIPTFUNC_PARAMS) {
// continues to run. If the parameter is false, the user interface is
// reenabled.
// Param1: boolean
int SF_freezeInterface(R_SCRIPTFUNC_PARAMS) {
int Script::SF_freezeInterface(R_SCRIPTFUNC_PARAMS) {
SDataWord_T b_param;
b_param = thread->stack->pop();
@ -239,17 +245,17 @@ int SF_freezeInterface(R_SCRIPTFUNC_PARAMS) {
}
// Script function #14
int SF_faceTowards(R_SCRIPTFUNC_PARAMS) {
int Script::SF_faceTowards(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #15
int SF_setFollower(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setFollower(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #25
int SF_centerActor(R_SCRIPTFUNC_PARAMS) {
int Script::SF_centerActor(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
@ -258,7 +264,7 @@ int SF_centerActor(R_SCRIPTFUNC_PARAMS) {
// Param1: ?
// Param2: frames of animation to play or -1 to loop
// Param3: animation id
int SF_startAnim(R_SCRIPTFUNC_PARAMS) {
int Script::SF_startAnim(R_SCRIPTFUNC_PARAMS) {
// FIXME: implementation is wrong. Should link animation
SDataWord_T unk_parm;
SDataWord_T frame_parm;
@ -286,7 +292,7 @@ int SF_startAnim(R_SCRIPTFUNC_PARAMS) {
// Param1: actor id
// Param2: actor destination x
// Param3: actor destination y
int SF_actorWalkToAsync(R_SCRIPTFUNC_PARAMS) {
int Script::SF_actorWalkToAsync(R_SCRIPTFUNC_PARAMS) {
SDataWord_T actor_parm;
SDataWord_T x_parm;
SDataWord_T y_parm;
@ -314,7 +320,7 @@ int SF_actorWalkToAsync(R_SCRIPTFUNC_PARAMS) {
}
// Script function #29
int SF_setActorState(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setActorState(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
@ -324,7 +330,7 @@ int SF_setActorState(R_SCRIPTFUNC_PARAMS) {
// Param1: actor id
// Param2: actor pos x
// Param3: actor pos y
int SF_moveTo(R_SCRIPTFUNC_PARAMS) {
int Script::SF_moveTo(R_SCRIPTFUNC_PARAMS) {
SDataWord_T actor_parm;
SDataWord_T x_parm;
SDataWord_T y_parm;
@ -356,7 +362,7 @@ int SF_moveTo(R_SCRIPTFUNC_PARAMS) {
}
// Script function #34
int SF_swapActors(R_SCRIPTFUNC_PARAMS) {
int Script::SF_swapActors(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
@ -366,7 +372,7 @@ int SF_swapActors(R_SCRIPTFUNC_PARAMS) {
// Param2: actor destination x
// Param3: actor destination y
// Param4: unknown
int SF_actorWalk(R_SCRIPTFUNC_PARAMS) {
int Script::SF_actorWalk(R_SCRIPTFUNC_PARAMS) {
// INCOMPLETE
SDataWord_T actor_parm;
SDataWord_T x_parm;
@ -404,7 +410,7 @@ int SF_actorWalk(R_SCRIPTFUNC_PARAMS) {
// Param2: unknown
// Param3: actor action state
// Param4: unknown
int SF_cycleActorFrames(R_SCRIPTFUNC_PARAMS) {
int Script::SF_cycleActorFrames(R_SCRIPTFUNC_PARAMS) {
// INCOMPLETE
SDataWord_T actor_parm;
SDataWord_T unk1_parm;
@ -436,7 +442,7 @@ int SF_cycleActorFrames(R_SCRIPTFUNC_PARAMS) {
// Param1: actor id
// Param2: actor action state
// Param3: unknown
int SF_setFrame(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setFrame(R_SCRIPTFUNC_PARAMS) {
// INCOMPLETE
SDataWord_T actor_parm;
@ -471,7 +477,7 @@ int SF_setFrame(R_SCRIPTFUNC_PARAMS) {
// Param2: total linked frame count
// Param3: animation id link target
// Param4: animation id link source
int SF_linkAnim(R_SCRIPTFUNC_PARAMS) {
int Script::SF_linkAnim(R_SCRIPTFUNC_PARAMS) {
SDataWord_T unk_parm;
SDataWord_T tframes_parm;
SDataWord_T anim1_parm;
@ -497,7 +503,7 @@ int SF_linkAnim(R_SCRIPTFUNC_PARAMS) {
}
// Script function #42
int SF_scriptSpecialWalk(R_SCRIPTFUNC_PARAMS) {
int Script::SF_scriptSpecialWalk(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
@ -510,7 +516,7 @@ int SF_scriptSpecialWalk(R_SCRIPTFUNC_PARAMS) {
// Param4: ?
// Param5: actor action
// Param6: ?
int SF_placeActor(R_SCRIPTFUNC_PARAMS) {
int Script::SF_placeActor(R_SCRIPTFUNC_PARAMS) {
// INCOMPLETE
SDataWord_T actor_parm;
SDataWord_T x_parm;
@ -557,7 +563,7 @@ int SF_placeActor(R_SCRIPTFUNC_PARAMS) {
// Checks to see if the user has interrupted a currently playing
// game cinematic. Pushes a zero or positive value if the game
// has not been interrupted.
int SF_checkUserInterrupt(R_SCRIPTFUNC_PARAMS) {
int Script::SF_checkUserInterrupt(R_SCRIPTFUNC_PARAMS) {
thread->stack->push(0);
// INCOMPLETE
@ -566,47 +572,47 @@ int SF_checkUserInterrupt(R_SCRIPTFUNC_PARAMS) {
}
// Script function #45
int SF_walkRelative(R_SCRIPTFUNC_PARAMS) {
int Script::SF_walkRelative(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #46
int SF_moveRelative(R_SCRIPTFUNC_PARAMS) {
int Script::SF_moveRelative(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #52
int SF_throwActor(R_SCRIPTFUNC_PARAMS) {
int Script::SF_throwActor(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #53
int SF_waitWalk(R_SCRIPTFUNC_PARAMS) {
int Script::SF_waitWalk(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #55
int SF_changeActorScene(R_SCRIPTFUNC_PARAMS) {
int Script::SF_changeActorScene(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #56
int SF_climb(R_SCRIPTFUNC_PARAMS) {
int Script::SF_climb(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #58
int SF_setActorZ(R_SCRIPTFUNC_PARAMS) {
int Script::SF_setActorZ(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #60
int SF_getActorX(R_SCRIPTFUNC_PARAMS) {
int Script::SF_getActorX(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}
// Script function #61
int SF_getActorY(R_SCRIPTFUNC_PARAMS) {
int Script::SF_getActorY(R_SCRIPTFUNC_PARAMS) {
return R_SUCCESS;
}

View file

@ -1,81 +0,0 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2004 The ScummVM project
*
* The ReInherit Engine is (C)2000-2003 by Daniel Balsom.
*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header$
*
*/
// Scripting module script function component header file
#ifndef SAGA_SFUNCS_H
#define SAGA_SFUNCS_H
#include "saga/sthread.h"
namespace Saga {
#define R_SFUNC_NUM 78
#define R_SCRIPTFUNC_PARAMS R_SCRIPT_THREAD *thread
typedef int (*SFunc_T) (R_SCRIPTFUNC_PARAMS);
struct R_SFUNC_ENTRY {
int sfunc_num;
int sfunc_argc;
SFunc_T sfunc_fp;
};
extern R_SFUNC_ENTRY SFuncList[];
int SF_sleep(R_SCRIPTFUNC_PARAMS);
int SF_3(R_SCRIPTFUNC_PARAMS);
int SF_setCommandText(R_SCRIPTFUNC_PARAMS);
int SF_actorWalkTo(R_SCRIPTFUNC_PARAMS);
int SF_setFacing(R_SCRIPTFUNC_PARAMS);
int SF_freezeInterface(R_SCRIPTFUNC_PARAMS);
int SF_startAnim(R_SCRIPTFUNC_PARAMS);
int SF_actorWalkToAsync(R_SCRIPTFUNC_PARAMS);
int SF_moveTo(R_SCRIPTFUNC_PARAMS);
int SF_actorWalk(R_SCRIPTFUNC_PARAMS);
int SF_cycleActorFrames(R_SCRIPTFUNC_PARAMS);
int SF_setFrame(R_SCRIPTFUNC_PARAMS);
int SF_linkAnim(R_SCRIPTFUNC_PARAMS);
int SF_placeActor(R_SCRIPTFUNC_PARAMS);
int SF_checkUserInterrupt(R_SCRIPTFUNC_PARAMS);
int SF_moveRelative(R_SCRIPTFUNC_PARAMS);
int SF_doAction(R_SCRIPTFUNC_PARAMS);
int SF_faceTowards(R_SCRIPTFUNC_PARAMS);
int SF_setFollower(R_SCRIPTFUNC_PARAMS);
int SF_centerActor(R_SCRIPTFUNC_PARAMS);
int SF_setActorState(R_SCRIPTFUNC_PARAMS);
int SF_swapActors(R_SCRIPTFUNC_PARAMS);
int SF_scriptSpecialWalk(R_SCRIPTFUNC_PARAMS);
int SF_walkRelative(R_SCRIPTFUNC_PARAMS);
int SF_throwActor(R_SCRIPTFUNC_PARAMS);
int SF_waitWalk(R_SCRIPTFUNC_PARAMS);
int SF_changeActorScene(R_SCRIPTFUNC_PARAMS);
int SF_climb(R_SCRIPTFUNC_PARAMS);
int SF_setActorZ(R_SCRIPTFUNC_PARAMS);
int SF_getActorX(R_SCRIPTFUNC_PARAMS);
int SF_getActorY(R_SCRIPTFUNC_PARAMS);
}
#endif

View file

@ -29,22 +29,19 @@
#include "saga/actor.h"
#include "saga/console.h"
#include "saga/script_mod.h"
#include "saga/script.h"
#include "saga/sdata.h"
#include "saga/sthread.h"
#include "saga/sfuncs.h"
#include "common/stack.h"
namespace Saga {
R_SCRIPT_THREAD *STHREAD_Create() {
R_SCRIPT_THREAD *Script::SThreadCreate() {
YS_DL_NODE *new_node;
R_SCRIPT_THREAD *new_thread;
if (!_vm->_script->isInitialized()) {
if (!isInitialized()) {
return NULL;
}
@ -55,14 +52,14 @@ R_SCRIPT_THREAD *STHREAD_Create() {
new_thread->stack = new Common::Stack<SDataWord_T>();
new_node = ys_dll_add_head(_vm->_script->threadList(), new_thread, sizeof *new_thread);
new_node = ys_dll_add_head(threadList(), new_thread, sizeof *new_thread);
free(new_thread);
return (R_SCRIPT_THREAD *)ys_dll_get_data(new_node);
}
int STHREAD_Destroy(R_SCRIPT_THREAD *thread) {
int Script::SThreadDestroy(R_SCRIPT_THREAD *thread) {
if (thread == NULL) {
return R_FAILURE;
}
@ -72,36 +69,36 @@ int STHREAD_Destroy(R_SCRIPT_THREAD *thread) {
return R_SUCCESS;
}
int STHREAD_ExecThreads(int msec) {
int Script::SThreadExecThreads(int msec) {
YS_DL_NODE *walk_p;
R_SCRIPT_THREAD *thread;
if (!_vm->_script->isInitialized()) {
if (!isInitialized()) {
return R_FAILURE;
}
for (walk_p = ys_dll_head(_vm->_script->threadList()); walk_p != NULL; walk_p = ys_dll_next(walk_p)) {
for (walk_p = ys_dll_head(threadList()); walk_p != NULL; walk_p = ys_dll_next(walk_p)) {
thread = (R_SCRIPT_THREAD *)ys_dll_get_data(walk_p);
if (thread->executing) {
STHREAD_Run(thread, STHREAD_DEF_INSTR_COUNT, msec);
SThreadRun(thread, STHREAD_DEF_INSTR_COUNT, msec);
}
}
return R_SUCCESS;
}
void STHREAD_completeThread(void) {
for (int i = 0; i < 40 && (ys_dll_head(_vm->_script->threadList()) != NULL); i++)
STHREAD_ExecThreads(0);
void Script::SThreadCompleteThread(void) {
for (int i = 0; i < 40 && (ys_dll_head(threadList()) != NULL); i++)
SThreadExecThreads(0);
}
int STHREAD_SetEntrypoint(R_SCRIPT_THREAD *thread, int ep_num) {
int Script::SThreadSetEntrypoint(R_SCRIPT_THREAD *thread, int ep_num) {
R_SCRIPT_BYTECODE *bytecode;
int max_entrypoint;
assert(_vm->_script->isInitialized());
assert(isInitialized());
bytecode = _vm->_script->currentScript()->bytecode;
bytecode = currentScript()->bytecode;
max_entrypoint = bytecode->n_entrypoints;
if ((ep_num < 0) || (ep_num >= max_entrypoint)) {
@ -114,14 +111,14 @@ int STHREAD_SetEntrypoint(R_SCRIPT_THREAD *thread, int ep_num) {
return R_SUCCESS;
}
int STHREAD_Execute(R_SCRIPT_THREAD *thread, int ep_num) {
assert(_vm->_script->isInitialized());
int Script::SThreadExecute(R_SCRIPT_THREAD *thread, int ep_num) {
assert(isInitialized());
if ((_vm->_script->currentScript() == NULL) || (!_vm->_script->currentScript()->loaded)) {
if ((currentScript() == NULL) || (!currentScript()->loaded)) {
return R_FAILURE;
}
STHREAD_SetEntrypoint(thread, ep_num);
SThreadSetEntrypoint(thread, ep_num);
thread->i_offset = thread->ep_offset;
thread->executing = 1;
@ -129,20 +126,20 @@ int STHREAD_Execute(R_SCRIPT_THREAD *thread, int ep_num) {
return R_SUCCESS;
}
unsigned char *GetReadPtr(R_SCRIPT_THREAD *thread) {
return _vm->_script->currentScript()->bytecode->bytecode_p + thread->i_offset;
unsigned char *Script::SThreadGetReadPtr(R_SCRIPT_THREAD *thread) {
return currentScript()->bytecode->bytecode_p + thread->i_offset;
}
unsigned long GetReadOffset(const byte *read_p) {
return (unsigned long)(read_p - (unsigned char *)_vm->_script->currentScript()->bytecode->bytecode_p);
unsigned long Script::SThreadGetReadOffset(const byte *read_p) {
return (unsigned long)(read_p - (unsigned char *)currentScript()->bytecode->bytecode_p);
}
size_t GetReadLen(R_SCRIPT_THREAD *thread) {
return _vm->_script->currentScript()->bytecode->bytecode_len - thread->i_offset;
size_t Script::SThreadGetReadLen(R_SCRIPT_THREAD *thread) {
return currentScript()->bytecode->bytecode_len - thread->i_offset;
}
int STHREAD_HoldSem(R_SEMAPHORE *sem) {
int Script::SThreadHoldSem(R_SEMAPHORE *sem) {
if (sem == NULL) {
return R_FAILURE;
}
@ -152,7 +149,7 @@ int STHREAD_HoldSem(R_SEMAPHORE *sem) {
return R_SUCCESS;
}
int STHREAD_ReleaseSem(R_SEMAPHORE *sem) {
int Script::SThreadReleaseSem(R_SEMAPHORE *sem) {
if (sem == NULL) {
return R_FAILURE;
}
@ -165,15 +162,15 @@ int STHREAD_ReleaseSem(R_SEMAPHORE *sem) {
return R_SUCCESS;
}
int STHREAD_DebugStep() {
if (_vm->_script->_dbg_singlestep) {
_vm->_script->_dbg_dostep = 1;
int Script::SThreadDebugStep() {
if (_dbg_singlestep) {
_dbg_dostep = 1;
}
return R_SUCCESS;
}
int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
int instr_count;
uint32 saved_offset;
SDataWord_T param1;
@ -191,12 +188,12 @@ int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
int unhandled = 0;
// Handle debug single-stepping
if ((thread == _vm->_script->_dbg_thread) && _vm->_script->_dbg_singlestep) {
if (_vm->_script->_dbg_dostep) {
if ((thread == _dbg_thread) && _dbg_singlestep) {
if (_dbg_dostep) {
debug_print = 1;
thread->sleep_time = 0;
instr_limit = 1;
_vm->_script->_dbg_dostep = 0;
_dbg_dostep = 0;
} else {
return R_SUCCESS;
}
@ -218,7 +215,7 @@ int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
saved_offset = thread->i_offset;
MemoryReadStream readS(GetReadPtr(thread), GetReadLen(thread));
MemoryReadStream readS(SThreadGetReadPtr(thread), SThreadGetReadLen(thread));
in_char = readS.readByte();
@ -347,7 +344,7 @@ int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
break;
}
sfunc = SFuncList[func_num].sfunc_fp;
sfunc = _SFuncList[func_num].sfunc_fp;
if (sfunc == NULL) {
_vm->_console->print(S_WARN_PREFIX "%X: Undefined script function number: (%X)\n",
thread->i_offset, func_num);
@ -356,7 +353,7 @@ int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
thread->stack->pop();
}
} else {
FIXME_SHADOWED_result = sfunc(thread);
FIXME_SHADOWED_result = (this->*sfunc)(thread);
if (FIXME_SHADOWED_result != R_SUCCESS) {
_vm->_console->print(S_WARN_PREFIX "%X: Script function %d failed.\n", thread->i_offset, func_num);
}
@ -732,12 +729,12 @@ int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
data = thread->stack->pop();
if (a_index < 0)
continue;
if (!_vm->_script->isVoiceLUTPresent()) {
if (!isVoiceLUTPresent()) {
voice_rn = -1;
} else {
voice_rn = _vm->_script->currentScript()->voice->voices[data];
voice_rn = currentScript()->voice->voices[data];
}
_vm->_actor->speak(a_index, _vm->_script->currentScript()->diag-> str[data], voice_rn, &thread->sem);
_vm->_actor->speak(a_index, currentScript()->diag-> str[data], voice_rn, &thread->sem);
}
}
break;
@ -784,7 +781,7 @@ int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
thread->executing = 0;
}
if (thread->executing && debug_print) {
SDEBUG_PrintInstr(thread);
SDebugPrintInstr(thread);
}
}

View file

@ -1,63 +0,0 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2004 The ScummVM project
*
* The ReInherit Engine is (C)2000-2003 by Daniel Balsom.
*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header$
*
*/
// Scripting module thread management component header file
#ifndef SAGA_STHREAD_H__
#define SAGA_STHREAD_H__
#include "common/stack.h"
namespace Saga {
#define STHREAD_DEF_INSTR_COUNT 8
struct R_SEMAPHORE {
int hold_count;
};
struct R_SCRIPT_THREAD_tag {
int executing;
int sleep_time;
int ep_num; // Entrypoint number
unsigned long ep_offset; // Entrypoint offset
unsigned long i_offset; // Instruction offset
R_SEMAPHORE sem;
Common::Stack<SDataWord_T> *stack;
};
R_SCRIPT_THREAD *STHREAD_Create();
int STHREAD_Destroy(R_SCRIPT_THREAD *thread);
int STHREAD_SetEntrypoint(R_SCRIPT_THREAD *thread, int ep_num);
int STHREAD_Execute(R_SCRIPT_THREAD *thread, int ep_num);
int STHREAD_Run(R_SCRIPT_THREAD *thread, int instr_limit, int msec);
unsigned long GetReadOffset(const byte *read_p);
unsigned char *GetReadPtr(R_SCRIPT_THREAD *thread);
size_t GetReadLen(R_SCRIPT_THREAD *thread);
int SDEBUG_PrintInstr(R_SCRIPT_THREAD *thread);
} // End of namespace Saga
#endif