Add args to ENCOUNTER hook to determine which encounter is being loaded, not just map ID

This commit is contained in:
phobos2077
2024-05-31 00:53:17 +02:00
parent 0ba74de616
commit f9faa73b9c
6 changed files with 48 additions and 5 deletions
@@ -516,6 +516,11 @@
#define CRITICAL_VALUE_FAIL_MSG (6) // This is shown instead of Message if the stat check fails.
#define DIFFICULTY_EASY (0)
#define DIFFICULTY_NORMAL (1)
#define DIFFICULTY_HARD (2)
/* Playback mode defines for the soundplay function */
#define soundraw (0x80000000) // sfall flag
#define Stereo8bit (soundstereo)
+27 -4
View File
@@ -121,7 +121,7 @@ procedure remove_array_block(variable arr, variable blocksize, variable index);
/**
* Converts any array to string for debugging purposes
*/
#define debug_array_str(arr) debug_array_str_deep(arr, 1)
#define debug_array_str(arr) debug_array_str_deep(arr, 1, false)
// Prints contents of a given array to main message window, for debugging purposes.
#define display_array(arr) display_msg(debug_array_str(arr))
@@ -502,6 +502,28 @@ end
#undef ARRAY_SET_BLOCK_SIZE
/**
* Returns a new array containing only those items from *arr* for which *filterFunc* returns true.
* @arg {array} arr - Array to use values from. Can be map or list.
* @arg {string} filterFunc - A name of procedure that accepts value from arr and returns true if it should be copied to the new array.
* @arg {bool} negate - If true, reverses the result of filterFunc so that only "false" values will be copied to the new array.
* @ret {array}
*/
procedure array_filter(variable arr, variable filterFunc, variable negate := false) begin
variable k, v,
isMap := array_is_map(arr),
retArr := temp_array_map if isMap else temp_array_list(0);
foreach (k: v in arr) begin
if ((filterFunc(v) != 0) == (not negate)) then begin
if (isMap) then
set_array(retArr, k, v);
else
call array_push(retArr, v);
end
end
return retArr;
end
/**
* Creates a new array filled from a given array by transforming each value using given procedure name.
* @arg {array} arr - Array to use values from.
@@ -721,16 +743,17 @@ end
* Formats array contents into a string with a given level of recursion. For debugging.
* @arg {array} arr
* @arg {int} levels - recursion level
* @arg {bool} prefix - true to include a prefix with item count
* @ret {string}
*/
procedure debug_array_str_deep(variable arr, variable levels) begin
procedure debug_array_str_deep(variable arr, variable levels, variable prefix := false) begin
#define _newline if (levels > 1) then s += "\n";
#define _indent ii := 0; while (ii < levels - 1) do begin s += " "; ii++; end
#define _value(v) (v if (levels <= 1 or not array_exists(v)) else debug_array_str_deep(v, levels - 1))
variable i := 0, ii, k, v, s, len;
len := len_array(arr);
if (array_is_map(arr)) then begin // print assoc array
s := "Map("+len+"): {";
s := ("Map("+len+"): {") if prefix else "{";
while i < len do begin
_newline
k := array_key(arr, i);
@@ -744,7 +767,7 @@ procedure debug_array_str_deep(variable arr, variable levels) begin
_newline
s += "}";
end else begin // print list
s := "List("+len+"): [";
s := ("List("+len+"): [") if prefix else "[";
_newline
while i < len do begin
_newline
@@ -200,6 +200,15 @@ procedure to_string(variable val) begin
return ""+val;
end
/**
* Returns true if given string is 0 or empty string. For use as a delegate.
* @arg {string} str
* @ret {bool}
*/
procedure string_null_or_empty(variable str) begin
return str == 0 or str == "";
end
/**
DEPRECATED, use string_format instead!
+2
View File
@@ -731,6 +731,8 @@
int arg0 - event type: 0 - when a random encounter occurs, 1 - when the player enters from the world map
int arg1 - the map ID that the encounter will load (see MAPS.h or Maps.txt)
int arg2 - 1 when the encounter occurs is a special encounter, 0 otherwise
int arg3 - encounter table index or -1 if not an encounter
int arg4 - encounter index in the table, or -1 if not an encounter
int ret0 - overrides the map ID, or pass -1 for event type 0 to cancel the encounter and continue traveling
int ret1 - pass 1 to cancel the encounter and load the specified map from the ret0 (only for event type 0)
+2
View File
@@ -95,6 +95,8 @@
#define FO_VAR_Educated 0x57082C
#define FO_VAR_elevation 0x631D2C
#define FO_VAR_EncounterMapID 0x672E4C
#define FO_VAR_EncounterTableNum 0x672E50
#define FO_VAR_EncounterNum 0x672E54
#define FO_VAR_endgame_subtitle_done 0x570BD0
#define FO_VAR_endgame_subtitle_characters 0x51866C
#define FO_VAR_endgame_voiceover_loaded 0x570AB8
+3 -1
View File
@@ -592,11 +592,13 @@ end:
// Hook does not work for scripted encounters and meeting Horrigan
static long __fastcall EncounterHook_Script(long encounterMapID, long eventType, long encType) {
BeginHook();
argCount = 3;
argCount = 5;
args[0] = eventType; // 1 - enter local map from the world map
args[1] = encounterMapID;
args[2] = (encType == 3); // 1 - special random encounter
args[3] = fo::var::getInt(FO_VAR_EncounterTableNum);
args[4] = fo::var::getInt(FO_VAR_EncounterNum);
RunHookScript(HOOK_ENCOUNTER);