ILLUSIONS: Implement more script opcodes and related functions
This commit is contained in:
parent
e881db0732
commit
48ef46c02d
12 changed files with 176 additions and 6 deletions
|
@ -22,6 +22,9 @@
|
|||
|
||||
#include "illusions/illusions.h"
|
||||
#include "illusions/scriptopcodes.h"
|
||||
#include "illusions/actor.h"
|
||||
#include "illusions/input.h"
|
||||
#include "illusions/screen.h"
|
||||
#include "illusions/scriptman.h"
|
||||
#include "illusions/scriptresource.h"
|
||||
#include "illusions/scriptthread.h"
|
||||
|
@ -76,8 +79,20 @@ void ScriptOpcodes::initOpcodes() {
|
|||
for (uint i = 0; i < 256; ++i)
|
||||
_opcodes[i] = 0;
|
||||
// Register opcodes
|
||||
OPCODE(2, opSuspend);
|
||||
OPCODE(3, opYield);
|
||||
OPCODE(6, opStartScriptThread);
|
||||
OPCODE(16, opLoadResource);
|
||||
OPCODE(20, opEnterScene);
|
||||
OPCODE(39, opSetDisplay);
|
||||
OPCODE(42, opIncBlockCounter);
|
||||
OPCODE(46, opPlaceActor);
|
||||
OPCODE(87, opDeactivateButton);
|
||||
OPCODE(88, opActivateButton);
|
||||
OPCODE(126, opDebug126);
|
||||
OPCODE(144, opPlayVideo);
|
||||
OPCODE(175, opSetSceneIdThreadId);
|
||||
OPCODE(177, opSetFontId);
|
||||
}
|
||||
|
||||
#undef OPCODE
|
||||
|
@ -92,7 +107,48 @@ void ScriptOpcodes::freeOpcodes() {
|
|||
// Convenience macros
|
||||
#define ARG_SKIP(x) opCall.skip(x);
|
||||
#define ARG_INT16(name) int16 name = opCall.readSint16(); debug("ARG_INT16(" #name " = %d)", name);
|
||||
#define ARG_UINT32(name) uint32 name = opCall.readUint32(); debug("ARG_UINT32(" #name " = %d)", name);
|
||||
#define ARG_UINT32(name) uint32 name = opCall.readUint32(); debug("ARG_UINT32(" #name " = %08X)", name);
|
||||
|
||||
void ScriptOpcodes::opSuspend(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
opCall._result = kTSSuspend;
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opYield(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
opCall._result = kTSYield;
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opStartScriptThread(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(threadId);
|
||||
_vm->_scriptMan->startScriptThread(threadId, opCall._threadId,
|
||||
scriptThread->_value8, scriptThread->_valueC, scriptThread->_value10);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opLoadResource(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(resourceId);
|
||||
// NOTE Skipped checking for stalled resources
|
||||
uint32 sceneId = _vm->_scriptMan->_activeScenes.getCurrentScene();
|
||||
_vm->_resSys->loadResource(resourceId, sceneId, opCall._threadId);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opEnterScene(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(sceneId);
|
||||
uint scenesCount = _vm->_scriptMan->_activeScenes.getActiveScenesCount();
|
||||
if (scenesCount > 0) {
|
||||
uint32 currSceneId;
|
||||
_vm->_scriptMan->_activeScenes.getActiveSceneInfo(scenesCount - 1, &currSceneId, 0);
|
||||
// TODO krnfileDump(currSceneId);
|
||||
}
|
||||
if (!_vm->_scriptMan->enterScene(sceneId, opCall._threadId))
|
||||
opCall._result = kTSTerminate;
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opSetDisplay(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_INT16(flag);
|
||||
_vm->_screen->setDisplayOn(flag != 0);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opIncBlockCounter(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_INT16(index)
|
||||
|
@ -101,8 +157,53 @@ void ScriptOpcodes::opIncBlockCounter(ScriptThread *scriptThread, OpCall &opCall
|
|||
_vm->_scriptMan->_scriptResource->_blockCounters.set(index + 1, value);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opPlaceActor(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(objectId);
|
||||
ARG_UINT32(actorTypeId);
|
||||
ARG_UINT32(sequenceId);
|
||||
ARG_UINT32(namedPointId);
|
||||
Common::Point pos = _vm->getNamedPointPosition(namedPointId);
|
||||
_vm->_controls->placeActor(actorTypeId, pos, sequenceId, objectId, opCall._threadId);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opDeactivateButton(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_INT16(button)
|
||||
_vm->_input->deactivateButton(button);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opActivateButton(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_INT16(button)
|
||||
_vm->_input->activateButton(button);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opDebug126(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
// NOTE Prints some debug text
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opPlayVideo(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(objectId);
|
||||
ARG_UINT32(videoId);
|
||||
ARG_UINT32(priority);
|
||||
// TODO _vm->playVideo(videoId, objectId, value, opCall._threadId);
|
||||
|
||||
//DEBUG Resume calling thread, later done by the video player
|
||||
_vm->notifyThreadId(opCall._threadId);
|
||||
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opSetSceneIdThreadId(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(sceneId);
|
||||
ARG_UINT32(threadId);
|
||||
_vm->_scriptMan->setSceneIdThreadId(sceneId, threadId);
|
||||
}
|
||||
|
||||
void ScriptOpcodes::opSetFontId(ScriptThread *scriptThread, OpCall &opCall) {
|
||||
ARG_SKIP(2);
|
||||
ARG_UINT32(fontId);
|
||||
_vm->_scriptMan->setCurrFontId(fontId);
|
||||
}
|
||||
|
||||
} // End of namespace Illusions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue