Add berserk weapon special abilities tests (#8973)

Changes:
* CHECK_STRIKES macro now takes a comma-delimited list of strike counts for when units have a different number of strikes for different weapons, and updates the existing usage in the attacks tests
* Fixed a typo in the attacks_zero test
* Adds tests for berserk as a weapon special ability.

Berserk's handling differs from attacks as a weapon special ability:
* A value less than 1 is treated as effectively infinite rounds of combat (undocumented)
* The cumulative attribute is handled differently - in some cases it sums the values instead of using the highest single value whereas for attacks it always uses the highest single value

Also now exclude data/tests/ from scons pot-update since it was hitting the argument limit for number of arguments to a script.
This commit is contained in:
Pentarctagon 2024-06-15 20:20:54 -05:00 committed by GitHub
parent 1ef24e461f
commit a2993884cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
77 changed files with 1327 additions and 55 deletions

View file

@ -79,6 +79,7 @@
{test/scenarios/wml_tests/UnitsWML}
{test/scenarios/wml_tests/UnitsWML/AbilitiesWML}
{test/scenarios/wml_tests/UnitsWML/AbilitiesWML/attacks}
{test/scenarios/wml_tests/UnitsWML/AbilitiesWML/berserk}
{test/scenarios/wml_tests/UnitsWML/AbilitiesWML/heals}
{test/scenarios/wml_tests/UnitsWML/AbilitiesWML/hides}
{test/scenarios/wml_tests/UnitsWML/AbilitiesWML/illuminates}

View file

@ -159,8 +159,9 @@ bob#endarg
#enddef
# checks the number of strikes of all weapons a unit has
# they are expected to have the same number of strikes on all weapons
#define CHECK_STRIKES WEAPONS STRIKES RESULT
# STRIKES is a comma-delimited list containing the number of strikes each weapon the unit has is expected to have
# The implementation currently only supports one CHECK_STRIKES per unique ID1 per unit test
#define CHECK_STRIKES STRIKES RESULT
#arg ID1
alice#endarg
@ -174,6 +175,27 @@ numerical_equals#endarg
[event]
name = start
# allow specifying a different number of strikes per weapon
[set_variables]
name=strikes
[split]
list={STRIKES}
key=value
separator=","
remove_empty=yes
[/split]
[/set_variables]
[store_unit]
[filter]
id={ID1}
[/filter]
variable={ID1}
[/store_unit]
{ASSERT ({VARIABLE_CONDITIONAL {ID1}.attack.length numerical_equals $strikes.length})}
{CLEAR_VARIABLE {ID1}}
[modify_unit]
[filter]
id={ID1},{ID2}
@ -198,7 +220,7 @@ numerical_equals#endarg
variable=i
start=0
step=1
end="$({WEAPONS}-1)"
end="$($strikes.length-1)"
[do]
[test_do_attack_by_id]
attacker={ID1}
@ -240,10 +262,10 @@ numerical_equals#endarg
id={ID1}
[/filter]
{ASSERT {VARIABLE_CONDITIONAL {ID1}_{ID2}_strikes {COMPARE} {STRIKES}}}
{ASSERT {VARIABLE_CONDITIONAL {ID1}_{ID2}_strikes {COMPARE} $strikes[$i].value}}
{VARIABLE_OP {ID1}_{ID2}_count add 1}
[if]
{VARIABLE_CONDITIONAL {ID1}_{ID2}_count numerical_equals {WEAPONS}}
{VARIABLE_CONDITIONAL {ID1}_{ID2}_count numerical_equals $strikes.length}
[then]
{RESULT}
[/then]

View file

@ -0,0 +1,29 @@
# wmllint: no translatables
#####
# API(s) being tested: CHECK_STRIKES
##
# Actions:
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The Elvish Archer's melee attack strikes twice and its ranged attack strikes 4 times
#####
{COMMON_KEEP_A_B_UNIT_TEST "check_strikes_once" (
{CHECK_STRIKES "2,4" ({SUCCEED})}
)}
#####
# API(s) being tested: CHECK_STRIKES
##
# Actions:
# Have the side 1 leader attack the side 2 leader with both its weapons
# Have the side 1 leader attack the side 2 leader with both its weapons a second time
##
# Expected end state:
# The test fails since the variable tracking the strike count is not cleared
#####
{COMMON_KEEP_A_B_UNIT_TEST "check_strikes_twice_fail" (
{CHECK_STRIKES "2,4" ()}
{CHECK_STRIKES "2,4" ({SUCCEED})}
)}

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 3 ({SUCCEED})}
{CHECK_STRIKES "3,3" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 12 ({SUCCEED})}
{CHECK_STRIKES "12,12" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 3 ({SUCCEED})}
{CHECK_STRIKES "3,3" ({SUCCEED})}
)}

