Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions src/Data/Misc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,145 @@ data.gameConstants = {
["CullingStrikeRareThreshold"] = 10,
["CullingStrikeUniqueThreshold"] = 5,
}
-- From Metadata/Characters/Character.ot
data.characterConstants = {
["level"] = 1,
["is_player"] = 1,
["energy_shield_recharge_rate_per_minute_%"] = 750,
["character_inherent_mana_regeneration_rate_per_minute_%"] = 240,
["base_maximum_all_resistances_%"] = 75,
["maximum_physical_damage_reduction_%"] = 90,
["object_inherent_base_maximum_block_%_from_ot"] = 75,
["base_maximum_spell_block_%"] = 75,
["max_viper_strike_orbs"] = 4,
["max_fuse_arrow_orbs"] = 5,
["max_fire_beam_stacks"] = 8,
["base_evasion_rating"] = 27,
["base_maximum_chance_to_evade_%"] = 95,
["life_per_level"] = 12,
["mana_per_level"] = 4,
["accuracy_rating_per_level"] = 3,
["evasion_rating_per_level"] = 300,
["base_critical_hit_damage_bonus"] = 100,
["strength_per_level"] = 0,
["dexterity_per_level"] = 0,
["intelligence_per_level"] = 0,
["max_endurance_charges"] = 3,
["max_frenzy_charges"] = 3,
["max_power_charges"] = 3,
["maximum_righteous_charges"] = 5,
["maximum_blood_scythe_charges"] = 5,
["base_number_of_traps_allowed"] = 15,
["base_number_of_remote_mines_allowed"] = 15,
["max_charged_attack_stacks"] = 6,
["max_talisman_degen_stacks"] = 20,
["max_frost_nova_stacks"] = 20,
["max_rampage_stacks"] = 1000,
["damage_+%_per_10_rampage_stacks"] = 2,
["movement_velocity_+%_per_10_rampage_stacks"] = 1,
["pvp_shield_damage_+%_final"] = -15,
["minions_have_labyrinth_trap_degen_effect_+%"] = -90,
["minions_are_immune_to_labyrinth_degen_effect"] = 0,
["minion_damage_taken_+%_from_spike_traps_final"] = -90,
["minion_damage_taken_+%_from_arrow_traps_final"] = 0,
["minion_damage_taken_+%_from_guillotine_traps_final"] = -90,
["traps_explode_on_timeout"] = 1,
["maximum_rage"] = 30,
["max_delve_degen_stacks"] = 5000,
["max_azurite_debuff_stacks"] = 10,
["melee_variation"] = 1,
["base_total_number_of_sigils_allowed"] = 3,
["enable_movement_skill_animation_skipping"] = 1,
["melee_hit_damage_stun_multiplier_+%"] = 50,
["non_physical_hit_damage_stun_multiplier_+%"] = -33,
["additional_insanity_effects_while_delirious"] = 1,
["max_steel_ammo"] = 12,
["chance_to_deal_triple_damage_%_per_brutal_charge"] = 3,
["stun_threshold_+%_per_brutal_charge"] = 10,
["elemental_damage_taken_goes_to_energy_shield_over_4_seconds_%_per_absorption_charge"] = 12,
["actor_scale_+%_limit"] = 100,
["mines_invulnerable_for_duration_ms"] = 2000,
["traps_invulnerable_for_duration_ms"] = 2000,
["damage_taken_when_hit_+%_final_per_fortification"] = -1,
["base_max_fortification"] = 20,
["base_presence_radius"] = 40,
["mtx_max_killstreak_stacks"] = 1000,
["mtx_max_killcounter_stacks"] = 30000,
["melee_strike_bonus_attack_distance"] = 2,
["melee_defer_damage_prediction"] = 1,
["accuracy_rating_+%_final_at_max_distance_scaled"] = -90,
["base_weapon_swap_duration_ms"] = 250,
["poise_decay_%_per_second"] = 50,
["enable_weapon_sets"] = true,
["base_number_of_weapon_sets"] = 2,
["quadruped_head_turn_duration_ms"] = 100,
["has_quadruped_head_control"] = 0,
["base_pay_cost_over_start_of_skill_animation"] = 1,
["base_knockback_speed_+%"] = -30,
["base_maximum_number_of_stored_corpses"] = 10,
["base_block_angle_degrees"] = 210,
["base_heavy_stun_duration_ms"] = 3000,
["global_resummon_time_ms"] = 7500,
["disable_minion_formation"] = 1,
["can_evade_spells"] = 1,
["crossbow_ammo_switch_time_ms"] = 300,
["light_stun_threshold_+%_final_per_number_of_times_stunned_in_past_duration_from_ot"] = 50,
["x_ms_for_number_of_times_stunned_in_past_duration_from_ot"] = 4000,
["rage_loss_delay_ms"] = 2000,
["stun_base_duration_override_ms"] = 500,
["object_inherent_armour_break_amount_+%_final_against_normal_monsters"] = 200,
["object_inherent_armour_break_amount_+%_final_against_magic_monsters"] = 100,
["object_inherent_evasion_break_amount_+%_final_against_normal_monsters"] = 200,
["object_inherent_evasion_break_amount_+%_final_against_magic_monsters"] = 100,
["fixed_frost_wall_limit"] = 60,
["player_allow_dodge_roll_cancel"] = 1,
["maximum_cold_infusion_stacks"] = 6,
["maximum_fire_infusion_stacks"] = 6,
["maximum_lightning_infusion_stacks"] = 6,
["maximum_chaos_infusion_stacks"] = 6,
["base_infusion_duration_ms"] = 15000,
["maximum_caltrops_allowed"] = 20,
["maximum_volatility_allowed"] = 200,
["base_speed"] = 37,
}
-- From Metadata/Monsters/Monster.ot
data.monsterConstants = {
["item_drop_slots"] = 1,
["energy_shield_recharge_rate_per_minute_%"] = 750,
["base_maximum_mana"] = 200,
["maximum_physical_damage_reduction_%"] = 75,
["base_maximum_all_resistances_%"] = 75,
["monster_base_flask_charges_percent_of_monster_power"] = 50,
["base_maximum_chance_to_evade_%"] = 95,
["base_critical_hit_damage_bonus"] = 30,
["max_endurance_charges"] = 3,
["max_frenzy_charges"] = 3,
["max_power_charges"] = 3,
["object_inherent_base_maximum_block_%_from_ot"] = 75,
["base_maximum_spell_block_%"] = 75,
["movement_velocity_cap"] = 128,
["max_azurite_debuff_stacks"] = 10,
["ignore_skill_weapon_restrictions"] = 1,
["melee_hit_damage_stun_multiplier_+%"] = 33,
["non_physical_hit_damage_stun_multiplier_+%"] = -50,
["scale_melee_range_to_actor_scale"] = 1,
["use_melee_pattern_range"] = 1,
["melee_swing_not_scaled_by_area_modifiers"] = 1,
["actor_scale_+%_limit"] = 200,
["base_heavy_stun_duration_ms"] = 2000,
["melee_defer_damage_prediction"] = 1,
["poise_decay_delay_ms"] = 8000,
["poise_decay_%_per_second"] = 5,
["base_block_angle_degrees"] = 180,
["action_attack_or_cast_time_uses_animation_length"] = 1,
["slow_potency_+%_final_per_additional_player"] = -10,
["check_for_targets_between_initiator_and_projectile_source"] = 1,
["maximum_life_+%_final_per_additional_player"] = 50,
["maximum_energy_shield_+%_final_per_additional_player"] = 50,
["poise_threshold_+%_final_per_additional_player"] = 50,
["stun_base_duration_override_ms"] = 500,
["bleeding_moving_damage_%_of_base_override"] = 200,
}
-- From PlayerMinionIntrinsicStats.dat
data.playerMinionIntrinsicStats = {
["stun_base_duration_override_ms"] = 500,
Expand Down
7 changes: 6 additions & 1 deletion src/Export/Classes/GGPKData.lua
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,10 @@ function GGPKClass:GetNeededFiles()
"^Metadata/StatDescriptions/\\w+.csd$",
"^Metadata/StatDescriptions/specific_skill_stat_descriptions/\\w+/\\w+.csd$",
}
local otFiles = {
"Metadata/Characters/Character.ot",
"Metadata/Monsters/Monster.ot",
}
local itFiles = {
"Metadata/Items/Equipment.it",
"Metadata/Items/Item.it",
Expand Down Expand Up @@ -391,5 +395,6 @@ function GGPKClass:GetNeededFiles()
"Metadata/Items/Armours/BodyArmours/AbstractBodyArmour.it",
"Metadata/Items/Amulets/AbstractAmulet.it",
}
return datFiles, csdFiles, itFiles

