Chel
Master Knight

COMBAT ABILITIES KIT
These are the combat abilites I wrote, and think they add a something to the combat dynamic and help balance things between foot and mounted player characters. Some are old, the rest are new. Feel free to use, modify, adapt, improve in your game or mod. If you'd like to test them out, they are currently implemented in EGIII v0.91 mod (link in my signature).
CODE:
Help message
paste into module_mission_templates.py, at the top, right above "common_battle_mission_start" for example.
Experience cost scripts, paste into module_scripts.py, at the end for example.
the rest is actual code for the abilities, each part should be pasted into each combat mission in module_mission_templates.py that you want it to work in, like "lead_charge", "village_attack_bandits", "village_raid", "besiege_inner_battle_castle", etc.
Help messages (also good to paste into something like "town_center" mission so can be read outside of battle)
Horse whistle after I wrote it, I noticed The Mercenary did this already, and very nicely, although slightly differently - in his version you only call your horse, if you came into battle with one. I did such that you can call any horse if you have enough charisma, and if you have even more charisma you can call multiple ones, and possibly create a small stampede
Taunt good for getting circling horse archers to try and melee you, or distracting some infantry charging at your archers so they can take more fire. More charisma allows to taunt more enemies for a short period.
Warcry scares away enemies surrounding you that are lower level than twice your level for a short period. Very good for getting out of a tough spot as an infantryman (and followed by Sprint), or scattering an infantry line as you charge them on foot or horse.
First aid allows you to heal a small number of hitpoints in battle, higher with more intelligence and first aid skill. Good to mitigate the effects of random arrows hitting your head and making high intelligence character more viable.
Battlecry recovers percentage of your wounded troops' life, and looks and sounds great
Rage
Sprint
Focus
P.S. Also in some rare cases (I've never seen it happen, but people have reported it, I'm not sure when and why) the bonuses from rage/focus/sprint do not go away and become permanent.
Adding this to module_triggers.py should fix this problem in most cases:
These are the combat abilites I wrote, and think they add a something to the combat dynamic and help balance things between foot and mounted player characters. Some are old, the rest are new. Feel free to use, modify, adapt, improve in your game or mod. If you'd like to test them out, they are currently implemented in EGIII v0.91 mod (link in my signature).

