Skip to content

Commit 757aef4

Browse files
LocalIdentityLocalIdentity
andauthored
Use Characters.ot and Monsters.ot files for many magic numbers (#1184)
* Use Characters.ot and Monsters.ot files for many magic numbers These 2 files contain many constants we had currently hardcoded in various files Next step is to extract the ot files for all the minions we use as some of them can contain their own stats that are exclusive to the minion / monster Also fixes the base stun duration values for players and minions + the max damage reduction for impale * Weapon swap speed --------- Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent 9138245 commit 757aef4

9 files changed

Lines changed: 232 additions & 44 deletions

File tree

src/Data/Misc.lua

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,145 @@ data.gameConstants = {
100100
["CullingStrikeRareThreshold"] = 10,
101101
["CullingStrikeUniqueThreshold"] = 5,
102102
}
103+
-- From Metadata/Characters/Character.ot
104+
data.characterConstants = {
105+
["level"] = 1,
106+
["is_player"] = 1,
107+
["energy_shield_recharge_rate_per_minute_%"] = 750,
108+
["character_inherent_mana_regeneration_rate_per_minute_%"] = 240,
109+
["base_maximum_all_resistances_%"] = 75,
110+
["maximum_physical_damage_reduction_%"] = 90,
111+
["object_inherent_base_maximum_block_%_from_ot"] = 75,
112+
["base_maximum_spell_block_%"] = 75,
113+
["max_viper_strike_orbs"] = 4,
114+
["max_fuse_arrow_orbs"] = 5,
115+
["max_fire_beam_stacks"] = 8,
116+
["base_evasion_rating"] = 27,
117+
["base_maximum_chance_to_evade_%"] = 95,
118+
["life_per_level"] = 12,
119+
["mana_per_level"] = 4,
120+
["accuracy_rating_per_level"] = 3,
121+
["evasion_rating_per_level"] = 300,
122+
["base_critical_hit_damage_bonus"] = 100,
123+
["strength_per_level"] = 0,
124+
["dexterity_per_level"] = 0,
125+
["intelligence_per_level"] = 0,
126+
["max_endurance_charges"] = 3,
127+
["max_frenzy_charges"] = 3,
128+
["max_power_charges"] = 3,
129+
["maximum_righteous_charges"] = 5,
130+
["maximum_blood_scythe_charges"] = 5,
131+
["base_number_of_traps_allowed"] = 15,
132+
["base_number_of_remote_mines_allowed"] = 15,
133+
["max_charged_attack_stacks"] = 6,
134+
["max_talisman_degen_stacks"] = 20,
135+
["max_frost_nova_stacks"] = 20,
136+
["max_rampage_stacks"] = 1000,
137+
["damage_+%_per_10_rampage_stacks"] = 2,
138+
["movement_velocity_+%_per_10_rampage_stacks"] = 1,
139+
["pvp_shield_damage_+%_final"] = -15,
140+
["minions_have_labyrinth_trap_degen_effect_+%"] = -90,
141+
["minions_are_immune_to_labyrinth_degen_effect"] = 0,
142+
["minion_damage_taken_+%_from_spike_traps_final"] = -90,
143+
["minion_damage_taken_+%_from_arrow_traps_final"] = 0,
144+
["minion_damage_taken_+%_from_guillotine_traps_final"] = -90,
145+
["traps_explode_on_timeout"] = 1,
146+
["maximum_rage"] = 30,
147+
["max_delve_degen_stacks"] = 5000,
148+
["max_azurite_debuff_stacks"] = 10,
149+
["melee_variation"] = 1,
150+
["base_total_number_of_sigils_allowed"] = 3,
151+
["enable_movement_skill_animation_skipping"] = 1,
152+
["melee_hit_damage_stun_multiplier_+%"] = 50,
153+
["non_physical_hit_damage_stun_multiplier_+%"] = -33,
154+
["additional_insanity_effects_while_delirious"] = 1,
155+
["max_steel_ammo"] = 12,
156+
["chance_to_deal_triple_damage_%_per_brutal_charge"] = 3,
157+
["stun_threshold_+%_per_brutal_charge"] = 10,
158+
["elemental_damage_taken_goes_to_energy_shield_over_4_seconds_%_per_absorption_charge"] = 12,
159+
["actor_scale_+%_limit"] = 100,
160+
["mines_invulnerable_for_duration_ms"] = 2000,
161+
["traps_invulnerable_for_duration_ms"] = 2000,
162+
["damage_taken_when_hit_+%_final_per_fortification"] = -1,
163+
["base_max_fortification"] = 20,
164+
["base_presence_radius"] = 40,
165+
["mtx_max_killstreak_stacks"] = 1000,
166+
["mtx_max_killcounter_stacks"] = 30000,
167+
["melee_strike_bonus_attack_distance"] = 2,
168+
["melee_defer_damage_prediction"] = 1,
169+
["accuracy_rating_+%_final_at_max_distance_scaled"] = -90,
170+
["base_weapon_swap_duration_ms"] = 250,
171+
["poise_decay_%_per_second"] = 50,
172+
["enable_weapon_sets"] = true,
173+
["base_number_of_weapon_sets"] = 2,
174+
["quadruped_head_turn_duration_ms"] = 100,
175+
["has_quadruped_head_control"] = 0,
176+
["base_pay_cost_over_start_of_skill_animation"] = 1,
177+
["base_knockback_speed_+%"] = -30,
178+
["base_maximum_number_of_stored_corpses"] = 10,
179+
["base_block_angle_degrees"] = 210,
180+
["base_heavy_stun_duration_ms"] = 3000,
181+
["global_resummon_time_ms"] = 7500,
182+
["disable_minion_formation"] = 1,
183+
["can_evade_spells"] = 1,
184+
["crossbow_ammo_switch_time_ms"] = 300,
185+
["light_stun_threshold_+%_final_per_number_of_times_stunned_in_past_duration_from_ot"] = 50,
186+
["x_ms_for_number_of_times_stunned_in_past_duration_from_ot"] = 4000,
187+
["rage_loss_delay_ms"] = 2000,
188+
["stun_base_duration_override_ms"] = 500,
189+
["object_inherent_armour_break_amount_+%_final_against_normal_monsters"] = 200,
190+
["object_inherent_armour_break_amount_+%_final_against_magic_monsters"] = 100,
191+
["object_inherent_evasion_break_amount_+%_final_against_normal_monsters"] = 200,
192+
["object_inherent_evasion_break_amount_+%_final_against_magic_monsters"] = 100,
193+
["fixed_frost_wall_limit"] = 60,
194+
["player_allow_dodge_roll_cancel"] = 1,
195+
["maximum_cold_infusion_stacks"] = 6,
196+
["maximum_fire_infusion_stacks"] = 6,
197+
["maximum_lightning_infusion_stacks"] = 6,
198+
["maximum_chaos_infusion_stacks"] = 6,
199+
["base_infusion_duration_ms"] = 15000,
200+
["maximum_caltrops_allowed"] = 20,
201+
["maximum_volatility_allowed"] = 200,
202+
["base_speed"] = 37,
203+
}
204+
-- From Metadata/Monsters/Monster.ot
205+
data.monsterConstants = {
206+
["item_drop_slots"] = 1,
207+
["energy_shield_recharge_rate_per_minute_%"] = 750,
208+
["base_maximum_mana"] = 200,
209+
["maximum_physical_damage_reduction_%"] = 75,
210+
["base_maximum_all_resistances_%"] = 75,
211+
["monster_base_flask_charges_percent_of_monster_power"] = 50,
212+
["base_maximum_chance_to_evade_%"] = 95,
213+
["base_critical_hit_damage_bonus"] = 30,
214+
["max_endurance_charges"] = 3,
215+
["max_frenzy_charges"] = 3,
216+
["max_power_charges"] = 3,
217+
["object_inherent_base_maximum_block_%_from_ot"] = 75,
218+
["base_maximum_spell_block_%"] = 75,
219+
["movement_velocity_cap"] = 128,
220+
["max_azurite_debuff_stacks"] = 10,
221+
["ignore_skill_weapon_restrictions"] = 1,
222+
["melee_hit_damage_stun_multiplier_+%"] = 33,
223+
["non_physical_hit_damage_stun_multiplier_+%"] = -50,
224+
["scale_melee_range_to_actor_scale"] = 1,
225+
["use_melee_pattern_range"] = 1,
226+
["melee_swing_not_scaled_by_area_modifiers"] = 1,
227+
["actor_scale_+%_limit"] = 200,
228+
["base_heavy_stun_duration_ms"] = 2000,
229+
["melee_defer_damage_prediction"] = 1,
230+
["poise_decay_delay_ms"] = 8000,
231+
["poise_decay_%_per_second"] = 5,
232+
["base_block_angle_degrees"] = 180,
233+
["action_attack_or_cast_time_uses_animation_length"] = 1,
234+
["slow_potency_+%_final_per_additional_player"] = -10,
235+
["check_for_targets_between_initiator_and_projectile_source"] = 1,
236+
["maximum_life_+%_final_per_additional_player"] = 50,
237+
["maximum_energy_shield_+%_final_per_additional_player"] = 50,
238+
["poise_threshold_+%_final_per_additional_player"] = 50,
239+
["stun_base_duration_override_ms"] = 500,
240+
["bleeding_moving_damage_%_of_base_override"] = 200,
241+
}
103242
-- From PlayerMinionIntrinsicStats.dat
104243
data.playerMinionIntrinsicStats = {
105244
["stun_base_duration_override_ms"] = 500,

src/Export/Classes/GGPKData.lua

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,10 @@ function GGPKClass:GetNeededFiles()
346346
"^Metadata/StatDescriptions/\\w+.csd$",
347347
"^Metadata/StatDescriptions/specific_skill_stat_descriptions/\\w+/\\w+.csd$",
348348
}
349+
local otFiles = {
350+
"Metadata/Characters/Character.ot",
351+
"Metadata/Monsters/Monster.ot",
352+
}
349353
local itFiles = {
350354
"Metadata/Items/Equipment.it",
351355
"Metadata/Items/Item.it",
@@ -391,5 +395,6 @@ function GGPKClass:GetNeededFiles()
391395
"Metadata/Items/Armours/BodyArmours/AbstractBodyArmour.it",
392396
"Metadata/Items/Amulets/AbstractAmulet.it",
393397
}
394-
return datFiles, csdFiles, itFiles
398+
399+
return datFiles, csdFiles, otFiles, itFiles
395400
end

src/Export/Scripts/miscdata.lua

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,48 @@ for row in dat("GameConstants"):Rows() do
4949
end
5050
out:write('}\n')
5151

52+
out:write('-- From Metadata/Characters/Character.ot\n')
53+
out:write('data.characterConstants = {\n')
54+
local file = getFile("Metadata/Characters/Character.ot")
55+
if not file then return nil end
56+
local text = convertUTF16to8(file)
57+
local inWantedBlock = false
58+
for line in text:gmatch("[^\r\n]+") do
59+
-- Detect start of a block
60+
if line:match("^Stats") or line:match("^Pathfinding") then
61+
inWantedBlock = true
62+
elseif inWantedBlock and line:match("^}") then
63+
inWantedBlock = false
64+
elseif inWantedBlock and line:find("=") then
65+
local key, value = line:gsub("%s+",""):match("^(.-)=(.+)$")
66+
if key and value then
67+
out:write('\t["' .. key .. '"] = ' .. value .. ',\n')
68+
end
69+
end
70+
end
71+
out:write('}\n')
72+
73+
out:write('-- From Metadata/Monsters/Monster.ot\n')
74+
out:write('data.monsterConstants = {\n')
75+
local file = getFile("Metadata/Monsters/Monster.ot")
76+
if not file then return nil end
77+
local text = convertUTF16to8(file)
78+
local inWantedBlock = false
79+
for line in text:gmatch("[^\r\n]+") do
80+
-- Detect start of a block
81+
if line:match("^Stats") then
82+
inWantedBlock = true
83+
elseif inWantedBlock and line:match("^}") then
84+
inWantedBlock = false
85+
elseif inWantedBlock and line:find("=") then
86+
local key, value = line:gsub("%s+",""):match("^(.-)=(.+)$")
87+
if key and value then
88+
out:write('\t["' .. key .. '"] = ' .. value .. ',\n')
89+
end
90+
end
91+
end
92+
out:write('}\n')
93+
5294
out:write('-- From PlayerMinionIntrinsicStats.dat\n')
5395
out:write('data.playerMinionIntrinsicStats = {\n')
5496
for row in dat("PlayerMinionIntrinsicStats"):Rows() do

src/Modules/CalcDefence.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2456,7 +2456,7 @@ function calcs.buildDefenceEstimations(env, actor)
24562456
end
24572457
else
24582458
local stunDuration = (1 + modDB:Sum("INC", nil, "StunDuration") / 100)
2459-
local baseStunDuration = data.misc.StunBaseDuration
2459+
local baseStunDuration = actor == env.minion and data.misc.MinionBaseStunDuration or data.misc.StunBaseDuration
24602460
local stunRecovery = (1 + modDB:Sum("INC", nil, "StunRecovery") / 100)
24612461
local stunAndBlockRecovery = (1 + modDB:Sum("INC", nil, "StunRecovery", "BlockRecovery") / 100)
24622462
output.StunDuration = m_ceil(baseStunDuration * stunDuration / stunRecovery * data.misc.ServerTickRate) / data.misc.ServerTickRate

src/Modules/CalcOffence.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5008,7 +5008,7 @@ function calcs.offence(env, actor, activeSkill)
50085008

50095009
local enemyArmour = m_max(calcLib.val(enemyDB, "Armour"), 0)
50105010
local impaleArmourReduction = calcs.armourReductionF(enemyArmour, impaleHitDamageMod * output.PhysicalStoredCombinedAvg)
5011-
local impaleResist = m_min(m_max(0, enemyDB:Sum("BASE", nil, "PhysicalDamageReduction") + skillModList:Sum("BASE", cfg, "EnemyImpalePhysicalDamageReduction") + impaleArmourReduction), data.misc.DamageReductionCap)
5011+
local impaleResist = m_min(m_max(0, enemyDB:Sum("BASE", nil, "PhysicalDamageReduction") + skillModList:Sum("BASE", cfg, "EnemyImpalePhysicalDamageReduction") + impaleArmourReduction), data.misc.EnemyPhysicalDamageReductionCap)
50125012
if skillModList:Flag(cfg, "IgnoreEnemyImpalePhysicalDamageReduction") then
50135013
impaleResist = 0
50145014
end
@@ -5195,7 +5195,7 @@ function calcs.offence(env, actor, activeSkill)
51955195
local takenInc = enemyDB:Sum("INC", dotTakenCfg, "DamageTaken", "DamageTakenOverTime", damageType.."DamageTaken", damageType.."DamageTakenOverTime") + (isElemental[damageType] and enemyDB:Sum("INC", dotTakenCfg, "ElementalDamageTaken") or 0)
51965196
local takenMore = enemyDB:More(dotTakenCfg, "DamageTaken", "DamageTakenOverTime", damageType.."DamageTaken", damageType.."DamageTakenOverTime") * (isElemental[damageType] and enemyDB:More(dotTakenCfg, "ElementalDamageTaken") or 1)
51975197
if damageType == "Physical" then
5198-
resist = m_max(0, m_min(enemyDB:Sum("BASE", nil, "PhysicalDamageReduction"), data.misc.DamageReductionCap))
5198+
resist = m_max(0, m_min(enemyDB:Sum("BASE", nil, "PhysicalDamageReduction"), data.misc.EnemyPhysicalDamageReductionCap))
51995199
else
52005200
resist = calcResistForType(damageType, dotTypeCfg)
52015201
end

src/Modules/CalcPerform.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,9 @@ function calcs.perform(env, skipEHP)
895895
if modDB:Flag(nil, "MinionAccuracyEqualsAccuracy") then
896896
env.minion.modDB:NewMod("Accuracy", "BASE", calcLib.val(modDB, "Accuracy") + calcLib.val(modDB, "Dex") * (modDB:Override(nil, "DexAccBonusOverride") or data.misc.AccuracyPerDexBase), "Player")
897897
else
898-
env.minion.modDB:NewMod("Accuracy", "BASE", round(env.data.monsterAccuracyTable[env.minion.level] * (env.minion.minionData.accuracy or 1)) + data.playerMinionIntrinsicStats.accuracy_rating_per_level * (env.minion.level - 1), "Base")
898+
env.minion.modDB:NewMod("Accuracy", "BASE", round(env.data.monsterAccuracyTable[env.minion.level] * (env.minion.minionData.accuracy or 1)) + data.playerMinionIntrinsicStats["accuracy_rating_per_level"] * (env.minion.level - 1), "Base")
899899
end
900-
env.minion.modDB:NewMod("CritMultiplier", "BASE", 100, "Base")
900+
env.minion.modDB:NewMod("CritMultiplier", "BASE", env.data.monsterConstants["base_critical_hit_damage_bonus"] + env.data.playerMinionIntrinsicStats["base_critical_hit_damage_bonus"], "Base")
901901
env.minion.modDB:NewMod("FireResist", "BASE", env.minion.minionData.fireResist, "Base")
902902
env.minion.modDB:NewMod("ColdResist", "BASE", env.minion.minionData.coldResist, "Base")
903903
env.minion.modDB:NewMod("LightningResist", "BASE", env.minion.minionData.lightningResist, "Base")

0 commit comments

Comments
 (0)