View file

@ -34,6 +34,6 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 () ID1=bob ID2=charlie}
{CHECK_STRIKES 2 5 ({SUCCEED}) ID1=alice ID2=dave COMPARE=numerical_not_equals}
{CHECK_STRIKES "5,5" () ID1=bob ID2=charlie}
{CHECK_STRIKES "5,5" ({SUCCEED}) ID1=alice ID2=dave COMPARE=numerical_not_equals}
) SIDE_LEADER="Elvish Archer"}

View file

@ -29,6 +29,6 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 () COMPARE=numerical_not_equals}
{CHECK_STRIKES 2 5 ({SUCCEED}) ID1=bob ID2=alice}
{CHECK_STRIKES "5,5" () COMPARE=numerical_not_equals}
{CHECK_STRIKES "5,5" ({SUCCEED}) ID1=bob ID2=alice}
) SIDE2_LEADER="Elvish Archer"}

View file

@ -37,7 +37,7 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 () ID1=alice ID2=charlie}
{CHECK_STRIKES 2 5 () ID1=bob ID2=dave}
{CHECK_STRIKES 2 5 ({SUCCEED}) ID1=dave ID2=alice}
{CHECK_STRIKES "5,5" () ID1=alice ID2=charlie}
{CHECK_STRIKES "5,5" () ID1=bob ID2=dave}
{CHECK_STRIKES "5,5" ({SUCCEED}) ID1=dave ID2=alice}
) SIDE_LEADER="Elvish Archer"}

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 ({SUCCEED}) COMPARE=numerical_not_equals}
{CHECK_STRIKES "5,5" ({SUCCEED}) COMPARE=numerical_not_equals}
)}

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 3 ({SUCCEED})}
{CHECK_STRIKES "3,3" ({SUCCEED})}
)}

View file

@ -27,6 +27,6 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 3 ({SUCCEED})}
{CHECK_STRIKES "3,3" ({SUCCEED})}
)}
#endif

View file

@ -27,6 +27,6 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 3 ({SUCCEED})}
{CHECK_STRIKES "3,3" ({SUCCEED})}
)}
#endif

View file

@ -28,6 +28,6 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 3 ({SUCCEED})}
{CHECK_STRIKES "3,3" ({SUCCEED})}
)}
#endif

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 8 ({SUCCEED})}
{CHECK_STRIKES "8,8" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,6 +27,6 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 4 ({SUCCEED})}
{CHECK_STRIKES "4,4" ({SUCCEED})}
)}
#endif

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 -10 ({SUCCEED}) COMPARE=numerical_not_equals}
{CHECK_STRIKES "-10,-10" ({SUCCEED}) COMPARE=numerical_not_equals}
)}

View file

@ -34,5 +34,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 ({SUCCEED}) COMPARE=numerical_not_equals}
{CHECK_STRIKES "5,5" ({SUCCEED}) COMPARE=numerical_not_equals}
)}

View file

@ -29,5 +29,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 ({SUCCEED})}
{CHECK_STRIKES "5,5" ({SUCCEED})}
)}

