Source

Lost Sky Project (Public) / Story of a Lost Sky / lostsky / missions / ch3st5.py

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
from lostsky.worldmap.event import BattleEvent
from lostsky.battle.mapdata import MapData
from lostsky.battle.mapaction import MapActionEvent, UnitHPBelowTrigger, UnitAliveTrigger, SSPStateTrigger, CustVarTrigger
from lostsky.battle.mapobj import SpiritSourcePoint

class Mission(BattleEvent):

    def __init__(self):
        # Event Data
        name = 'The Guardian Misaki'
        location = 'Summit'
        id_string = 'CH3ST5'
        prereqs = ['CH3ST4']
        show_rewards = True
        desc = "The Guardian Misaki awaits at the top of Youkai Mountain. With the balance of Gensokyo at stake, will Youmu's team be able to convince her to help them in stopping Fuyuhana?"

        BattleEvent.__init__(self, name, location,
                             id_string, prereqs,
                             show_rewards, desc)

        # Map Data
        map_name = 'ch3st5.txt'
        mission_type = 'battle'
        objective = {'type':'Defeat Boss',
                     'target':'Misaki',
                     'desc':'Defeat Misaki!'
                     }

        deploy_data = {'enable':True,
                       'max_units':9,
                       'preset_units':{},
                       'boxes':[(10, 19, 5, 3)],
                       'default_locations':{'Youmu':(13,19),
                                            'Ran':(10,19),
                                            'Keine':(14,19),
                                            'Marisa':(12,19),
                                            'Aya':(11,19),
                                            'Mokou':(14,20),
                                            'Chen':(10,20),
                                            'Reimu':(12,20),
                                            'Alice':(12,21),
                                            }
                       }
        reward_list = []

        # Enemy Unit Data
        enemy_unit_data = [{'template_name': 'Misaki',
                                'unit_name': 'Misaki',
                                    'level': 15
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama A',
                                    'level': 10
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama B',
                                    'level': 10
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama C',
                                    'level': 10
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama D',
                                    'level': 10
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama E',
                                    'level': 12
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama F',
                                    'level': 12
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama G',
                                    'level': 12
                                },
                          {'template_name': 'Hitodama',
                                'unit_name': 'Hitodama H',
                                    'level': 12
                                },

                          {'template_name': 'Kodama Lord',
                                'unit_name': 'Kodama Lord',
                                'level': 9},

                          {'template_name': 'Yuyuko',
                             'unit_name': 'Yuyuko',
                             'level': 10
                          },

                          {'template_name': 'Yukari',
                             'unit_name': 'Yukari',
                             'level': 16
                          }

                            ]

        initial_spells = {'Misaki':["Iwanaga's Flames", "Withering Fall"],
                          'Hitodama A':['Fireball'],
                          'Hitodama B':['Holy Amulet'],
                          'Hitodama C':['Leaf Crystal'],
                          'Hitodama D':['Dagger Throw'],


                          'Hitodama E':['Fireball'],
                          'Hitodama F':['Holy Amulet'],
                          'Hitodama G':['Leaf Crystal'],
                          'Hitodama H':['Dagger Throw'],

                          'Kodama Lord':['Leaf Crystal']

                            }
        initial_traits = {'Misaki':[]}
        initial_ai_states = {'Misaki':'Attack',
                             'Hitodama A':'Defend',
                             'Hitodama B':'Defend',
                             'Hitodama C':'Defend',
                             'Hitodama D':'Defend',
                             'Hitodama E':'Defend',
                             'Hitodama F':'Defend',
                             'Hitodama G':'Defend',
                             'Hitodama H':'Defend', }

        initial_locations = {'Misaki':(12, 13),
                              'Kodama Lord':(12, 15),

                              'Youmu': (12, 18),
                              'Aya': (11, 18),
                              'Ran': (11, 19),
                              'Chen': (11, 20),
                              'Reimu': (12, 19),
                              'Marisa': (12, 20),
                              'Keine': (13, 19),
                              'Mokou': (13, 20),

                              }
        reserve_units = ['Hitodama %s' % letter for letter in 'ABCDEFGH'] #[list of unit names to deploy later in mission]
        reserve_units.append('Yuyuko')
        reserve_units.append('Yukari')
        all_landmarks = [
                            {'name':'Torii',
                             'id_string':'small_torii',
                             'location':(12, 8)
                        },
                            {'name':'Tree',
                             'id_string':'cherryblossom_tree',
                             'location':(12, 7)
                        },

        ]

        required_starters = ['Youmu', 'Marisa', 'Reimu', 'Ran', 'Chen', 'Mokou', 'Keine', 'Aya']
        pre_mission_MAE = PreMissionMAE()
        mid_mission_MAE_list = [Misaki1(), Misaki2(), Misaki3(), Misaki4(), Misaki5()]
        required_survivors = ['Misaki', 'Youmu', 'Marisa', 'Reimu', 'Ran', 'Chen', 'Mokou', 'Keine', 'Aya']
        post_mission_MAE = PostMissionMAE()

        self.map_data = MapData(map_name, mission_type, objective,
                                deploy_data, reward_list, enemy_unit_data,
                                initial_spells, initial_traits, initial_ai_states,
                                initial_locations, reserve_units, all_landmarks,
                                required_starters, pre_mission_MAE, mid_mission_MAE_list,
                                required_survivors, post_mission_MAE)