return datFiles, csdFiles, otFiles, itFiles
end
42 changes: 42 additions & 0 deletions src/Export/Scripts/miscdata.lua
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,48 @@ for row in dat("GameConstants"):Rows() do
end
out:write('}\n')

out:write('-- From Metadata/Characters/Character.ot\n')
out:write('data.characterConstants = {\n')
local file = getFile("Metadata/Characters/Character.ot")
if not file then return nil end
local text = convertUTF16to8(file)
local inWantedBlock = false
for line in text:gmatch("[^\r\n]+") do
-- Detect start of a block
if line:match("^Stats") or line:match("^Pathfinding") then
inWantedBlock = true
elseif inWantedBlock and line:match("^}") then
inWantedBlock = false
elseif inWantedBlock and line:find("=") then
local key, value = line:gsub("%s+",""):match("^(.-)=(.+)$")
if key and value then
out:write('\t["' .. key .. '"] = ' .. value .. ',\n')
end
end
end
out:write('}\n')

out:write('-- From Metadata/Monsters/Monster.ot\n')
out:write('data.monsterConstants = {\n')
local file = getFile("Metadata/Monsters/Monster.ot")
if not file then return nil end
local text = convertUTF16to8(file)
local inWantedBlock = false
for line in text:gmatch("[^\r\n]+") do
-- Detect start of a block
if line:match("^Stats") then
inWantedBlock = true
elseif inWantedBlock and line:match("^}") then
inWantedBlock = false
elseif inWantedBlock and line:find("=") then
local key, value = line:gsub("%s+",""):match("^(.-)=(.+)$")
if key and value then
out:write('\t["' .. key .. '"] = ' .. value .. ',\n')
end
end
end
out:write('}\n')