View file

@ -29,5 +29,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 7 ({SUCCEED})}
{CHECK_STRIKES "7,7" ({SUCCEED})}
)}

View file

@ -29,5 +29,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 5 ({SUCCEED})}
{CHECK_STRIKES "5,5" ({SUCCEED})}
)}

View file

@ -29,5 +29,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 7 ({SUCCEED})}
{CHECK_STRIKES "7,7" ({SUCCEED})}
)}

View file

@ -29,5 +29,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 7 ({SUCCEED})}
{CHECK_STRIKES "7,7" ({SUCCEED})}
)}

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 1 ({SUCCEED})}
{CHECK_STRIKES "1,1" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 1 ({SUCCEED})}
{CHECK_STRIKES "1,1" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 4 ({SUCCEED})}
{CHECK_STRIKES "4,4" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -27,5 +27,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 6 ({SUCCEED})}
{CHECK_STRIKES "6,6" ({SUCCEED})}
)}

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 7 ({SUCCEED})}
{CHECK_STRIKES "7,7" ({SUCCEED})}
)}

View file

@ -26,5 +26,5 @@
[/modify_unit]
[/event]
{CHECK_STRIKES 2 7 ({SUCCEED})}
{CHECK_STRIKES "7,7" ({SUCCEED})}
)}

View file

@ -8,7 +8,7 @@
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons both of which don't have 0 strikes
# The side 1 leader has 2 weapons both of which have 0 strikes
# No errors are logged
#####
{COMMON_KEEP_A_B_UNIT_TEST "attacks_zero" (
@ -21,11 +21,11 @@
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY attacks 0 ()}
{TEST_ABILITY attacks 0 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES 2 0 ({SUCCEED}) COMPARE=numerical_not_equals}
{CHECK_STRIKES "0,0" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value and add attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the add attribute is ignored
# The side 1 leader's first weapon strikes 10 times (2*5)
# The side 1 leader's second weapon strikes 20 times (4*5)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_add" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (add=1) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,35 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value, add, and divide attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the add and divide attributes are ignored
# The side 1 leader's first weapon strikes 10 times (2*5)
# The side 1 leader's second weapon strikes 20 times (4*5)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_add_divide" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (add=1
divide=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,35 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value, add, and multiply attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the add and multiply attributes are ignored
# The side 1 leader's first weapon strikes 10 times (2*5)
# The side 1 leader's second weapon strikes 20 times (4*5)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_add_multiply" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (add=1
multiply=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,35 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value, add, and sub attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the add and sub attributes are ignored
# The side 1 leader's first weapon strikes 10 times (2*5)
# The side 1 leader's second weapon strikes 20 times (4*5)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_add_sub" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (add=1
sub=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,42 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]affect_allies=
##
# Actions:
# Give the side 1 leader a berserk ability that only affects adjacent allies
# Have the side 2 leader attack the side 3 leader with both its weapons
# Have the side 1 leader attack the side 4 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 2 times
# The side 1 leader's second weapon strikes 4 times
# The side 2 leader's first weapon strikes 10 times (2*5)
# The side 2 leader's second weapon strikes 20 times (4*5)
#####
{COMMON_KEEP_A_B_C_D_UNIT_TEST "berserk_affect_allies" (
[event]
name = start
[modify_side]
side=1,2
team_name=allies
[/modify_side]
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 ([affect_adjacent][/affect_adjacent]) ALLIES=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" () ID1=bob ID2=charlie}
{CHECK_STRIKES "2,4" ({SUCCEED}) ID1=alice ID2=dave}
) SIDE_LEADER="Elvish Archer"}

View file

@ -0,0 +1,37 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]affect_enemies=
##
# Actions:
# Give the side 1 leader a berserk ability that only affects adjacent enemies
# Have the side 2 leader attack the side 1 leader with both its weapons
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 10 times (2*5)
# The side 1 leader's second weapon strikes 20 times (4*5)
# The side 2 leader's first weapon strikes 10 times (2*5)
# The side 2 leader's second weapon strikes 20 times (4*5)
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_affect_enemies" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 ([affect_adjacent][/affect_adjacent]) ENEMIES=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ()}
{CHECK_STRIKES "10,20" ({SUCCEED}) ID1=bob ID2=alice}
) SIDE2_LEADER="Elvish Archer"}

