Added "proto_exists" script function

Updated gl_auto_closebox example script.
This commit is contained in:
NovaRain
2021-05-25 12:55:11 +08:00
parent 0b242a770d
commit 1b37ed5d7c
13 changed files with 47 additions and 2 deletions
@@ -13,8 +13,10 @@ Requires sfall 4.2.2/3.8.29 or higher
#include "..\headers\sfall\define_extra.h"
procedure start;
procedure close;
variable lootObject;
variable closeObject;
procedure start begin
if (game_loaded) then begin
@@ -26,8 +28,14 @@ procedure start begin
lootObject := loot_obj;
if (obj_type(lootObject) != OBJ_TYPE_ITEM) then lootObject = 0;
end else if (lootObject andAlso get_sfall_arg_at(1) == INTFACELOOT) then begin
if (get_object_data(lootObject, OBJ_DATA_CUR_FRM) > 1) then obj_close(lootObject);
lootObject = 0;
if (get_object_data(lootObject, OBJ_DATA_CUR_FRM) > 1) then begin
closeObject = lootObject;
call close in 0;
end
end
end
end
procedure close begin
obj_close(closeObject);
end
+1
View File
@@ -365,6 +365,7 @@
#define overlay_clear(winType) sfall_func2("interface_overlay", winType, 2)
#define overlay_clear_rectangle(winType, x, y, w, h) sfall_func6("interface_overlay", winType, 2, x, y, w, h)
#define overlay_destroy(winType) sfall_func2("interface_overlay", winType, 0)
#define proto_exists(pid) sfall_func1("proto_exists", pid)
#define real_dude_obj sfall_func0("real_dude_obj")
#define remove_all_timer_events sfall_func0("remove_timer_event")
#define remove_timer_event(fixedParam) sfall_func1("remove_timer_event", fixedParam)
@@ -796,6 +796,9 @@ optional arguments:
- gvarNumber: the number of the global variable controlling the quest
- thresholdValue: the value of the global variable at which the quest is counted as a failure
> bool sfall_func1("proto_exists", int pid)
- returns True if the specified PID number exists in the list of registered protos
------------------------
------ MORE INFO -------
------------------------
+8
View File
@@ -98,6 +98,14 @@ long AnimCodeByWeapon(fo::GameObject* weapon) {
return 0;
}
bool CheckProtoID(DWORD pid) {
if (pid == 0) return false;
long type = pid >> 24;
if (type > fo::ObjType::OBJ_TYPE_MISC) return false;
return (static_cast<long>(pid & 0xFFFF) < fo::var::protoLists[type].totalCount);
}
bool GetProto(long pid, fo::Proto** outProto) {
return (fo::func::proto_ptr(pid, outProto) != -1);
}
+2
View File
@@ -57,6 +57,8 @@ fo::Queue* QueueFind(fo::GameObject* object, long type);
// returns weapon animation code
long AnimCodeByWeapon(fo::GameObject* weapon);
bool CheckProtoID(DWORD pid);
// returns False if the prototype does not exist, or pointer to prototype by PID in the outProto argument
bool GetProto(long pid, fo::Proto** outProto);
+1
View File
@@ -192,6 +192,7 @@ WRAP_WATCOM_FUNC2(long, perk_level, fo::GameObject*, critter, long, perkId)
WRAP_WATCOM_FUNC6(long, pick_death, fo::GameObject*, attacker, fo::GameObject*, target, fo::GameObject*, weapon, long, amount, long, anim, long, hitFromBack)
WRAP_WATCOM_FUNC0(void, process_bk)
WRAP_WATCOM_FUNC0(void, proto_dude_update_gender)
WRAP_WATCOM_FUNC2(void, proto_make_path, char*, buffer, long, pid)
// Places pointer to a prototype structure into ptrPtr and returns 0 on success or -1 on failure
WRAP_WATCOM_FUNC2(long, proto_ptr, long, pid, fo::Proto**, ptrPtr)
WRAP_WATCOM_FUNC2(void, queue_clear_type, long, qType, void*, func) // removes all events of the given type and performs func before removal
+13
View File
@@ -619,6 +619,19 @@ struct PremadeChar {
char unknown[20];
};
struct ProtoListBlock {
long* protoMem[16];
long count;
ProtoListBlock* next;
};
struct ProtoList {
ProtoListBlock* block;
ProtoListBlock* lastBlock;
long countBlocks; // current
long totalCount; // total number of prototypes for this type
};
// In-memory PROTO structure, not the same as PRO file format.
struct Proto {
struct Tile {
+1
View File
@@ -225,6 +225,7 @@
#define FO_VAR_procTableStrs 0x51C758 // table of procId (from define.h) => procName map
#define FO_VAR_proto_main_msg_file 0x6647FC
#define FO_VAR_proto_msg_files 0x6647AC
#define FO_VAR_protoLists 0x51C290
#define FO_VAR_ptable 0x59E934
#define FO_VAR_pud 0x59E960
#define FO_VAR_quest_count 0x51C12C
+1
View File
@@ -175,6 +175,7 @@ VAR_(preload_list_index, DWORD)
VARA(procTableStrs, const char*, (int)fo::Scripts::ScriptProc::count) // table of procId (from define.h) => procName map
VAR_(proto_main_msg_file, fo::MessageList)
VARA(proto_msg_files, fo::MessageList, 6) // array of 6 elements
VARA(protoLists, fo::ProtoList, 11)
VAR_(ptable, DWORD)
VAR_(pud, DWORD)
VAR_(queue, fo::Queue*)
@@ -121,6 +121,7 @@ static const SfallMetarule metarules[] = {
{"obj_under_cursor", mf_obj_under_cursor, 2, 2, 0, {ARG_INT, ARG_INT}},
{"objects_in_radius", mf_objects_in_radius, 3, 4, 0, {ARG_INT, ARG_INT, ARG_INT, ARG_INT}},
{"outlined_object", mf_outlined_object, 0, 0},
{"proto_exists", mf_proto_exists, 1, 1, 0, {ARG_INT}},
{"real_dude_obj", mf_real_dude_obj, 0, 0},
{"remove_timer_event", mf_remove_timer_event, 0, 1, -1, {ARG_INT}},
{"set_can_rest_on_map", mf_set_rest_on_map, 3, 3, -1, {ARG_INT, ARG_INT, ARG_INT}},
@@ -446,6 +446,10 @@ void mf_get_loot_object(OpcodeContext& ctx) {
ctx.setReturn((GetLoopFlags() & INTFACELOOT) ? fo::var::target_stack[fo::var::target_curr_stack] : 0);
}
void mf_proto_exists(OpcodeContext& ctx) {
ctx.setReturn(fo::CheckProtoID(ctx.arg(0).rawValue()));
}
static bool protoMaxLimitPatch = false;
void op_get_proto_data(OpcodeContext& ctx) {
@@ -89,6 +89,8 @@ void mf_obj_under_cursor(OpcodeContext&);
void mf_get_loot_object(OpcodeContext&);
void mf_proto_exists(OpcodeContext&);
void op_get_proto_data(OpcodeContext&);
void op_set_proto_data(OpcodeContext&);