From f5af4fa641325c92bffba1010f5bad30174642e1 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Tue, 5 May 2026 20:58:38 +0200 Subject: [PATCH 1/3] . --- config/fxdata/lua/bindings/config.lua | 4 +- src/config_magic.c | 166 +++++++---- src/config_magic.h | 3 +- src/frontmenu_ingame_tabs.c | 15 + src/lua_api.c | 13 +- src/lvl_script_commands.c | 386 +------------------------- 6 files changed, 142 insertions(+), 445 deletions(-) diff --git a/config/fxdata/lua/bindings/config.lua b/config/fxdata/lua/bindings/config.lua index 81b1f632e3..fd2e64f2ac 100644 --- a/config/fxdata/lua/bindings/config.lua +++ b/config/fxdata/lua/bindings/config.lua @@ -45,14 +45,12 @@ function Set_creature_configuration(creature_type,property,value,value2) end ---@param value3 any function SetEffectGeneratorConfiguration(effectgeneratorname,property,value,value2,value3) end ---[[ ---Makes changes to keeper powers, as originally set in magic.cfg. ---@param power_kind power_kind ---@param property any ---@param value any ---@param value2 any -function Set_power_configuration(power_kind,property,value,value2) end -]] +function SetPowerConfiguration(power_kind,property,value,value2) end ---Allows you to make changes to room values set in terrain.cfg. Look in that file for explanations on the numbers. ---@param room_type room_type diff --git a/src/config_magic.c b/src/config_magic.c index 8afbca2d54..2eac30a486 100644 --- a/src/config_magic.c +++ b/src/config_magic.c @@ -175,33 +175,6 @@ const struct NamedCommand magic_shot_commands[] = { {NULL, 0}, }; -const struct NamedCommand magic_power_commands[] = { - {"NAME", 1}, - {"POWER", 2}, - {"COST", 3}, - {"DURATION", 4}, - {"CASTABILITY", 5}, - {"ARTIFACT", 6}, - {"NAMETEXTID", 7}, - {"TOOLTIPTEXTID", 8}, - {"SYMBOLSPRITES", 10}, - {"POINTERSPRITES", 11}, - {"PANELTABINDEX", 12}, - {"SOUNDSAMPLES", 13}, - {"PROPERTIES", 14}, - {"CASTEXPANDFUNC", 15}, - {"PLAYERSTATE", 16}, - {"PARENTPOWER", 17}, - {"SOUNDPLAYED", 18}, - {"COOLDOWN", 19}, - {"SPELL", 20}, - {"EFFECT", 21}, - {"USEFUNCTION", 22}, - {"CREATURETYPE", 23}, - {"COSTFORMULA", 24}, - {NULL, 0}, - }; - const struct NamedCommand magic_special_commands[] = { {"NAME", 1}, {"ARTIFACT", 2}, @@ -357,36 +330,127 @@ static void assign_artifact(const struct NamedField* named_field, int64_t value, game.conf.object_conf.object_to_power_artifact[value] = idx; } -static void assign_strength_before_last(const struct NamedField* named_field, int64_t value, const struct NamedFieldSet* named_fields_set, int idx, const char* src_str, unsigned char flags) +static int64_t value_strength(const struct NamedField* named_field, const char* value_text, const struct NamedFieldSet* named_fields_set, int idx, const char* src_str, unsigned char flags) { - // Old power max is one short for spell max, so duplicate final power value to use for lvl10 creatures. - assign_default(named_field,value,named_fields_set,idx,src_str,flags); - named_field++; - assign_default(named_field,value,named_fields_set,idx,src_str,flags); + char word_buf[COMMAND_WORD_LEN]; + + int32_t pos = 0; + long len = strlen(value_text); + int num_params = 0; + while (get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + num_params++; + } + + pos = 0; + + if (num_params == 2) + { + get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)); + int32_t strength_value = atoi(word_buf); + get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)); + int32_t slot = atoi(word_buf) - 1; + if (flag_is_set(flags,ccf_SplitExecution)) + { + return strength_value | ((int64_t)slot << 32); + } + else + { + struct PowerConfigStats* powerst = get_power_model_stats(idx); + powerst->strength[slot] = strength_value; + return 0; + } + + } + + if (flag_is_set(flags,ccf_SplitExecution) || (num_params != 9 && num_params != 10)) + { + ERRORLOG("Invalid strength value \"%s\" for power %d", value_text, idx); + return -1; + } + + int32_t i = 0; + struct PowerConfigStats* powerst = get_power_model_stats(idx); + while (get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + int32_t strength_value = atoi(word_buf); + powerst->strength[i] = strength_value; + i++; + } + + if (num_params == 8) + { + powerst->strength[9] = powerst->strength[8]; + } + return 0; + +} + +static int64_t value_cost(const struct NamedField* named_field, const char* value_text, const struct NamedFieldSet* named_fields_set, int idx, const char* src_str, unsigned char flags) +{ + char word_buf[COMMAND_WORD_LEN]; + + int32_t pos = 0; + long len = strlen(value_text); + int num_params = 0; + while (get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + num_params++; + } + + pos = 0; + + if (num_params == 2) + { + get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)); + int32_t cost_value = atoi(word_buf); + get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)); + int32_t slot = atoi(word_buf) - 1; + if (flag_is_set(flags,ccf_SplitExecution)) + { + return cost_value | ((int64_t)slot << 32); + } + else + { + struct PowerConfigStats* powerst = get_power_model_stats(idx); + powerst->cost[slot] = cost_value; + return 0; + } + + } + + if (flag_is_set(flags,ccf_SplitExecution) || (num_params != 9)) + { + ERRORLOG("Invalid cost value \"%s\" for power %d", value_text, idx); + return -1; + } + + int32_t i = 0; + struct PowerConfigStats* powerst = get_power_model_stats(idx); + while (get_conf_parameter_single(value_text,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + int32_t cost_value = atoi(word_buf); + powerst->cost[i] = cost_value; + i++; + } + return 0; +} + +static void assign_strength_cost(const struct NamedField* named_field, int64_t value, const struct NamedFieldSet* named_fields_set, int idx, const char* src_str, unsigned char flags) +{ + if (flag_is_set(flags,ccf_SplitExecution)) + { + int32_t assign_value = value & 0xFFFFFFFF; + int32_t slot = (value >> 32) & 0xFFFFFFFF; + ((int32_t*)named_field->field)[slot] = assign_value; + } } static const struct NamedField magic_powers_named_fields[] = { //name //pos //field //default //min //max //NamedCommand {"NAME", 0, field(game.conf.magic_conf.power_cfgstats[0].code_name), 0, INT32_MIN,UINT32_MAX, power_desc, value_name, assign_null}, - {"POWER", 0, field(game.conf.magic_conf.power_cfgstats[0].strength[0]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 1, field(game.conf.magic_conf.power_cfgstats[0].strength[1]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 2, field(game.conf.magic_conf.power_cfgstats[0].strength[2]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 3, field(game.conf.magic_conf.power_cfgstats[0].strength[3]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 4, field(game.conf.magic_conf.power_cfgstats[0].strength[4]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 5, field(game.conf.magic_conf.power_cfgstats[0].strength[5]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 6, field(game.conf.magic_conf.power_cfgstats[0].strength[6]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 7, field(game.conf.magic_conf.power_cfgstats[0].strength[7]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"POWER", 8, field(game.conf.magic_conf.power_cfgstats[0].strength[8]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_strength_before_last}, - {"POWER", 8, field(game.conf.magic_conf.power_cfgstats[0].strength[9]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 0, field(game.conf.magic_conf.power_cfgstats[0].cost[0]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 1, field(game.conf.magic_conf.power_cfgstats[0].cost[1]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 2, field(game.conf.magic_conf.power_cfgstats[0].cost[2]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 3, field(game.conf.magic_conf.power_cfgstats[0].cost[3]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 4, field(game.conf.magic_conf.power_cfgstats[0].cost[4]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 5, field(game.conf.magic_conf.power_cfgstats[0].cost[5]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 6, field(game.conf.magic_conf.power_cfgstats[0].cost[6]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 7, field(game.conf.magic_conf.power_cfgstats[0].cost[7]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"COST", 7, field(game.conf.magic_conf.power_cfgstats[0].cost[8]), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, + {"POWER", -1, field(game.conf.magic_conf.power_cfgstats[0].strength[0]), 0, INT32_MIN,UINT32_MAX, NULL, value_strength, assign_strength_cost}, + {"COST", -1, field(game.conf.magic_conf.power_cfgstats[0].cost[0]), 0, INT32_MIN,UINT32_MAX, NULL, value_cost, assign_strength_cost}, {"DURATION", 0, field(game.conf.magic_conf.power_cfgstats[0].duration), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, {"CASTABILITY", -1, field(game.conf.magic_conf.power_cfgstats[0].can_cast_flags), 0, 0,UINT64_MAX, (struct NamedCommand*)powermodel_castability_commands, value_longflagsfield, assign_default}, {"ARTIFACT", 0, field(game.conf.magic_conf.power_cfgstats[0].artifact_model), 0, INT32_MIN,UINT32_MAX, object_desc, value_default, assign_artifact}, diff --git a/src/config_magic.h b/src/config_magic.h index c76efb83c9..4791d897d5 100644 --- a/src/config_magic.h +++ b/src/config_magic.h @@ -424,10 +424,11 @@ extern const struct NamedCommand spell_effect_flags[]; extern const struct NamedCommand powermodel_properties_commands[]; extern const struct LongNamedCommand powermodel_castability_commands[]; extern const struct NamedCommand powermodel_expand_check_func_type[]; -extern const struct NamedCommand magic_power_commands[]; extern const Expand_Check_Func powermodel_expand_check_func_list[]; extern const struct NamedCommand magic_use_func_commands[]; extern const struct NamedCommand magic_cost_formula_commands[]; + +extern const struct NamedFieldSet magic_powers_named_fields_set; /******************************************************************************/ struct SpellConfig *get_spell_config(SpellKind spell_idx); TbBool spell_config_is_invalid(struct SpellConfig *mgcinfo); diff --git a/src/frontmenu_ingame_tabs.c b/src/frontmenu_ingame_tabs.c index f837e86c60..e8de4f52f6 100644 --- a/src/frontmenu_ingame_tabs.c +++ b/src/frontmenu_ingame_tabs.c @@ -2875,6 +2875,21 @@ void update_powers_tab_to_config(void) ibtn->draw_call = gui_area_spell_button; ibtn->maintain_call = maintain_spell; } + + struct PlayerInfo *player = get_my_player(); + if (player->view_type == PVT_DungeonTop) + { + if (menu_is_active(GMnu_SPELL)) + { + turn_off_menu(GMnu_SPELL); + turn_on_menu(GMnu_SPELL); + } + else if (menu_is_active(GMnu_SPELL2)) + { + turn_off_menu(GMnu_SPELL2); + turn_on_menu(GMnu_SPELL2); + } + } } void draw_placefiller(long scr_x, long scr_y, long units_per_px) diff --git a/src/lua_api.c b/src/lua_api.c index ca14051b6a..ec1f6f4344 100644 --- a/src/lua_api.c +++ b/src/lua_api.c @@ -1028,11 +1028,12 @@ static int lua_Set_effect_generator_configuration(lua_State *L) return 0; } -//static int lua_Set_power_configuration(lua_State *L) -//{ -// set_configuration(L, &terrain_room_named_fields_set, "SET_POWER_CONFIGURATION"); -// return 0; -//} +static int lua_Set_power_configuration(lua_State *L) +{ + set_configuration(L, &magic_powers_named_fields_set, "SET_POWER_CONFIGURATION"); + update_powers_tab_to_config(); + return 0; +} static int lua_Set_room_configuration(lua_State *L) { @@ -2241,7 +2242,7 @@ static const luaL_Reg global_methods[] = { {"SetTrapConfiguration", lua_Set_trap_configuration }, //{"SetCreatureConfiguration", lua_Set_creature_configuration }, {"SetEffectGeneratorConfiguration", lua_Set_effect_generator_configuration}, - //{"SetPowerConfiguration", lua_Set_power_configuration }, + {"SetPowerConfiguration", lua_Set_power_configuration }, {"SetRoomConfiguration", lua_Set_room_configuration }, {"SetGameRule", lua_Set_game_rule }, {"SetHandRule", lua_Set_hand_rule }, diff --git a/src/lvl_script_commands.c b/src/lvl_script_commands.c index 5bcfdfc5da..83b509571e 100644 --- a/src/lvl_script_commands.c +++ b/src/lvl_script_commands.c @@ -4532,395 +4532,13 @@ static void set_effectgen_configuration_process(struct ScriptContext* context) static void set_power_configuration_check(const struct ScriptLine *scline) { - ALLOCATE_SCRIPT_VALUE(scline->command, 0); - const char *powername = scline->tp[0]; - const char *property = scline->tp[1]; - char *new_value = (char*)scline->tp[2]; - - long power_id = get_id(power_desc, powername); - if (power_id == -1) - { - SCRPTERRLOG("Unknown power, '%s'", powername); - DEALLOCATE_SCRIPT_VALUE - return; - } - - long powervar = get_id(magic_power_commands, property); - if (powervar == -1) - { - SCRPTERRLOG("Unknown power variable: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - long long number_value = 0; - long k; - switch (powervar) - { - case 2: // Power - case 3: // Cost - { - value->bytes[3] = atoi(scline->tp[3]) - 1; //-1 because we want slot 1 to 9, not 0 to 8 - value->longs[2] = atoi(new_value); - break; - } - case 5: // Castability - { - long long j; - if (scline->tp[3][0] != '\0') - { - j = get_long_id(powermodel_castability_commands, new_value); - if (j <= 0) - { - SCRPTERRLOG("Incorrect castability value: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - else - { - number_value = j; - } - value->chars[3] = atoi(scline->tp[3]); - } - else - { - if (parameter_is_number(new_value)) - { - number_value = atoll(new_value); - } - else - { - char *flag = strtok(new_value," "); - while ( flag != NULL ) - { - j = get_long_id(powermodel_castability_commands, flag); - if (j > 0) - { - number_value |= j; - } else - { - SCRPTERRLOG("Incorrect castability value: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - flag = strtok(NULL, " " ); - } - } - value->chars[3] = -1; - } - value->ulonglongs[1] = number_value; - break; - } - case 6: // Artifact - { - k = get_id(object_desc, new_value); - if (k >= 0) - { - number_value = k; - } - value->longs[2] = number_value; - break; - } - case 10: // SymbolSprites - { - value->longs[1] = atoi(new_value); - value->longs[2] = atoi(scline->tp[3]); - break; - } - case 14: // Properties - { - if (scline->tp[3][0] != '\0') - { - k = get_id(powermodel_properties_commands, new_value); - if (k <= 0) - { - SCRPTERRLOG("Incorrect property value: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - else - { - number_value = k; - } - value->chars[3] = atoi(scline->tp[3]); - } - else - { - if (parameter_is_number(new_value)) - { - number_value = atoi(new_value); - } - else - { - char *flag = strtok(new_value," "); - while ( flag != NULL ) - { - k = get_id(powermodel_properties_commands, flag); - if (k > 0) - { - number_value |= k; - } else - { - SCRPTERRLOG("Incorrect property value: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - flag = strtok(NULL, " " ); - } - } - value->chars[3] = -1; - } - value->longs[2] = number_value; - break; - } - case 15: // OverchargeCheck - { - number_value = get_id(powermodel_expand_check_func_type,new_value); - if (number_value < 0) - { - SCRPTERRLOG("Invalid OverchargeCheckt: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - value->longs[2] = number_value; - break; - } - case 16: // PlayerState - { - k = get_id(player_state_commands, new_value); - if (k >= 0) - { - number_value = k; - } - value->longs[2] = number_value; - break; - } - case 17: // ParentPower - { - k = get_id(power_desc, new_value); - if (k >= 0) - { - number_value = k; - } - value->longs[2] = number_value; - break; - } - case 20: // Spell - { - k = get_id(spell_desc, new_value); - if (k >= 0) - { - number_value = k; - } - else - { - SCRPTERRLOG("Incorrect Spell valuet: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - } - case 21: // Effect - { - k = effect_or_effect_element_id(new_value); - if (k == 0) - { - SCRPTERRLOG("Unrecognised effect: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - else - { - number_value = k; - } - break; - } - case 22: // UseFunction - { - k = get_id(magic_use_func_commands, new_value); - if (k >= 0) - { - number_value = k; - } - else - { - SCRPTERRLOG("Incorrect UseFunction: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - } - case 23: // CreatureType - { - k = get_id(creature_desc, new_value); - if (k >= 0) - { - number_value = k; - } - else - { - SCRPTERRLOG("Incorrect Creature type: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - } - case 24: // CostFormula - { - k = get_id(magic_cost_formula_commands, new_value); - if (k >= 0) - { - number_value = k; - } - else - { - SCRPTERRLOG("Incorrect Cost formula: %s", new_value); - DEALLOCATE_SCRIPT_VALUE - return; - } - break; - } - default: - value->longs[2] = atoi(new_value); - } - #if (BFDEBUG_LEVEL >= 7) - { - if ( (powervar == 5) && (value->chars[3] != -1) ) - { - SCRIPTDBG(7, "Toggling %s castability flag: %I64d", powername, number_value); - } - else if ( (powervar == 14) && (value->chars[3] != -1) ) - { - SCRIPTDBG(7, "Toggling %s property flag: %I64d", powername, number_value); - } - else - { - SCRIPTDBG(7, "Setting power %s property %s to %I64d", powername, property, number_value); - } - } - #endif - value->shorts[0] = power_id; - value->bytes[2] = powervar; - - PROCESS_SCRIPT_VALUE(scline->command); + set_config_check(&magic_powers_named_fields_set, scline,"SET_POWER_CONFIG"); } static void set_power_configuration_process(struct ScriptContext *context) { - struct PowerConfigStats *powerst = get_power_model_stats(context->value->shorts[0]); - switch (context->value->bytes[2]) - { - case 2: // Power - powerst->strength[context->value->bytes[3]] = context->value->longs[2]; - break; - case 3: // Cost - powerst->cost[context->value->bytes[3]] = context->value->longs[2]; - break; - case 4: // Duration - powerst->duration = context->value->longs[2]; - break; - case 5: // Castability - { - unsigned long long flag = context->value->ulonglongs[1]; - if (context->value->chars[3] == 1) - { - set_flag(powerst->can_cast_flags, flag); - } - else if (context->value->chars[3] == 0) - { - clear_flag(powerst->can_cast_flags, flag); - } - else - { - powerst->can_cast_flags = flag; - } - break; - } - case 6: // Artifact - powerst->artifact_model = context->value->longs[2]; - game.conf.object_conf.object_to_power_artifact[powerst->artifact_model] = context->value->shorts[0]; - break; - case 7: // NameTextID - powerst->name_stridx = context->value->longs[2]; - break; - case 8: // TooltipTextID - powerst->tooltip_stridx = context->value->longs[2]; - break; - case 10: // SymbolSprites - powerst->bigsym_sprite_idx = context->value->longs[1]; - powerst->medsym_sprite_idx = context->value->longs[2]; - break; - case 11: // PointerSprites - powerst->pointer_sprite_idx = context->value->longs[2]; - break; - case 12: // PanelTabIndex - powerst->panel_tab_idx = context->value->longs[2]; - break; - case 13: // SoundSamples - powerst->select_sample_idx = context->value->longs[2]; - break; - case 14: // Properties - if (context->value->chars[3] == 1) - { - set_flag(powerst->config_flags, context->value->longs[2]); - } - else if (context->value->chars[3] == 0) - { - clear_flag(powerst->config_flags, context->value->longs[2]); - } - else - { - powerst->config_flags = context->value->longs[2]; - } - break; - case 15: // OverchargeCheck - powerst->overcharge_check_idx = context->value->longs[2]; - break; - case 16: // PlayerState - powerst->work_state = context->value->longs[2]; - break; - case 17: // ParentPower - powerst->parent_power = context->value->longs[2]; - break; - case 18: // SoundPlayed - powerst->select_sound_idx = context->value->longs[2]; - break; - case 19: // Cooldown - powerst->cast_cooldown = context->value->longs[2]; - break; - case 20: // Spell - powerst->cast_cooldown = context->value->longs[2]; - break; - case 21: // Effect - powerst->effect_id = context->value->longs[2]; - break; - case 22: // UseFunction - powerst->magic_use_func_idx = context->value->longs[2]; - break; - case 23: // CreatureType - powerst->creature_model = context->value->longs[2]; - break; - case 24: // CostFormula - powerst->cost_formula = context->value->longs[2]; - break; - default: - WARNMSG("Unsupported power configuration, variable %d.", context->value->bytes[2]); - break; - } + set_config_process(&magic_powers_named_fields_set, context,"SET_POWER_CONFIG"); update_powers_tab_to_config(); - struct PlayerInfo *player = get_my_player(); - if (player->view_type == PVT_DungeonTop) - { - if (menu_is_active(GMnu_SPELL)) - { - turn_off_menu(GMnu_SPELL); - turn_on_menu(GMnu_SPELL); - } - else if (menu_is_active(GMnu_SPELL2)) - { - turn_off_menu(GMnu_SPELL2); - turn_on_menu(GMnu_SPELL2); - } - } } static void set_player_colour_check(const struct ScriptLine *scline) From 5a8a7a8f108430c98dc372354e7e8a653423ebb5 Mon Sep 17 00:00:00 2001 From: Pieter Vandecandelaere Date: Tue, 5 May 2026 21:09:36 +0200 Subject: [PATCH 2/3] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/config_magic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config_magic.c b/src/config_magic.c index 2eac30a486..a735406b10 100644 --- a/src/config_magic.c +++ b/src/config_magic.c @@ -378,7 +378,7 @@ static int64_t value_strength(const struct NamedField* named_field, const char* i++; } - if (num_params == 8) + if (num_params == 9) { powerst->strength[9] = powerst->strength[8]; } From 1feea18f990192d2fd49baac1f9a0defbb6b1092 Mon Sep 17 00:00:00 2001 From: qqluqq Date: Tue, 5 May 2026 21:12:49 +0200 Subject: [PATCH 3/3] fix PROPERTIES only taking 1 value --- src/config_magic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config_magic.c b/src/config_magic.c index 2eac30a486..f9b8aae8aa 100644 --- a/src/config_magic.c +++ b/src/config_magic.c @@ -461,7 +461,7 @@ static const struct NamedField magic_powers_named_fields[] = { {"POINTERSPRITES", 0, field(game.conf.magic_conf.power_cfgstats[0].pointer_sprite_idx), 0, INT32_MIN,UINT32_MAX, NULL, value_icon, assign_icon}, {"PANELTABINDEX", 0, field(game.conf.magic_conf.power_cfgstats[0].panel_tab_idx), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, {"SOUNDSAMPLES", 0, field(game.conf.magic_conf.power_cfgstats[0].select_sample_idx), 0, INT32_MIN,UINT32_MAX, NULL, value_default, assign_default}, - {"PROPERTIES", 0, field(game.conf.magic_conf.power_cfgstats[0].config_flags), 0, INT32_MIN,UINT32_MAX, powermodel_properties_commands, value_flagsfield,assign_default}, + {"PROPERTIES", -1, field(game.conf.magic_conf.power_cfgstats[0].config_flags), 0, INT32_MIN,UINT32_MAX, powermodel_properties_commands, value_flagsfield,assign_default}, {"CASTEXPANDFUNC", 0, field(game.conf.magic_conf.power_cfgstats[0].overcharge_check_idx), 0, INT32_MIN,UINT32_MAX, powermodel_expand_check_func_type, value_default, assign_default}, {"PLAYERSTATE", 0, field(game.conf.magic_conf.power_cfgstats[0].work_state), 0, INT32_MIN,UINT32_MAX, player_state_commands, value_default, assign_default}, {"PARENTPOWER", 0, field(game.conf.magic_conf.power_cfgstats[0].parent_power), 0, INT32_MIN,UINT32_MAX, power_desc, value_default, assign_default},