View file

@ -0,0 +1,47 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]affect_allies=
##
# Actions:
# Give the side 1 leader a berserk ability with affect_allies, affect_enemies, and affect_self
# Make side 1 and side 2 allies
# Have the side 1 leader attack the side 3 leader with both its weapons
# Have the side 2 leader attack the side 4 leader with both its weapons
# Have the side 4 leader attack the side 1 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 10 times (2*5)
# The side 1 leader's second weapon strikes 20 times (4*5)
# The side 2 leader's first weapon strikes 10 times (2*5)
# The side 2 leader's second weapon strikes 20 times (4*5)
# The side 4 leader's first weapon strikes 10 times (2*5)
# The side 4 leader's second weapon strikes 20 times (4*5)
#####
{COMMON_KEEP_A_B_C_D_UNIT_TEST "berserk_affect_everybody" (
[event]
name = start
[modify_side]
side=1,2
team_name=allies
[/modify_side]
{SET_HP VALUE=100}
[modify_unit]
[filter]
side = 1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 ([affect_adjacent][/affect_adjacent]) ENEMIES=yes SELF=yes ALLIES=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" () ID1=alice ID2=charlie}
{CHECK_STRIKES "10,20" () ID1=bob ID2=dave}
{CHECK_STRIKES "10,20" ({SUCCEED}) ID1=dave ID2=alice}
) SIDE_LEADER="Elvish Archer"}

View file

@ -0,0 +1,30 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]affect_self=
##
# Actions:
# Give the leaders a berserk ability that doesn't affect themselves.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons and uses them to strike 2 and 4 times respectively
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_affect_self_no" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 ()}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "2,4" ({SUCCEED})}
)}

View file

@ -0,0 +1,45 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the side 1 leader a berserk ability with a value of 5
# Give the side 2 leader a berserk ability with a value of 7
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# 7 rounds of combat happens with the first weapon since the opponent has a berserk with a higher value
# 5 rounds of combat happens with the second weapon since the opponent has no ranged attack
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_different_values" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[modify_unit]
[filter]
side=2
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 7 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "14,20" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value and divide attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the divide attribute is ignored
# The side 1 leader's first weapon strikes 12 times (2*6)
# The side 1 leader's second weapon strikes 24 times (4*6)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_divide" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 (divide=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "12,24" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with a value of 3.8.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 6 times (2*3)
# The side 1 leader's second weapon strikes 12 times (4*3)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_high_fraction" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 3.8 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "6,12" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with a value of 3.2.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 6 times (2*3)
# The side 1 leader's second weapon strikes 12 times (4*3)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_low_fraction" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 3.2 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "6,12" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value and max_value attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# max_value does nothing.
# The side 1 leader's first weapon strikes 6 times (2*3)
# The side 1 leader's second weapon strikes 12 times (4*3)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_max_value" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 3 (max_value=1) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "6,12" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value and multiply attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the multiply attribute is ignored
# The side 1 leader's first weapon strikes 8 times (2*4)
# The side 1 leader's second weapon strikes 18 times (4*4)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_multiply" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 4 (multiply=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "8,16" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,35 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value, multiply, and divide attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the multiply and divide attributes are ignored
# The side 1 leader's first weapon strikes 8 times (2*4)
# The side 1 leader's second weapon strikes 18 times (4*4)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_multiply_divide" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 4 (multiply=3
divide=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "8,16" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with a value of -10.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The number of strikes is unlimited
# The side 2 leader dies despite have 1000 hp and each round of combat only having 2 strikes (aka 500 rounds of combat)
# The first weapon used by the side 1 leader hits 1000 times
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_negative_value" (
[event]
name = start
{SET_HP VALUE=1000}
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk -10 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "1000" ({SUCCEED}) ID1=bob ID2=alice}
)}