out:write('-- From PlayerMinionIntrinsicStats.dat\n')
out:write('data.playerMinionIntrinsicStats = {\n')
for row in dat("PlayerMinionIntrinsicStats"):Rows() do
Expand Down
2 changes: 1 addition & 1 deletion src/Modules/CalcDefence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2456,7 +2456,7 @@ function calcs.buildDefenceEstimations(env, actor)
end
else
local stunDuration = (1 + modDB:Sum("INC", nil, "StunDuration") / 100)
local baseStunDuration = data.misc.StunBaseDuration
local baseStunDuration = actor == env.minion and data.misc.MinionBaseStunDuration or data.misc.StunBaseDuration
local stunRecovery = (1 + modDB:Sum("INC", nil, "StunRecovery") / 100)
local stunAndBlockRecovery = (1 + modDB:Sum("INC", nil, "StunRecovery", "BlockRecovery") / 100)
output.StunDuration = m_ceil(baseStunDuration * stunDuration / stunRecovery * data.misc.ServerTickRate) / data.misc.ServerTickRate
Expand Down
4 changes: 2 additions & 2 deletions src/Modules/CalcOffence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,7 @@
end
end
end
-- Apply Gemling's "Integrated Efficency" Passive

Check warning on line 640 in src/Modules/CalcOffence.lua

