#textdomain wesnoth-tutorial {./utils.cfg} # Comment this out for a faster (no-commentry) tutorial for testing. {./2_Speaking.cfg} #define BADGUY TYPE NAME POSITION [unit] id={NAME} generate_name=yes type={TYPE} x,y={POSITION} moves=0 side=2 animate=yes [/unit] [redraw][/redraw] #enddef #define DEFEND_ISLAND [if] {NUMEQ island_defended 0} {NUMEQ dumbo_dead 1} [then] {VARIABLE island_defended 1} {LABEL (_"Patch of forest") 10,14} {TALK_ABOUT_LOC 10,14 (_"Now put an unwounded unit, preferably a Fighter, in that patch of forest on the south-east of the island; a nice, defensible spot.")} {STUDENT (_"Can one unit survive against all those enemies?")} {TEACHER (_"With a little help, yes. If you move your Shaman next to the defending unit, she will heal it 4 hitpoints per turn. Just be careful not to expose the Shaman to attack since she is fairly weak herself.")} {PRINT (_"Move a unit (a Fighter if possible) to the patch of forest")} [event] name=moveto [filter] x,y=10,14 [/filter] {UNLABEL 10,14} {PRINT (_"Advance other units onto the island or to capture villages, then End Turn")} [allow_undo][/allow_undo] [/event] [/then] [/if] #enddef #define REFUND_AND_REMOVE_RECRUIT [if] [variable] # is it a recall? # FIXME: units could be recalled with 0 xp name=recruit.experience greater_than=0 [/variable] [then] [gold] side=1 amount=20 [/gold] # put the unit back into the recall list # ugly trait hack... [unit] side=$recruit.side name=$recruit.name type=$recruit.type experience=$recruit.experience gender=$recruit.gender [modifications] [trait] id=$recruit.modifications.trait[0].id name=$recruit.modifications.trait[0].name [effect] apply_to=$recruit.modifications.trait[0].effect[0].apply_to # hitpoints (resilient & quick) increase_total=$recruit.modifications.trait[0].effect[0].increase_total times=$recruit.modifications.trait[0].effect[0].times # damage (strong, dextrous) increase_damage=$recruit.modifications.trait[0].effect[0].increase_damage range=$recruit.modifications.trait[0].effect[0].range # movement (quick), experience (intelligent) increase=$recruit.modifications.trait[0].effect[0].increase [/effect] [effect] apply_to=$recruit.modifications.trait[0].effect[1].apply_to # hitpoints (resilient & quick) increase_total=$recruit.modifications.trait[0].effect[1].increase_total times=$recruit.modifications.trait[0].effect[1].times # damage (strong, dextrous) increase_damage=$recruit.modifications.trait[0].effect[1].increase_damage range=$recruit.modifications.trait[0].effect[1].range # movement (quick), experience (intelligent) increase=$recruit.modifications.trait[0].effect[1].increase [/effect] [/trait] [trait] id=$recruit.modifications.trait[1].id name=$recruit.modifications.trait[1].name [effect] apply_to=$recruit.modifications.trait[1].effect[0].apply_to # hitpoints (resilient & quick) increase_total=$recruit.modifications.trait[1].effect[0].increase_total times=$recruit.modifications.trait[1].effect[0].times # damage (strong, dextrous) increase_damage=$recruit.modifications.trait[1].effect[0].increase_damage range=$recruit.modifications.trait[1].effect[0].range # movement (quick), experience (intelligent) increase=$recruit.modifications.trait[1].effect[0].increase [/effect] [effect] apply_to=$recruit.modifications.trait[1].effect[1].apply_to # hitpoints (resilient & quick) increase_total=$recruit.modifications.trait[1].effect[1].increase_total times=$recruit.modifications.trait[1].effect[1].times # damage (strong, dextrous) increase_damage=$recruit.modifications.trait[1].effect[1].increase_damage range=$recruit.modifications.trait[1].effect[1].range # movement (quick), experience (intelligent) increase=$recruit.modifications.trait[1].effect[1].increase [/effect] [/trait] [/modifications] [/unit] [/then] [else] # simply use cost to return [gold] side=1 amount=$recruit.cost [/gold] [/else] [/if] #enddef #define CHECK_INTELLIGENT NAME [if] [variable] # Ignoring single-trait units, as we don't have those during the tutorial name={NAME}.modifications.trait.length equals=2 [/variable] [then] [if] [variable] name={NAME}.modifications.trait[0].id equals=intelligent [/variable] [or] [variable] name={NAME}.modifications.trait[1].id equals=intelligent [/variable] [/or] [then] {VARIABLE is_intelligent yes} [/then] [else] {VARIABLE is_intelligent no} [/else] [/if] [/then] [else] {VARIABLE is_intelligent no} [/else] [/if] #enddef #define IMPORTANT_UNIT NAME {CHECK_INTELLIGENT {NAME}} [if] # Archer needs 44/35(intelligent), Fighter needs 40/32 [variable] name={NAME}.type equals=Elvish Archer [/variable] {BOOLEQ is_intelligent no} [variable] name={NAME}.experience greater_than=35 [/variable] [or] [variable] name={NAME}.type equals=Elvish Archer [/variable] {BOOLEQ is_intelligent yes} [variable] name={NAME}.experience greater_than=26 [/variable] [/or] [or] [variable] name={NAME}.type equals=Elvish Fighter [/variable] {BOOLEQ is_intelligent no} [variable] name={NAME}.experience greater_than=31 [/variable] [/or] [or] [variable] name={NAME}.type equals=Elvish Fighter [/variable] {BOOLEQ is_intelligent yes} [variable] name={NAME}.experience greater_than=23 [/variable] [/or] [then] {VARIABLE commented 0} {FOREACH galdrad_comments i} [if] [variable] name=galdrad_comments[$i].id equals=${NAME}.id [/variable] [then] {VARIABLE commented 1} [/then] [/if] {NEXT i} {CLEAR_VARIABLE i} [if] {NUMEQ commented 0} [then] [store_unit] [filter] id=${NAME}.id [/filter] variable=galdrad_comments mode=append [/store_unit] {TEACHER (_"That unit is about one kill (8 experience points) away from gaining a level! Do not let it die!")} [/then] [/if] {CLEAR_VARIABLE commented} [/then] [/if] {CLEAR_VARIABLE is_intelligent} #enddef #define DEFENDER_INJURED NAME [if] {NUMEQ {NAME}.side 1} [variable] name={NAME}.hitpoints less_than=19 [/variable] [variable] name={NAME}.hitpoints greater_than=0 [/variable] [then] {VARIABLE complained 0} # FIXME: If same unit gets attacked twice in same turn, this # does not seem to find it the second time. Some internal bug? {FOREACH unit_complained i} [if] [variable] name=unit_complained[$i].id equals=${NAME}.id [/variable] [then] {VARIABLE complained 1} [/then] [/if] {NEXT i} [if] {NUMEQ complained 0} [then] [store_unit] [filter] id=${NAME}.id [/filter] variable=unit_complained mode=append [/store_unit] [if] {NUMEQ complain_msg 2} [then] [message] speaker=second_unit message= _"I hope I have a chance to retreat after this!" [/message] {VARIABLE_OP complain_msg add 1} [/then] [/if] [if] {NUMEQ complain_msg 1} [then] [message] speaker=second_unit message= _"One lucky attack by an Orcish Grunt, and I’m done for!" [/message] {VARIABLE_OP complain_msg add 1} [/then] [/if] [if] {NUMEQ complain_msg 0} [then] [message] speaker=second_unit message= _"Ouch! I could make use of some healing in a village." [/message] {VARIABLE_OP complain_msg add 1} [/then] [/if] [/then] [/if] {CLEAR_VARIABLE i} {CLEAR_VARIABLE complained} {IMPORTANT_UNIT {NAME}} [/then] [/if] #enddef #define CHECK_INCOME [if] {NUMEQ income_exceeded 0} [then] [store_side] [/store_side] [if] [variable] name=side.gold greater_than=13 [/variable] [then] {VARIABLE income_exceeded 1} {STUDENT (_"I have $side.gold gold; enough to recruit!")} {TALK_ABOUT_LOC 9,15 (_"Yes, keep recruiting more units: I think you might need them!")} [/then] [/if] {CLEAR_VARIABLE side} [/then] [/if] #enddef [tutorial] id=2_Tutorial name= _"Wesnoth Tutorial Part II" map_data="{campaigns/tutorial/maps/2_Tutorial.map}" turns=26 {DEFAULT_SCHEDULE} [side] type=Fighter id=student name= _"Konrad" save_id=human_player persistent=yes canrecruit=yes side=1 gold=123 controller=human recruit=Elvish Fighter,Elvish Archer,Elvish Shaman [/side] [side] type=Orcish Warrior id=Thrag name= _"Thrag" side=2 canrecruit=yes recruit=Orcish Grunt,Wolf Rider,Orcish Archer gold=0 {ai/aliases/stable_singleplayer.cfg} [ai] [aspect] id=aggression [facet] # When we unleash you, you *will* attack. value=1.0 turns=1-6 [/facet] [/aspect] [/ai] [/side] [side] no_leader=yes side=3 team_name=1 controller=null [/side] [event] name=prestart [objectives] side=1 [objective] description= _"Defeat the Orc Leader" condition=win [/objective] [objective] [show_if] [variable] name=gender not_equals=female [/variable] [/show_if] description= _"Death of Konrad" condition=lose [/objective] [objective] [show_if] [variable] name=gender equals=female [/variable] [/show_if] description= _"Death of Li’sar" condition=lose [/objective] {TURNS_RUN_OUT} [/objectives] [unit] id=Galdrad name= _"Galdrad" type=Elvish Captain x,y=12,2 side=3 [/unit] [unit] id=Dumbo generate_name=yes type=Orcish Grunt x,y=8,13 side=2 # Make sure the two archers can't take him out! [modifications] {TRAIT_RESILIENT} [/modifications] [/unit] [/event] [event] name=start {VARIABLE dumbo_dead 0} {VARIABLE villages_around_keep 0} {VARIABLE village_warn 0} {VARIABLE recruit_num 1} {VARIABLE income_exceeded 0} {STUDENT (_"Ho, Galdrad! Has Delfador conjured something else to beat me with? A flock of scarecrows, perhaps?")} # wmlindent: start ignoring {GENDER ({TEACHER (_"This is no game, Konrad! " + _"Orcs have encamped across the river. This is elven country; they are fools to enter here. We Elves are fast and hard to hit in forests. You must defeat their leader so they never threaten us again. I will advise you.")}) ({TEACHER (_"This is no game, Li’sar! " + _"Orcs have encamped across the river. This is elven country; they are fools to enter here. We Elves are fast and hard to hit in forests. You must defeat their leader so they never threaten us again. I will advise you.")})} # wmlindent: stop ignoring {STUDENT (_"What should I do?")} # Now we’re into it... start music. {DEFAULT_MUSIC_PLAYLIST} {TALK_ABOUT Dumbo (_"First, we will have to deal with the Orcish Grunt stationed in the middle of the river. He should be little trouble.")} {TALK_ABOUT Thrag (_"By then, their leader will have recruited more units to send against us and the real fight will begin.")} {LABEL (_"Shallow") 19,16} {LABEL (_"Shallow") 18,16} {LABEL (_"Shallow") 18,14} {LABEL (_"Shallow") 19,15} {LABEL (_"Shallow") 20,14} {LABEL (_"Deep water") 14,14} {LABEL (_"Deep water") 20,16} {LABEL (_"Deep water") 4,14} {TALK_ABOUT_LOC 19,14 (_"See this dark blue water? It’s too deep for either side to cross. The orcs could slowly wade through that narrow band of shallow lighter-blue water in the east; but we could stand on the shore and force them to fight us from the water, where they are exposed and we are protected by the forest.")} {UNLABEL 19,16} {UNLABEL 18,16} {UNLABEL 18,14} {UNLABEL 19,15} {UNLABEL 20,14} {UNLABEL 14,14} {UNLABEL 20,16} {UNLABEL 4,14} {LABEL (_"Village") 11,14} {TALK_ABOUT_LOC 9,14 (_"The more likely attack, then, is across the bridge. That middle island is the key: it has a village for healing injured units and forests in which we fight so well.")} {UNLABEL 11,14} # wmlindent: start ignoring {TEACHER (_"To start, we will need some units: two Elvish Fighters two Elvish Archers one Elvish Shaman")} # wmlindent: stop ignoring # See if there are two fighters worth recalling [store_unit] variable=recall [filter] x,y=recall,recall [/filter] [/store_unit] # Higher Level units should come first. {VARIABLE recall_xp1 0} {VARIABLE recall_xp2 0} {FOREACH recall i} {VARIABLE temp_xp $recall[$i].experience} {VARIABLE_OP temp_xp add $recall[$i].variables.previous_xp} [if] [variable] name=temp_xp greater_than=$recall_xp1 [/variable] [then] # Move anything from slot 1 to slot 2 [if] [variable] name=recall_xp1 greater_than=0 [/variable] [then] {VARIABLE_OP recall_i2 value $recall_i1} {VARIABLE_OP recall_xp2 value $recall_xp1} [/then] [/if] {VARIABLE_OP recall_i1 value $i} {VARIABLE_OP recall_xp1 value $temp_xp} [/then] [else] [if] [variable] name=temp_xp greater_than=$recall_xp2 [/variable] [then] {VARIABLE_OP recall_i2 value $i} {VARIABLE_OP recall_xp2 value $temp_xp} [/then] [/if] [/else] [/if] {NEXT i} {CLEAR_VARIABLE i} [if] [variable] name=recall_xp1 greater_than=0 [/variable] [then] {VARIABLE_OP recall_name1 value $recall[$recall_i1].name} [if] [variable] name=recall_xp2 greater_than=0 [/variable] [then] {VARIABLE_OP recall_name2 value $recall[$recall_i2].name} # We have two worth recalling. [if] [variable] name=recall_xp1 equals=$recall_xp2 [/variable] [then] {TEACHER (_"During your tutorial, both $recall_name1 and $recall_name2 gained $recall_xp1 experience points. You should recall them now so they can gain more experience, rather than recruiting new Fighters.")} [/then] [else] {TEACHER (_"During your tutorial, $recall_name1 gained $recall_xp1 experience points, and $recall_name2 gained $recall_xp2. You should recall them now so they can gain more experience, rather than recruiting new Fighters.")} [/else] [/if] [/then] [else] # We have one worth recalling. {TEACHER (_"During your tutorial, $recall_name1 gained $recall_xp1 experience points. You should recall that unit now, and recruit a second one (which is cheaper than recalling, anyway).")} [/else] [/if] {LABEL (_"RECALL $recall_name1") 11,3} {PRINT (_"Right click on the tile north-east of you and recall $recall_name1")} [/then] [else] [if] [variable] name=recall.length greater_than=0 [/variable] [then] {TEACHER (_"If any Elvish Fighters from your last battle had experience, we would recall them to the current battlefield. However, your veterans gained no experience so it’s cheaper to recruit new units instead. Recruit an Elvish Fighter.")} [/then] [else] {TEACHER (_"If you had any experienced units alive from your last battle we would recall them. Instead we must recruit some new Elvish Fighters.")} [/else] [/if] {LABEL (_"Elvish Fighter") 11,3} {PRINT (_"Right click on the tile north-east of you and recruit an Elvish Fighter")} [/else] [/if] [/event] # Check they recall/recruit correctly in their first turn. [event] name=recruit,recall first_time_only=no [filter] side=1 [/filter] [if] [variable] name=recruit_num less_than=6 [/variable] [then] # What did they recruit? [store_unit] variable=recruit kill=yes [filter] x,y=$x1,$y1 [/filter] [/store_unit] [/then] [/if] [if] {NUMEQ recruit_num 5} [then] [if] [variable] name=recruit.type not_equals=Elvish Shaman [/variable] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recruit an Elvish Shaman! Now try again...")} [/then] [else] [unstore_unit] variable=recruit [/unstore_unit] {VARIABLE_OP recruit_num add 1} {UNLABEL 10,2} {CLEAR_PRINT} {TEACHER (_"The Shaman is a fairly weak unit, but she has the ability to heal friendly units around her. She also has a special attack which slows enemies, halving the damage they do.")} {STUDENT (_"So, should I end my turn now?")} # FIXME: If any level 2 units, costs will be higher. {TEACHER (_"While none of your recruited units can move, you still can. Your five units cost you 5 gold in upkeep, leaving you 3 gold poorer per turn. You need more income.")} # wmlindent: start ignoring {GENDER ({PRINT (_"Move Konrad to capture a village")}) ({PRINT (_"Move Li’sar to capture a village")})} # wmlindent: stop ignoring [/else] [/if] [/then] [/if] [if] {NUMEQ recruit_num 4} [then] [if] [variable] name=recruit.type not_equals=Elvish Archer [/variable] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recruit an Elvish Archer! Now try again...")} [/then] [else] {VARIABLE_OP recruit_num add 1} [unit] id=Eowynial name= _"Eowynial" type=Elvish Archer x,y=$x1,$y1 side=1 gender=female moves=0 [modifications] {TRAIT_QUICK} {TRAIT_RESILIENT} [/modifications] [/unit] {EXPLAIN_QUICK_RESILIENT (_"Eowynial")} {UNLABEL 9,4} {UNLABEL 9,3} {LABEL (_"Shaman") 10,2} {PRINT (_"Recruit an Elvish Shaman to your north")} [/else] [/if] [/then] [/if] [if] {NUMEQ recruit_num 3} [then] [if] [variable] name=recruit.type not_equals=Elvish Archer [/variable] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recruit an Elvish Archer! Now try again...")} [/then] [else] {VARIABLE_OP recruit_num add 1} [unit] id=Elriend name= _"Elriend" type=Elvish Archer x,y=$x1,$y1 side=1 moves=0 [modifications] {TRAIT_STRONG} {TRAIT_INTELLIGENT} [/modifications] [/unit] {EXPLAIN_STRONG_INTELLIGENT (_"Elriend")} [/else] [/if] [/then] [/if] [if] {NUMEQ recruit_num 2} [then] [if] [variable] name=recall_xp2 greater_than=0 [/variable] [then] # You were supposed to recall $recall_name2. [if] [variable] name=recruit.name not_equals=$recall_name2 [/variable] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recall $recall_name2|! Now try again...")} [/then] [else] {VARIABLE_OP recruit_num add 1} [unstore_unit] variable=recruit [/unstore_unit] {UNLABEL 12,3} # wmlindent: start ignoring {LABEL (_"Archer #1") 9,4} {LABEL (_"Archer #2") 9,3} # wmlindent: stop ignoring {PRINT (_"Recruit two Elvish Archers in the tiles to your west")} [/else] [/if] [/then] [else] # You were supposed to recruit a Fighter. [if] [variable] name=recruit.type not_equals=Elvish Fighter [/variable] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recruit an Elvish Fighter! Now try again...")} [/then] [else] {VARIABLE_OP recruit_num add 1} [unit] id=Golir name= _"Golir" type=Elvish Fighter x,y=$x1,$y1 side=1 moves=0 [modifications] {TRAIT_QUICK} {TRAIT_RESILIENT} [/modifications] [/unit] {EXPLAIN_QUICK_RESILIENT (_"Golir")} {UNLABEL 12,3} # wmlindent: start ignoring {LABEL (_"Archer #1") 9,4} {LABEL (_"Archer #2") 9,3} # wmlindent: stop ignoring {PRINT (_"Recruit two Elvish Archers in the tiles to your west")} [/else] [/if] [/else] [/if] [/then] [/if] [if] {NUMEQ recruit_num 1} [then] [if] [variable] name=recall_xp1 greater_than=0 [/variable] [then] # You were supposed to recall $recall_name1. [if] [variable] name=recruit.name not_equals=$recall_name1 [/variable] [then] [if] [variable] name=recruit.name equals=$recall_name2 [/variable] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recall $recall_name1, not $recall_name2|! Now try again...")} [/then] [else] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"No! I said recall $recall_name1 from the last battle, not recruit a new $recruit.language_name|! Now try again...")} [/else] [/if] [/then] [else] {VARIABLE_OP recruit_num add 1} {UNLABEL 11,3} [unstore_unit] variable=recruit [/unstore_unit] [if] [variable] name=recall_xp2 greater_than=0 [/variable] [then] {PRINT (_"Right click on the tile east of you and recall $recall_name2")} {LABEL (_"RECALL $recall_name2") 12,3} [/then] [else] {LABEL (_"Elvish Fighter") 12,3} {PRINT (_"Right click on the tile east of you and recruit an Elvish Fighter")} [/else] [/if] [/else] [/if] [/then] [else] # You were supposed to recruit a new fighter. # FIXME: How do we tell if they recalled instead? [if] [variable] name=recruit.type not_equals=Elvish Fighter [/variable] [or] [variable] # FIXME: not a perfect indicator of recall name=recruit.experience greater_than=0 [/variable] [/or] [then] {REFUND_AND_REMOVE_RECRUIT} {TEACHER (_"$recruit.language_name|? I said recruit a new Elvish Fighter. Now try again...")} [/then] [else] {UNLABEL 11,3} {VARIABLE_OP recruit_num add 1} [unit] id=Elindel name= _"Elindel" type=Elvish Fighter x,y=$x1,$y1 side=1 moves=0 [modifications] {TRAIT_STRONG} {TRAIT_INTELLIGENT} [/modifications] [/unit] {EXPLAIN_STRONG_INTELLIGENT (_"Elindel")} {LABEL (_"Elvish Fighter") 12,3} {PRINT (_"Right click on the tile east of you and recruit an Elvish Fighter")} [/else] [/if] [/else] [/if] [/then] [/if] {CLEAR_VARIABLE recruit} [/event] [event] name=capture [filter] x=7,9,13 y=4,2,3 id=student [/filter] first_time_only=no [allow_undo][/allow_undo] # FIXME: If they somehow capture a village near keep, count could be wrong. {VARIABLE_OP villages_around_keep add 1} [if] {NUMEQ villages_around_keep 1} [then] # wmlindent: start ignoring # FIXME: Level 2 units change costs. {GENDER ({TEACHER (_"You’ve learned well, Konrad! " + _"The village supports one unit and pays 1 gold per turn. You’re only losing 1 gold per turn now.")}) ({TEACHER (_"You’ve learned well, Li’sar! " + _"The village supports one unit and pays 1 gold per turn. You’re only losing 1 gold per turn now.")})} # wmlindent: stop ignoring {PRINT (_"End your turn")} [/then] [/if] [if] {NUMEQ villages_around_keep 3} [then] {TEACHER (_"You’ve captured all the villages around the keep, but stay near so you can recruit more units.")} [/then] [/if] [/event] [event] name=capture [filter] x=7,9,13 y=4,2,3 side=1 [not] id=student [/not] [/filter] {GENDER ({TEACHER (_"You should leave the villages near your keep for Konrad to capture. He needs to stay nearby to recruit more units anyway.")}) ({TEACHER (_"You should leave the villages near your keep for Li’sar to capture. She needs to stay nearby to recruit more units anyway.")})} {UNDO_REMINDER} [/event] [event] name=turn 2 {TALK_ABOUT Dumbo (_"Orcish Grunts have no ranged attacks, so use your archers against them.")} {PRINT (_"Attack the orc with an Archer")} {NARRATOR _"Unit Summaries" _"To review the capabilities of any unit—including an enemy—hover the mouse over it, and you will see a unit summary on the right of the screen"} [event] name=moveto [filter] x=8,10 y=8,8 [/filter] {TEACHER (_"Excellent. Elves are well-protected in the forest. There’s only a 30% chance of hitting an Elvish Archer in that tile.")} [/event] [event] name=moveto [filter] x,y=9,8 side=1 [/filter] [allow_undo][/allow_undo] {TEACHER (_"It’s very dangerous to stand in water when there are enemies about! Your unit will have an 80% chance of being hit when the enemy counter-attacks! Cancel!")} {UNDO_REMINDER} [/event] [event] name=attack_end {PRINT (_"Attack the orc with the other Archer")} # FIXME: Can't nest events of same type: they both fire 8( # So set up this event on next attack. [event] name=attack [event] name=attack_end {CLEAR_PRINT} {UNLABEL 14,3} {LABEL (_"Fighter to HERE") 19,5} {TALK_ABOUT_LOC 19,5 (_"Your other units cannot reach the orc this turn. Send a Fighter to the village in the far east of the map. It will take two turns to reach it.")} {NARRATOR _"Long-distance Movement" _"You can order a unit to move for multiple turns by selecting the unit and clicking on the destination. A number will indicate how many turns it will take to get there."} {PRINT (_"Tell a Fighter to move to the far east village")} [event] name=moveto [filter] x,y=19,5 [/filter] {UNLABEL 19,5} [/event] [event] name=moveto [filter] x=15-19 y=1-6 [/filter] {UNLABEL 19,5} {LABEL (_"Keep") 10,3} {TEACHER (_"Send the other Fighter and the Shaman south so they can attack next turn, then return to the keep to recruit more units!")} {GENDER ({PRINT (_"Move your Fighter and Shaman south, then return Konrad to the keep")}) ({PRINT (_"Move your Fighter and Shaman south, then return Li’sar to the keep")})} [/event] [event] name=moveto [filter] side=1 x,y=10,3 [/filter] {UNLABEL 10,3} {PRINT (_"Recruit another Archer and a Fighter")} {VARIABLE num_recruited 0} [/event] [event] name=recruit first_time_only=no [filter] side=1 [/filter] {UNLABEL 11,3} {VARIABLE_OP num_recruited add 1} [if] {NUMEQ num_recruited 2} [then] {STUDENT (_"I have no more money to recruit!")} {TEACHER (_"That is often a problem, which is why owning villages is important.")} {GENDER ({PRINT (_"Move Konrad to another (unowned) village")}) ({PRINT (_"Move Li’sar to another (unowned) village")})} [/then] [/if] [/event] [event] name=moveto [filter] x=7,9,13 y=4,2,3 id=student [/filter] {PRINT (_"End your turn")} [/event] [/event] [/event] [/event] [/event] [event] name=turn 3 {UNLABEL 11,3} {UNLABEL 12,3} # Explain: Zone of Control {TALK_ABOUT Dumbo (_"That Grunt is blocking the bridge! We must occupy that island before the Wolf Riders reach it.")} {STUDENT (_"Can’t our units just move around him?")} # All around Dumbo (9,14) {LABEL (_"ZoC") 10,14} {LABEL (_"ZoC") 8,14} {LABEL (_"ZoC") 9,13} {LABEL (_"ZoC") 9,15} {LABEL (_"ZoC") 10,13} {LABEL (_"ZoC") 8,13} # FIXME: Figure out best unit choice. {TALK_ABOUT Dumbo (_"No. Once you move close to an enemy unit, you are in its Zone of Control and cannot move further that turn. To move your troops onto that island without wading slowly through the water, you’ll have to kill the Grunt.")} {PRINT (_"Attack the orc with an Archer")} {UNLABEL 10,14} {UNLABEL 8,14} {UNLABEL 9,15} {UNLABEL 9,13} {UNLABEL 10,13} {UNLABEL 8,13} [event] name=attack_end [filter_second] id=Dumbo [/filter_second] {CLEAR_PRINT} [store_unit] variable=dumbo kill=no [filter] id=Dumbo [/filter] [/store_unit] # This happens before kill event, so we must do this the hard way. [if] [variable] name=dumbo.hitpoints less_than=1 [/variable] [then] {PRINT (_"Advance other units and capture villages, then End Turn")} [/then] [else] [if] [variable] name=unit.gender equals=male [/variable] [then] #po: The unit with unit type $unit.language_name is male. {STUDENT (_"No other units can reach that orc. I hope my $unit.language_name survives its counter-attack! I’d better grab more villages and move everyone closer for next turn.")} [/then] [else] #po: The unit with unit type $unit.language_name is female. {STUDENT (_"female^No other units can reach that orc. I hope my $unit.language_name survives its counter-attack! I’d better grab more villages and move everyone closer for next turn.")} [/else] [/if] {TEACHER (_"Yes. If your Shaman stands just behind that unit on the bridge, she will heal it at the beginning of the next turn.")} {PRINT (_"Move your Shaman onto the bridge to stand behind your other unit")} [event] name=moveto [filter] type=Elvish Shaman [/filter] {PRINT (_"Advance other units and capture villages, then End Turn")} [/event] [/else] [/if] {CLEAR_VARIABLE dumbo} [/event] [/event] [event] name=die [filter] id=Dumbo [/filter] {VARIABLE dumbo_dead 1} # Only tell them to defend island if not turn 3. [if] [variable] name=turn_number greater_than=3 [/variable] [then] {DEFEND_ISLAND} [/then] [/if] [event] name=moveto [filter] x=9,9,9 y=15,16,17 side=1 [/filter] [allow_undo][/allow_undo] [if] [variable] name=turn_number less_than=8 [/variable] [then] {TALK_NO_MOVE (_"Be careful: if you stand on the bridge you are exposed to attack from multiple directions!")} {UNDO_REMINDER} [/then] [/if] [/event] [event] name=moveto [filter] x=8,10,18,19,20,11 y=14,15,14,15,14,15 side=1 [/filter] {TEACHER (_"It’s very dangerous to stand in water when there are enemies about! Your unit will have an 80% chance of being hit! Cancel, and wait for them to attack you!")} {UNDO_REMINDER} [allow_undo][/allow_undo] [/event] [/event] [event] name=turn 4 {CLEAR_PRINT} {TALK_ABOUT_LOC 19,5 (_"Don’t forget about your Fighter in the east; you can move him south to that last village near the channel.")} [allow_undo][/allow_undo] [if] {NUMEQ dumbo_dead 0} [then] {TALK_ABOUT Dumbo (_"We need to occupy that village, otherwise they will take it next turn! Move a unit into the village to stop the orcs capturing it. Whichever unit you choose will benefit from the village’s healing, too.")} [/then] [else] {DEFEND_ISLAND} [/else] [/if] [/event] [event] name=turn 5 {DEFEND_ISLAND} {TALK_ABOUT_LOC 11,14 (_"Careful! It is now nighttime. Orcs are chaotic, which means their attacks are now 25% stronger. By day, their attacks are 25% weaker, which is a noticeable difference. You are lawful: stronger by day and weaker at night. Your elvish warriors are neutral: unaffected by the time of day.")} {NARRATOR _"Time of Day" _"After this dialog, hold the mouse over the landscape image below the minimap on the right. This brings up a description of the time of day, showing who has the advantage."} [/event] [event] name=turn 6 {CHECK_INCOME} {TALK_ABOUT_LOC 9,15 (_"Remember to retreat your wounded units to villages. Healers can only heal 4 hitpoints at a time, while villages can heal 8 (the maximum healing for any unit).")} [/event] [event] name=turn 7 {CHECK_INCOME} {LABEL (_"Defend here") 19,14} {TALK_ABOUT_LOC 19,16 (_"Beware of those orcs crossing the river! If they get into the forest they’ll be hard to dislodge!")} [/event] [event] name=turn 9 {UNLABEL 19,14} {NARRATOR _"Tracking Unused Units" _"You can ensure you use all your troops by pressing n to step from one unit to the next. If you press space, you can mark the currently selected unit as having finished its turn, which stops you moving it by accident later on. When n no longer selects a new unit, it’s safe to end your turn."} [/event] [event] name=turn 10 {NARRATOR _"Victory Conditions" _"In this scenario, you only need to defeat the orc leader to win. (Victory conditions for a scenario are given under Scenario Objectives in the Main Menu)."} [/event] [event] name=turn 12 {NARRATOR _"Recruit the Right Unit Types" _"Remember to recruit troops useful for the situation. Archers are particularly effective against Grunts, Wolf Riders and the orcish leader."} [/event] # Remind them to keep back [event] name=moveto [filter] id=student x=1-20 y=6-20 [/filter] [if] [variable] name=turn_number less_than=8 [/variable] [then] {TEACHER (_"Stay near the keep! You need to be on a keep to recruit more units, and I doubt the orc leader will let you use his!")} [/then] [/if] [allow_undo][/allow_undo] [/event] [event] name=moveto [filter] id=Thrag x=5,14,19 y=19,19,23 [/filter] {TALK_ABOUT Thrag (_"Their leader has moved into that village! He’s not as stupid as I thought. The village heals him each turn and provides good defense.")} [/event] [event] name=moveto [filter] side=2 x=11,6,11 y=14,10,10 [/filter] {TALK_ABOUT_LOC ($x1,$y1) (_"That unit has captured our village! You’d better get him out; it heals him each turn and provides good defense.")} [/event] # Warn about using shaman to attack. [event] name=attack [filter] type=Elvish Shaman [/filter] [message] speaker=unit message= _"Using me to attack is risky! I can slow the opponent with my ranged attack, but I hope you have a plan if I miss!" [/message] [/event] [event] name=attack_end first_time_only=no [store_unit] variable=attacker [filter] x,y=$x1,$y1 [/filter] [/store_unit] [store_unit] variable=defender [filter] x,y=$x2,$y2 [/filter] [/store_unit] {DEFENDER_INJURED defender} {IMPORTANT_UNIT attacker} [if] [variable] name=attacker.id equals=Thrag [/variable] [variable] name=attacker.hitpoints less_than=21 [/variable] {NUMEQ talk_about_killing_thrag 0} [then] {VARIABLE talk_about_killing_thrag 1} {TALK_ABOUT Thrag (_"You are close to killing their leader! The unit who finishes him will gain 16 experience points because he is second level. Choose your attacking unit carefully!")} [/then] [/if] [if] [variable] name=defender.id equals=Thrag [/variable] [variable] name=defender.hitpoints less_than=21 [/variable] {NUMEQ talk_about_killing_thrag 0} [then] {VARIABLE talk_about_killing_thrag 1} {TALK_ABOUT Thrag (_"You are close to killing their leader! The unit who finishes him will gain 16 experience points because he is second level. Choose your attacking unit carefully!")} [/then] [/if] {CLEAR_VARIABLE attacker} {CLEAR_VARIABLE defender} [/event] [event] name=die first_time_only=no [filter] side=1 [not] id=student [/not] [/filter] [store_unit] variable=deadguy [filter] x,y=$x1,$y1 [/filter] [/store_unit] [if] [variable] name=deadguy.type equals=Elvish Fighter [/variable] [or] [variable] name=deadguy.type equals=Elvish Archer [/variable] [/or] [then] [if] [variable] name=deadguy.experience greater_than=20 [/variable] [then] [if] [variable] name=deadguy.gender equals=male [/variable] [then] {TEACHER (_"We will miss $deadguy.name| because he had $deadguy.experience experience points. He would have advanced to second level soon.")} [/then] [else] {TEACHER (_"We will miss $deadguy.name| because she had $deadguy.experience experience points. She would have advanced to second level soon.")} [/else] [/if] [/then] [else] [if] [variable] name=deadguy.experience less_than=8 [/variable] [then] [if] [variable] name=deadguy.gender equals=male [/variable] [then] {TEACHER (_"We will miss $deadguy.name|, but at least he was not one of our experienced troops!")} [/then] [else] {TEACHER (_"We will miss $deadguy.name|, but at least she was not one of our experienced troops!")} [/else] [/if] [/then] [/if] [/else] [/if] [/then] [else] [if] [variable] name=deadguy.type equals=Elvish Shaman [/variable] [then] {TEACHER (_"Losing a healer hurts all the troops! Keep them out of the enemy’s reach!")} {NARRATOR _"Tracking Enemy Movement" _"You can see where an enemy can reach by moving the mouse over them. You can see all possible enemy moves at once with the Show Enemy Moves command from the Actions menu."} [/then] [else] # Must be level 2 unit. {TEACHER (_"Second level units are powerful, but not invulnerable! Goodbye, $deadguy.name|.")} [/else] [/if] [/else] [/if] {CLEAR_VARIABLE deadguy} [/event] [event] name=moveto [filter] side=1 x=1-13 y=18-21 [/filter] {TALK_ABOUT Thrag (_"Beware of the orc leader: he can do 36 hitpoints of damage at night! Attack with many units at once during the day.")} [/event] # What if they level the Shaman? [event] name=post_advance [filter] side=1 type=Elvish Marksman [/filter] # FIXME: Abilities. [if] [variable] name=unit.gender equals=male [/variable] [then] [message] speaker=unit #wmllint: display on message= _"Advancing a level has fully healed me! I always have a 60% chance of hitting with my Marksman ability, and I deal 9 damage each for 4 attacks. Use me to dislodge hard-to-hit units." #wmllint: display off [/message] [/then] [else] [message] speaker=unit #wmllint: display on message= _"female^Advancing a level has fully healed me! I always have a 60% chance of hitting with my Marksman ability, and I deal 9 damage each for 4 attacks. Use me to dislodge hard-to-hit units." #wmllint: display off [/message] [/else] [/if] [/event] [event] name=post_advance [filter] side=1 type=Elvish Ranger [/filter] [message] speaker=unit #wmllint: display on message= _"Advancing a level has fully healed me! I am good with both bow and sword, and I have a special ability: Ambush. I can hide in forests where enemies can only see me if they are right next to me." #wmllint: display off [/message] [/event] [event] name=post_advance [filter] side=1 type=Elvish Captain [/filter] [message] speaker=unit #wmllint: display on message= _"Advancing a level has fully healed me! I am good with both bow and sword, and I have a special ability: Leadership. First level units around me do 25% more damage, so position me carefully." #wmllint: display off [/message] [/event] [event] name=post_advance [filter] side=1 type=Elvish Hero [/filter] # FIXME: Abilities [message] speaker=unit #wmllint: display on message= _"Advancing a level has fully healed me! I am particularly good with the sword, dealing 8 damage in 4 attacks." #wmllint: display off [/message] [/event] # WE control the AI! Bwahahaha! [event] name=side 2 turn refresh first_time_only=no {CLEAR_PRINT} [if] {NUMEQ turn_number 1} [then] # Advance sacrificial orc. {MOVE Dumbo 8 13 9 9} [scroll_to_unit] id=Thrag [/scroll_to_unit] {BADGUY (Wolf Rider) Scout1 17,24} {BADGUY (Wolf Rider) Scout2 18,23} {BADGUY (Wolf Rider) Scout3 19,24} {BADGUY (Wolf Rider) Scout4 17,25} {BADGUY (Wolf Rider) Scout5 18,25} # Leader moves to take village {MOVE Thrag 18 24 19 23} [capture_village] side=2 x,y=19,23 [/capture_village] [/then] [/if] [if] {NUMEQ turn_number 2} [then] # Orc runs away. {MOVE Dumbo 9 9 9 14} # Riders advance [scroll_to_unit] id=Thrag [/scroll_to_unit] {MOVE Scout1 17 24 13 20} {MOVE Scout2 18 23 12 19} {MOVE Scout3 19 24 14 20} {MOVE Scout4 17 25 10 24} {MOVE Scout5 18 25 14 19} [capture_village] side=2 x,y=14,19 [/capture_village] # Leader move to keep, recruits & advances {MOVE Thrag 19 23 18 24} {BADGUY (Orcish Grunt) Grunt1 18,23} {BADGUY (Orcish Grunt) Grunt2 17,24} {BADGUY (Orcish Archer) Archer1 19,24} {MOVE Thrag 18 24 16 20} [/then] [/if] [if] {NUMEQ turn_number 3} [then] {MOVE Scout1 13 20 8 18} {MOVE Scout2 12 19 7 18} {MOVE Scout3 14 20 9 18} {MOVE Scout4 10 24 9 26} [capture_village] side=2 x,y=9,26 [/capture_village] {MOVE Scout5 14 19 9 17} {MOVE Thrag 16 20 11 19} {MOVE Grunt1 18 23 15 20} {MOVE Archer1 19 24 16 20} {MOVE Grunt2 17 24 16 21} [/then] [/if] [if] {NUMEQ turn_number 4} [then] # Leave Scout1 and Scout2 to attack {MOVE Scout3 9 18 11 16} {MOVE Scout5 9 17 10 16} {MOVE Scout4 9 26 6 20} {MOVE Thrag 11 19 9 19} {MOVE Grunt1 15 20 11 19} {MOVE Archer1 16 20 18 17} {MOVE Grunt2 16 21 18 18} [/then] [/if] # From now on, we only control these two, down channel [if] {NUMEQ turn_number 5} [then] {MOVE Archer1 18 17 18 16} {MOVE Grunt2 18 18 18 17} # Leaders stays here, to shorten the scenario 8) {MOVE Thrag 9 19 9 19} [/then] [/if] [if] {NUMEQ turn_number 6} [then] {MOVE Archer1 18 16 19 16} {MOVE Grunt2 18 17 18 16} {MOVE Thrag 9 19 9 19} [/then] [/if] [if] {NUMEQ turn_number 7} [then] # Force grunt to advance if poss. [if] [not] [have_unit] x,y=19,16 [/have_unit] [/not] [then] {MOVE Grunt2 18 16 19 16} [/then] [else] {MOVE Grunt2 18 16 18 16} [/else] [/if] {MOVE Thrag 9 19 9 19} [/then] [/if] [if] {NUMEQ turn_number 8} [then] # Force grunt to advance if poss. [if] [not] [have_unit] x,y=19,16 [/have_unit] [/not] [then] {MOVE Grunt2 18 16 19 16} [/then] [else] {MOVE Grunt2 18 16 18 16} [/else] [/if] # We can now leader move IF they are on bridge [if] [not] [have_unit] side=1 x=7-11 y=16-21 [/have_unit] [/not] [then] {MOVE Thrag 9 19 9 19} [/then] [/if] [/then] [/if] [/event] [event] name=time over {TEACHER (_"You took too long! We’ll never be rid of these orcs!")} [endlevel] result=defeat [/endlevel] [/event] [event] name=die [filter] id=student [/filter] [endlevel] result=defeat [/endlevel] [/event] [event] name=defeat {CLEAR_PRINT} [/event] [event] name=victory {TEACHER (_"You have beaten the orcs! You may want to try some novice-level campaigns next, such as: The South Guard, An Orcish Incursion, A Tale of Two Brothers, or Heir to the Throne. The South Guard was specifically designed as a beginner’s campaign. Konrad, Li’sar and Delfador are characters from Heir to the Throne.")} [/event] [/tutorial]