#################### GS Rigale dodge and iron flesh adds ###################
#rigale
#Damage simulation code example by xenoargh
#Makes Ironflesh reduce damage (i.e., it's actually worth putting points into in SP)
#Makes Athletics also give an 'auto-dodge' or 'roll with punch' that reduces damage to a minimum
common_damage_system = (
ti_on_agent_hit, 0, 0,
[],
[
(store_trigger_param, ":agent",1),
(store_trigger_param, ":attacker",2),
(store_trigger_param, ":damage",3),
### from header_triggers
# Trigger Param 1: damage inflicted agent_id
# Trigger Param 2: damage dealer agent_id
# Trigger Param 3: inflicted damage
# Register 0: damage dealer item_id
# Position Register 0: position of the blow
# rotation gives the direction of the blow
# Trigger result: if returned result is greater than or equal to zero, inflicted damage is set to the value specified by the module.
(assign, ":damaging_item_id", reg0), # GS this will be the item that is trying to hit us
(item_get_missile_speed, ":dmg_missile_speed", ":damaging_item_id"),
(assign,":orig_damage",":damage"),
(agent_get_troop_id, ":troop", ":agent"),
(agent_get_troop_id, ":attacker_troop", ":attacker"),
(store_skill_level, ":ironflesh", "skl_ironflesh", ":troop"),
# (store_skill_level, ":athletics_dodge", "skl_athletics", ":troop"),
(troop_get_slot, ":athletics_dodge", ":troop", slot_eff_athletics), # (troop_get_slot, <destination>, <troop_id>, <slot_no>),
(val_clamp, ":athletics_dodge", 0, 11), # just to be sure nothing is > 10 athletics
(troop_get_slot, ":dodge_type", ":troop", slot_troop_dodge_type), # GS new
(val_clamp, ":dodge_type", -4, 6), # make sure it never gets > 5 through corruption or other means
#Damage is lowered 3% per point of Ironflesh.
(try_begin),
(gt, ":ironflesh", 0),
(agent_is_human,":agent"), #rigale pour chevaux pas ironflesh
(val_mul, ":ironflesh", 3),
(assign, ":mod_damage", ":damage"),
(val_mul, ":mod_damage", ":ironflesh"),
(val_div, ":mod_damage", 100),
#Rounded here, but whatever.
(val_sub, ":damage", ":mod_damage"),
(assign,reg1,":mod_damage"),
(try_begin),
(eq, ":troop", "trp_player"),
(display_message, "@Ironflesh soaked {reg1} damage."),
(try_end),
(try_end),
##Critical hits for missiles
# (try_begin),
# (is_between, reg0, ranged_weapons_begin, ranged_weapons_end),#special def in Blood and Steel source
# (store_random_in_range, ":random_no", 1, 100),
# (store_proficiency_level,
# (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 avoided 3% per point of Athletics # GS .76r3 changed so it now varies by encumbrance
(try_begin),
(gt, ":athletics_dodge", 0), # GS some chance of actual dodge; needs athletics to be at least 1
# checking slot "effective_athletics" because a hero constantly changes gear so athletics cant be modified directly
# unlike regular troops, else recovering original athletics will be impossible. So instead we have effective_athletics stored
# by script_ce_put_troop_encumbrance called in scripts script_start_game
(neg|eq, "$g_dodge_control", 1), # GS second chance to disable dodge
(try_begin), # GS .76r3 now :dodge_type is a value (between -4 and 5)
(ge, ":dodge_type", 0), # GS some chance of actual dodge
(val_mul, ":athletics_dodge", ":dodge_type"), # GS let's recap: dodge type was set in script_ce_put_troop_encumbrance @ lines 1475 and 1480 in scripts script_start_game
(store_random_in_range, ":random_no", 1, 100),
## GS here I want to add something new to (greatly) reduce chance to dodge bullets and crossbow bolts
(store_attribute_level, ":def_agility", ":troop", ca_agility),
(store_mul, ":speed_adjust", ":def_agility", 2),
(try_begin),
(gt, ":dmg_missile_speed", 0), # GS there IS a missile weapon in use...
(val_sub, ":dmg_missile_speed", ":speed_adjust"),
(lt, ":dmg_missile_speed", 0), # looking for things faster than this
(val_add, ":random_no", ":dmg_missile_speed"), # it just got harder to dodge fast projectiles. It should be extremely hard to dodge bullets now
# this is faster code than looking for weapons ranges or classes, as it applies also to crossbows and scales from agi
(try_end),
(try_begin),
(le, ":random_no", ":athletics_dodge"), # GS if athletics is less, dodge is less. If encumbrance is less, dodge is greater. It can _never_ be > 50%
(assign, ":damage", 1),
(try_begin),
(eq, ":troop", "trp_player"),
(display_message, "@You dodge the attack!",0x339900),
(else_try),
(eq, ":attacker_troop", "trp_player"),
(call_script, "script_dplmc_store_troop_is_female_reg", ":troop", 4), # GS gender = reg4
(display_message, "@{reg4?She:He} dodges the attack!"), # GS most likely this is wrong gender for non-humans
(try_end),
(try_end),
(else_try), # GS over burdened, so no dodge but now check to amplify damage!! implicit < 0 value here for :dodge_type
(val_max, ":dodge_type", -4), # GS let's make sure this never gets beyond the lowest value from script_ce_put_troop_encumbrance
(val_abs, ":dodge_type"), # GS convert to positive number
(val_mul, ":dodge_type", 4),
(assign, ":mod_damage", ":damage"),
(val_mul, ":mod_damage", ":dodge_type"),
(val_div, ":mod_damage", 100),
#Rounded here, but whatever.
(val_add, ":damage", ":mod_damage"), # GS and now the damage is amplified, so does more damage to persons too encumbered to dodge, regardless of athletics
(try_end),
(try_end),
(store_sub, ":diff_damage", ":damage", ":orig_damage"), # GS here the interest is to have a positive number to list the ADDED damage amount
(try_begin), #rigale
# (eq,":diff_damage",0),(eq, ":troop", "trp_player"), (agent_is_human,":agent"),(display_message,"@You suffer a very light wound",0xFFCCCC),
# (else_try),
(is_between,":damage",0,10),
(eq, ":troop", "trp_player"),
(agent_is_human,":agent"),
(display_message,"@You suffer a light wound",0xFFCCCC),
(else_try),
(is_between,":damage",10,20),
(eq, ":troop", "trp_player"),
(agent_is_human,":agent"),
(display_message,"@You suffer a serious wound",0xFF6666),
(else_try),
(ge,":damage",20),
(eq, ":troop", "trp_player"),
(agent_is_human,":agent"),
(display_message,"@You suffer a critical wound",0xCC0000),
(try_end),
(val_mul, ":diff_damage", -1), #
(store_agent_hit_points, ":hitpoints" , ":agent", 1),
(val_add, ":hitpoints", ":diff_damage"), # GS which is the same as subtracting :diff_damage from :hitpoints
(agent_set_hit_points,":agent",":hitpoints",1),
# (val_mul, ":diff_damage", -1),#rigale check wound
# (try_begin),
# (eq, ":troop", "trp_player"),
# (agent_is_human,":agent"),
# (try_begin), #rigale
# (is_between,":diff_damage",1,10),
# (display_message,"@You suffer a light wound",0xFFCCCC),
# (else_try),
# (is_between,":diff_damage",10,20),
# (display_message,"@You suffer a serious wound",0xFF6666),
# (else_try),
# (ge,":diff_damage",20),
# (display_message,"@You suffer a critical wound",0xCC0000),
# (try_end),
# (try_end),
(set_trigger_result, -1),
]
)
################## GS Rigale damage end ##############