Implement gdialog_get_barter_mod (#385)

* Implement `gdialog_get_barter_mod`

Used by Et tu
This commit is contained in:
Mike Klaas
2026-04-17 08:37:34 -07:00
committed by GitHub
parent 53ff2293a1
commit ed2db51afd
5 changed files with 19 additions and 5 deletions
+1 -1
View File
@@ -68,7 +68,7 @@ See [`https://sfall-team.github.io/sfall/`](https://sfall-team.github.io/sfall/)
| INI settings | get_ini_setting<br>get_ini_string<br>get_ini_section<br>get_ini_sections<br>get_ini_config<br>get_ini_config_db<br>set_ini_setting | ✅ except get_ini_config, get_ini_config_db | `modified_ini` is intentionally omitted as deprecated. |
| Objects and scripts | set_self<br>set_dude_obj<br>real_dude_obj<br>remove_script<br>get/set_script<br>obj_is_carrying_obj<br>loot_obj<br>dialog_obj<br>obj_under_cursor<br>get/set_object_data<br>get/set_flags<br>set_unique_id<br>set_scr_name<br>obj_is_openable<br>get/set_proto_data<br>get_object_ai_data | implemented: set_self, get_script, obj_is_carrying_obj, loot_obj, dialog_obj, obj_under_cursor, get_object_data, get_flags, set_flags, obj_is_openable, get_proto_data, set_proto_data | - |
| Other / Game management | set_movie_path<br>stop/resume_game<br>mark_movie_played<br>game_loaded<br>get_game_mode<br>get_uptime<br>signal_close_game | implemented: game_loaded, get_game_mode, get_uptime, signal_close_game | - |
| Gameplay tweaks | set_pickpocket_max<br>set_hit_chance_max<br>set_xp_mod<br>set_critter_hit_chance_mod<br>set_base_hit_chance_mod<br>set_hp_per_level_mod<br>get_unspent_ap_bonus<br>gdialog_get_barter_mod<br>set_unspent_ap_bonus<br>get/set_unspent_ap_perk_bonus<br>set_inven_ap_cost<br>set_base_pickpocket_mod<br>set_critter_pickpocket_mod<br>get_inven_ap_cost<br>set_drugs_data<br>get_kill_counter<br>mod_kill_counter<br>set_pipboy_available | not implemented | - |
| Gameplay tweaks | set_pickpocket_max<br>set_hit_chance_max<br>set_xp_mod<br>set_critter_hit_chance_mod<br>set_base_hit_chance_mod<br>set_hp_per_level_mod<br>get_unspent_ap_bonus<br>gdialog_get_barter_mod<br>set_unspent_ap_bonus<br>get/set_unspent_ap_perk_bonus<br>set_inven_ap_cost<br>set_base_pickpocket_mod<br>set_critter_pickpocket_mod<br>get_inven_ap_cost<br>set_drugs_data<br>get_kill_counter<br>mod_kill_counter<br>set_pipboy_available | implemented: gdialog_get_barter_mod | - |
| NPCs | inc_npc_level<br>get_npc_level<br>npc_engine_level_up | not implemented | - |
| Other | get_year<br>set_dm/df_model<br>active_hand<br>toggle_active_hand<br>get/set_viewport_x/y<br>hero_select_win<br>get_light_level<br>message_str_game<br>sneak_success<br>create_spatial<br>unwield_slot<br>add_g_timer_event<br>add_extra_msg_file<br>get_metarule_table<br>metarule_exist<br>remove_timer_event<br>spatial_radius | implemented: get_year, active_hand, toggle_active_hand, get_light_level, message_str_game, add_extra_msg_file, metarule_exist | `input_funcs_available`, `nb_create_char` are deprecated in sfall and intentionally absent in CE. `add_extra_msg_file` does not support the explicit `fileNumber` form in CE. |
+5
View File
@@ -3215,6 +3215,11 @@ static int gameDialogDrawText(unsigned char* buffer, Rect* rect, const char* str
return rect->top;
}
int gameDialogGetBarterModifier()
{
return gGameDialogBarterModifier;
}
// 0x448214
void gameDialogSetBarterModifier(int modifier)
{
+1
View File
@@ -35,6 +35,7 @@ int gameDialogSetTextReply(Program* program, int messageListId, const char* text
int _gdialogGo();
void _gdialogUpdatePartyStatus();
void _talk_to_critter_reacts(int reaction);
int gameDialogGetBarterModifier();
void gameDialogSetBarterModifier(int modifier);
int gameDialogBarter(int modifier);
void gameDialogEndBarter();
+4 -4
View File
@@ -4029,9 +4029,9 @@ static void opCombatIsInitialized(Program* program)
// 0x45AFA0
static void _op_gdialog_barter(Program* program)
{
int data = programStackPopInteger(program);
int modifier = programStackPopInteger(program);
if (gameDialogBarter(data) == -1) {
if (gameDialogBarter(modifier) == -1) {
debugPrint("\nScript Error: gdialog_barter: failed");
}
}
@@ -4700,9 +4700,9 @@ static void opJamLock(Program* program)
// 0x45C7D4
static void opGameDialogSetBarterMod(Program* program)
{
int data = programStackPopInteger(program);
int modifier = programStackPopInteger(program);
gameDialogSetBarterModifier(data);
gameDialogSetBarterModifier(modifier);
}
// combat_difficulty
+8
View File
@@ -11,6 +11,7 @@
#include "dbox.h"
#include "debug.h"
#include "game.h"
#include "game_dialog.h"
#include "input.h"
#include "interface.h"
#include "interpreter.h"
@@ -843,6 +844,12 @@ static void op_tile_under_cursor(Program* program)
programStackPushInteger(program, tile);
}
// gdialog_get_barter_mod
static void op_gdialog_get_barter_mod(Program* program)
{
programStackPushInteger(program, gameDialogGetBarterModifier());
}
// get_tile_fid
static void op_get_tile_fid(Program* program)
{
@@ -1992,6 +1999,7 @@ void sfallOpcodesInit()
// 0x824b - int tile_under_cursor()
interpreterRegisterOpcode(0x824B, op_tile_under_cursor);
// 0x824c - int gdialog_get_barter_mod()
interpreterRegisterOpcode(0x824C, op_gdialog_get_barter_mod);
// 0x824d - void set_inven_ap_cost(int cost)
// 0x825a - void reg_anim_destroy(object object)