X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FLoader.cpp;h=3c7f2bd5b3005611e6c41d93f0fc5f7b2895b96b;hb=b20681c1bf555c337b15796b3910d0d48488b102;hp=ba5dcc066d2b6c941534eb1160f57ded7106b74a;hpb=8ef435410d1f8aff339e4afef87a5757e77eba45;p=l2e.git diff --git a/src/loader/Loader.cpp b/src/loader/Loader.cpp index ba5dcc0..3c7f2bd 100644 --- a/src/loader/Loader.cpp +++ b/src/loader/Loader.cpp @@ -1,5 +1,7 @@ #include "Loader.h" +#include "../common/Script.h" + #include #include #include @@ -64,6 +66,9 @@ void Loader::Load(const std::string &filePath) { LoadImages(header->ident, header->ImagesBegin(), header->ImagesEnd()); + LoadScripts(header->ident, + header->ScriptsBegin(), + header->ScriptsEnd()); InitObjects( header->ObjectsBegin(), @@ -203,6 +208,36 @@ void Loader::LoadArrays(char *src, Array *begin, Array *end) { } } +void Loader::LoadScripts(char *src, Script *begin, Script *end) { + for (Script *s = begin; s < end; s = s->Next()) { + for (char *i = s->Text(), *end = s->Text() + s->size; i < end;) { + common::Script::Code *code = + reinterpret_cast(i); + if (code->type == common::Script::TYPE_ADDRESS && code->numParams > 0) { + if (code->reg1 == 7) { + char *addr = i + sizeof(common::Script::Code); + unsigned int offset = *reinterpret_cast(addr); + if (offset) { + *reinterpret_cast(addr) = src + offset; + } + } + + if (code->numParams > 1 && code->reg2 == 7) { + char *addr = i + sizeof(common::Script::Code); + if (code->reg1 == 7) { + addr += sizeof(void *); + } + unsigned int offset = *reinterpret_cast(addr); + if (offset) { + *reinterpret_cast(addr) = src + offset; + } + } + } + i += code->Size(); + } + } +} + void Loader::InitObjects(Object *begin, Object *end) { for (Object *i = begin; i < end; i = i->Next()) {