1- # res://scripts/DamageEngine .gd
1+ # res://scripts/damage_engine .gd
22extends Node
33class_name FF4DamageEngine
44
5- # ---------- Inner result type ----------
5+ # Result type for combat resolution
66class CombatResult :
77 var amount : int
88 var crit : bool
@@ -28,7 +28,7 @@ class CombatResult:
2828 func pretty_str () -> String :
2929 return "{amount: %d, hit:%s, crit:%s, absorbed:%s, elements:%s} " % [amount , str (hit ), str (crit ), str (absorbed ), str (elements )]
3030
31- # ---------- Tunables ----------
31+ # Tunables
3232const CRIT_BASE := 0.03 # base crit chance (no LUK)
3333const CRIT_AGI_SCALE := 0.0015 # +0.15% crit per AGI
3434const CRIT_MULT := 1.5
@@ -47,14 +47,14 @@ const BLIND_HIT_MULT := 0.5 # blind halves hit chance
4747const BACKROW_OUT := 0.5
4848const BACKROW_IN := 0.5
4949
50- # ---------- Helpers ----------
50+ # Helpers
5151static func _rand_range (a : float , b : float ) -> float :
5252 return a + randf () * (b - a )
5353
5454static func _roll_crit (agi : int ) -> bool :
5555 return randf () < (CRIT_BASE + float (agi ) * CRIT_AGI_SCALE )
5656
57- static func _element_mult (attacker_elems : Array [Element .Type ], defender_resist : Dictionary [Element .Type , String ]) -> float :
57+ static func _element_mult (attacker_elems : Array [Element .Type ], defender_resist : Dictionary [Element .Type , Element . ResistTag ]) -> float :
5858 return Element .vs_defender (attacker_elems , defender_resist )
5959
6060static func _row_mult (attacker : Combatant , defender : Combatant ) -> float :
@@ -81,13 +81,13 @@ static func physical_damage(attacker: Combatant, defender: Combatant) -> CombatR
8181 var elems_miss := attacker .weapon_elements ()
8282 return CombatResult .new (0 , false , false , elems_miss , false )
8383
84- var A := attacker .total_stats ()
85- var D := defender .total_stats ()
84+ var att_stats := attacker .total_stats ()
85+ var def_stats := defender .total_stats ()
8686
87- var atk_term := A .atk + int (floor (A .strn / 2.0 ))
88- var def_term := D .def_ + int (floor (D .vit / 2.0 ))
87+ var atk_term := att_stats .atk + int (floor (att_stats .strn / 2.0 ))
88+ var def_term := def_stats .def_ + int (floor (def_stats .vit / 2.0 ))
8989
90- var crit := _roll_crit (A .agi )
90+ var crit := _roll_crit (att_stats .agi )
9191 var def_factor : float
9292 if crit :
9393 def_factor = 0.25
@@ -118,11 +118,11 @@ static func physical_damage(attacker: Combatant, defender: Combatant) -> CombatR
118118# ---------- Magical damage (single-element) ----------
119119# Uses WIS for offense, WIL for resistance.
120120static func magical_damage (attacker : Combatant , defender : Combatant , power : int , elem : Element .Type ) -> CombatResult :
121- var A := attacker .total_stats ()
122- var D := defender .total_stats ()
121+ var att_stats := attacker .total_stats ()
122+ var def_stats := defender .total_stats ()
123123
124- var mag_term := power + int (floor (A .wis / 2.0 )) + int (floor (A .mag / 2.0 ))
125- var mres := int (floor (D .mdef / 2.0 ) + floor (D .wil / 2.0 ))
124+ var mag_term := power + int (floor (att_stats .wis / 2.0 )) + int (floor (att_stats .mag / 2.0 ))
125+ var mres := int (floor (def_stats .mdef / 2.0 ) + floor (def_stats .wil / 2.0 ))
126126
127127 var base : int = max (1 , mag_term - mres )
128128 base = int (round (base * _rand_range (VARIANCE_LOW , VARIANCE_HIGH )))
0 commit comments