DRAGONS: Add start of special opcode support

This commit is contained in:
Eric Fry 2019-01-28 21:20:54 +11:00 committed by Eugene Sandulenko
parent 875d9f7bd7
commit a25ee6f255
11 changed files with 312 additions and 9 deletions

View file

@ -25,6 +25,7 @@
#include "dragons/dragonini.h"
#include "dragons/dragonobd.h"
#include "dragons/scriptopcodes.h"
#include "dragons/specialopcodes.h"
#include "dragons/actor.h"
#include "scriptopcodes.h"
@ -56,11 +57,13 @@ uint32 ScriptOpCall::readUint32() {
ScriptOpcodes::ScriptOpcodes(DragonsEngine *vm, DragonFLG *dragonFLG)
: _vm(vm), _dragonFLG(dragonFLG), _data_80071f5c(0) {
_specialOpCodes = new SpecialOpcodes(_vm);
initOpcodes();
}
ScriptOpcodes::~ScriptOpcodes() {
freeOpcodes();
delete _specialOpCodes;
}
void ScriptOpcodes::execOpcode(ScriptOpCall &scriptOpCall) {
@ -88,6 +91,7 @@ void ScriptOpcodes::initOpcodes() {
OPCODE(7, opUnk7);
OPCODE(10, opUnkA);
OPCODE(11, opRunSpecialOpCode);
OPCODE(15, opUnkF);
@ -309,8 +313,79 @@ void ScriptOpcodes::opUnkA(ScriptOpCall &scriptOpCall) {
}
}
void ScriptOpcodes::opRunSpecialOpCode(ScriptOpCall &scriptOpCall) {
ARG_SKIP(2);
ARG_INT16(specialOpCode);
if (scriptOpCall._field8 != 0) {
return;
}
if (specialOpCode >= 140) {
error("Invalid Special OpCode %d", specialOpCode);
}
debug("Special opCode %X", specialOpCode);
_specialOpCodes->run(specialOpCode);
}
void ScriptOpcodes::opUnkF(ScriptOpCall &scriptOpCall) {
scriptOpCall._result = 1;
ARG_INT16(field0);
ARG_INT16(field2);
ARG_INT16(field4);
ARG_INT16(field6);
ARG_INT16(field8);
ARG_INT16(fieldA);
if (scriptOpCall._field8 != 0) {
return;
}
int32 s3 = 0;
DragonINI *ini = _vm->getINI(field2 - 1);
if (field6 & 0x8000) {
s3 = 0 > (field6 ^ 0xffff) ? 1 : 0;
}
if (field4 != -1) {
if (field6 != -1) {
if (!(field0 & 0x8000)) {
assert(ini->actor);
ini->actor->flags |= Dragons::ACTOR_FLAG_800;
ini->actor->updateSequence(field6 & 0x7fff);
}
ini->actor->field_7c = field4 & 0x8000 ? (field4 & 0x7fff) << 0x10 : (field4 & 0x7fff) << 7;
if (_vm->_dragonINIResource->isFlicker(ini)) {
}
bool isFlicker = _vm->_dragonINIResource->isFlicker(ini);
ini->actor->pathfinding_maybe(field8, fieldA, isFlicker ? 0 : 1);
if(s3 == 0) {
while (ini->actor->flags & Dragons::ACTOR_FLAG_10) {
//TODO
//wait a game tick
error("Wait a game tick here");
}
}
ini->x = field8;
ini->y = fieldA;
ini->actor->flags &= ~Dragons::ACTOR_FLAG_800;
}
} else {
assert(ini->actor);
ini->x = field8;
ini->actor->x_pos = field8;
ini->y = fieldA;
ini->actor->y_pos = fieldA;
if (field4 != field6) {
ini->actor->field_7c = field4;
}
ini->actor->updateSequence(field6 & 0x7fff);
}
}
void ScriptOpcodes::opCode_UnkA_setsProperty(ScriptOpCall &scriptOpCall) {
@ -380,9 +455,11 @@ void ScriptOpcodes::opCode_UnkA_setsProperty(ScriptOpCall &scriptOpCall) {
if (s1 == -1) {
if (ini->iptIndex_maybe != -1) {
// TODO ipt_img_file_related_3(ini->iptIndex_maybe);
error("TODO ipt_img_file_related_3(ini->iptIndex_maybe);");
}
} else {
// TODO ipt_img_file_related_2(s1);
error("TODO ipt_img_file_related_2(s1);");
}
}
}
@ -401,6 +478,7 @@ void ScriptOpcodes::opCode_UnkA_setsProperty(ScriptOpCall &scriptOpCall) {
} else {
if (fieldB == 3) {
//TODO s2 = sub_80023830(s1);
error("TODO s2 = sub_80023830(s1);");
}
}
}
@ -481,9 +559,11 @@ void ScriptOpcodes::opCode_Unk7(ScriptOpCall &scriptOpCall) {
} else {
if (ini->sceneId == currentScene && ini->iptIndex_maybe != -1) {
//TODO ipt_img_file_related_3(ini->iptIndex_maybe);
error("//TODO ipt_img_file_related_3(ini->iptIndex_maybe);");
}
if (sceneId == currentScene && ini->iptIndex_maybe != -1) {
// TODO ipt_img_file_related_2(ini->iptIndex_maybe);
error("// TODO ipt_img_file_related_2(ini->iptIndex_maybe);");
}
}
@ -499,4 +579,5 @@ void ScriptOpcodes::opCode_Unk7(ScriptOpCall &scriptOpCall) {
}
} // End of namespace Dragons