class PreMissionMAE(MapActionEvent):

    def __init__(self):
        triggers = []
        MapActionEvent.__init__(self, triggers)

    def execute(self):
        """
        Prologue event
        """

        # Initialize spirit source points
        ssp_list = [SpiritSourcePoint('NorthWest', (3, 7), 2), SpiritSourcePoint('SouthWest', (3, 16), 2),
                    SpiritSourcePoint('NorthEast', (21, 7), 2), SpiritSourcePoint('SouthEast', (21, 16), 2)]

        map(self.map.add_ssp, ssp_list)
        self.set_invincibility_state('Misaki', True)

        # Disables Misaki going after SSPs
        self.map.all_units_by_name['Misaki'].ai.current_state.pursue_ssp = False
        self.set_cursor_state(False)
        self.set_stats_display(False)

        # Hero party confronts a Kodama Lord already fighting Misaki

        self.play_music('battle04')
        self.center_on('Youmu')
        self.say("We're finally here!",
                    'Youmu',
                    'Youmu')
        self.say('And maybe too late?',
                    'Mokou',
                    'Mokou')
        self.say("Argh. All the fairies scattered. I guess I'll have to take you on myself, Misaki.",
                'Kodama Lord',
                'Kodama')
        self.say('Hmm...',
            'Misaki',
            'Misaki')

        # Kodama lord fights Misaki. Gets beaten pretty badly
        self.script_battle('Kodama Lord',
                           'Misaki',
                            {'lhs_equip':0,
                             'rhs_equip':0,
                             'lhs_hit':False,
                             'lhs_crit':False,
                             'rhs_hit':True,
                             'rhs_crit':True})
        self.startle('Kodama Lord')

        self.say("I'm done for!",
            'Kodama Lord',
            'Kodama')

        # Kodama Lord attempts to escape but is blocked by the party
        self.move_unit('Kodama Lord', (13, 17))

        self.say("She's too strong. Retreat!",
            'Kodama Lord',
            'Kodama')
        self.emote('Kodama Lord', 'exclamation')
        self.say("Oh, it's you guys. Not even you stand a chance against Misaki.",
            'Kodama Lord',
            'Kodama')
        self.say("Get out of here before you get your heads handed to you.",
            'Kodama Lord',
            'Kodama')

        # Party lets her retreat
        self.move_unit('Keine', (14, 19))
        self.move_unit('Mokou', (14, 20))
        self.move_unit('Kodama Lord', (13, 30))
        self.kill_unit('Kodama Lord')
        self.move_unit('Keine', (13, 19))
        self.move_unit('Mokou', (13, 20))

        # Misaki confronts party
        self.emote('Misaki', 'scribble')
        self.say("Those Kodama were after the goddess Iwanaga's power of immortality that rests at the heart of this mountain. I presume you seek the same power?",
            'Misaki',
            'Misaki')
        self.say("Lady Misaki, we mean no harm to you or the sanctuary.",
            'Youmu',
            'Youmu')
        self.say("Iwanaga's power of immortality? That's a power that should have been sealed up forever.",
            'Mokou',
            'Mokou')
        self.say("Of course you would say that. Her flames rest within you, do they not? You have her blessing... or should I call it a curse?",
            'Misaki',
            'Misaki')
        self.startle('Mokou')
        self.say("Curse is one way to put it. But I'll take what I can get now.",
            'Mokou',
            'Mokou')
        self.say("I wouldn't have lived to see this day without the curse. I wouldn't have met Keine or all these people in Gensokyo.",
            'Mokou',
            'Mokou')
        self.say("Enough of that though, we're here to put a stop to your unruly daughter.",
            'Mokou',
            'Mokou')
        self.say("Fuyuhana's actions threaten the balance in Gensokyo. We seek your help in order to stop her.",
            'Youmu',
            'Youmu')
        self.say("What's needed to stop Fuyuhana can only be entrusted to those with the strength and will to achieve it. Defeat me, and that power is yours!",
            'Misaki',
            'Misaki')

        # Show a barrier animation around Misaki. Reimu senses its nature
        self.play_sfx('miss')
        self.show_animation('barrier_spell', (12, 13))
        self.startle('Reimu')
        self.say("Ugh!",
            'Reimu',
            'Reimu')
        self.say("What's wrong, Reimu?",
            'Marisa',
            'Marisa')
        self.say("I thought I felt something wrong when that Kodama Lord was fighting her. Now I see what it was.",
            'Reimu',
            'Reimu')
        self.say("Misaki's put up a powerful barrier all around her. The sheer strength of it gives me the chills.",
            'Reimu',
            'Reimu')
        self.say("Even Marisa's Master Spark won't get through it?",
            'Chen',
            'Chen')
        self.say("I wouldn't be surprised if it could nullify Yukari's spells.",
            'Reimu',
            'Reimu')
        self.say("The strength needed to conjure such a spell is too great for her alone.",
            'Ran',
            'Ran')

        # Center camera on one of the four spirit source points in the map
        self.set_cursor_state(True)
        self.center_on_coords((3, 7))
        self.say("Look over there at those spirit source points! Misaki must be drawing power from the mountain itself.",
            'Ran',
            'Ran')
        self.say("If we can seal them up, Misaki's spell should be broken!",
            'Youmu',
            'Youmu')

        self.set_cursor_state(False)

        # Go back to the party for one last line before the battle starts.
        self.center_on('Youmu')
        self.say("Then let's get to it before Misaki burns us to a crisp!",
            'Marisa',
            'Marisa')



        self.set_cursor_state(True)
        self.set_stats_display(True)

