diff --git a/artifacts/scripting/headers/sfall.h b/artifacts/scripting/headers/sfall.h index eb9b9316..058f449e 100644 --- a/artifacts/scripting/headers/sfall.h +++ b/artifacts/scripting/headers/sfall.h @@ -250,6 +250,7 @@ // sfall_funcX macros #define add_extra_msg_file(name) sfall_func1("add_extra_msg_file", name) #define add_iface_tag sfall_func0("add_iface_tag") +#define add_trait(traitId) sfall_func1("add_trait", traitId) #define art_cache_clear sfall_func0("art_cache_clear") #define attack_is_aimed sfall_func0("attack_is_aimed") #define car_gas_amount sfall_func0("car_gas_amount") diff --git a/artifacts/scripting/sfall function notes.txt b/artifacts/scripting/sfall function notes.txt index 648cb885..549b66fb 100644 --- a/artifacts/scripting/sfall function notes.txt +++ b/artifacts/scripting/sfall function notes.txt @@ -627,6 +627,9 @@ optional argument: - can take off player's equipped item when the inventory is opened, or the player is in the barter screen - slot: 0 - armor slot, 1 - right slot, 2 - left slot (see INVEN_TYPE_* in define.h) +> void sfall_func1("add_trait", int traitId) +- adds the specified trait to the player + ------------------------ ------ MORE INFO ------- ------------------------ diff --git a/sfall/Modules/Scripting/Handlers/Metarule.cpp b/sfall/Modules/Scripting/Handlers/Metarule.cpp index fb70a290..ac30ed0a 100644 --- a/sfall/Modules/Scripting/Handlers/Metarule.cpp +++ b/sfall/Modules/Scripting/Handlers/Metarule.cpp @@ -61,6 +61,7 @@ static MetaruleTableType metaruleTable; static const SfallMetarule metarules[] = { {"add_extra_msg_file", sf_add_extra_msg_file, 1, 2, {ARG_STRING, ARG_INT}}, {"add_iface_tag", sf_add_iface_tag, 0, 0}, + {"add_trait", sf_add_trait, 1, 1, {ARG_INT}}, {"art_cache_clear", sf_art_cache_flush, 0, 0}, {"attack_is_aimed", sf_attack_is_aimed, 0, 0}, {"car_gas_amount", sf_car_gas_amount, 0, 0}, diff --git a/sfall/Modules/Scripting/Handlers/Objects.cpp b/sfall/Modules/Scripting/Handlers/Objects.cpp index c0c8fc23..0af741c7 100644 --- a/sfall/Modules/Scripting/Handlers/Objects.cpp +++ b/sfall/Modules/Scripting/Handlers/Objects.cpp @@ -435,7 +435,7 @@ void sf_get_loot_object(OpcodeContext& ctx) { ctx.setReturn((GetLoopFlags() & INTFACELOOT) ? LoadGameHook::LootTarget : 0); } -static const char* failedLoad = "%s() - failed to load a prototype id: %d"; +static const char* failedLoad = "%s() - failed to load a prototype ID: %d"; static bool protoMaxLimitPatch = false; void sf_get_proto_data(OpcodeContext& ctx) { diff --git a/sfall/Modules/Scripting/Handlers/Perks.cpp b/sfall/Modules/Scripting/Handlers/Perks.cpp index 1a3c5f30..e33371e3 100644 --- a/sfall/Modules/Scripting/Handlers/Perks.cpp +++ b/sfall/Modules/Scripting/Handlers/Perks.cpp @@ -405,5 +405,24 @@ end: } } +void sf_add_trait(OpcodeContext& ctx) { + if (fo::var::obj_dude->protoId != fo::PID_Player) { + ctx.printOpcodeError("%s() - traits can be added only to the player.", ctx.getMetaruleName()); + return; + } + long traitId = ctx.arg(0).rawValue(); + if (traitId >= fo::TRAIT_fast_metabolism && traitId <= fo::TRAIT_gifted) { + if (fo::var::pc_trait[0] == -1) { + fo::var::pc_trait[0] = traitId; + } else if (fo::var::pc_trait[0] != traitId && fo::var::pc_trait[1] == -1) { + fo::var::pc_trait[1] = traitId; + } else { + ctx.printOpcodeError("%s() - cannot add the trait ID: %d", ctx.getMetaruleName(), traitId); + } + } else { + ctx.printOpcodeError("%s() - invalid trait ID.", ctx.getMetaruleName()); + } +} + } } diff --git a/sfall/Modules/Scripting/Handlers/Perks.h b/sfall/Modules/Scripting/Handlers/Perks.h index 1a781bb4..9b60aed5 100644 --- a/sfall/Modules/Scripting/Handlers/Perks.h +++ b/sfall/Modules/Scripting/Handlers/Perks.h @@ -77,5 +77,7 @@ void __declspec() op_set_swiftlearner_mod(); void __declspec() op_set_perk_level_mod(); +void sf_add_trait(OpcodeContext&); + } } diff --git a/sfall/main.cpp b/sfall/main.cpp index b65b44c9..5028d3e4 100644 --- a/sfall/main.cpp +++ b/sfall/main.cpp @@ -158,7 +158,6 @@ static void InitModules() { // initialize all modules manager.add(); // fixes should be applied at the beginning - manager.add(); manager.add(); manager.add(); manager.add(); @@ -168,15 +167,16 @@ static void InitModules() { manager.add(); manager.add(); manager.add(); + manager.add(); manager.add(); manager.add(); manager.add(); manager.add(); - manager.add(); manager.add(); manager.add(); manager.add(); manager.add(); + manager.add(); manager.add(); manager.add(); manager.add();