View file

@ -0,0 +1,38 @@
#textdomain wesnoth-test
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability missing the value attribute.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The number of strikes is not changed.
# No errors are logged.
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_no_value" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
[berserk]
id = "test-berserk"
name = _"test-berserk"
affect_self = yes
affect_allies = no
affect_enemies = no
cumulative = no
[/berserk]
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "2,4" ({SUCCEED})}
)}

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]overwrite_specials=
##
# Actions:
# Give the side 1 leader a berserk ability with the overwrite_specials=both_sides attribute
# Give the side 1 leader a berserk ability without the overwrite_specials attribute
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons which strike 10 (2*5) and 20 (4*5) times, since the 5 value ability takes priority due to overwrite_specials
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_overwrite_specials_both_sides" (
[event]
name = start
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (overwrite_specials=both_sides) SELF=yes}
{TEST_ABILITY berserk 7 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]overwrite_specials=
##
# Actions:
# Give the side 1 leader a berserk ability with the overwrite_specials=one_side attribute
# Give the side 1 leader another berserk ability with the overwrite_specials=both_sides attribute
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons which strike 14 (2*7) and 28 (4*7) times, since the the higher value ability is used
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_overwrite_specials_mixed" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (overwrite_specials=one_side) SELF=yes}
{TEST_ABILITY berserk 7 (overwrite_specials=both_sides) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "14,28" ({SUCCEED})}
)}

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]overwrite_specials=
##
# Actions:
# Give the side 1 leader a berserk ability with the overwrite_specials=one_side attribute
# Give the side 1 leader a berserk ability without the overwrite_specials attribute
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons which strike 10 (2*5) and 20 (4*5) times, since the 5 value ability takes priority due to overwrite_specials
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_overwrite_specials_one_side" (
[event]
name = start
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (overwrite_specials=one_side) SELF=yes}
{TEST_ABILITY berserk 7 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "10,20" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]overwrite_specials=
##
# Actions:
# Give the side 1 leader a berserk ability with the overwrite_specials=both_sides attribute
# Give the side 1 leader another berserk ability with the overwrite_specials=both_sides attribute
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons which strike 14 (2*7) and 28 (4*7) times, since the the higher value ability is used
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_overwrite_specials_two_both_sides" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 7 (overwrite_specials=both_sides) SELF=yes}
{TEST_ABILITY berserk 5 (overwrite_specials=both_sides) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "14,28" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]overwrite_specials=
##
# Actions:
# Give the side 1 leader a berserk ability with the overwrite_specials=one_side attribute
# Give the side 1 leader another berserk ability with the overwrite_specials=one_side attribute
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader has 2 weapons which strike 14 (2*7) and 28 (4*7) times, since the the higher value ability is used
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_overwrite_specials_two_one_side" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 5 (overwrite_specials=one_side) SELF=yes}
{TEST_ABILITY berserk 7 (overwrite_specials=one_side) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "14,28" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value and sub attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the sub attribute is ignored
# The side 1 leader's first weapon strikes 6 times (2*3)
# The side 1 leader's second weapon strikes 12 times (4*3)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_sub" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 3 (sub=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "6,12" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,35 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value, sub, and divide attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the sub and divide attributes are ignored
# The side 1 leader's first weapon strikes 6 times (2*3)
# The side 1 leader's second weapon strikes 12 times (4*3)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_sub_divide" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 3 (sub=1
divide=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "6,12" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,35 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with both the value, sub, and multiply attributes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# the sub and multiply attributes are ignored
# The side 1 leader's first weapon strikes 6 times (2*3)
# The side 1 leader's second weapon strikes 12 times (4*3)
#####
#ifndef SCHEMA_VALIDATION
{COMMON_KEEP_A_B_UNIT_TEST "berserk_sub_multiply" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 3 (sub=1
multiply=2) SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "6,12" ({SUCCEED})}
)}
#endif

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]cumulative=
##
# Actions:
# Give the leaders a berserk ability with non-unique IDs, one with cumulative=yes, and one with cumulative=no
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 20 times (2*(4+6))
# The side 1 leader's second weapon strikes 40 times (4*(4+6))
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_two_cumulative_mixed_same_id" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 () ID=1 CUMULATIVE=yes SELF=yes}
{TEST_ABILITY berserk 4 () ID=1 CUMULATIVE=no SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "20,40" ({SUCCEED})}
)}

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]cumulative=
##
# Actions:
# Give the leaders a berserk ability with unique IDs, one with cumulative=yes, and one with cumulative=no
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 20 times (2*(4+6))
# The side 1 leader's second weapon strikes 40 times (4*(4+6))
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_two_cumulative_mixed_unique_id" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 () ID=1 CUMULATIVE=yes SELF=yes}
{TEST_ABILITY berserk 4 () ID=2 CUMULATIVE=no SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "20,40" ({SUCCEED})}
)}

