diff options
author | mekolat <mekolat@users.noreply.github.com> | 2015-08-18 15:39:39 -0400 |
---|---|---|
committer | mekolat <mekolat@users.noreply.github.com> | 2015-09-26 21:22:03 +0000 |
commit | f78d7fea310ba0b3d587e7409ea0b56e5bc9dbd0 (patch) | |
tree | ec0219d522706a084da7a6b39f5d760721bd1301 | |
parent | 66626c7f79f1d1a07847b5d9de5591412d047603 (diff) | |
download | tmwa-f78d7fea310ba0b3d587e7409ea0b56e5bc9dbd0.tar.gz tmwa-f78d7fea310ba0b3d587e7409ea0b56e5bc9dbd0.tar.bz2 tmwa-f78d7fea310ba0b3d587e7409ea0b56e5bc9dbd0.tar.xz tmwa-f78d7fea310ba0b3d587e7409ea0b56e5bc9dbd0.zip |
add max and min builtins
-rw-r--r-- | src/map/script-fun.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp index f85a181..23702e5 100644 --- a/src/map/script-fun.cpp +++ b/src/map/script-fun.cpp @@ -311,6 +311,66 @@ void builtin_rand(ScriptState *st) } static +void builtin_max(ScriptState *st) +{ + int max=0, num; + if (HARG(1)) + { + max = conv_num(st, &AARG(0)); + for (int i = 1; HARG(i); i++) + { + num = conv_num(st, &AARG(i)); + if (num > max) + max = num; + } + } + else + { + SIR reg = AARG(0).get_if<ScriptDataVariable>()->reg; + ZString name = variable_names.outtern(reg.base()); + char prefix = name.front(); + if (prefix != '$' && prefix != '@' && prefix != '.') + { + PRINTF("builtin_max: illegal scope!\n"_fmt); + return; + } + for (int i = reg.index(); i < 256; i++) + { + struct script_data vd = get_val2(st, reg.iplus(i)); + MATCH_BEGIN (vd) + { + MATCH_CASE (const ScriptDataInt&, u) + { + if (u.numi > max) + max = u.numi; + continue; + } + } + MATCH_END (); + abort(); + } + } + + push_int<ScriptDataInt>(st->stack, max); +} + +static +void builtin_min(ScriptState *st) +{ + int min, num; + min = conv_num(st, &AARG(0)); + + for (int i = 1; HARG(i); i++) + { + num = conv_num(st, &AARG(i)); + if (num < min) + min = num; + } + + push_int<ScriptDataInt>(st->stack, min); +} + +static void builtin_sqrt(ScriptState *st) { push_int<ScriptDataInt>(st->stack, static_cast<int>(sqrt(conv_num(st, &AARG(0))))); @@ -3387,6 +3447,8 @@ BuiltinFunction builtin_functions[] = BUILTIN(mapexit, ""_s, '\0'), BUILTIN(freeloop, "i"_s, '\0'), BUILTIN(if_then_else, "iii"_s, '.'), + BUILTIN(max, "e?*"_s, 'i'), + BUILTIN(min, "ii*"_s, 'i'), BUILTIN(sqrt, "i"_s, 'i'), BUILTIN(cbrt, "i"_s, 'i'), BUILTIN(pow, "ii"_s, 'i'), |