common_damage_system_1 = (ti_on_agent_hit, 0, 0, [],
[
(store_trigger_param_1, ":agent"),
(store_trigger_param_2, ":attacker"),
(store_trigger_param_3, ":damage"),
(store_trigger_param_3, ":orig_damage"),
(agent_get_troop_id, ":troop", ":agent"),
(agent_get_troop_id, ":attacker_troop", ":attacker"),
(assign, ":dodged", 0),
#EVERYBODY#
#Critical hits for missiles
(try_begin),
(is_between, reg0, "itm_missile_weapons_start", "itm_missile_weapons_end"),#special def in Blood and Steel source
(store_random_in_range, ":random_no", 1, 100),
(try_begin),
(le, ":random_no", 5),
(val_max, ":damage", 20),
(try_end),
(else_try),
#Random critical hits, 3% per point of Combat Training (formerly Tactics)
(store_skill_level, ":combat_training", "skl_combat_training", ":attacker_troop"),
(val_mul, ":combat_training", 3),#3 percent chance per level, per hit
(store_random_in_range, ":random", 1, 100),
(try_begin),
(le, ":random", ":combat_training"),
(neg|agent_is_ally,":agent"),#don't critically hit non-allies
(val_max, ":damage", 7),
(val_mul, ":damage", 3),
(try_end),
(try_end),
#Damage is increased by 2 points for every point of Heroism, 3 if heroes. Army-based skill!
(agent_get_party_id, ":attacker_party_id", ":attacker"),
(party_get_skill_level, ":heroism", ":attacker_party_id", "skl_heroism"),
(try_begin),
(gt, ":heroism", 0),
(assign, reg1, ":heroism"),
#(display_message, "@Heroism = {reg1}"),
(try_begin),
(troop_is_hero, ":attacker_troop"),
(val_mul, ":heroism", 3),
(val_add, ":damage", ":heroism"),
(else_try),
(val_mul, ":heroism", 2),
(val_add, ":damage", ":heroism"),
(try_end),
(try_end),
#Damage is decreased by 1 points for every point of Defensive Tactics, 2 if heroes. Army-based skill!
(agent_get_party_id, ":defender_party_id", ":agent"),
(party_get_skill_level, ":defense", ":defender_party_id", "skl_defensive_tactics"),
(try_begin),
(gt, ":defense", 0),
(assign, reg1, ":defense"),
#(display_message, "@Heroism = {reg1}"),
(try_begin),
(troop_is_hero, ":troop"),
(val_mul, ":defense", 2),
(val_sub, ":damage", ":defense"),
(else_try),
(val_mul, ":defense", 1),
(val_sub, ":damage", ":defense"),
(try_end),
(try_end),
#HUMANS
(try_begin),
(agent_is_human, ":agent"),#branch if not human
#DEFENSIVE SKILLS
#Damage is lowered 5% per point of Toughness (formerly Ironflesh).
(try_begin),
(store_skill_level, ":toughness", "skl_toughness", ":troop"),
(gt, ":toughness", 0),
(val_mul, ":toughness", 5),
(assign, ":mod_damage", ":damage"),
(val_mul, ":mod_damage", ":toughness"),
(val_div, ":mod_damage", 100),#Rounded here, but whatever.
(val_sub, ":damage", ":mod_damage"),
(try_end),
#Damage is avoided 5% per point of Reflexes(formerly Athletics)
(try_begin),
(store_skill_level, ":reflexes", "skl_reflexes", ":troop"),
(gt, ":reflexes", 0),
(val_mul, ":reflexes", 5),
(store_random_in_range, ":random_no", 1, 100),
(try_begin),
(le, ":random_no", ":reflexes"),
(assign, ":damage", 0),
(try_begin),
(eq, ":troop", "trp_player"),
(display_message, "@You dodge the attack!"),
(assign,":dodged",1),
(else_try),
(eq, ":attacker_troop", "trp_player"),
(display_message, "@They dodge the attack!"),
(assign,":dodged",1),
(try_end),
(try_end),
(try_end),
#HORSE DAMAGE
(else_try),
#Pike special rules
(try_begin),
(is_between, reg0, "itm_pikes_start", "itm_pikes_end"),
(val_min, ":damage", 100),
(try_end),
#Horses randomly rear if they take damage
(store_random_in_range, ":random_no", 1, 100),
(try_begin),
(gt, ":damage", 5),
(le, ":random_no", 10),
(agent_set_animation, ":agent","anim_horse_rear"),
(try_end),
(try_end),
(store_sub, ":diff_damage", ":damage", ":orig_damage"),
(val_mul, ":diff_damage", -1),
(store_agent_hit_points, ":hitpoints" , ":agent", 1),
(val_add, ":hitpoints", ":diff_damage"),
(try_begin),
(eq, ":dodged", 1),
(call_script, "script_get_agent_max_hp", ":troop"), #arbitrary script name - output=35+STR+2*Ironflesh
(ge, ":damage", reg1), #arbitrary output register - damage will be overkill
(store_agent_hit_points, ":hp", ":agent", 1), #store current hp
(agent_set_slot, ":agent", slot_agent_avoid, ":hp"), #inside slot
(agent_set_no_death_knock_down_only, ":agent", 1), #disable death
(else_try),
(agent_set_hit_points,":agent",":hitpoints",1),
(try_end),
])
common_damage_system_2 = (ti_on_agent_knocked_down, 0, 0,
[],[
(store_trigger_param_1, ":agent"),
(agent_get_slot, ":hp", ":agent", slot_agent_avoid),
(ge, ":hp", 1), #this slot was marked
(agent_set_slot, ":agent", slot_agent_avoid, 0),
(agent_set_hit_points, ":agent", ":hp", 1), #restore hp
(agent_set_no_death_knock_down_only, ":agent", 0),
])