X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fcommon%2FScriptRunner.cpp;h=98fd4fbdc9a3dfec83b812e0d662377a5e600706;hb=3a86cc937e9fce68384efc08edb6d6ba101d12eb;hp=110b702b88a86aad29297759e5b666940d203da5;hpb=6e88a625710c7936f87b38ecf6094472f3a49f4f;p=l2e.git diff --git a/src/common/ScriptRunner.cpp b/src/common/ScriptRunner.cpp index 110b702..98fd4fb 100644 --- a/src/common/ScriptRunner.cpp +++ b/src/common/ScriptRunner.cpp @@ -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 &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; + } +} + }