View workflow job for this annotation

GitHub Actions / spellcheck

Unknown word (Efficency)
if skillModList:Flag(nil, "SkillDamageIncreasedPerRedSupport") or
skillModList:Flag(nil, "SkillSpeedIncreasedPerGreenSupport") or
skillModList:Flag(nil, "SkillCritChanceIncreasedPerBlueSupport") then
Expand Down Expand Up @@ -5008,7 +5008,7 @@

local enemyArmour = m_max(calcLib.val(enemyDB, "Armour"), 0)
local impaleArmourReduction = calcs.armourReductionF(enemyArmour, impaleHitDamageMod * output.PhysicalStoredCombinedAvg)
local impaleResist = m_min(m_max(0, enemyDB:Sum("BASE", nil, "PhysicalDamageReduction") + skillModList:Sum("BASE", cfg, "EnemyImpalePhysicalDamageReduction") + impaleArmourReduction), data.misc.DamageReductionCap)
local impaleResist = m_min(m_max(0, enemyDB:Sum("BASE", nil, "PhysicalDamageReduction") + skillModList:Sum("BASE", cfg, "EnemyImpalePhysicalDamageReduction") + impaleArmourReduction), data.misc.EnemyPhysicalDamageReductionCap)
if skillModList:Flag(cfg, "IgnoreEnemyImpalePhysicalDamageReduction") then
impaleResist = 0
end
Expand Down Expand Up @@ -5195,7 +5195,7 @@
local takenInc = enemyDB:Sum("INC", dotTakenCfg, "DamageTaken", "DamageTakenOverTime", damageType.."DamageTaken", damageType.."DamageTakenOverTime") + (isElemental[damageType] and enemyDB:Sum("INC", dotTakenCfg, "ElementalDamageTaken") or 0)
local takenMore = enemyDB:More(dotTakenCfg, "DamageTaken", "DamageTakenOverTime", damageType.."DamageTaken", damageType.."DamageTakenOverTime") * (isElemental[damageType] and enemyDB:More(dotTakenCfg, "ElementalDamageTaken") or 1)
if damageType == "Physical" then
resist = m_max(0, m_min(enemyDB:Sum("BASE", nil, "PhysicalDamageReduction"), data.misc.DamageReductionCap))
resist = m_max(0, m_min(enemyDB:Sum("BASE", nil, "PhysicalDamageReduction"), data.misc.EnemyPhysicalDamageReductionCap))
else
resist = calcResistForType(damageType, dotTypeCfg)
end
Expand Down
4 changes: 2 additions & 2 deletions src/Modules/CalcPerform.lua
Original file line number Diff line number Diff line change
Expand Up @@ -895,9 +895,9 @@ function calcs.perform(env, skipEHP)
if modDB:Flag(nil, "MinionAccuracyEqualsAccuracy") then
env.minion.modDB:NewMod("Accuracy", "BASE", calcLib.val(modDB, "Accuracy") + calcLib.val(modDB, "Dex") * (modDB:Override(nil, "DexAccBonusOverride") or data.misc.AccuracyPerDexBase), "Player")
else
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")
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")
end
env.minion.modDB:NewMod("CritMultiplier", "BASE", 100, "Base")
env.minion.modDB:NewMod("CritMultiplier", "BASE", env.data.monsterConstants["base_critical_hit_damage_bonus"] + env.data.playerMinionIntrinsicStats["base_critical_hit_damage_bonus"], "Base")
env.minion.modDB:NewMod("FireResist", "BASE", env.minion.minionData.fireResist, "Base")
env.minion.modDB:NewMod("ColdResist", "BASE", env.minion.minionData.coldResist, "Base")
env.minion.modDB:NewMod("LightningResist", "BASE", env.minion.minionData.lightningResist, "Base")
Expand Down
Loading
Loading