summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormekolat <mekolat@users.noreply.github.com>2015-08-18 15:39:39 -0400
committermekolat <mekolat@users.noreply.github.com>2015-09-26 21:22:03 +0000
commitf78d7fea310ba0b3d587e7409ea0b56e5bc9dbd0 (patch)
treeec0219d522706a084da7a6b39f5d760721bd1301
parent66626c7f79f1d1a07847b5d9de5591412d047603 (diff)
downloadtmwa-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.cpp62
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'),