From 74ef65335d8d5f369ade64bec0b66e3facf4c0fe Mon Sep 17 00:00:00 2001 From: phobos2077 Date: Tue, 4 Jul 2023 20:19:38 +0200 Subject: [PATCH] Add string_find metarule - lib.inven.h: Updated remove_items_pid to return actually removed quantity --- artifacts/scripting/headers/lib.inven.h | 13 +++++++----- artifacts/scripting/headers/sfall.h | 3 ++- sfall/Modules/Scripting/Handlers/Metarule.cpp | 1 + sfall/Modules/Scripting/Handlers/Utils.cpp | 20 +++++++++++++++++++ sfall/Modules/Scripting/Handlers/Utils.h | 2 ++ sfall/Modules/Scripting/ScriptValue.cpp | 4 ++++ sfall/Modules/Scripting/ScriptValue.h | 2 ++ 7 files changed, 39 insertions(+), 6 deletions(-) diff --git a/artifacts/scripting/headers/lib.inven.h b/artifacts/scripting/headers/lib.inven.h index 74429bcb..1c757a61 100644 --- a/artifacts/scripting/headers/lib.inven.h +++ b/artifacts/scripting/headers/lib.inven.h @@ -51,13 +51,15 @@ procedure remove_items_pid(variable invenObj, variable itemPid, variable quantit variable begin item; toRemoveQty; + actualQty; end if (not(invenObj)) then return; - toRemoveQty := obj_is_carrying_obj_pid(invenObj, itemPid); - if (quantity < toRemoveQty and quantity != -1) then begin - toRemoveQty := quantity; + actualQty := obj_is_carrying_obj_pid(invenObj, itemPid); + if (quantity > actualQty or quantity < 0) then begin + quantity := actualQty; end - while (toRemoveQty > 0) do begin + toRemoveQty := quantity; + while (quantity > 0) do begin item := obj_carrying_pid_obj(invenObj, itemPid); if (obj_type(invenObj) == OBJ_TYPE_CRITTER) then begin if (critter_inven_obj(invenObj, INVEN_TYPE_WORN) == item) then begin @@ -66,9 +68,10 @@ procedure remove_items_pid(variable invenObj, variable itemPid, variable quantit inven_unwield(invenObj); end end - toRemoveQty -= rm_mult_objs_from_inven(invenObj, item, toRemoveQty); + quantity -= rm_mult_objs_from_inven(invenObj, item, quantity); destroy_object(item); end + return toRemoveQty; end procedure remove_item_obj(variable invenObj, variable item) begin diff --git a/artifacts/scripting/headers/sfall.h b/artifacts/scripting/headers/sfall.h index 83beff2b..99caddb2 100644 --- a/artifacts/scripting/headers/sfall.h +++ b/artifacts/scripting/headers/sfall.h @@ -149,7 +149,7 @@ // sort map in descending order by key value #define sort_map_reverse(array) resize_array(array, -7) // remove element from map or just replace value with 0 for list -#define unset_array(array, item) set_array(array, item, 0) +#define unset_array(array, key) set_array(array, key, 0) // same as "key_pressed" but checks VK codes instead of DX codes #define key_pressed_vk(key) (key_pressed(key bwor 0x80000000)) @@ -391,6 +391,7 @@ #define spatial_radius(obj) sfall_func1("spatial_radius", obj) #define string_compare(str1, str2) sfall_func2("string_compare", str1, str2) #define string_compare_locale(str1, str2, codePage) sfall_func3("string_compare", str1, str2, codePage) +#define string_find(haystack, needle, pos) sfall_func3("string_find", haystack, needle, pos) #define string_format1(format, a1) sfall_func2("string_format", format, a1) #define string_format2(format, a1, a2) sfall_func3("string_format", format, a1, a2) #define string_format3(format, a1, a2, a3) sfall_func4("string_format", format, a1, a2, a3) diff --git a/sfall/Modules/Scripting/Handlers/Metarule.cpp b/sfall/Modules/Scripting/Handlers/Metarule.cpp index 94eb47f0..3abf3f5e 100644 --- a/sfall/Modules/Scripting/Handlers/Metarule.cpp +++ b/sfall/Modules/Scripting/Handlers/Metarule.cpp @@ -160,6 +160,7 @@ static const SfallMetarule metarules[] = { {"show_window", mf_show_window, 0, 1, -1, {ARG_STRING}}, {"spatial_radius", mf_spatial_radius, 1, 1, 0, {ARG_OBJECT}}, {"string_compare", mf_string_compare, 2, 3, 0, {ARG_STRING, ARG_STRING, ARG_INT}}, + {"string_find", mf_string_find, 2, 3, 0, {ARG_STRING, ARG_STRING, ARG_INT}}, {"string_format", mf_string_format, 2, 8, 0, {ARG_STRING, ARG_ANY, ARG_ANY, ARG_ANY, ARG_ANY, ARG_ANY, ARG_ANY, ARG_ANY}}, {"string_to_case", mf_string_to_case, 2, 2, -1, {ARG_STRING, ARG_INT}}, {"tile_by_position", mf_tile_by_position, 2, 2, -1, {ARG_INT, ARG_INT}}, diff --git a/sfall/Modules/Scripting/Handlers/Utils.cpp b/sfall/Modules/Scripting/Handlers/Utils.cpp index d1d5ed9b..60f6c3d3 100644 --- a/sfall/Modules/Scripting/Handlers/Utils.cpp +++ b/sfall/Modules/Scripting/Handlers/Utils.cpp @@ -198,6 +198,26 @@ void mf_string_compare(OpcodeContext& ctx) { } } +void mf_string_find(OpcodeContext& ctx) { + const char* const haystack = ctx.arg(0).strValue(); + int pos; + if (ctx.numArgs() > 2) { + int len = strlen(haystack); + pos = ctx.arg(2).intValue(); + if (pos >= len) { + ctx.setReturn(-1); + return; + } + } + else { + pos = 0; + } + const char* needle = strstr(haystack + pos, ctx.arg(1).strValue()); + ctx.setReturn( + needle != nullptr ? (int)(needle - haystack) : -1 + ); +} + // A safer version of sprintf for using in user scripts. static const char* sprintf_lite(OpcodeContext& ctx, const char* opcodeName) { const char* format = ctx.arg(0).strValue(); diff --git a/sfall/Modules/Scripting/Handlers/Utils.h b/sfall/Modules/Scripting/Handlers/Utils.h index 305d9313..6c96d413 100644 --- a/sfall/Modules/Scripting/Handlers/Utils.h +++ b/sfall/Modules/Scripting/Handlers/Utils.h @@ -37,6 +37,8 @@ void op_strlen(OpcodeContext&); void mf_string_compare(OpcodeContext&); +void mf_string_find(OpcodeContext&); + void op_sprintf(OpcodeContext&); void mf_string_format(OpcodeContext&); diff --git a/sfall/Modules/Scripting/ScriptValue.cpp b/sfall/Modules/Scripting/ScriptValue.cpp index 2e3c7986..5c809348 100644 --- a/sfall/Modules/Scripting/ScriptValue.cpp +++ b/sfall/Modules/Scripting/ScriptValue.cpp @@ -135,6 +135,10 @@ unsigned long ScriptValue::rawValue() const { return _val.dw; } +long ScriptValue::intValue() const { + return _val.i; +} + const char* ScriptValue::strValue() const { return _val.str; } diff --git a/sfall/Modules/Scripting/ScriptValue.h b/sfall/Modules/Scripting/ScriptValue.h index e229d1c6..4dd9459c 100644 --- a/sfall/Modules/Scripting/ScriptValue.h +++ b/sfall/Modules/Scripting/ScriptValue.h @@ -57,6 +57,8 @@ public: unsigned long rawValue() const; + long intValue() const; + float floatValue() const; const char* strValue() const;