class Misaki1(MapActionEvent):
    def __init__(self):
        # Triggers on all SSPs captured
        triggers = [SSPStateTrigger('NorthWest', 1),
                    SSPStateTrigger('NorthEast', 1),
                    SSPStateTrigger('SouthEast', 1),
                    SSPStateTrigger('SouthWest', 1),
                    ]

        MapActionEvent.__init__(self, triggers)

    def execute(self):

        # Misaki is impressed that the party discovered how to break her barrier.
        self.center_on('Misaki')
        self.say("Good. Good. That was faster than I had expected. Those Kodama just kept throwing themselves at my barrier.",
            'Misaki',
            'Misaki')

        # Reimu senses barrier is down. If she's not in the party a generic line is said.
        if 'Reimu' in self.map.all_units_by_name.keys() and self.map.all_units_by_name['Reimu'].alive:
            self.center_on('Reimu')
            self.emote('Reimu', 'exclamation')
            self.say("Misaki's barrier is broken! Now's our chance!",
                'Reimu',
                'Reimu')
        else:
            self.say("Misaki's barrier is down. She is now vulnerable to attack.",
                    None,
                    None)

        self.set_invincibility_state('Misaki', False)
        self.set_equip('Misaki', 'Withering Fall')

class Misaki2(MapActionEvent):
    def __init__(self):
        # Triggers on turn 2

        triggers = [UnitHPBelowTrigger('Misaki', 300), UnitAliveTrigger('Misaki', True)]

        MapActionEvent.__init__(self, triggers)

    def execute(self):

        # Misaki summons guardian orbs
        self.center_on('Misaki')
        self.say("Guardians of Iwanaga's fires, arise!",
                "Misaki",
                "Misaki")

        self.set_invincibility_state('Misaki', True)

        # Equip Misaki with her more powerful spell
        self.set_equip('Misaki', "Iwanaga's Flames")

        # Switch the SSP state of all SSPs
        self.set_ssp_state('NorthWest', 2)
        self.set_ssp_state('NorthEast', 2)
        self.set_ssp_state('SouthWest', 2)
        self.set_ssp_state('SouthEast', 2)

        ssp_coords = ((3, 7), (3, 16), (21, 7), (21, 16))

        # if a unit is currently standing on the SSP while it switches states, teleport them to the middle of the map
        deploy_set = 'ABCD'

        for index, coord in enumerate(ssp_coords):

            unit_name = self.map.check_occupancy(coord)

            if unit_name:
                self.center_on_coords(coord)
                self.play_sfx('fire2')
                self.show_animation('fire_spell', coord)
                self.random_teleport(unit_name, (6, 7, 8, 11))
                self.center_on(unit_name)
                self.emote(unit_name, 'questionmark')

            # Deploy the Hitodama
            self.center_on_coords(coord)
            letter = deploy_set[index]
            self.deploy_unit('Hitodama %s'%letter, coord)
            self.pause(0.5)

        # Show barrier animation to indicate that Misaki is invincible again.
        self.center_on('Misaki')
        self.play_sfx('miss')
        self.show_animation('barrier_spell', tuple(self.map.all_units_by_name['Misaki'].location_tile))
        self.set_cust_var('Phase 2', True)