View file

@ -0,0 +1,32 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]cumulative=
##
# Actions:
# Give the leaders a berserk ability with non-unique IDs and cumulative=no
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 12 times (2*6)
# The side 1 leader's second weapon strikes 24 times (4*6)
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_two_cumulative_no_same_id" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 () ID=1 CUMULATIVE=no SELF=yes}
{TEST_ABILITY berserk 4 () ID=1 CUMULATIVE=no SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "12,24" ({SUCCEED})}
)}

View file

@ -0,0 +1,32 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]cumulative=
##
# Actions:
# Give the leaders a berserk ability with unique IDs and cumulative=no
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 12 times (2*6)
# The side 1 leader's second weapon strikes 24 times (4*6)
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_two_cumulative_no_unique_id" (
[event]
name = start
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 () ID=1 CUMULATIVE=no SELF=yes}
{TEST_ABILITY berserk 4 () ID=2 CUMULATIVE=no SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "12,24" ({SUCCEED})}
)}

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]cumulative=
##
# Actions:
# Give the leaders a berserk ability with non-unique IDs and cumulative=yes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 20 times (2*(4+6))
# The side 1 leader's second weapon strikes 40 times (4*(4+6))
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_two_cumulative_yes_same_id" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 () ID=1 CUMULATIVE=yes SELF=yes}
{TEST_ABILITY berserk 4 () ID=1 CUMULATIVE=yes SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "20,40" ({SUCCEED})}
)}

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]cumulative=
##
# Actions:
# Give the leaders a berserk ability with unique IDs and cumulative=yes
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The side 1 leader's first weapon strikes 20 times (2*(4+6))
# The side 1 leader's second weapon strikes 40 times (4*(4+6))
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_two_cumulative_yes_unique_id" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 6 () ID=1 CUMULATIVE=yes SELF=yes}
{TEST_ABILITY berserk 4 () ID=2 CUMULATIVE=yes SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "20,40" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability that gives a quarter of the max hp of the other unit as strikes.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# berserk has a value of 7 (29/4)
# The side 1 leader's first weapon strikes 10 times (2*7)
# The side 1 leader's second weapon strikes 20 times (4*7)
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_wfl_other" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk "(other.max_hitpoints/4)" () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "14,28" ({SUCCEED})}
)}

View file

@ -0,0 +1,34 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability that berserk half its own max hp.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# berserk has a value of 7 (29/4)
# The side 1 leader's first weapon strikes 10 times (2*7)
# The side 1 leader's second weapon strikes 20 times (4*7)
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_wfl_self" (
[event]
name = start
{SET_HP VALUE=100}
[modify_unit]
[filter]
side=1
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk "(max_hitpoints/4)" () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "14,28" ({SUCCEED})}
)}

View file

@ -0,0 +1,33 @@
# wmllint: no translatables
#####
# API(s) being tested: [berserk]value=
##
# Actions:
# Give the leaders a berserk ability with a value of 0.
# Have the side 1 leader attack the side 2 leader with both its weapons
##
# Expected end state:
# The number of strikes is unlimited
# The side 2 leader dies despite have 1000 hp and each round of combat only having 2 strikes (aka 500 rounds of combat)
# The first weapon used by the side 1 leader hits 1000 times
#####
{COMMON_KEEP_A_B_UNIT_TEST "berserk_zero" (
[event]
name = start
{SET_HP VALUE=1000}
[modify_unit]
[filter]
[/filter]
[effect]
apply_to = new_ability
[abilities]
{TEST_ABILITY berserk 0 () SELF=yes}
[/abilities]
[/effect]
[/modify_unit]
[/event]
{CHECK_STRIKES "1000" ({SUCCEED}) ID1=bob ID2=alice}
)}

View file

@ -1,2 +1,2 @@
find data -name '*.cfg' -print
find data -name '*.lua' -print
find data -name '*.cfg' -not -path "data/test/*" -print
find data -name '*.lua' -not -path "data/test/*" -print

View file

@ -1,2 +1,2 @@
find data -name '*.cfg' -print
find data -name '*.lua' -print
find data -name '*.cfg' -not -path "data/test/*" -print
find data -name '*.lua' -not -path "data/test/*" -print

View file

@ -1,2 +1,2 @@
find data -name '*.cfg' -print
find data -name '*.lua' -print
find data -name '*.cfg' -not -path "data/test/*" -print
find data -name '*.lua' -not -path "data/test/*" -print

View file

@ -1,2 +1,2 @@
find data -name '*.cfg' -print
find data -name '*.lua' -print
find data -name '*.cfg' -not -path "data/test/*" -print
find data -name '*.lua' -not -path "data/test/*" -print

View file

@ -1,2 +1,2 @@
find data -name '*.cfg' -print
find data -name '*.lua' -print
find data -name '*.cfg' -not -path "data/test/*" -print
find data -name '*.lua' -not -path "data/test/*" -print

View file

@ -34,6 +34,8 @@
2 empty_test
0 test_end_turn
9 there_is_no_test_with_this_name
0 check_strikes_once
10 check_strikes_twice_fail
#
# The synchronisation mechanism
#
@ -747,6 +749,40 @@
0 attacks_overwrite_specials_two_both_sides
0 attacks_overwrite_specials_two_one_side
0 attacks_overwrite_specials_mixed
# berserk ability tests
0 berserk_negative_value
0 berserk_zero
0 berserk_add
0 berserk_add_divide
0 berserk_add_multiply
0 berserk_add_sub
0 berserk_affect_self_no
0 berserk_affect_enemies
0 berserk_affect_everybody
0 berserk_divide
0 berserk_high_fraction
0 berserk_low_fraction
0 berserk_multiply
0 berserk_multiply_divide
0 berserk_no_value
0 berserk_sub
0 berserk_sub_divide
0 berserk_sub_multiply
0 berserk_wfl_other
0 berserk_wfl_self
0 berserk_two_cumulative_yes_same_id
0 berserk_two_cumulative_yes_unique_id
0 berserk_two_cumulative_no_same_id
0 berserk_two_cumulative_no_unique_id
0 berserk_two_cumulative_mixed_same_id
0 berserk_two_cumulative_mixed_unique_id
0 berserk_max_value
0 berserk_overwrite_specials_one_side
0 berserk_overwrite_specials_both_sides
0 berserk_overwrite_specials_two_both_sides
0 berserk_overwrite_specials_two_one_side
0 berserk_overwrite_specials_mixed
0 berserk_different_values
# Warnings about WML
0 unknown_scenario_false_positives
0 unknown_scenario_interpolated