#textdomain wesnoth-sota
# Walking corpses are summoned from graves using the right-click menu. Each grave is
# marked by a stone on the map and has its own terrain type. Each can only be used once,
# so a pile of dirt is used to mark one after it is used. After the player captures the
# guardhouse, they can summon skeletons as well, but that ability is lost if the enemy
# units retake it. The opening has some interesting WML to keep Ardonna hidden while
# the guards are talking amongst themselves. It is explained there.
[scenario]
name= _ "Dark Business"
map_file=02_Dark_Business.map
id=02_Dark_Business
next_scenario=03_Bandits
victory_when_enemies_defeated=no
[story]
[part]
[background_layer]
image=story/cemetery.jpg
scale=no
[/background_layer]
story= _ "16 III, 23 YW:
I decided to hide in the cemetery. That way I could try my experiment to animate a human body when night fell. With my dark cloak, I resembled the mourners, and with my hood up, nobody could see my hair."
[/part]
{JOURNEY_PART 2}
[/story]
{FIRST_WATCH_HOUR3}
{FIRST_WATCH_HOUR3}
{FIRST_WATCH_HOUR4}
{FIRST_WATCH_HOUR4}
{MIDNIGHT_HOUR}
{MIDNIGHT_HOUR}
{SECOND_WATCH_HOUR1}
{SECOND_WATCH_HOUR1}
{SECOND_WATCH_HOUR2}
{SECOND_WATCH_HOUR2}
{SECOND_WATCH_HOUR3}
{SECOND_WATCH_HOUR3}
{SECOND_WATCH_HOUR4}
{SECOND_WATCH_HOUR4}
{SECOND_WATCH_HOUR5}
{SECOND_WATCH_HOUR5}
{SECOND_WATCH_HOUR6}
{SECOND_WATCH_HOUR6}
{DAWN_HOUR}
{DEFAULT_MUSIC_PLAYLIST}
{TURNS 18 18 18}
# wmllint: validate-off
[side]
{SIDE_1_ARDONNA}
{ARDONNA_RECRUIT_1}
{GOLD 60 50 40}
facing=se
# The scenario won't be shrouded, but some of the intro dialog is:
shroud=yes
[/side]
# wmllint: validate-on
[side]
side=2
controller=ai
no_leader=yes
user_team_name= _ "Guards"
{FLAG_VARIANT loyalist}
[/side]
# *************************** MACROS ***************************
# This menu item macro is used for "recruiting" walking corpses, skeletons, and skeleton
# archers from graves. UNIT is the unit type, UNIT_STRING is similar but has underscores
# and is used for the id and icon filename. GOLD is the cost (a number).
#define SET_MENU_ITEM_FOR UNIT UNIT_STRING GOLD
# We need a variable to use in the switch statement:
[set_variable]
name=unit_string
value={UNIT_STRING}
[/set_variable]
# The following sentences could be built from the macro arguments, but that might
# make them impossible to translate properly. So, we use a switch statement instead.
[switch]
variable=unit_string
[case]
value=walking_corpse
[set_variable]
name=description_text
value= _ "Raise Walking Corpse (8 Gold)"
[/set_variable]
[/case]
[case]
value=skeleton
[set_variable]
name=description_text
value= _ "Raise Skeleton (15 Gold)"
[/set_variable]
[/case]
[case]
value=skeleton_archer
[set_variable]
name=description_text
value= _ "Raise Skeleton Archer (14 Gold)"
[/set_variable]
[/case]
[/switch]
[clear_variable]
name=unit_string
[/clear_variable]
[set_menu_item]
id=raise_{UNIT_STRING}
description=$description_text
image=units/icons/icon-{UNIT_STRING}.png
[show_if]
[and]
# Show if: This is a grave overlay terrain...
[have_location]
terrain=*^GrvS
x,y=$x1,$y1
# ...within 1 hex of the leader...
[and]
[filter]
id=Ardonna
[/filter]
radius=1
[/and]
[/have_location]
# ...And there is not a unit here already.
[not]
[have_unit]
x,y=$x1,$y1
[/have_unit]
[/not]
[/and]
[/show_if]
[command]
[store_gold]
side=1
variable=gold
[/store_gold]
[if]
[variable]
name=gold
less_than={GOLD}
[/variable]
[then]
[message]
speaker=narrator
image=items/gold-coins-message.png
message=_ "You don’t have enough gold to raise that unit."
[/message]
[/then]
[else]
[gold]
side=1
amount=-{GOLD}
[/gold]
# x1 and y1 have to be stored because they can be changed by the
# player right-clicking again during this command:
[set_variable]
name=zombie_x
value=$x1
[/set_variable]
[set_variable]
name=zombie_y
value=$y1
[/set_variable]
[item] # Marks the grave as used.
x,y=$zombie_x,$zombie_y
image=items/dirt.png
[/item]
[delay] # This makes it a bit animated.
time=400
[/delay]
[unit]
side=1
x,y=$zombie_x,$zombie_y
type={UNIT}
animate=yes
moves=0
attacks_left=0
[/unit]
# Remove the overlay that defines this terrain as a grave:
[terrain]
terrain=^
layer=overlay
x,y=$zombie_x,$zombie_y
[/terrain]
[fire_event]
id=more_guards
[/fire_event]
[clear_variable]
name=zombie_x,zombie_y
[/clear_variable]
[/else]
[/if]
[/command]
[/set_menu_item]
#enddef
#define PLACE_GUARD X Y TYPE TRAIT1 TRAIT2 ID NAME
[unit]
type={TYPE}
id={ID}
name={NAME}
x,y={X},{Y}
side=2
facing=sw
[modifications]
{TRAIT_{TRAIT1}}
{TRAIT_{TRAIT2}}
[/modifications]
[/unit]
#enddef
# wmllint: whofield PLACE_GUARD 6
# *************************** PRESTART ***************************
[event]
name=prestart
[hide_unit]
id=Ardonna
[/hide_unit]
[objectives]
side=1
[objective]
description= _ "Kill all the guards, and capture the guardhouse"
condition=win
[/objective]
{HOW_TO_LOSE_WITH_ARDONNA}
[gold_carryover]
bonus=yes
carryover_percentage=40
[/gold_carryover]
[note]
description= _ "Right-click on a grave adjacent to your leader to raise a unit."
[/note]
[note]
description= _ "Each grave can be used only once."
[/note]
[note]
description= _ "This scenario takes place entirely at night."
[/note]
[/objectives]
[label]
x,y=10,11
text= _ "Guardhouse"
immutable=no
[/label]
[item]
x,y=15,7
image=scenery/temple1.png
[/item]
[label]
x,y=15,7
# po: In English, this label bled into the two hexes on either side, and obscured
# po: the units there, which is why it's split across two lines. The extra spaces
# po: before "Temple" are to center that word above the others.
text= _ " Temple
of Healing"
immutable=no
[/label]
[item]
x,y=23,8
image=items/gravestone1.png
[/item]
{PLACE_GUARD 10 11 (Spearman) RESILIENT QUICK "Gwyllin" (_"Gwyllin")}
{PLACE_GUARD 10 10 (Spearman) QUICK RESILIENT "Veomyr" (_"Veomyr")}
{PLACE_GUARD 8 10 (Spearman) STRONG RESILIENT "Syrillin" (_"Syrillin")}
{PLACE_GUARD 7 10 (Bowman) STRONG INTELLIGENT "Glant" (_"Glant")}
#ifdef HARD
{PLACE_GUARD 8 9 (Spearman) STRONG INTELLIGENT "Renvan" (_"Renvan")}
{PLACE_GUARD 10 9 (Bowman) STRONG RESILIENT "Vin" (_"Vin")}
#endif
#ifdef EASY
{PLACE_GUARD 9 10 (Lieutenant) AGED INTELLIGENT "Caradoc" (_"Caradoc")}
#else
{PLACE_GUARD 9 10 (Lieutenant) RESILIENT INTELLIGENT "Caradoc" (_"Caradoc")}
#endif
# We don't want the guard on the village to move from there:
{FREEZE_UNIT Gwyllin}
[store_locations]
terrain=*^GrvS
variable=graves
[/store_locations]
[for]
array=graves
variable=i
[do]
[set_variable]
name=stone_number
rand=1..3
[/set_variable]
[item]
x=$graves[$i].x
y=$graves[$i].y
image=items/gravestone$stone_number|.png
[/item]
[/do]
[/for]
[clear_variable]
name=graves,stone_number
[/clear_variable]
{SET_MENU_ITEM_FOR (SotA Walking Corpse_Human) walking_corpse 8}
[/event]
# *************************** PLAY ***************************
[event]
name=moveto
[filter]
side=1
x, y=15, 7
[/filter]
# Choose a bat off the recall list if there is one.
[role]
type=Blood Bat, Vampire Bat # A Dread Bat would be too powerful.
search_recall_list=yes
role=hiding_bat
[/role]
# Store the bat if there was one, or create and store one if there wasn't.
[if]
[have_unit]
role=hiding_bat
search_recall_list=yes
[/have_unit]
[then]
[store_unit]
[filter]
role=hiding_bat
[/filter]
variable=frightened_bat
[/store_unit]
[/then]
[else]
[unit]
type=Vampire Bat
x, y=1, 1
[/unit]
[store_unit]
[filter]
x, y=1, 1
[/filter]
variable=frightened_bat
kill=yes
[/store_unit]
[/else]
[/if]
[move_unit_fake]
type=$frightened_bat.type
x=15, 16
y=7, 7
[/move_unit_fake]
[unstore_unit]
variable=frightened_bat
x, y=16, 7
[/unstore_unit]
# If there is a bat with a role, it's still on the recall list at this point,
# though there is a copy of it on the map as well.
# Ardonna's comment is different depending on whether she has seen this bat
# before or not.
[if]
[have_unit]
role=hiding_bat
search_recall_list=yes
[/have_unit]
[then]
[message]
speaker=Ardonna
# po: She's speaking to a bat from scenario 1
message= _ "Oh, hello friend! I didn’t know you were hiding in there."
[/message]
[/then]
[else]
[message]
speaker=Ardonna
# po: She's speaking to a bat that she hasn't met before
message= _ "Oh, hello! You’re a handsome one."
[/message]
[/else]
[/if]
[kill]
# We can't be certain where the bat is, but we know it's the only one.
race=bats
x=1-26 # This keeps the bats on the recall list from going away.
[/kill]
# The bat is very likely on 16, 7, so we're not going to worry about if it's not.
[move_unit_fake]
type=$frightened_bat.type
x=16, 17
y=7, 1
[/move_unit_fake]
[message]
speaker=Ardonna
message= _ "Hey, come back! I didn’t mean to frighten you."
[/message]
[message]
speaker=Ardonna
message= _ "Maybe I could attract it if I jingled some coins."
[/message]
[if]
[variable]
name=frightened_bat.type
equals=Vampire Bat
[/variable]
[then]
[set_variable]
name=message_image
value="units/undead/bat-se-3.png~CROP(13,15,46,39)~XBRZ(2)"
[/set_variable]
[/then]
[else]
[set_variable]
name=message_image
value="units/undead/bloodbat-se-3.png~CROP(13,15,46,39)~XBRZ(2)"
[/set_variable]
[/else]
[/if]
[message]
speaker=narrator
image=$message_image
message= _ "Right-click adjacent to your leader to summon the bat."
[/message]
[clear_variable]
name=message_image
[/clear_variable]
[set_menu_item]
id=summon_bat
description= _ "Summon the Bat (20 gold)"
image=units/icons/icon-bat.png
[show_if]
[and]
[have_location]
[and]
[filter]
id=Ardonna
[/filter]
radius=1
[/and]
[/have_location]
[not]
[have_unit]
x,y=$x1,$y1
[/have_unit]
[/not]
[variable]
name=bat_summoned
boolean_equals=no
[/variable]
[/and]
[/show_if]
[command]
[store_gold]
side=1
variable=gold
[/store_gold]
[if]
[variable]
name=gold
less_than=20
[/variable]
[then]
[message]
speaker=narrator
image=items/gold-coins-message.png
message=_ "You don’t have enough gold to summon the bat."
[/message]
[/then]
[else]
[gold]
side=1
amount=-20
[/gold]
# x1 and y1 have to be stored because they can be changed by the
# player right-clicking again during this command:
[set_variable]
name=bat_x
value=$x1
[/set_variable]
[set_variable]
name=bat_y
value=$y1
[/set_variable]
[set_variable]
name=bat_summoned
value=yes
[/set_variable]
[move_unit_fake]
type=$frightened_bat.type
x=17, $bat_x
y=1, $bat_y
[/move_unit_fake]
[if]
[have_unit]
role=hiding_bat
search_recall_list=yes
[/have_unit]
[then]
[recall]
role=hiding_bat
x, y=$bat_x, $bat_y
show=no
[/recall]
[modify_unit]
[filter]
role=hiding_bat
[/filter]
moves=0
[/modify_unit]
[/then]
[else]
[unit]
type=Vampire Bat
x, y=$bat_x, $bat_y
moves=0
[/unit]
[/else]
[/if]
[clear_variable]
name=bat_x,bat_y
[/clear_variable]
[/else]
[/if]
[/command]
[/set_menu_item]
[/event]
[event]
name=capture
first_time_only=no
[filter]
side=1
x,y=10,11
[/filter]
[allow_recruit]
type=Skeleton,Skeleton Archer
side=1
[/allow_recruit]
[message]
speaker=narrator
# This puts images of the two units next to each other,
# scaled to the same size:
image=story/black-background.png~BLIT(portraits/undead/archer.png~SCALE(180,180),6,25 )~BLIT(portraits/undead/skeleton.png~SCALE(220,220),187,0)~CROP(0,0,376,205)~SCALE(171,93)
message= _ "You can now recruit skeletons and skeleton archers! You will lose this ability if the guardhouse is retaken by the guards!"
[/message]
[set_variable]
name=can_recruit_skeletons
value=yes
[/set_variable]
[fire_event]
name=guards_emerge
[/fire_event]
{SET_MENU_ITEM_FOR (Skeleton) skeleton 15}
{SET_MENU_ITEM_FOR (Skeleton Archer) skeleton_archer 14}
[fire_event]
name=check for win
[/fire_event]
[/event]
# This macro animates guards moving out of the guardhouse. Each guard moves to the
# nearest unoccupied, walkable, hex, without an ^NohS overlay. ^NohS ("Not here") marks
# hexes outside the fence where the unit shouldn't be placed. We use it because it's made
# to be invisible in the minimap. ^FnbS is the base fence tile.
#define MOVE_AND_PLACE_GUARD TRAIT1 TRAIT2 ID NAME
{NEAREST_HEX 10 11 20 (
[and]
terrain=!,*^NohS,*^Qov,*^FnbS,*^Eqf,*^P*
[not]
x,y=10,11
[/not]
[not]
[filter]
[/filter]
[/not]
[/and]
) location}
[move_unit_fake]
type=Spearman
x=10, $location.x
y=11, $location.y
side=2
[/move_unit_fake]
{PLACE_GUARD $location.x $location.y (Spearman) {TRAIT1} {TRAIT2} {ID} {NAME}}
[clear_variable]
name=location
[/clear_variable]
#enddef
# wmllint: whofield MOVE_AND_PLACE_GUARD 3
[event]
name=guards_emerge
first_time_only=yes
{MOVE_AND_PLACE_GUARD STRONG RESILIENT "Blollyn" (_"Blollyn")}
{MOVE_AND_PLACE_GUARD INTELLIGENT RESILIENT "Ceoran" (_"Ceoran")}
#ifdef HARD
{MOVE_AND_PLACE_GUARD INTELLIGENT QUICK "Vindry" (_"Vindry")}
{MOVE_AND_PLACE_GUARD STRONG QUICK "Aethacyn" (_"Aethacyn")}
{MOVE_AND_PLACE_GUARD STRONG INTELLIGENT "Elomyr" (_"Elomyr")}
#endif
[/event]
# A capture event does not fire when a leaderless side takes a village, but that is
# what we need. The filters make this event fire when a unit from side 2 retakes the
# "guardhouse" village. The can_recruit_skeletons variable is used to check whether
# side 1 owned the village before.
[event]
name=moveto
first_time_only=no
[filter]
side=2
x,y=10,11
[/filter]
[filter_condition]
[variable]
name=can_recruit_skeletons
equals=yes
[/variable]
[/filter_condition]
[disallow_recruit]
type=Skeleton,Skeleton Archer
side=1
[/disallow_recruit]
[message]
speaker=narrator
image=logo.png
message= _ "You can no longer recruit skeletons and skeleton archers."
[/message]
[clear_menu_item]
id=raise_skeleton_archer, raise_skeleton
[/clear_menu_item]
[set_variable]
name=can_recruit_skeletons
value=no
[/set_variable]
[/event]
[event]
name=die
first_time_only=no
[filter]
side=2
[/filter]
[fire_event]
name=check for win
[/fire_event]
[/event]
[event]
name=check for win
first_time_only=no
[if]
[and]
[have_location]
x,y=10,11
owner_side=1
[/have_location]
[not]
[have_unit]
side=2
[/have_unit]
[/not]
[/and]
[then]
[clear_variable]
name=can_recruit_skeletons,gold,description_text,unit_string,bat_summoned,frightened_bat
[/clear_variable]
[clear_menu_item]
id=raise_skeleton_archer, raise_skeleton, raise_walking_corpse, summon_bat
[/clear_menu_item]
[endlevel]
result=victory
bonus=yes
{NEW_GOLD_CARRYOVER 40}
[/endlevel]
[/then]
[/if]
[/event]
[event]
name=recruit,recall
id=more_guards
[message]
speaker=Ardonna
#ifdef HARD
message= _ "Wait, that guard said there were twelve of them, so where are the other five?"
#else
message= _ "Wait, that guard said there were seven of them, so where are the other two?"
#endif
[/message]
[/event]
# *************************** OPENING / ENDING ***************************
[event]
name=start
[place_shroud]
side=1
[/place_shroud]
[remove_shroud]
side=1
x,y=9,11
radius=5
[/remove_shroud]
[message]
speaker=Syrillin
message= _ "Why are we stuck guarding a cemetery all night?"
[/message]
[message]
speaker=Veomyr
image=portraits/humans/spearman-2.png
#ifdef HARD
message= _ "And why twelve of us? Who wants to break into a cemetery that badly?"
#else
message= _ "And why seven of us? Who wants to break into a cemetery that badly?"
#endif
[/message]
[message]
speaker=Glant
message= _ "I don’t know, but this evening a mage from the Academy was here talking to the mayor, my brother says."
[/message]
[message]
speaker=Caradoc
message= _ "Well I say you shouldn’t question orders, so pipe down."
[/message]
[place_shroud]
side=1
[/place_shroud]
# Until now, Ardonna has been invisible. To keep her from clearing the
# shroud around her until she is revealed in the graveyard, she started
# buried in the middle of a void. The void kept her from seeing anything.
# She is not in her starting location though. The position where we actually
# want her to start would take a lot of work to un-void, so she was at the
# edge of the map in a place where we wanted only hill terrain.
[teleport]
[filter]
id=Ardonna
[/filter]
x,y=22,7
animate=no
clear_shroud=no
check_passability=no
[/teleport]
[terrain] # Turn void into hills
terrain=Hh
[and]
terrain=Xv
[/and]
[/terrain]
[unhide_unit]
id=Ardonna
[/unhide_unit]
[remove_shroud]
side=1
x,y=22,7
radius=5
[/remove_shroud]
[message]
speaker=Ardonna
message= _ "They must be guarding the cemetery from me! Maybe Aimucasur really was suspicious. It’s a good thing I’m here already, but how am I going to get out?
Well, I might as well do my experiment and worry about leaving later."
[/message]
[item]
x,y=23,8
image=items/dirt.png
[/item]
[delay]
time=400
[/delay]
[unit]
side=1
x,y=23,8
id=first_zombie
type=SotA Walking Corpse_Human
animate=yes
moves=0
attacks_left=0
facing=nw
[/unit]
[fire_event]
name=add_SotA Walking Corpse_Human
[primary_unit]
# It doesn't matter *which* human.
race=human
[/primary_unit]
[/fire_event]
[message]
speaker=Ardonna
message= _ "Hello?"
[/message]
[message]
speaker=first_zombie
image=portraits/zombie-farmer.png
message= _ "Uhngh."
[/message]
[message]
speaker=Ardonna
message= _ "Do you remember anything?"
[/message]
[message]
speaker=first_zombie
image=portraits/zombie-farmer.png
message= _ "Uhrrr."
[/message]
[message]
speaker=Ardonna
message= _ "It seems that my first guess was correct. The poor creature is mindless."
[/message]
[place_shroud]
side=1
[/place_shroud]
[remove_shroud]
side=1
x,y=9,11
radius=5
[/remove_shroud]
[message]
speaker=Veomyr
image=portraits/humans/spearman-2.png
message= _ "I heard something over there!"
[/message]
[modify_unit]
[filter]
side=2
[/filter]
facing=ne
[/modify_unit]
[message]
speaker=Glant
message= _ "Who’s there?"
[/message]
[remove_shroud]
side=1
[/remove_shroud]
[move_unit]
id=Ardonna
to_x=21
to_y=7
[/move_unit]
[modify_unit]
# This is not really necessary at the moment (as of 1.11.7) because
# dark adepts can't face north anyway. This is in case that changes.
[filter]
id=Ardonna
[/filter]
facing=sw
[/modify_unit]
[message]
speaker=Ardonna
message= _ "It’s only me. Is the cemetery closed then? I was about to leave."
[/message]
[message]
speaker=Syrillin
message= _ "You and that... other person. Who is that?"
[/message]
[message]
speaker=Ardonna
message= _ "Oh, him. See here, I don’t want any trouble, but he is a little... ah..."
[/message]
[message]
speaker=Caradoc
message= _ "He’s dead! This is dark sorcery like in my granddad’s time in the old country! The penalty is death. Attack and destroy them both!"
[/message]
[message]
speaker=Ardonna
message= _ "Hey! Don’t do that, or I will need more of them."
[/message]
[message]
speaker=Ardonna
message= _ "I would do better if I had weapons, and I bet I can find some in the guardhouse. Go take it, my companions."
[/message]
[message]
speaker=Caradoc
message= _ "Gwyllin, don’t move from that guardhouse."
[/message]
[/event]
[event]
name=time over
[message]
speaker=Ardonna
message= _ "The morning has come, and we have not escaped the city. We will be caught for sure!"
[/message]
[/event]
{HERO_DEATHS}
{MAKE_BATS_NORMAL}
{ZOMBIES}
# wmllint: whofield clear PLACE_GUARD MOVE_AND_PLACE_GUARD
#undef PLACE_GUARD
#undef MOVE_AND_PLACE_GUARD
#undef SET_MENU_ITEM_FOR
[/scenario]