class Misaki3(MapActionEvent):
    def __init__(self):
        # Triggers on all SSPs captured
        triggers = [SSPStateTrigger('NorthWest', 1),
                    SSPStateTrigger('NorthEast', 1),
                    SSPStateTrigger('SouthEast', 1),
                    SSPStateTrigger('SouthWest', 1),
                    CustVarTrigger('Phase 2', True)
                    ]

        MapActionEvent.__init__(self, triggers)

    def execute(self):

        # Same thing as last time barrier goes down, but with Marisa
        if 'Marisa' in self.map.all_units_by_name.keys() and self.map.all_units_by_name['Marisa'].alive:
            self.center_on('Marisa')
            self.emote('Marisa', 'exclamation')
            self.say("Her barrier just collapsed! The magic is surging back into the mountain!",
                'Marisa',
                'Marisa')
        else:
            self.say("Misaki's barrier is down. She is now vulnerable to attack.",
                None,
                None)

        self.set_equip('Misaki', 'Withering Fall')
        self.set_invincibility_state('Misaki', False)

class Misaki4(MapActionEvent):
    def __init__(self):
        # Triggers on turn 2

        triggers = [UnitHPBelowTrigger('Misaki', 150), UnitAliveTrigger('Misaki', True)]

        MapActionEvent.__init__(self, triggers)

    def execute(self):

        self.center_on('Misaki')
        self.say("Let's see you deal with these stronger guardians!",
            "Misaki",
            "Misaki")

        self.set_invincibility_state('Misaki', True)

        # Equip Misaki with her more powerful spell
        self.set_equip('Misaki', "Iwanaga's Flames")

        # Switch the SSP state of all SSPs
        self.set_ssp_state('NorthWest', 2)
        self.set_ssp_state('NorthEast', 2)
        self.set_ssp_state('SouthWest', 2)
        self.set_ssp_state('SouthEast', 2)

        ssp_coords = ((3, 7), (3, 16), (21, 7), (21, 16))

        # if a unit is currently standing on the SSP while it switches states, teleport them to the middle of the map
        deploy_set = 'EFGH'

        for index, coord in enumerate(ssp_coords):

            unit_name = self.map.check_occupancy(coord)

            if unit_name:
                self.center_on_coords(coord)
                self.play_sfx('fire2')
                self.show_animation('fire_spell', coord)
                self.random_teleport(unit_name, (6, 7, 8, 11))
                self.center_on(unit_name)
                self.emote(unit_name, 'questionmark')

            # Deploy the Hitodama
            self.center_on_coords(coord)
            letter = deploy_set[index]
            self.deploy_unit('Hitodama %s'%letter, coord)
            self.pause(0.5)

        self.center_on('Misaki')
        self.play_sfx('miss')
        self.show_animation('barrier_spell', tuple(self.map.all_units_by_name['Misaki'].location_tile))
        self.set_cust_var('Phase 3', True)

