diff options
Diffstat (limited to 'engines/illusions/scriptopcodes.cpp')
| -rw-r--r-- | engines/illusions/scriptopcodes.cpp | 103 | 
1 files changed, 102 insertions, 1 deletions
diff --git a/engines/illusions/scriptopcodes.cpp b/engines/illusions/scriptopcodes.cpp index 392170db57..1f6c354eb4 100644 --- a/engines/illusions/scriptopcodes.cpp +++ b/engines/illusions/scriptopcodes.cpp @@ -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  | 