CODE:
Help message
paste into module_mission_templates.py, at the top, right above "common_battle_mission_start" for example.
Code:
abilities_help_on = (0, 0, 0,[(key_clicked, key_n),
(tutorial_message, "@Combat abilities ^^J : RAGE, +5 Power strike, +5 Power throw, +5 Agility, lasts for 2xStrength sec, requires 14 Strength ^^K : FOCUS, +10xIntelligence to weapon proficiencies, +5 Agility, lasts for 2xIntelligence sec, requires 14 Intelligence ^^O : SPRINT, +7 Athletics, +15 Agility, lasts for 2xAgility seconds, requires 14 Agility ^^T : WHISTLE FOR HORSE, call a horse to come to you, more than one with higher Charisma, requires 14 Charisma ^^Y : FIRST AID, treat your immediate wounds to recover 3xFirstAid+Intelligence hitpoints, requires 14 Intelligence ^^U : BATTLECRY, rally your wounded troops to fight and recover 3xLeadership+Charisma percent of their hitpoints ^^B : WARCRY, unleash a fearsome cry to terrify weaker oppnents around you ^^G : TAUNT, attract the attention of your enemies, more with higher charisma^^All combat abilites can be used every 60 seconds in battle ^^Press M to see several other important changes ^^Press H to close help."),
], [])
abilities_help_extra = (0, 0, 0,[(key_clicked, key_m),
(tutorial_message, "@ blank."),
], [])
abilities_help_off = (0, 0, 0,[(key_clicked, key_h),
(tutorial_message, "@ "),
], [])
Experience cost scripts, paste into module_scripts.py, at the end for example.
Code:
("rage_exp_penalty",
[(store_character_level,":level","trp_player"),
(val_mul,":level",-8),
(add_xp_to_troop,":level","trp_player"),
(assign,reg1,":level"),
(display_message, "@You spent {reg1} experience points.",0x6495ed),
]),
("sprint_exp_penalty",
[(store_character_level,":level","trp_player"),
(val_mul,":level",-6),
(add_xp_to_troop,":level","trp_player"),
(assign,reg1,":level"),
(display_message, "@You spent {reg1} experience points.",0x6495ed),
]),
("focus_exp_penalty",
[(store_character_level,":level","trp_player"),
(val_mul,":level",-10),
(add_xp_to_troop,":level","trp_player"),
(assign,reg1,":level"),
(display_message, "@You spent {reg1} experience points.",0x6495ed),
]),
the rest is actual code for the abilities, each part should be pasted into each combat mission in module_mission_templates.py that you want it to work in, like "lead_charge", "village_attack_bandits", "village_raid", "besiege_inner_battle_castle", etc.
Help messages (also good to paste into something like "town_center" mission so can be read outside of battle)
Code:
# EGIII ABILITIES
abilities_help_on,
abilities_help_extra,
abilities_help_off,
(3, 0, ti_once, [], [
(display_message,"@Press N for help",0x6495ed),
]),
(1, 0, ti_once, [], [
(assign, "$ability", 1), ]),
Horse whistle after I wrote it, I noticed The Mercenary did this already, and very nicely, although slightly differently - in his version you only call your horse, if you came into battle with one. I did such that you can call any horse if you have enough charisma, and if you have even more charisma you can call multiple ones, and possibly create a small stampede
Code:
# EGIII Whistle for horse
(0, 0, 60, [(key_clicked, key_t),(store_attribute_level,"$attribute","trp_player",3),(ge,"$attribute",14),(neg|main_hero_fallen)], [
(play_sound,"snd_horse_low_whinny"),
(get_player_agent_no, ":player_agent"),
(agent_get_position, pos1, ":player_agent"),
(store_sub,":ch_bonus","$attribute",14),
(val_div,":ch_bonus",-2),
(assign,":whistled",":ch_bonus"),
(try_for_agents,":agent"),
(agent_is_alive,":agent"),
(neg|agent_is_human,":agent"),
(neg|ge,":whistled",1),
(agent_get_position, pos2, ":agent"),
(get_distance_between_positions,":distance",pos2,pos1),
(ge,":distance",250),
(agent_set_scripted_destination,":agent",pos1,1),
(val_add,":whistled",1),
(try_end),
(display_message,"@You whistle for a horse!",0x6495ed),
(call_script, "script_sprint_exp_penalty"),
]),
Taunt good for getting circling horse archers to try and melee you, or distracting some infantry charging at your archers so they can take more fire. More charisma allows to taunt more enemies for a short period.
Code:
# EGIII taunt
(0, 0, 60, [(key_clicked, key_g),(store_attribute_level,"$attribute","trp_player",3),(neg|main_hero_fallen)], [
(play_sound,"snd_man_warcry"),
(get_player_agent_no, ":player_agent"),
(agent_get_position, pos1, ":player_agent"),
(store_sub,":ch_bonus","$attribute",0),
(val_div,":ch_bonus",-3),
(assign,":whistled",":ch_bonus"),
(try_for_agents,":agent"),
(agent_is_alive,":agent"),
(agent_is_human,":agent"),
(neg|agent_is_ally,":agent"),
(neg|ge,":whistled",1),
(agent_get_position, pos2, ":agent"),
(get_distance_between_positions,":distance",pos2,pos1),
(ge,":distance",600),
(agent_set_scripted_destination,":agent",pos1,1),
(val_add,":whistled",1),
(try_end),
(display_message,"@You taunt your enemies!",0x6495ed),
(call_script, "script_rage_exp_penalty"),
]),
(0, 4, 60, [(key_clicked, key_g),(neg|main_hero_fallen)
], [
(try_for_agents,":agent"),
(agent_is_alive,":agent"),
(agent_is_human,":agent"),
(neg|agent_is_ally,":agent"),
(agent_clear_scripted_mode,":agent"),
(try_end),
]),
Warcry scares away enemies surrounding you that are lower level than twice your level for a short period. Very good for getting out of a tough spot as an infantryman (and followed by Sprint), or scattering an infantry line as you charge them on foot or horse.
Code:
#EGIII WARCRY
(0, 0, 60, [(key_clicked, key_b),(neg|main_hero_fallen)
], [
(play_sound,"snd_man_victory"),
(get_player_agent_no, ":player_agent"),
(agent_get_position, pos1, ":player_agent"),
(store_character_level,":level","trp_player"),
# (agent_set_animation, ":player_agent", "anim_cheer"),
(val_mul,":level",2),
(val_add,":level",1),
(try_for_agents,":agent"),
(set_fixed_point_multiplier, 1),
(agent_is_alive,":agent"),
(agent_is_human,":agent"),
(neg|agent_is_ally,":agent"),
(agent_get_troop_id,":trp_agent", ":agent"),
(store_character_level,":troop_level",":trp_agent"),
(ge,":level",":troop_level"),
(agent_get_position, pos2, ":agent"),
(get_distance_between_positions,":distance",pos2,pos1),
(lt,":distance",500),
(set_fixed_point_multiplier, 10),
(position_get_x,":player_x",pos1),
(position_get_y,":player_y",pos1),
(position_get_x,":enemy_x",pos2),
(position_get_y,":enemy_y",pos2),
(store_sub,":difference_x",":enemy_x",":player_x"),
(val_mul,":difference_x",12),
(store_sub,":difference_y",":enemy_y",":player_y"),
(val_mul,":difference_y",12),
(val_add,":enemy_x",":difference_x"),
(val_add,":enemy_y",":difference_y"),
(position_set_x,pos2,":enemy_x"),
(position_set_y,pos2,":enemy_y"),
(agent_set_scripted_destination,":agent",pos2,1),
(try_end),
(display_message,"@You unleash a fearsome cry!",0x6495ed),
(set_fixed_point_multiplier, 1),
(call_script, "script_focus_exp_penalty"),
]),
(0, 5, 60, [(key_clicked, key_b),(neg|main_hero_fallen)
], [
#(display_message,"@Enemies regain their courage!",0x6495ed),
(try_for_agents,":agent"),
(agent_is_alive,":agent"),
(agent_is_human,":agent"),
(neg|agent_is_ally,":agent"),
(agent_clear_scripted_mode,":agent"),
(try_end),
]),
(0, 7, 60, [(key_clicked, key_b),(neg|main_hero_fallen)
], [
(try_for_agents,":agent"),
(agent_is_alive,":agent"),
(agent_is_human,":agent"),
(neg|agent_is_ally,":agent"),
(agent_clear_scripted_mode,":agent"),
(try_end),
]),
First aid allows you to heal a small number of hitpoints in battle, higher with more intelligence and first aid skill. Good to mitigate the effects of random arrows hitting your head and making high intelligence character more viable.
Code:
# EGIII first aid
(0, 0, 60, [(key_clicked, key_y),(store_attribute_level,"$attribute","trp_player",2),(ge,"$attribute",14),(neg|main_hero_fallen)], [
(play_sound,"snd_man_grunt_long"),
(get_player_agent_no, ":player_agent"),
(store_skill_level,":first_aid","skl_first_aid","trp_player"),
(store_sub,":int_bonus","$attribute",0),
(val_mul,":first_aid",3),
(store_agent_hit_points,":life",":player_agent",1),
(val_add,":first_aid",":int_bonus"),
(val_add,":life",":first_aid"),
(agent_set_hit_points,":player_agent",":life",1),
(agent_set_animation, ":player_agent", "anim_strike_abdomen_front"),
(assign,reg1,":first_aid"),
(display_message,"@You treat your wounds! (recover {reg1} hitpoints)",0x6495ed),
(call_script, "script_focus_exp_penalty"),
]),
Battlecry recovers percentage of your wounded troops' life, and looks and sounds great
Code:
# battlecry
(0, 0, 60, [(key_clicked, key_u),(store_attribute_level,"$attribute","trp_player",3),(neg|main_hero_fallen),
(play_sound,"snd_man_warcry"),
], [
(get_player_agent_no, ":player_agent"),
(try_begin),
(agent_get_class ,":blah", ":player_agent"),
(neq,":blah",grc_cavalry),
(agent_set_animation, ":player_agent", "anim_cheer"),
(try_end),
]),
(0, 2, 60, [(key_clicked, key_u),(store_attribute_level,"$attribute","trp_player",3),(neg|main_hero_fallen),
(get_player_agent_no, ":player_agent")
], [
(store_skill_level,":leadership","skl_leadership","trp_player"),
(get_player_agent_no, ":player_agent"),
(store_sub,":cha_bonus","$attribute",0),
(val_mul,":leadership",3),
(try_for_agents,":agent"),
(agent_is_alive,":agent"),
(agent_is_human,":agent"),
(agent_is_ally,":agent"),
(neg|eq,":agent",":player_agent"),
(store_agent_hit_points,":life",":agent",0),
(try_begin),
(agent_get_class ,":blah", ":agent"),
(neq,":blah",grc_cavalry),
(agent_set_animation, ":agent", "anim_cheer"),
(try_end),
(val_add,":life",":cha_bonus"),
(val_add,":life",":leadership"),
(agent_set_hit_points,":agent",":life",0),
#(agent_get_horse,":horse",":agent"),
(agent_play_sound, ":agent", "snd_man_victory"),
#(agent_set_animation, ":agent", "anim_cheer"),
(try_end),
(store_add,":recovery",":leadership",":cha_bonus"),
(assign,reg1,":recovery"),
(display_message,"@You rally your men! (wounded troops recover {reg1} % hitpoints)",0x6495ed),
(call_script, "script_rage_exp_penalty"),
]),
Rage
Code:
# rage NEW9
(0, 0, 60, [(key_clicked, key_j), (store_attribute_level,"$attribute","trp_player",0),(ge,"$attribute",14),(eq,"$ability",1),(neg|main_hero_fallen)], [
(play_sound,"snd_man_victory"),
(display_message,"@You rage in battle!",0x6495ed),
(reset_mission_timer_b),
(assign, "$ability", 2),
(store_attribute_level,"$attribue2","trp_player",0),
(val_mul,"$attribue2",2),
(store_skill_level,"$iron","skl_ironflesh","trp_player"),
(store_skill_level,"$strike","skl_power_strike","trp_player"),
(store_skill_level,"$draw","skl_power_draw","trp_player"),
(store_skill_level,"$throw","skl_power_throw","trp_player"),
(troop_raise_skill,"trp_player","skl_power_strike",5),
#(troop_raise_skill,"trp_player","skl_power_draw",5),
(troop_raise_skill,"trp_player","skl_ironflesh",5),
(troop_raise_skill,"trp_player","skl_power_throw",5),
(store_skill_level,"$ironnew","skl_ironflesh","trp_player"),
(store_skill_level,"$strikenew","skl_power_strike","trp_player"),
(store_skill_level,"$drawnew","skl_power_draw","trp_player"),
(store_skill_level,"$thrownew","skl_power_throw","trp_player"),
(troop_raise_attribute,"trp_player",1,5),
]),
(1, 0, 0, [(store_mission_timer_b,"$timer"),(gt,"$timer","$attribue2"),(eq,"$ability",2)], [
(val_sub,"$iron","$ironnew"),
(val_sub,"$strike","$strikenew"),
(val_sub,"$draw","$drawnew"),
(val_sub,"$throw","$thrownew"),
(troop_raise_skill,"trp_player","skl_ironflesh","$iron"),
(troop_raise_skill,"trp_player","skl_power_strike","$strike"),
(troop_raise_skill,"trp_player","skl_power_draw","$draw"),
(troop_raise_skill,"trp_player","skl_power_throw","$throw"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your rage dies down...",0x6495ed),
(call_script, "script_rage_exp_penalty"),
(assign, "$ability", 1),
]),
(1, 0, 0, [(main_hero_fallen),(eq,"$ability",2)], [
(val_sub,"$iron","$ironnew"),
(val_sub,"$strike","$strikenew"),
(val_sub,"$draw","$drawnew"),
(val_sub,"$throw","$thrownew"),
(troop_raise_skill,"trp_player","skl_ironflesh","$iron"),
(troop_raise_skill,"trp_player","skl_power_strike","$strike"),
(troop_raise_skill,"trp_player","skl_power_draw","$draw"),
(troop_raise_skill,"trp_player","skl_power_throw","$throw"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your rage dies down...",0x6495ed),
(call_script, "script_rage_exp_penalty"),
(assign, "$ability", 1),
]),
(ti_tab_pressed, 0, 0, [(eq,"$ability",2)], [
(val_sub,"$iron","$ironnew"),
(val_sub,"$strike","$strikenew"),
(val_sub,"$draw","$drawnew"),
(val_sub,"$throw","$thrownew"),
(troop_raise_skill,"trp_player","skl_ironflesh","$iron"),
(troop_raise_skill,"trp_player","skl_power_strike","$strike"),
(troop_raise_skill,"trp_player","skl_power_draw","$draw"),
(troop_raise_skill,"trp_player","skl_power_throw","$throw"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your rage dies down... ",0x6495ed),
(call_script, "script_rage_exp_penalty"),
(assign, "$ability", 1),
]),
# rage end
Sprint
Code:
# sprint NEW8
(0, 0, 60, [(key_clicked, key_o),(store_attribute_level,"$attribute","trp_player",1),(ge,"$attribute",14),(eq,"$ability",1),(neg|main_hero_fallen)], [
(play_sound,"snd_man_victory"),
(display_message,"@You push yourself to the limit!",0x6495ed),
(reset_mission_timer_b),
(assign, "$ability", 3),
(store_attribute_level,"$attribue2","trp_player",1),
(val_mul,"$attribue2",2),
(store_skill_level,"$athletics","skl_athletics","trp_player"),
(troop_raise_skill,"trp_player","skl_athletics",7),
(troop_raise_attribute,"trp_player",1,15),
(store_skill_level,"$athleticsnew","skl_athletics","trp_player"),
]),
(1, 0, 0, [(store_mission_timer_b,"$timer"),(gt,"$timer","$attribue2"),(eq,"$ability",3)], [
(val_sub,"$athletics","$athleticsnew"),
(troop_raise_skill,"trp_player","skl_athletics","$athletics"),
(troop_raise_attribute,"trp_player",1,-15),
(display_message,"@You are out of breath... ",0x6495ed),
(call_script, "script_sprint_exp_penalty"),
(assign, "$ability", 1),
]),
(1, 0, 0, [(main_hero_fallen),(eq,"$ability",3)], [
(val_sub,"$athletics","$athleticsnew"),
(troop_raise_skill,"trp_player","skl_athletics","$athletics"),
(troop_raise_attribute,"trp_player",1,-15),
(display_message,"@You are out of breath... ",0x6495ed),
(call_script, "script_sprint_exp_penalty"),
(assign, "$ability", 1),
]),
(ti_tab_pressed, 0, 0, [(eq,"$ability",3)], [
(val_sub,"$athletics","$athleticsnew"),
(troop_raise_skill,"trp_player","skl_athletics","$athletics"),
(troop_raise_attribute,"trp_player",1,-15),
(display_message,"@You are out of breath.. ",0x6495ed),
(call_script, "script_sprint_exp_penalty"),
(assign, "$ability", 1),
]),
# sprint end
Focus
Code:
# focus NEW8
(0, 0, 60, [(key_clicked, key_k),(store_attribute_level,"$attribute","trp_player",2),(ge,"$attribute",14),(eq,"$ability",1),(neg|main_hero_fallen)], [
(display_message,"@You focus on your weapon completely!",0x6495ed),
(reset_mission_timer_b),
(assign, "$ability", 4),
(store_attribute_level,"$attribue2","trp_player",2),
(store_attribute_level,"$bonus","trp_player",2),
(val_mul,"$bonus",10),
(val_mul,"$attribue2",2),
(troop_raise_proficiency_linear,"trp_player",0,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",1,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",2,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",3,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",4,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",5,"$bonus"),
(troop_raise_attribute,"trp_player",1,5),
]),
(1, 0, 0, [(store_mission_timer_b,"$timer"),(gt,"$timer","$attribue2"),(eq,"$ability",4)], [
(val_mul,"$bonus",-1),
(troop_raise_proficiency_linear,"trp_player",0,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",1,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",2,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",3,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",4,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",5,"$bonus"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your lose your focus...",0x6495ed),
(call_script, "script_focus_exp_penalty"),
(assign, "$ability", 1),
]),
(1, 0, 0, [(main_hero_fallen),(eq,"$ability",4)], [
(val_mul,"$bonus",-1),
(troop_raise_proficiency_linear,"trp_player",0,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",1,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",2,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",3,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",4,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",5,"$bonus"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your lose your focus... ",0x6495ed),
(call_script, "script_focus_exp_penalty"),
(assign, "$ability", 1),
]),
(ti_tab_pressed, 0, 0, [(eq,"$ability",4)], [
(val_mul,"$bonus",-1),
(troop_raise_proficiency_linear,"trp_player",0,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",1,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",2,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",3,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",4,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",5,"$bonus"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your lose your focus... ",0x6495ed),
(call_script, "script_focus_exp_penalty"),
(assign, "$ability", 1),
]),
# focus end
P.S. Also in some rare cases (I've never seen it happen, but people have reported it, I'm not sure when and why) the bonuses from rage/focus/sprint do not go away and become permanent.
Adding this to module_triggers.py should fix this problem in most cases:
Code:
(1, 0, 1, [(eq,"$ability",2)], [
(val_sub,"$iron","$ironnew"),
(val_sub,"$strike","$strikenew"),
(val_sub,"$draw","$drawnew"),
(val_sub,"$throw","$thrownew"),
(troop_raise_skill,"trp_player","skl_ironflesh","$iron"),
(troop_raise_skill,"trp_player","skl_power_strike","$strike"),
(troop_raise_skill,"trp_player","skl_power_draw","$draw"),
(troop_raise_skill,"trp_player","skl_power_throw","$throw"),
# (troop_raise_attribute,"trp_player",0,-20),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your rage dies down...",0x6495ed),
(call_script, "script_rage_exp_penalty"),
(assign, "$ability", 1),
]),
(1, 0, 1, [(eq,"$ability",3)], [
(val_sub,"$athletics","$athleticsnew"),
(troop_raise_skill,"trp_player","skl_athletics","$athletics"),
(troop_raise_attribute,"trp_player",1,-15),
(display_message,"@You are out of breath... ",0x6495ed),
(call_script, "script_sprint_exp_penalty"),
(assign, "$ability", 1),
]),
(1, 0, 1, [(eq,"$ability",4)], [
(val_mul,"$bonus",-1),
(troop_raise_proficiency_linear,"trp_player",0,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",1,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",2,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",3,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",4,"$bonus"),
(troop_raise_proficiency_linear,"trp_player",5,"$bonus"),
(troop_raise_attribute,"trp_player",1,-5),
(display_message,"@Your lose your focus... ",0x6495ed),
(call_script, "script_focus_exp_penalty"),
(assign, "$ability", 1),
]),
Last edited by a moderator: