This commit is contained in:
nemaara 2020-04-07 21:29:18 -04:00
commit 859c50a028
21 changed files with 1013 additions and 45 deletions

View file

@ -16,7 +16,7 @@
{AMLA_DEFAULT}
cost=50
usage=mixed fighter
description= _ "From time to time, an orc will arise who has a natural charisma and command over his ilk. If he is also strong and cunning enough to survive early leadership struggles, he will inevitably find himself leading a great horde of warriors, and he will also inevitably cause a great deal of trouble for the civilized races of the world. The surest way to disperse such a host is to slay this rare orc who can hold it together."
description= _ "Although orcs tend to be fairly tribal in nature, from time to time, a situation arises that impels several clans to join forces under a single powerful sovereign. By virtue of the station, such an orc must possess both the strength and cunning to lead a great horde of warriors, almost invariably possessing an inherent charisma that is an exceptional rarity among their kind. The path to such a status is a varied one; sometimes, a powerful tribe may conquer lesser ones and absorb the defeated warriors into their ranks, while other circumstances demand appointing by a council of shamans, where the Sovereign becomes a temporary, but formal title. In either case, the warchief is the critical linchpin of the horde, which rapidly dissolves back into individual clans once the strength of its leadership is extinguished."
{NOTE_LEADERSHIP}
die_sound={SOUND_LIST:ORC_DIE}
{DEFENSE_ANIM_RANGE "units/orcs/sovereign-defend-2.png" "units/orcs/sovereign-defend-1.png" {SOUND_LIST:ORC_HIT} melee}

View file

@ -100,5 +100,6 @@ function wesnoth.wml_actions.endlevel(cfg)
reveal_map = cfg.reveal_map,
proceed_to_next_level = proceed_to_next_level,
result = victory and "victory" or "defeat",
test_result = cfg.test_result,
}
end

View file

@ -157,6 +157,7 @@
{DEFAULT_KEY end_credits s_bool yes}
{SIMPLE_KEY end_text t_string}
{SIMPLE_KEY end_text_duration s_unsigned}
{SIMPLE_KEY test_result string}
[tag]
name="result"
max=infinite

View file

@ -11,7 +11,7 @@
[then]
{VARIABLE ended yes}
[endlevel]
result=victory
test_result=pass
linger_mode = yes
[/endlevel]
[/then]
@ -22,7 +22,7 @@
[/test_condition]
{VARIABLE ended yes}
[endlevel]
result=defeat
test_result=fail
linger_mode = yes
[/endlevel]
[/else]
@ -47,7 +47,7 @@
[/test_condition]
{VARIABLE ended yes}
[endlevel]
result=defeat
test_result=fail
linger_mode = yes
[/endlevel]
[/else]
@ -57,10 +57,23 @@
#enddef
#define GENERIC_UNIT_TEST NAME CONTENT
#arg SIDE1_CONTROLLER
human#endarg
#arg SIDE2_CONTROLLER
human#endarg
#arg TURNS
-1#endarg
#arg SIDE1_RECRUIT
#endarg
#arg SIDE1_GOLD
100#endarg
#arg SIDE1_LEADER
Elvish Archer#endarg
[test]
name = "Unit Test " + {NAME}
map_file=test/maps/generic_unit_test.map
turns = -1
turns = {TURNS}
id = {NAME}
is_unit_test = yes
@ -68,17 +81,23 @@
[side]
side=1
controller=human
name = "Alice"
type = Elvish Archer
id=alice
controller={SIDE1_CONTROLLER}
recruit={SIDE1_RECRUIT}
gold={SIDE1_GOLD}
[leader]
name = "Alice"
type = {SIDE1_LEADER}
id=alice
[/leader]
[/side]
[side]
side=2
controller=human
name = "Bob"
type = Orcish Grunt
id=bob
controller={SIDE2_CONTROLLER}
[leader]
name = "Bob"
type = Orcish Grunt
id=bob
[/leader]
[/side]
{CONTENT}
@ -92,3 +111,15 @@
#define SUCCEED
{RETURN ([true][/true])}
#enddef
#define FAIL_IF_NOT FLAG NOT_EQUALS
[if]
[variable]
name={FLAG}
not_equals={NOT_EQUALS}
[/variable]
[then]
{FAIL}
[/then]
[/if]
#enddef

View file

@ -0,0 +1,39 @@
# time over
# local_defeat
# defeat
# scenario_end
{GENERIC_UNIT_TEST "events-test_defeat" (
[event]
name=time over
{VARIABLE time_over_flag 1}
{FAIL_IF_NOT time_over_flag 1}
{FAIL_IF_NOT local_defeat_flag $null}
{FAIL_IF_NOT defeat_flag $null}
{FAIL_IF_NOT scenario_end_flag $null}
[/event]
[event]
name=local_defeat
{VARIABLE local_defeat_flag 1}
{FAIL_IF_NOT time_over_flag 1}
{FAIL_IF_NOT local_defeat_flag 1}
{FAIL_IF_NOT defeat_flag $null}
{FAIL_IF_NOT scenario_end_flag $null}
[/event]
[event]
name=defeat
{VARIABLE defeat_flag 1}
{FAIL_IF_NOT time_over_flag 1}
{FAIL_IF_NOT local_defeat_flag 1}
{FAIL_IF_NOT defeat_flag 1}
{FAIL_IF_NOT scenario_end_flag $null}
[/event]
[event]
name=scenario_end
{VARIABLE scenario_end_flag 1}
{FAIL_IF_NOT time_over_flag 1}
{FAIL_IF_NOT local_defeat_flag 1}
{FAIL_IF_NOT defeat_flag 1}
{FAIL_IF_NOT scenario_end_flag 1}
{SUCCEED}
[/event]
) TURNS=1 SIDE1_CONTROLLER=ai SIDE2_CONTROLLER=ai}

View file

@ -0,0 +1,24 @@
# last breath
# die
{GENERIC_UNIT_TEST "events-test_die" (
[event]
name=start
[kill]
side=2
fire_event=yes
[/kill]
[/event]
[event]
name=last breath
{VARIABLE last_breath_flag 1}
{FAIL_IF_NOT last_breath_flag 1}
{FAIL_IF_NOT die_flag $null}
[/event]
[event]
name=die
{VARIABLE die_flag 1}
{FAIL_IF_NOT last_breath_flag 1}
{FAIL_IF_NOT die_flag 1}
{SUCCEED}
[/event]
)}

View file

@ -0,0 +1,198 @@
# unit placed
# prerecruit
# recruit
# exit_hex
# enter_hex
# moveto
# attack
# attacker hits
# defender misses
# attack end
# attacker misses
# defender hits
# pre advance
# advance
# post advance
{GENERIC_UNIT_TEST "events-test_filterable1" (
[event]
name=start
# ensure attacker/defender hits/misses events are triggered
[modify_unit]
[filter]
name="Alice"
[/filter]
[effect]
apply_to=defense
replace=yes
[defense]
flat=0
[/defense]
[/effect]
[/modify_unit]
[modify_unit]
[filter]
name="Bob"
[/filter]
[effect]
apply_to=max_experience
set=2
[/effect]
[effect]
apply_to=defense
replace=yes
[defense]
castle=100
frozen=100
flat=100
[/defense]
[/effect]
[/modify_unit]
[/event]
[event]
name=unit placed
{VARIABLE unit_placed_flag 1}
{FAIL_IF_NOT unit_placed_flag 1}
{FAIL_IF_NOT prerecruit_flag $null}
{FAIL_IF_NOT recruit_flag $null}
[/event]
[event]
name=prerecruit
{VARIABLE prerecruit_flag 1}
{FAIL_IF_NOT unit_placed_flag 1}
{FAIL_IF_NOT prerecruit_flag 1}
{FAIL_IF_NOT recruit_flag $null}
[/event]
[event]
name=recruit
{VARIABLE recruit_flag 1}
{FAIL_IF_NOT unit_placed_flag 1}
{FAIL_IF_NOT prerecruit_flag 1}
{FAIL_IF_NOT recruit_flag 1}
# ensure it's side 2's unit that dies
[modify_unit]
[filter]
x,y=$x1,$y1
[/filter]
[effect]
apply_to=defense
replace=yes
[defense]
flat=0
[/defense]
[/effect]
[/modify_unit]
[do_command]
[move]
x=7,8,9,10,11,12
y=3,3,3,3,3,3
[/move]
[/do_command]
[do_command]
[attack]
weapon=0
defender_weapon=0
[source]
x,y=12,3
[/source]
[destination]
x,y=13,3
[/destination]
[/attack]
[/do_command]
[do_command]
[attack]
weapon=0
defender_weapon=0
[source]
x,y=13,3
[/source]
[destination]
x,y=12,3
[/destination]
[/attack]
[/do_command]
[/event]
[event]
name=exit_hex
{VARIABLE exit_hex_flag 1}
{FAIL_IF_NOT exit_hex_flag 1}
{FAIL_IF_NOT enter_hex_flag $null}
{FAIL_IF_NOT moveto_flag $null}
[/event]
[event]
name=enter_hex
{VARIABLE enter_hex_flag 1}
{FAIL_IF_NOT exit_hex_flag 1}
{FAIL_IF_NOT enter_hex_flag 1}
{FAIL_IF_NOT moveto_flag $null}
[/event]
[event]
name=moveto
{VARIABLE moveto_flag 1}
{FAIL_IF_NOT exit_hex_flag 1}
{FAIL_IF_NOT enter_hex_flag 1}
{FAIL_IF_NOT moveto_flag 1}
[/event]
[event]
name=attack
{VARIABLE attack_flag 1}
{FAIL_IF_NOT attack_flag 1}
{FAIL_IF_NOT attack_end_flag $null}
[/event]
[event]
name=attacker hits
{VARIABLE attacker_hits_flag 1}
[/event]
[event]
name=defender misses
{VARIABLE defender_misses_flag 1}
[/event]
[event]
name=attack end
{VARIABLE attack_end_flag 1}
{FAIL_IF_NOT attack_flag 1}
{FAIL_IF_NOT attack_end_flag 1}
[/event]
[event]
name=attacker misses
{VARIABLE attacker_misses_flag 1}
[/event]
[event]
name=defender hits
{VARIABLE defender_hits_flag 1}
[/event]
[event]
name=pre advance
{VARIABLE pre_advance_flag 1}
{FAIL_IF_NOT pre_advance_flag 1}
{FAIL_IF_NOT advance_flag $null}
{FAIL_IF_NOT post_advance_flag $null}
[/event]
[event]
name=advance
{VARIABLE advance_flag 1}
{FAIL_IF_NOT pre_advance_flag 1}
{FAIL_IF_NOT advance_flag 1}
{FAIL_IF_NOT post_advance_flag $null}
[/event]
[event]
name=post advance
{VARIABLE post_advance_flag 1}
{FAIL_IF_NOT unit_placed_flag 1}
{FAIL_IF_NOT prerecruit_flag 1}
{FAIL_IF_NOT recruit_flag 1}
{FAIL_IF_NOT exit_hex_flag 1}
{FAIL_IF_NOT enter_hex_flag 1}
{FAIL_IF_NOT moveto_flag 1}
{FAIL_IF_NOT attack_flag 1}
{FAIL_IF_NOT attacker_hits_flag 1}
{FAIL_IF_NOT defender_misses_flag 1}
{FAIL_IF_NOT attack_end_flag 1}
{FAIL_IF_NOT attacker_misses_flag 1}
{FAIL_IF_NOT defender_hits_flag 1}
{FAIL_IF_NOT pre_advance_flag 1}
{FAIL_IF_NOT advance_flag 1}
{FAIL_IF_NOT post_advance_flag 1}
{SUCCEED}
[/event]
) SIDE1_CONTROLLER=ai SIDE1_LEADER="Orcish Grunt" SIDE1_GOLD=20 SIDE1_RECRUIT=Wose}

View file

@ -0,0 +1,47 @@
# petrified
{GENERIC_UNIT_TEST "events-test_filterable2" (
[event]
name=start
# ensure the petrifying attack hits
[modify_unit]
[filter]
name="Alice"
[/filter]
[effect]
apply_to=defense
replace=yes
[defense]
flat=0
[/defense]
[/effect]
[effect]
apply_to=attack
[set_specials]
{WEAPON_SPECIAL_PETRIFY}
[/set_specials]
[/effect]
[/modify_unit]
[modify_unit]
[filter]
name="Bob"
[/filter]
[effect]
apply_to=max_experience
set=2
[/effect]
[effect]
apply_to=defense
replace=yes
[defense]
castle=100
frozen=100
flat=100
[/defense]
[/effect]
[/modify_unit]
[/event]
[event]
name=petrified
{SUCCEED}
[/event]
) SIDE1_CONTROLLER=ai SIDE1_LEADER="Orcish Grunt"}

View file

@ -0,0 +1,32 @@
# petrified
{GENERIC_UNIT_TEST "events-test_filterable3" (
[event]
name=start
[terrain]
x,y=5,5
terrain=Gd^Vo
[/terrain]
[/event]
[event]
name=prestart
[modify_side]
side=1
[ai]
aggression=0
caution=1
[goal]
name=target_location
[criteria]
x,y=5,5
[/criteria]
value=5000
[/goal]
[/ai]
[/modify_side]
[/event]
[event]
name=capture
{FAIL_IF_NOT owner_side 0}
{SUCCEED}
[/event]
) SIDE1_CONTROLLER=ai SIDE1_LEADER="Orcish Grunt"}

View file

@ -0,0 +1,505 @@
# preload
# prestart
# start
# turn 1
# new turn
# side turn
# ai turn
# side 1 turn
# side turn 1
# side 1 turn 1
# turn refresh
# side 1 turn refresh
# turn 1 refresh
# side 1 turn 1 refresh
# side turn end
# side 1 turn end
# side turn 1 end
# side 1 turn 1 end
# turn end
# turn 1 end
# time over
{GENERIC_UNIT_TEST "events-test_nonfilterable" (
[event]
name=preload
first_time_only=no
{VARIABLE preload_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag $null}
{FAIL_IF_NOT start_flag $null}
{FAIL_IF_NOT turn1_flag $null}
{FAIL_IF_NOT new_turn_flag $null}
{FAIL_IF_NOT side_turn_flag $null}
{FAIL_IF_NOT side1_turn_flag $null}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=prestart
{VARIABLE prestart_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag $null}
{FAIL_IF_NOT turn1_flag $null}
{FAIL_IF_NOT new_turn_flag $null}
{FAIL_IF_NOT side_turn_flag $null}
{FAIL_IF_NOT side1_turn_flag $null}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=start
{VARIABLE start_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag $null}
{FAIL_IF_NOT new_turn_flag $null}
{FAIL_IF_NOT side_turn_flag $null}
{FAIL_IF_NOT side1_turn_flag $null}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=turn 1
{VARIABLE turn1_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag $null}
{FAIL_IF_NOT side_turn_flag $null}
{FAIL_IF_NOT side1_turn_flag $null}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=new turn
{VARIABLE new_turn_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag $null}
{FAIL_IF_NOT side1_turn_flag $null}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side turn
{VARIABLE side_turn_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag $null}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side 1 turn
{VARIABLE side1_turn_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag $null}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side turn 1
{VARIABLE side_turn1_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag $null}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side 1 turn 1
{VARIABLE side1_turn1_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag $null}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=turn refresh
{VARIABLE turn_refresh_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag $null}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side 1 turn refresh
{VARIABLE side1_turn_refresh_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag $null}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=turn 1 refresh
{VARIABLE turn1_refresh_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag $null}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side 1 turn 1 refresh
{VARIABLE side1_turn1_refresh_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag $null}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side turn end
{VARIABLE side_turn_end_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag $null}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side 1 turn end
{VARIABLE side1_turn_end_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag 1}
{FAIL_IF_NOT side_turn1_end_flag $null}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side turn 1 end
{VARIABLE side_turn1_end_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag 1}
{FAIL_IF_NOT side_turn1_end_flag 1}
{FAIL_IF_NOT side1_turn1_end_flag $null}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=side 1 turn 1 end
{VARIABLE side1_turn1_end_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag 1}
{FAIL_IF_NOT side_turn1_end_flag 1}
{FAIL_IF_NOT side1_turn1_end_flag 1}
{FAIL_IF_NOT turn_end_flag $null}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=turn end
{VARIABLE turn_end_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag 1}
{FAIL_IF_NOT side_turn1_end_flag 1}
{FAIL_IF_NOT side1_turn1_end_flag 1}
{FAIL_IF_NOT turn_end_flag 1}
{FAIL_IF_NOT turn1_end_flag $null}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=turn 1 end
{VARIABLE turn1_end_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag 1}
{FAIL_IF_NOT side_turn1_end_flag 1}
{FAIL_IF_NOT side1_turn1_end_flag 1}
{FAIL_IF_NOT turn_end_flag 1}
{FAIL_IF_NOT turn1_end_flag 1}
{FAIL_IF_NOT time_over_flag $null}
[/event]
[event]
name=time over
{VARIABLE time_over_flag 1}
{FAIL_IF_NOT preload_flag 1}
{FAIL_IF_NOT prestart_flag 1}
{FAIL_IF_NOT start_flag 1}
{FAIL_IF_NOT turn1_flag 1}
{FAIL_IF_NOT new_turn_flag 1}
{FAIL_IF_NOT side_turn_flag 1}
{FAIL_IF_NOT side1_turn_flag 1}
{FAIL_IF_NOT side_turn1_flag 1}
{FAIL_IF_NOT side1_turn1_flag 1}
{FAIL_IF_NOT turn_refresh_flag 1}
{FAIL_IF_NOT side1_turn_refresh_flag 1}
{FAIL_IF_NOT turn1_refresh_flag 1}
{FAIL_IF_NOT side1_turn1_refresh_flag 1}
{FAIL_IF_NOT side_turn_end_flag 1}
{FAIL_IF_NOT side1_turn_end_flag 1}
{FAIL_IF_NOT side_turn1_end_flag 1}
{FAIL_IF_NOT side1_turn1_end_flag 1}
{FAIL_IF_NOT turn_end_flag 1}
{FAIL_IF_NOT turn1_end_flag 1}
{FAIL_IF_NOT time_over_flag 1}
{SUCCEED}
[/event]
) TURNS=1 SIDE1_CONTROLLER=ai SIDE2_CONTROLLER=ai}

View file

@ -0,0 +1,45 @@
# enemies defeated
# local_victory
# victory
# scenario_end
{GENERIC_UNIT_TEST "events-test_victory" (
[event]
name=turn 1
[kill]
side=2
[/kill]
[/event]
[event]
name=enemies defeated
{VARIABLE enemies_defeated_flag 1}
{FAIL_IF_NOT enemies_defeated_flag 1}
{FAIL_IF_NOT local_victory_flag $null}
{FAIL_IF_NOT victory_flag $null}
{FAIL_IF_NOT scenario_end_flag $null}
[/event]
[event]
name=local_victory
{VARIABLE local_victory_flag 1}
{FAIL_IF_NOT enemies_defeated_flag 1}
{FAIL_IF_NOT local_victory_flag 1}
{FAIL_IF_NOT victory_flag $null}
{FAIL_IF_NOT scenario_end_flag $null}
[/event]
[event]
name=victory
{VARIABLE victory_flag 1}
{FAIL_IF_NOT enemies_defeated_flag 1}
{FAIL_IF_NOT local_victory_flag 1}
{FAIL_IF_NOT victory_flag 1}
{FAIL_IF_NOT scenario_end_flag $null}
[/event]
[event]
name=scenario_end
{VARIABLE scenario_end_flag 1}
{FAIL_IF_NOT enemies_defeated_flag 1}
{FAIL_IF_NOT local_victory_flag 1}
{FAIL_IF_NOT victory_flag 1}
{FAIL_IF_NOT scenario_end_flag 1}
{SUCCEED}
[/event]
)}

View file

@ -89,14 +89,14 @@
[event]
name=success
[endlevel]
result=victory
test_result=pass
linger_mode = yes
[/endlevel]
[/event]
[event]
name=fail
[endlevel]
result=defeat
test_result=fail
linger_mode = yes
[/endlevel]
[/event]

View file

@ -10,7 +10,7 @@
local function assert_equal(expect, status)
if status ~= expect then
-- Fail the test
wesnoth.wml_actions.endlevel({result = "defeat", linger_mode = true})
wesnoth.wml_actions.endlevel({test_result = "fail", linger_mode = true})
end
end
@ -77,7 +77,7 @@
end))
-- Pass the test. Doesn't do anything if any of the above assertions has failed.
wesnoth.wml_actions.endlevel({result = "victory", linger_mode = true})
wesnoth.wml_actions.endlevel({test_result = "pass", linger_mode = true})
>>
[/lua]
[/event]

View file

@ -19,6 +19,8 @@ class UnitTestResult(enum.Enum):
FAIL_PLAYING_REPLAY = 4
FAIL_BROKE_STRICT = 5
FAIL_WML_EXCEPTION = 6
FAIL_BY_DEFEAT = 7
PASS_BY_VICTORY = 8
class TestCase:
"""Represents a single line of the wml_test_schedule."""

View file

@ -28,6 +28,7 @@ end_level_data::end_level_data()
, replay_save(true)
, proceed_to_next_level(false)
, is_victory(true)
, test_result(LEVEL_RESULT::enum_to_string(LEVEL_RESULT::TEST_NOT_SET))
, transient()
{
}
@ -38,6 +39,7 @@ void end_level_data::write(config& cfg) const
cfg["replay_save"] = replay_save;
cfg["proceed_to_next_level"] = proceed_to_next_level;
cfg["is_victory"] = is_victory;
cfg["test_result"] = test_result;
}
void end_level_data::read(const config& cfg)
@ -46,6 +48,7 @@ void end_level_data::read(const config& cfg)
replay_save = cfg["replay_save"].to_bool(true);
proceed_to_next_level = cfg["proceed_to_next_level"].to_bool(true);
is_victory = cfg["is_victory"].to_bool(true);
test_result = cfg["test_result"].str();
}
config end_level_data::to_config() const

View file

@ -35,6 +35,10 @@ MAKE_ENUM(LEVEL_RESULT,
(DEFEAT, "defeat")
(QUIT, "quit")
(OBSERVER_END, "observer_end")
(TEST_NOT_SET, "result_not_set")
(TEST_PASS, "pass")
(TEST_FAIL, "fail")
(TEST_INVALID, "test_result_value_invalid")
)
/**
@ -98,6 +102,7 @@ struct end_level_data
bool replay_save; /**< Should a replay save be made? */
bool proceed_to_next_level; /**< whether to proceed to the next scenario, equals is_victory in sp. We need to save this in saves during linger mode. > */
bool is_victory;
std::string test_result; /**< result to use if this is a unit test */
transient_end_level transient;
void write(config& cfg) const;

View file

@ -25,7 +25,6 @@
#include "game_classification.hpp" // for game_classification, etc
#include "game_config.hpp" // for path, no_delay, revision, etc
#include "game_config_manager.hpp" // for game_config_manager
#include "game_end_exceptions.hpp" // for LEVEL_RESULT, etc
#include "generators/map_generator.hpp" // for mapgen_exception
#include "gettext.hpp" // for _
#include "gui/dialogs/end_credits.hpp"
@ -525,6 +524,12 @@ game_launcher::unit_test_result game_launcher::unit_test()
case unit_test_result::TEST_FAIL_WML_EXCEPTION:
describe_result = "FAIL TEST (WML EXCEPTION)";
break;
case unit_test_result::TEST_FAIL_BY_DEFEAT:
describe_result = "FAIL TEST (DEFEAT)";
break;
case unit_test_result::TEST_PASS_BY_VICTORY:
describe_result = "PASS TEST (VICTORY)";
break;
default:
describe_result = "FAIL TEST";
break;
@ -542,15 +547,16 @@ game_launcher::unit_test_result game_launcher::single_unit_test()
game_config_manager::get()->
load_game_config_for_game(state_.classification());
LEVEL_RESULT game_res = LEVEL_RESULT::TEST_FAIL;
try {
campaign_controller ccontroller(state_, game_config_manager::get()->terrain_types(), true);
LEVEL_RESULT res = ccontroller.play_game();
if (res != LEVEL_RESULT::VICTORY) {
game_res = ccontroller.play_game();
// TODO: How to handle the case where a unit test scenario ends without an explicit {SUCCEED} or {FAIL}?
// ex: check_victory_never_ai_fail results in victory by killing one side's leaders
if(game_res == LEVEL_RESULT::TEST_FAIL) {
return unit_test_result::TEST_FAIL;
}
if (lg::broke_strict()) {
// Test for LEVEL_RESULT::VICTORY before this, as the warning printed by
// a failing ASSERT will also set broke_strict()'s flag.
return unit_test_result::TEST_FAIL_BROKE_STRICT;
}
} catch(const wml_exception& e) {
@ -560,8 +566,9 @@ game_launcher::unit_test_result game_launcher::single_unit_test()
savegame::clean_saves(state_.classification().label);
if (cmdline_opts_.noreplaycheck)
return unit_test_result::TEST_PASS; //we passed, huzzah!
if (cmdline_opts_.noreplaycheck) {
return pass_victory_or_defeat(game_res);
}
savegame::replay_savegame save(state_, compression::NONE);
save.save_game_automatic(false, "unit_test_replay"); //false means don't check for overwrite
@ -575,8 +582,8 @@ game_launcher::unit_test_result game_launcher::single_unit_test()
try {
campaign_controller ccontroller(state_, game_config_manager::get()->terrain_types(), true);
LEVEL_RESULT res = ccontroller.play_replay();
if (!(res == LEVEL_RESULT::VICTORY) || lg::broke_strict()) {
ccontroller.play_replay();
if (lg::broke_strict()) {
std::cerr << "Observed failure on replay" << std::endl;
return unit_test_result::TEST_FAIL_PLAYING_REPLAY;
}
@ -585,7 +592,16 @@ game_launcher::unit_test_result game_launcher::single_unit_test()
return unit_test_result::TEST_FAIL_PLAYING_REPLAY;
}
return unit_test_result::TEST_PASS; //we passed, huzzah!
return pass_victory_or_defeat(game_res);
}
game_launcher::unit_test_result game_launcher::pass_victory_or_defeat(LEVEL_RESULT res) {
if(res == LEVEL_RESULT::DEFEAT) {
return unit_test_result::TEST_FAIL_BY_DEFEAT;
} else if(res == LEVEL_RESULT::VICTORY) {
return unit_test_result::TEST_PASS_BY_VICTORY;
}
return unit_test_result::TEST_PASS;
}
bool game_launcher::play_screenshot_mode()

View file

@ -22,6 +22,7 @@
#include "picture.hpp" // for manager
#include "saved_game.hpp" // for saved_game
#include "sound.hpp" // for music_thinker
#include "game_end_exceptions.hpp" // for LEVEL_RESULT, etc
#include <string> // for string
#include <vector> // for vector
@ -69,6 +70,8 @@ public:
TEST_FAIL_PLAYING_REPLAY = 4,
TEST_FAIL_BROKE_STRICT = 5,
TEST_FAIL_WML_EXCEPTION = 6,
TEST_FAIL_BY_DEFEAT = 7,
TEST_PASS_BY_VICTORY = 8,
};
bool init_video();
@ -119,6 +122,7 @@ private:
void mark_completed_campaigns(std::vector<config>& campaigns);
editor::EXIT_STATUS start_editor(const std::string& filename);
unit_test_result pass_victory_or_defeat(LEVEL_RESULT res);
/// Internal to the implementation of unit_test(). If a single instance of
/// Wesnoth is running multiple unit tests, this gets called once per test.

View file

@ -335,7 +335,12 @@ LEVEL_RESULT playsingle_controller::play_scenario(const config& level)
sound::play_music_once(end_music);
}
persist_.end_transaction();
return is_victory ? LEVEL_RESULT::VICTORY : LEVEL_RESULT::DEFEAT;
LEVEL_RESULT res = LEVEL_RESULT::string_to_enum(end_level.test_result);
if(res == LEVEL_RESULT::TEST_NOT_SET) {
return is_victory ? LEVEL_RESULT::VICTORY : LEVEL_RESULT::DEFEAT;
} else {
return res;
}
} catch(const savegame::load_game_exception &) {
// Loading a new game is effectively a quit.
saved_game_.clear();

View file

@ -1546,6 +1546,7 @@ static int impl_end_level_data_get(lua_State* L)
return_bool_attrib("is_victory", data.is_victory);
return_bool_attrib("is_loss", !data.is_victory);
return_cstring_attrib("result", data.is_victory ? "victory" : "loss"); // to match wesnoth.end_level()
return_string_attrib("test_result", data.test_result);
return_cfg_attrib("__cfg", data.to_config_full());
return 0;
@ -1574,6 +1575,7 @@ int game_lua_kernel::impl_end_level_data_set(lua_State* L)
modify_bool_attrib("carryover_report", data.transient.carryover_report = value);
modify_bool_attrib("prescenario_save", data.prescenario_save = value);
modify_bool_attrib("replay_save", data.replay_save = value);
modify_string_attrib("test_result", data.test_result = value);
return 0;
}
@ -1618,6 +1620,7 @@ int game_lua_kernel::intf_end_level(lua_State *L)
data.transient.linger_mode = cfg["linger_mode"].to_bool(true) && !teams().empty();
data.transient.reveal_map = cfg["reveal_map"].to_bool(true);
data.is_victory = cfg["result"] == "victory";
data.test_result = cfg["test_result"].str(LEVEL_RESULT::enum_to_string(LEVEL_RESULT::TEST_NOT_SET));
play_controller_.set_end_level_data(data);
return 0;
}

View file

@ -20,28 +20,28 @@
#
2 check_victory_basic_timeout
1 check_victory_basic_macro_check
0 check_victory_basic
8 check_victory_basic
1 check_victory_basic_fail
0 check_victory_basic_two
0 check_victory_basic_ai
8 check_victory_basic_two
8 check_victory_basic_ai
1 check_victory_basic_ai_fail
0 check_victory_basic_ai_two
8 check_victory_basic_ai_two
1 check_victory_one_no_units_fail_one
1 check_victory_one_no_units_fail_two
0 check_victory_one_no_units
8 check_victory_one_no_units
1 check_victory_two_no_units_fail_one
1 check_victory_two_no_units_fail_two
0 check_victory_two_no_units
0 check_victory_always_one
0 check_victory_always_two
8 check_victory_two_no_units
8 check_victory_always_one
8 check_victory_always_two
1 check_victory_always_no_units_fail
0 check_victory_always_no_units
8 check_victory_always_no_units
1 check_victory_always_fail
1 check_victory_never_fail_one
1 check_victory_never_fail_two
1 check_victory_never_fail_three
0 check_victory_never_pass
1 check_victory_never_ai_fail
8 check_victory_never_pass
7 check_victory_never_ai_fail
#
# WML API tests
#
@ -96,6 +96,13 @@
0 test_role_2
0 test_role_3
0 test_role_lua
0 events-test_nonfilterable
0 events-test_filterable1
0 events-test_filterable2
0 events-test_filterable3
0 events-test_victory
0 events-test_defeat
0 events-test_die
#
# LUA
#
@ -143,12 +150,12 @@
#
# Attack calculations & codepath tests
#
0 alice_kills_bob
0 bob_kills_alice_on_retal
0 alice_kills_bob_levelup
0 bob_kills_alice
0 alice_kills_bob_on_retal
0 alice_kills_bob_on_retal_levelup
8 alice_kills_bob
8 bob_kills_alice_on_retal
8 alice_kills_bob_levelup
8 bob_kills_alice
8 alice_kills_bob_on_retal
8 alice_kills_bob_on_retal_levelup
0 test_grunt_tod_damage
0 test_time_area_damage
0 test_time_area_prestart