]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Loader.cpp
relocate scripts
[l2e.git] / src / loader / Loader.cpp
index ba5dcc066d2b6c941534eb1160f57ded7106b74a..3c7f2bd5b3005611e6c41d93f0fc5f7b2895b96b 100644 (file)
@@ -1,5 +1,7 @@
 #include "Loader.h"
 
+#include "../common/Script.h"
+
 #include <climits>
 #include <cstring>
 #include <fstream>
@@ -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<common::Script::Code *>(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<unsigned int *>(addr);
+                                       if (offset) {
+                                               *reinterpret_cast<const char **>(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<unsigned int *>(addr);
+                                       if (offset) {
+                                               *reinterpret_cast<const char **>(addr) = src + offset;
+                                       }
+                               }
+                       }
+                       i += code->Size();
+               }
+       }
+}
+
 
 void Loader::InitObjects(Object *begin, Object *end) {
        for (Object *i = begin; i < end; i = i->Next()) {