class Misaki5(MapActionEvent):
    def __init__(self):
        # Triggers on all SSPs captured
        triggers = [SSPStateTrigger('NorthWest', 1),
                    SSPStateTrigger('NorthEast', 1),
                    SSPStateTrigger('SouthEast', 1),
                    SSPStateTrigger('SouthWest', 1),
                    CustVarTrigger('Phase 3', True)
                    ]

        MapActionEvent.__init__(self, triggers)

    def execute(self):

        # Final time Misaki's barrier goes down
        if 'Ran' in self.map.all_units_by_name.keys() and self.map.all_units_by_name['Ran'].alive:
            self.center_on('Ran')
            self.emote('Ran', 'exclamation')
            self.say("She's standing on her last legs! I don't think she'll be able to raise her barrier again.",
                'Ran',
                'Ran')
        else:
            self.say("Misaki's barrier is down. She is now vulnerable to attack.",
                None,
                None)


        self.set_equip('Misaki', "Withering Fall")
        self.set_invincibility_state('Misaki', False)


class PostMissionMAE(MapActionEvent):
    def __init__(self):
        triggers = []
        MapActionEvent.__init__(self, triggers)

    def pre_exec(self):

        self.set_cursor_state(False)
        self.set_stats_display(False)

        self.set_unit_pos('Misaki', (12, 13))

        self.set_unit_pos('Youmu', (12, 15))
        self.set_unit_pos('Ran', (9, 16))
        self.set_unit_pos('Chen', (10, 17))
        self.set_unit_pos('Mokou', (11, 17))
        self.set_unit_pos('Aya', (12, 17))
        self.set_unit_pos('Keine', (13, 17))
        self.set_unit_pos('Marisa', (14, 17))
        self.set_unit_pos('Reimu', (15, 16))


    def execute(self):

        self.stop_music()
        self.play_music('event02')

        # End of battle conversation with Misaki
        self.center_on('Youmu')
        self.say("Ah. I concede. I can see that your spirit is dedicated to the presevation of our world's balance.",
            'Misaki',
            'Misaki')
        self.say("Now, is there anything you can do about that kid of yours throwing a major tantrum in the forest and casting a drought across all of Gensokyo?",
            'Marisa',
            'Marisa')
        self.say("Yes. It is not our place to impose our will upon this world. We are protectors, not conquerors. I understand her motivations.",
            'Misaki',
            'Misaki')
        self.say("She is punishing Gensokyo for not taking care of the forest, but this is going too far.",
            'Misaki',
            'Misaki')
        self.say("Is there any way we can stop her?",
            'Youmu',
            'Youmu')
        self.say("The power the strongest of Kodama Lords gain in their demise is unimaginable for someone of her stature.",
            'Misaki',
            'Misaki')
        self.say("The destruction she can bring when she dies for good will be much worse than what she is doing now.",
            'Misaki',
            'Misaki')
        self.say("She has total control of the clouds now and without them Gensokyo will dry up and wilt.",
            'Mokou',
            'Mokou')
        self.say("Fuyuhana's power is to gather clouds, but she can only manifest it when she takes physical form.",
            'Misaki',
            'Misaki')
        self.say("That holy branch is her anchor to the world of the living.",
            'Reimu',
            'Reimu')
        self.say("How about the Lantern of Souls? It can attract ghosts, so maybe we can can separate them.",
            'Youmu',
            'Youmu')

        self.emote('Misaki', 'heart')
        self.say("Take this, a drop from the sap of the tree that I watch over.",
            'Misaki',
            'Misaki')
        self.say("If you burn use it in the lantern's oil, you'll be able to separate Fuyuhana from the holy branch by calling out with Iwanaga's flame.",
            'Misaki',
            'Misaki')
        self.say("I cannot leave this mountain, no matter how much I wish it. I suppose that is all I can do for you.",
            'Misaki',
            'Misaki')
        self.say("You have my prayers.",
            'Misaki',
            'Misaki')
        self.say("Goodbye, Misaki. And thank you.",
            'Youmu',
            'Youmu')

        # Misaki vanishes
        self.show_animation('fire_spell', (12, 13))
        self.kill_unit('Misaki')

        self.say("Your lantern is broken, Youmu. We'll have to find a way to fix it. How old is this rickety thing anyway?",
            'Reimu',
            'Reimu')
        self.say("It's been in my master's care since before I was born.",
            'Youmu',
            'Youmu')

        # Yuyuko and Yukari make an appearance at last
        self.fade_to_color('white', 1.0)
        self.deploy_unit('Yuyuko', (11, 20))
        self.deploy_unit('Yukari', (13, 20))
        self.play_music('event01')
        self.fade_from_color('white', 1.0)

        self.say("Fufufu~ And that's where we come in.",
            'Yuyuko',
            'Yuyuko')
        self.say("Are we late? Yuyuko wanted to stop for snacks at the Tengu city on our way here.",
            'Yukari',
            'Yukari')

        # Youmu runs up to Yuyuko
        self.startle('Youmu')
        self.emote('Youmu', 'exclamation')
        self.move_unit('Aya', (12, 18))
        self.move_unit('Aya', (11, 18))
        self.move_unit('Youmu', (12, 19))
        self.move_unit('Youmu', (11, 19))

        self.say("Lady Yuyuko!",
            'Youmu',
            'Youmu')
        self.emote('Chen', 'musicnote')
        self.say("Lady Yukari!",
            'Chen',
            'Chen')
        self.say("Ah, so you two finally show up. Have you been on some kind of secret vacation together?",
            'Reimu',
            'Reimu')
        self.say("We've been busy, too.",
            'Yukari',
            'Yukari')
        self.say("Lady Yuyuko, why didn't you tell me where you were going?",
            'Youmu',
            'Youmu')
        self.say("Oh, ah... Yukari showed up that night and dragged me off to a picnic in the forest. We were going to meet this ghost who appeared in the forest recently.",
            'Yuyuko',
            'Yuyuko')
        self.emote('Youmu', 'dotdotdot')
        self.say("I'm sorry, Youmu, dear. Yukari insisted that we keep this a secret.",
            'Yuyuko',
            'Yuyuko')
        self.say("Things didn't go exactly as planned.",
            'Yukari',
            'Yukari')
        self.say("You guys got beaten by Fuyuhana? I honestly don't believe THAT.",
            'Marisa',
            'Marisa')
        self.say("She ran away as soon as one of her lieutenants managed to knock the lantern from Yuyuko's hand.",
            'Yukari',
            'Yukari')
        self.say("She's also well on her way to restoring what power she had when she reigned over the Forest of Magic centuries ago.",
            'Yukari',
            'Yukari')
        self.say("Her underlings, especially that Ayaka, are nothing to sneeze at either.",
            'Yukari',
            'Yukari')
        self.say("So where to next, milady?",
            'Ran',
            'Ran')
        self.say("We should regroup in a place that's more comfortable. I could go for some tea.",
            'Yukari',
            'Yukari')
        self.say("Ah! Tea time sounds great right now!",
            'Yuyuko',
            'Yuyuko')
        self.say("I'm sure the Tsubaki would want to hear from us as well.",
            'Aya',
            'Aya')
        self.say("And I hope that Momiji and Nitori are both okay after that battle. Let's return to the outpost.",
            'Youmu',
            'Youmu')