Added "add_trait" script function

This commit is contained in:
NovaRain
2019-10-20 19:29:19 +08:00
parent 1f156d39ae
commit 9f27c160ff
7 changed files with 29 additions and 3 deletions
+1
View File
@@ -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")
@@ -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 -------
------------------------
@@ -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},
+1 -1
View File
@@ -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) {
@@ -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());
}
}
}
}
+2
View File
@@ -77,5 +77,7 @@ void __declspec() op_set_swiftlearner_mod();
void __declspec() op_set_perk_level_mod();
void sf_add_trait(OpcodeContext&);
}
}
+2 -2
View File
@@ -158,7 +158,6 @@ static void InitModules() {
// initialize all modules
manager.add<BugFixes>(); // fixes should be applied at the beginning
manager.add<SpeedPatch>();
manager.add<Graphics>();
manager.add<Input>();
manager.add<LoadOrder>();
@@ -168,15 +167,16 @@ static void InitModules() {
manager.add<MainMenu>();
manager.add<Interface>();
manager.add<Objects>();
manager.add<SpeedPatch>();
manager.add<PlayerModel>();
manager.add<Worldmap>();
manager.add<Stats>();
manager.add<CritterStats>();
manager.add<Criticals>();
manager.add<Perks>();
manager.add<Combat>();
manager.add<Skills>();
manager.add<FileSystem>();
manager.add<Criticals>();
manager.add<Karma>();
manager.add<Tiles>();
manager.add<Credits>();