]> git.localhorst.tv Git - l2e.git/blobdiff - src/common/ScriptRunner.cpp
added compare and jump codes for scripts
[l2e.git] / src / common / ScriptRunner.cpp
index 110b702b88a86aad29297759e5b666940d203da5..98fd4fbdc9a3dfec83b812e0d662377a5e600706 100644 (file)
@@ -25,7 +25,8 @@ ScriptRunner::ScriptRunner()
 , integer0(0)
 , integer1(0)
 , vector0(0, 0)
-, vector1(0, 0) {
+, vector1(0, 0)
+, compare(0) {
 
 }
 
@@ -93,12 +94,72 @@ void ScriptRunner::Exec(unsigned char code) {
                case Script::CODE_ADD_V1:
                        vector1 += PopVector();
                        break;
+               case Script::CODE_MOD_I0:
+                       integer0 %= PopInt();
+                       break;
+               case Script::CODE_MOD_I1:
+                       integer1 %= PopInt();
+                       break;
                case Script::CODE_RAND_I0:
                        integer0 = std::rand();
                        break;
                case Script::CODE_RAND_I1:
                        integer1 = std::rand();
                        break;
+               case Script::CODE_CMP_I0:
+                       Compare(integer0, PopInt());
+                       break;
+               case Script::CODE_CMP_I1:
+                       Compare(integer1, PopInt());
+                       break;
+               case Script::CODE_CMP_I0_I1:
+                       Compare(integer0, integer1);
+                       break;
+               case Script::CODE_JUMP:
+                       cursor = PopInt();
+                       break;
+               case Script::CODE_JUMP_EQUAL: {
+                       int addr(PopInt());
+                       if (compare == COMPARE_EQUAL) {
+                               cursor = addr;
+                       }
+                       break;
+               }
+               case Script::CODE_JUMP_NOT_EQUAL: {
+                       int addr(PopInt());
+                       if (compare != COMPARE_EQUAL) {
+                               cursor = addr;
+                       }
+                       break;
+               }
+               case Script::CODE_JUMP_LESS: {
+                       int addr(PopInt());
+                       if (compare == COMPARE_LESS) {
+                               cursor = addr;
+                       }
+                       break;
+               }
+               case Script::CODE_JUMP_LESS_EQUAL: {
+                       int addr(PopInt());
+                       if (compare != COMPARE_GREATER) {
+                               cursor = addr;
+                       }
+                       break;
+               }
+               case Script::CODE_JUMP_GREATER: {
+                       int addr(PopInt());
+                       if (compare == COMPARE_GREATER) {
+                               cursor = addr;
+                       }
+                       break;
+               }
+               case Script::CODE_JUMP_GREATER_EQUAL: {
+                       int addr(PopInt());
+                       if (compare != COMPARE_LESS) {
+                               cursor = addr;
+                       }
+                       break;
+               }
                case Script::CODE_SYSCALL:
                        host->HandleSyscall(*this);
                        break;
@@ -123,4 +184,14 @@ const Vector<int> &ScriptRunner::PopVector() {
        return *vec;
 }
 
+void ScriptRunner::Compare(int lhs, int rhs) {
+       if (lhs < rhs) {
+               compare = COMPARE_LESS;
+       } else if (lhs > rhs) {
+               compare = COMPARE_GREATER;
+       } else {
+               compare = COMPARE_EQUAL;
+       }
+}
+
 }