Alchemy
Loading...
Searching...
No Matches

vale_home.c

Go to the documentation of this file.
1/// @file
2/// Vale's village: its doors, the Psynergy Stone, the stormy night when the
3/// villagers send Isaac to the elders and he overhears the two surviving
4/// travelers, the villagers' farewell when the party sets out (entrance 12),
5/// and the village after the party's return from Kalay.
6
7#include "game_state.h"
8#include "flags.h"
9#include "character_ids.h"
10#include "version.h"
11#include "scene_ids.h"
12#include "vram_tab.h"
15#include "unit/object/object.h"
17#include "unit/field/field.h"
18#include "unit/game/game.h"
19#include "unit/window/window.h"
22#include "battle.h"
23#include "debug.h"
24#include "field.h"
25#include "game.h"
26#include "graphics.h"
27#include "menu.h"
28#include "minigame.h"
29#include "sound.h"
30#include "system.h"
31#include "resource.h"
32#include "global_cells.h"
33#include "vale_home.h"
34#include "map_scroll.h"
35#include "text/msg_ids.h"
36#include "field_event.h"
37#include "field_service.h"
38#include "types.h"
39#include "animspr.h"
40#include "ability_ids.h"
41#include "field_scene.h"
42#include "objcmd.h"
43#include "facing_object.h"
44#include "field_obj.h"
45#include "field_effect.h"
46#include "fixed_math.h"
47#include "songs.h"
48#include "item_ids.h"
49
50// Vale's place flags, kept while the party stays in Vale's scenes.
51/// Back from Kalay, a villager has welcomed Isaac home.
52#define FLAG_VALE_WELCOMED_HOME 0x302
53/// Back from Kalay, the villager searching for the Psynergy Stone has told
54/// Isaac it is gone.
55#define FLAG_VALE_PSYNERGY_STONE_GONE_TOLD 0x306
56
57// The stormy night's actors. Actor numbers differ in each placement table;
58// these hold in gValeHome_StormPlacements.
60 /// The two travelers who survived Sol Sanctum, Saturos and Menardi by their
61 /// sprites (0x20 and 0x21, as in vale_kraden.c). "Only the two of us
62 /// survived..."
65 /// Garet as a child, who follows Isaac through the night. "Isaac! Wait!"
67};
68
69// Forward declarations.
70static void Event_MeetSurvivingTravelers(void);
71static void ValeHome_FightTravelers(void);
72static void Event_TravelersLeaveAfterBattle(void);
73static void Event_DepartForQuest(void);
74static void Event_SayThenWait(s32 speaker, s32 frames);
75static void ValeHome_FaceDirectionAndWait(s32 actorId, s32 facing, s32 frames);
76static void ValeHome_FlashPsynergyPalette(struct FieldActor *actor);
77static void ValeHome_SpawnEffectPair(struct FieldActor *parent);
78static void ValeHome_UpdateActor15Psynergy(void);
79static void ValeHome_UpdateActor17Psynergy(void);
80static void ValeHome_UpdateActor20Psynergy(void);
81static void ValeHome_SetProgressFlagsAndExit(void);
82
83static inline void ValeHome_TurnAndWait(s32 actor, s32 facing, s32 frames) {
84 /* FAKEMATCH: forwarding inline for Event_DepartForQuest's three calls;
85 * called directly, the function grows by 4 bytes in tbs-en and builds its
86 * stack arguments in other registers. */
87 ValeHome_FaceDirectionAndWait(actor, facing, frames);
88}
89
90#ifdef UBFIX
91#define VALE_HOME_TURN_AND_WAIT ValeHome_FaceDirectionAndWait
92#else
93static inline s32 ValeHome_TurnAndWaitValue(s32 actor, s32 facing, s32 frames) {
94 /* FAKEMATCH: forwarding inline called as returning a value, its result
95 * discarded; called directly, 30 instructions differ in tbs-en (r5 and r6
96 * swap). */
97 return ((s32 (*)())ValeHome_FaceDirectionAndWait)(actor, facing, frames);
98}
99#define VALE_HOME_TURN_AND_WAIT ValeHome_TurnAndWaitValue
100#endif
101
102#include "common/object_facing.h"
103
105 return gValeHome_Entrances;
106}
107
108const struct SceneRegion *ValeHome_GetRegions(void) { return NULL; }
109
110/// Returns the stormy night's exits while FLAG_VALE_STORM is set, else the
111/// day's.
112const u32 *ValeHome_GetExits(void) {
115 }
116 return gValeHome_Exits;
117}
118
119/// Selects the placements: the stormy night's, the farewell's (entrance 12),
120/// after Kalay, else the day's.
124 }
125 if (gGameState.entrance == 12) {
127 }
130 }
132}
133
134/// Searching the Psynergy Stone restores the party's PP.
135///
136/// Reached by searching cell code 100 in every table but the farewell's.
137/// Clears FLAG_NOTHING_HAPPENS.
138static void Event_UsePsynergyStone(void) {
140 Engine_MessageShowCentered(MsgValeCheckedThePsynergyStone, 1);
144 Engine_MessageShowCentered(MsgValePartyPpRestored, 1);
148}
149
150/// Selects the events: after Kalay, after the party has left, the farewell's
151/// (entrance 12), the stormy night's, else the day's.
152const struct SceneEvent *ValeHome_GetEvents(void) {
155 }
158 }
159 if (gGameState.entrance == 12) {
161 }
164 }
165 return gValeHome_Events;
166}
167
168/// A villager asks whether Isaac meditates on the mountain each day.
169///
170/// Reached by talking to actor 23 on the day the story begins.
171static void Event_AskAboutMeditation(void) {
173 Engine_EventSetMessage(MsgValeMeditateOnMtAlephDaily);
177}
178
179/// A villager recalls the difficult time three years ago and asks Isaac
180/// about it.
181///
182/// Reached by talking to actor 24 on the day the story begins.
183static void Event_RecallThreeYearsAgo(void) {
185 Engine_EventSetMessage(MsgValeADifficultTimeThreeYears);
189}
190
191/// A villager asks whether the travelers went to meet the mayor.
192///
193/// Reached by talking to actor 15 on the day the story begins.
194static void Event_AskAboutTheTravelers(void) {
196 Engine_EventSetMessage(MsgValeDidTheTravelersMeetThe);
200}
201
202/// Before the party sets out, a villager shows Isaac his Psynergy and shakes
203/// the ground; later he asks whether they worry about crossing the land so few.
204///
205/// Reached by talking to actor 17 on the day the story begins and after the
206/// party has left. The display adds and removes the callback
207/// ValeHome_UpdateActor17Psynergy and shakes the map for three seconds.
208static void Event_DemonstratePsynergy(void) {
209 u32 i;
210 s32 message;
211 s32 shakes;
212 s32 *origin;
213
216 message = MsgValeArentWorriedCrossing;
217 Engine_EventSetMessage(message);
218 // "...with just the two of you?", three or four: the flag numbered for a
219 // character is set once that character has joined.
222 }
225 }
227 if (Engine_EventChooseYesNo(0, 0) == 0) {
228 Engine_EventSetMessage(message + 3);
229 } else {
230 Engine_EventSetMessage(message + 4);
231 }
233 } else {
234 origin = ((struct MapScrollWork *)gMapWork[0])->origin;
235 Engine_EventSetMessage(MsgValeShownNewAbility);
241 // Flash the caster before starting the palette cycle and camera shake.
243 shakes = 0;
244 for (i = 0; i < 40; i++) {
247 }
250 for (i = 0; i != 180; i++) {
251 if (Math_RemainderUnsigned(i, 10) == 0) {
252 if ((1 & shakes) != 0) {
253 *origin -= PIXELS(1);
254 } else {
255 *origin += PIXELS(1);
256 }
257 shakes++;
258 }
260 }
261 // End the display and restore the villager's ordinary appearance.
268 Engine_EventSetMessage(MsgValeBeholdPowerPsynergy);
270 }
272}
273
274/// A villager asks whether Isaac can use Psynergy, then about the Wise One,
275/// then about the journey.
276///
277/// Reached by talking to actor 11 on the stormy night and after the party has
278/// left, and to actor 15 after Kalay; the story state picks the question.
279static void Event_AskAboutJourney(void) {
282 Engine_EventSetMessage(MsgValeAnythingInterestingOnYourTrip);
284 if (Engine_EventChooseYesNo(0, 0) == 1) {
286 } else {
287 struct EventWork *work = gEventWork;
288
289 work->message++;
291 }
293 Engine_EventSetMessage(MsgValeYouSawTheWiseOne);
295 } else {
296 Engine_EventSetMessage(MsgValeCanIUsePsynergy);
298 }
300}
301
302/// A villager tells how the stone fell, and the camera looks at it.
303///
304/// Reached by talking to actor 26 after the party has left Vale.
305static void Event_TalkAboutFallenStone(void) {
309 Engine_ActorFaceActor(26, 21, 40);
310 Engine_EventSetMessage(MsgValeTheStoneFellOnThe);
311 Event_SayThenWait(26, 20);
312 Engine_CameraSetSpeed(PIXELS(8) / 5, PIXELS(1) / 5);
313 Engine_CameraMoveTo(PIXELS(337), -1, PIXELS(272), 1);
318 Event_SayThenWait(26, 40);
321}
322
323/// A villager with some Psynergy left lifts actor 20 into the air.
324///
325/// Reached by talking to actor 15 on the stormy night. Adds and removes the
326/// callbacks ValeHome_UpdateActor15Psynergy and
327/// ValeHome_UpdateActor20Psynergy.
329 u32 i;
330 s32 savedMotionFlags;
331 struct FieldActor *levitatingActor;
332
336 Engine_EventSetMessage(MsgValeIHaveSomePsynergyLeft);
337 Event_SayThenWait(15, 20);
339 Actor_SetAttachedEffect(15, 0x102);
341 // Charge the caster's display, then start both palette updates.
343 for (i = 0; i < 40; i++) {
346 }
350 // Suspend ordinary movement while lifting the target a little each frame.
351 levitatingActor = Object_GetById(20);
352 savedMotionFlags = levitatingActor->motionFlags;
353 levitatingActor->motionFlags = 0;
354 for (i = 0; i < 40; i++) {
355 levitatingActor->y.fixed += PIXELS(3) / 32;
357 }
358 levitatingActor->motionFlags = savedMotionFlags;
363 Actor_SetChildValue(15, 0);
364 Actor_SetChildValue(20, 0);
368 Event_ShowMessage(15, 0);
370}
371
372/// On the stormy night, a villager tells Isaac which way the others went, or,
373/// once he has been sent to the elders, to help them.
374///
375/// Reached by talking to actor 16 on the stormy night.
376static void Event_TalkAboutHelping(void) {
380 Engine_EventSetMessage(MsgValeSureHelp);
382 } else {
383 Engine_EventSetMessage(MsgValeWentOffWay);
385 }
387}
388
389/// Back from Kalay, a villager welcomes Isaac home; later he only says this
390/// is Vale.
391///
392/// Reached by talking to actor 11 after Kalay. Sets FLAG_VALE_WELCOMED_HOME.
393static void Event_WelcomeIsaacHome(void) {
396 Engine_EventSetMessage(MsgValeThisIsVale);
397 } else {
398 Engine_EventSetMessage(MsgValeYouCameBackHome);
400 }
401 Event_ShowMessage(11, 0);
403}
404
405/// The villager searching the ground stops and tells Isaac the Psynergy Stone
406/// is gone.
407///
408/// Reached after Kalay by talking to actor 21, or by Mind Read on it until
409/// FLAG_VALE_PSYNERGY_STONE_GONE_TOLD is set; sets it and restarts the search.
410static void Event_PsynergyStoneIsGone(void) {
411 struct FieldActor *actor = Object_GetById(21);
413 actor->targetX = ACTOR_NO_TARGET;
414 actor->targetY = ACTOR_NO_TARGET;
415 actor->targetZ = ACTOR_NO_TARGET;
422 Engine_EventSetMessage(MsgValeThePsynergyStoneIsGone);
432}
433
434#include "common/vale.h"
435
436/// Opens a door's map cells and sends the leader through its threshold.
437static inline void Event_OpenDoorAndWalkThrough(s32 cellX, s32 cellZ, s32 x,
438 s32 z) {
442}
443
444// The doors: walking north into cell code n opens door n and takes exit n
445// (Vale_RequestBackdropExit).
446static void Event_OpenNorthwestDoor(void) {
447 Event_OpenDoorAndWalkThrough(44, 7, 248, 279);
449}
450
451/// Opens the northeast doorway in two stages and walks inside.
452///
453/// Reached by walking north into cell code 2 after Kalay; the other tables
454/// have no door 2.
455static void Event_OpenNortheastDoor(void) {
457 Map_CopyCellsTo(0, 63, 51, 8, 2, 2);
458 Engine_TaskWait(10);
459 Map_CopyCellsTo(2, 63, 51, 8, 2, 2);
460 Engine_TaskWait(10);
465}
466
467/// Enters through the western door in the village's middle row.
468static void Event_OpenCentralWestDoor(void) {
469 Event_OpenDoorAndWalkThrough(43, 15, 230, 407);
471}
472
473/// Enters through the eastern door in the village's middle row.
474static void Event_OpenCentralEastDoor(void) {
475 Event_OpenDoorAndWalkThrough(52, 18, 374, 419);
477}
478
479static void Event_OpenSouthwestDoor(void) {
480 Event_OpenDoorAndWalkThrough(41, 32, 200, 546);
482}
483
484static void Event_OpenWestEdgeDoor(void) {
485 Event_OpenDoorAndWalkThrough(35, 36, 102, 611);
487}
488
489static void Event_OpenSoutheastDoor(void) {
490 Event_OpenDoorAndWalkThrough(51, 39, 358, 670);
492}
493
494/// Leaves by the west passage: stepping on cell code 9 on the stormy night
495/// takes exit 8.
499}
500
501/// Leaves by the south passage once the party has begun its journey.
502///
503/// Reached by stepping on cell code 8; takes exit 10 once FLAG_PARTY_LEFT_VALE
504/// is set, else does nothing.
509 }
510}
511
512/// Whirlwind clears the first target (actor 8).
513///
514/// Reached by Whirlwind on actor 8 by day, until it is cleared; sets
515/// FLAG_VALE_FIRST_WHIRLWIND_TARGET_CLEARED.
518}
519
520/// Whirlwind clears the second target (actor 9).
521///
522/// Reached by Whirlwind on actor 9 by day, until it is cleared; sets
523/// FLAG_VALE_SECOND_WHIRLWIND_TARGET_CLEARED.
526}
527
528/// Whirlwind clears the third target (actor 10).
529///
530/// Reached by Whirlwind on actor 10 by day, until it is cleared; sets
531/// FLAG_VALE_THIRD_WHIRLWIND_TARGET_CLEARED.
534}
535
536/// Arriving: hide the cleared Whirlwind targets, run entrances 97 to 99 (the
537/// return from the travelers' battle and two debug presets), and set up the
538/// storm, the farewell or the village after Kalay.
539///
540/// The scene's initialize entry. Entrance 98 sets FLAG_CHILDHOOD and takes
541/// exit 50; entrance 12 runs Event_DepartForQuest; entrance 19 (and 97)
542/// Event_TravelersLeaveAfterBattle; on the stormy night, once Garet has left
543/// Isaac (FLAG_VALE_STORM_GARET_LEFT), Event_MeetSurvivingTravelers. Once
544/// Isaac has been sent to the elders, it removes the villagers who sent him.
546 struct FieldActor *actor;
547 s32 flag;
548 s32 verticalScale;
549
552 }
555 }
557 Engine_ActorSetPosition(10, 0, 0);
558 }
559 switch (gGameState.entrance) {
560 case 98:
563 return 0;
564 case 99:
566 return 0;
567 case 97:
569 return 0;
570 }
571 verticalScale = 3 * Q16_ONE / 2;
572 actor = Object_GetById(8);
573 actor->scaleY = verticalScale;
574 actor = Object_GetById(9);
575 actor->scaleY = verticalScale;
576 actor = Object_GetById(10);
577 actor->scaleY = verticalScale;
579 Map_CopyCellsTo(97, 2, 80, 5, 2, 2);
580 Map_CopyCellsTo(42, 53, 42, 54, 3, 1);
583 } else {
587 Map_CopyCellAttributes(21, 38, 1, 1, 18, 41);
589 if (flag != 0) {
590 Engine_ActorSetPosition(17, 0, 0);
591 Engine_ActorSetPosition(18, 0, 0);
595 }
596 } else {
598 Actor_SetPosition(16, PIXELS(180), PIXELS(568));
599 Map_CopyCellsTo(92, 2, 80, 5, 2, 2);
600 Map_CopyCellsTo(42, 53, 42, 54, 3, 1);
603 }
604 }
605 if (gGameState.entrance == 12) {
607 } else {
609 actor = Object_GetById(20);
610 actor->scaleX = 3 * Q16_ONE / 10;
611 actor->scaleY = 3 * Q16_ONE / 10;
612 actor = Object_GetById(20);
614 actor = Object_GetById(21);
615 actor->scaleX = 3 * Q16_ONE / 5;
616 actor->scaleY = 3 * Q16_ONE / 5;
618 } else {
620 Actor_SetPosition(21, PIXELS(331), PIXELS(249));
621 actor = Object_GetById(21);
623 }
624 }
626 Engine_ActorSetPosition(26, 0, 0);
627 Engine_ActorSetPosition(22, 0, 0);
628 }
629 if (gGameState.entrance == 19) {
631 } else {
635 } else {
640 }
641 }
642 }
643 }
644 }
645 return 0;
646}
647
648/// Walks a separate scene actor back to the leader, then hides it.
649static inline void ValeHome_RejoinParty(s32 actorId) {
650 struct FieldActor *leader;
651
654 if (leader != NULL) {
655 Engine_ActorSetDestination(actorId, leader->x.part.pixel,
656 leader->z.part.pixel);
657 }
659 Engine_ActorSetPosition(actorId, 0, 0);
660}
661
662/// On the stormy night, villagers send Isaac and his companion to aid the
663/// elders holding back the Boulder. "Go aid the elders!"
664///
665/// Reached by stepping on cell code 20 on the stormy night, until
666/// FLAG_VALE_STORM_SENT_TO_AID_ELDERS is set; sets it.
667static void Event_SentToAidElders(void) {
668 struct FieldActor *leader;
669 s32 skipReply = 0;
670 s32 speechFlags;
671
674 // The camera goes to the villagers by the stone. Actor 19: go aid the
675 // elders, the Boulder is too heavy for them.
677 Camera_SetSpeed(PIXELS(8) / 5, PIXELS(1) / 5);
678 Engine_CameraMoveTo(PIXELS(197), -1, PIXELS(768), 1);
680 Engine_EventSetMessage(MsgValeGoAidElders);
683 // Isaac walks over and Garet steps out of him.
684 Actor_SetSpeed(0, PIXELS(1), PIXELS(1) / 2);
686 Actor_WalkToAndWait(0, 179, 789);
688 if (leader != NULL) {
690 leader->z.fixed);
691 }
696 // Actors 17 and 18 will not let the Boulder destroy the village and go to
697 // help; actor 19 counts on them.
700 Engine_ActorFaceEachOther(17, 18, 0);
710#if TBS_PATCH_4
712#endif
713 Actor_SetSpeed(17, PIXELS(8) / 5, PIXELS(4) / 5);
714 Actor_SetSpeed(18, PIXELS(8) / 5, PIXELS(4) / 5);
715 // The two run off; Isaac and Garet step up to the group.
718#if TBS_PATCH_4
720#endif
730 // Garet calls out to Grandpa and Jenna; Jenna (actor 26) asks
731 // whether they came to help her.
736 Event_SayThenWait(26, 10);
740 // Actor 19 asks whether Jenna told them about Felix. Yes: good boys, Jenna
741 // could use a hand; no: help her regardless.
744 if (Engine_EventChooseYesNo(0, 0) == 1) {
745 skipReply = 1;
747 } else {
750 }
752 if (skipReply != 0) {
754 }
755 // Actor 22, rested, is all charged up; everyone turns to him.
756 speechFlags = SPEAKER_WINDOW_ABOVE;
767 Engine_CameraSetSpeed(PIXELS(6) / 5, PIXELS(3) / 20);
768 Camera_MoveTo(PIXELS(215), -1, PIXELS(758), 1);
770 Engine_CameraSetSpeed(PIXELS(4) / 5, PIXELS(1) / 10);
771 Camera_MoveTo(PIXELS(205), -1, PIXELS(778), 1);
772 // He hops down to them; asked about his Psynergy, he has enough to save
773 // Felix, thanks to the Psynergy Stone.
778 Event_SayThenWait(19, 10);
780 Event_SayThenWait(22, 20);
783 // Actor 19 sends Jenna back with him, and Isaac and Garet to show the way
784 // past the fallen rocks; Jenna thanks Isaac.
786 Event_SayThenWait(speechFlags + 19, 10);
791 Event_SayThenWait(speechFlags + 19, 10);
797 Event_SayThenWait(26, 30);
801 // Garet, Jenna and actor 22 walk into Isaac; actor 19 keeps turning to
802 // watch him.
811 }
812}
813
814/// On the stormy night, Isaac overhears the two travelers who survived Sol
815/// Sanctum. "Only the two of us survived..."
816///
817/// Called by ValeHome_Initialize on the stormy night once
818/// FLAG_VALE_STORM_GARET_LEFT is set; goes on into ValeHome_FightTravelers.
820 struct FieldActor *camera;
821
822 camera = Camera_GetEventObject();
824 Camera_MoveTo(-1, -1, -1, 0);
826 // The screen opens on the storm by the river path; the village music plays
827 // as Isaac walks up and hears the first traveler.
828 Engine_CameraMoveTo(PIXELS(64), PIXELS(144), PIXELS(350), 0);
837 Actor_SetSpeed(0, PIXELS(6) / 5, PIXELS(3) / 5);
838 Engine_ActorWalkToAndWait(0, 93, 343);
839 Engine_EventSetMessage(MsgValeOnlyTwoSurvived);
841 // The travelers' theme starts; the camera rises to them and the second
842 // traveler walks in.
844 camera->motionFlags = 0;
845 Camera_SetSpeed(PIXELS(3), PIXELS(3) / 8);
846 Engine_CameraMoveTo(PIXELS(109), PIXELS(176), PIXELS(281), 1);
854 0);
860 // They talk of Sol Sanctum's fury and its trap switch, of the power of
861 // Alchemy, and of their next attempt on the sanctum.
884}
885
886/// The travelers catch Isaac eavesdropping and fight; win or lose, the party
887/// returns by entrance 19. "You must forget everything you heard."
888///
889/// Called by Event_MeetSurvivingTravelers. Starts encounter 4 of table 12
890/// with both outcomes leading back to this scene's entrance 19, and sets
891/// FLAG_KEEP_MUSIC.
892static void ValeHome_FightTravelers(void) {
893 struct FieldActor *actor;
894 s32 southSouthwestFacing;
895 s32 westFacing;
896 s32 northNortheastFacing;
897
898 // Garet, still out of sight, calls Isaac to wait; the travelers turn and
899 // look down at Isaac.
901 actor = Object_GetById(25);
910 southSouthwestFacing = FACING_SOUTH + FACING_STEP;
912 40);
913 Engine_CameraSetSpeed(PIXELS(3) / 2, PIXELS(3) / 16);
914 Engine_CameraMoveTo(PIXELS(89), PIXELS(176), PIXELS(313), 1);
920 Engine_CameraSetSpeed(PIXELS(4) / 5, PIXELS(1) / 10);
921 Engine_CameraMoveTo(PIXELS(100), PIXELS(144), PIXELS(333), 1);
929 Engine_ActorFaceDirection(ACTOR_FIRST_TRAVELER, southSouthwestFacing, 0);
932 Engine_ActorFaceDirection(ACTOR_SECOND_TRAVELER, southSouthwestFacing, 0);
933 // Garet runs in from the west. The first traveler asks whether Isaac was
934 // eavesdropping; whatever he answers, Garet thinks they look scary.
936 actor = Object_GetById(25);
945 northNortheastFacing = FACING_NORTH + FACING_STEP;
946 ValeHome_FaceDirectionAndWait(0, northNortheastFacing, 10);
950 westFacing = FACING_WEST;
958 ValeHome_FaceDirectionAndWait(ACTOR_STORM_GARET, northNortheastFacing, 40);
965 Engine_ActorFaceDirection(ACTOR_FIRST_TRAVELER, southSouthwestFacing, 0);
967 30);
968 // The travelers: forget everything you heard; we'll help you forget.
971 ValeHome_FaceDirectionAndWait(0, northNortheastFacing, 30);
976 Actor_SetAttachedEffect(0, 0x102);
986 // The confrontation continues in battle; both outcomes return here.
988 {
989 const void *message = &SceneId_ValeHome;
990
991 Event_SetNextDestination((s32)message, 19);
992 Event_SetDefeatDestination((s32)message, 19);
993 }
996}
997
998/// After the battle the travelers leave Isaac and his companion lying in the
999/// storm, and the storm ends.
1000///
1001/// Called by ValeHome_Initialize from entrance 19, after the battle, or 97.
1002/// Clears FLAG_VALE_STORM and takes exit 9.
1004 struct FieldActor *actor;
1005 s32 gravityQ8;
1006
1007 // The screen opens on Isaac and Garet lying beaten in the storm, the
1008 // travelers standing over them.
1011 Camera_MoveTo(-1, -1, -1, 0);
1012 Engine_TaskWait(1);
1013 Engine_CameraMoveTo(PIXELS(64), PIXELS(144), PIXELS(350), 0);
1015 Engine_TaskWait(1);
1016 Actor_SetPosition(0, PIXELS(48), PIXELS(346));
1023 actor = Object_GetById(0);
1024 actor->scaleX = -Q16_ONE;
1025 actor = Object_GetById(0);
1028 actor = Object_GetById(25);
1029 actor->sprite->rotation = 0x1555;
1030 actor = Object_GetById(25);
1032 {
1033 struct EventWork *work = gEventWork;
1034
1036 }
1040 Engine_EventWait(80);
1044 Engine_EventWait(20);
1051 gravityQ8 = 128;
1053 actor->bounce = 0x28f;
1054 actor->gravity = gravityQ8 << 8;
1059 actor->bounce = 0x28f;
1060 actor->gravity = gravityQ8 << 8;
1063 Engine_EventWait(40);
1064 // Three last flashes of lightning, then the storm ends and the screen
1065 // fades slowly out.
1068 Engine_TaskWait(20);
1070 Engine_TaskWait(60);
1072 Engine_TaskWait(20);
1074 Engine_EventWait(40);
1081}
1082
1083/// The villagers give their supplies and farewells before the party leaves
1084/// Vale.
1085///
1086/// Called by ValeHome_Initialize from entrance 12. Restores the party's HP
1087/// and PP, gives a Herb and the Catch Beads (from Dora), and takes exit 10.
1088static void Event_DepartForQuest(void) {
1089 struct FieldActor *actor;
1090 struct EventWork *work;
1091 s32 priorityFlags;
1092 const s32 *faceActions;
1093 const s32 *actor31Actions;
1094 const s32 *departureActions;
1095
1096 // The village gathers at the gate to see Isaac and Garet off; the camera
1097 // starts on two villagers (actors 11 and 12) up the path.
1100 Map_CopyCellsTo(42, 53, 42, 54, 3, 1);
1101 Camera_MoveTo(PIXELS(180), PIXELS(16), PIXELS(618), 0);
1103 Engine_TaskWait(1);
1104 actor = Object_GetById(22);
1106 actor = Object_GetById(23);
1108 actor = Object_GetById(24);
1110 actor = Object_GetById(25);
1112 actor = Object_GetById(26);
1114 actor = Object_GetById(29);
1121 Actor_SetPosition(0, PIXELS(208), PIXELS(814));
1124 Engine_EventWait(80);
1125 // Actor 12 asks why everyone is at the gate; actor 11 says Isaac and Garet
1126 // are leaving on a journey, and wishes he could go.
1127 Actor_ShowEmote(12, EMOTE_IN_FRONT | 1, 40);
1129 Event_SetMessage(MSGNO(MsgValeWhysEveryoneHanging));
1130 Event_SayThenWait(12, 10);
1131 Actor_ShowEmote(11, EMOTE_IN_FRONT | 2, 20);
1133 Event_SayThenWait(11, 10);
1135 Engine_EventWait(10);
1137 Event_SayThenWait(11, 10);
1138 // They walk to the top of the path: it will be dangerous, and everyone is
1139 // down there to say good-bye.
1140 Actor_ShowEmote(12, EMOTE_IN_FRONT | 0, 40);
1141 Actor_SetSpeed(12, PIXELS(4) / 5, PIXELS(2) / 5);
1142 Actor_WalkToAndWait(12, 184, 618);
1144 Event_SayThenWait(12, 20);
1145 Actor_SetSpeed(11, PIXELS(1), PIXELS(1) / 2);
1146 Actor_WalkToAndWait(11, 168, 618);
1149 Event_SayThenWait(11, 20);
1153 Engine_EventWait(10);
1154 Actor_SetSpeed(30, PIXELS(12) / 5, PIXELS(6) / 5);
1155 Actor_SetPosition(30, PIXELS(110), PIXELS(744));
1156 Engine_TaskWait(2);
1159 Engine_EventWait(40);
1160 faceActions = gValeHome_FaceTargetActions;
1162 faceActions);
1164 faceActions);
1166 Engine_ActorStop(11);
1167 Engine_ActorStop(12);
1168 Engine_EventWait(60);
1169 Actor_ShowEmote(11, EMOTE_IN_FRONT | 5, 0);
1170 Actor_ShowEmote(12, EMOTE_IN_FRONT | 5, 120);
1176 Engine_EventWait(20);
1180 // They step down to look over the crowd: Isaac's mother is not there to
1181 // see him off.
1182 Actor_ShowEmote(12, EMOTE_IN_FRONT | 1, 80);
1184 Actor_WalkToAndWait(12, 184, 630);
1185 Engine_EventWait(20);
1189 Actor_ShowEmote(12, EMOTE_IN_FRONT | 1, 40);
1190 Actor_ShowEmote(11, EMOTE_IN_FRONT | 1, 40);
1191 Actor_WalkToAndWait(11, 168, 630);
1192 Engine_EventWait(20);
1196 Actor_ShowEmote(11, EMOTE_IN_FRONT | 1, 40);
1198 Event_SayThenWait(11, 20);
1200 Event_SayThenWait(12, 10);
1201 Actor_ShowEmote(11, EMOTE_IN_FRONT | 0, 20);
1207 Event_SayThenWait(11, 10);
1208 {
1209 struct FieldActor *actor = Object_GetById(30);
1210
1211 if (actor != NULL) {
1212 Engine_ActorSetPosition(31, actor->x.fixed, actor->z.fixed);
1213 }
1214 }
1215 priorityFlags = 0xfe;
1216 Engine_TaskWait(2);
1221 Actor_SetSpeed(31, PIXELS(18) / 5, PIXELS(9) / 5);
1223 actor31Actions = gValeHome_Actor31Actions;
1224 Actor_SetActionScript(31, actor31Actions);
1225 Engine_EventWait(20);
1227 Actor_SetSpeed(30, PIXELS(24) / 5, PIXELS(12) / 5);
1228 Actor_RunActionScriptAndWait(30, actor31Actions);
1229 Engine_EventWait(60);
1230 // Should they say good-bye too? Sure: both run down, and the camera
1231 // follows them to the gate.
1234 Event_SayThenWait(12, 10);
1236 Engine_EventWait(20);
1239 Event_SayThenWait(11, 20);
1241 Engine_EventWait(10);
1243 Engine_EventWait(20);
1244 Actor_SetSpeed(11, PIXELS(12) / 5, PIXELS(6) / 5);
1245 Actor_SetSpeed(12, PIXELS(12) / 5, PIXELS(6) / 5);
1247 Engine_EventWait(10);
1248 Camera_SetSpeed(PIXELS(12) / 5, PIXELS(3) / 10);
1250 Camera_MoveTo(PIXELS(215), PIXELS(16), PIXELS(801), 1);
1251 Engine_EventWait(10);
1255 // Actor 13 counts on Isaac, and on Garet too; the two nod.
1257 Engine_EventWait(20);
1258 Event_SayThenWait(13, 20);
1264 Engine_EventWait(10);
1266 Engine_EventWait(40);
1267 // Actor 16 warns them off water that smells funny and hands over a Herb.
1269 Engine_EventWait(20);
1270 Event_SayThenWait(16, 10);
1271 Actor_SetSpeed(16, PIXELS(1), PIXELS(1) / 2);
1272 Actor_WalkToAndWait(16, 216, 800);
1275 Actor_WalkToAndWait(16, 264, 800);
1277 // Garet protests he knows that, Sis; actor 17 says he will eat anything,
1278 // and Garet jumps.
1279 Actor_ShowEmote(1, EMOTE_IN_FRONT | 2, 40);
1281 Event_SayThenWait(1, 10);
1283 Event_SayThenWait(17, 10);
1285 Actor_ShowEmote(1, EMOTE_IN_FRONT | 3, 20);
1286 ObjectMotion_Launch(1, 4, 60);
1287 // Actor 14: Dora is very late. Everyone wonders; actor 17 remembers.
1289 Engine_EventWait(20);
1291 Event_SayThenWait(14, 60);
1293 Actor_ShowEmote(16, EMOTE_IN_FRONT | 2, 0);
1294 Actor_ShowEmote(17, EMOTE_IN_FRONT | 2, 0);
1295 Actor_ShowEmote(18, EMOTE_IN_FRONT | 2, 0);
1296 Actor_ShowEmote(19, EMOTE_IN_FRONT | 2, 80);
1297 Actor_ShowEmote(17, EMOTE_IN_FRONT | 0, 0);
1298 Event_SayThenWait(17, 60);
1299 // Actor 17 brings the Catch Beads Aunty Dora sent for Isaac; Isaac and
1300 // Garet turn to follow.
1303 Actor_WalkToAndWait(17, 216, 800);
1305 Event_SayThenWait(17, 60);
1309 Actor_WalkToAndWait(17, 272, 816);
1311 // Garet thinks they are all set; actor 16 says think again, it must be hard
1312 // for Dora.
1315 Event_SayThenWait(1, 10);
1318 Actor_ShowEmote(0, EMOTE_IN_FRONT | 1, 60);
1320 Event_SayThenWait(16, 10);
1322 Actor_ShowEmote(1, EMOTE_IN_FRONT | 1, 20);
1324 Event_SayThenWait(16, 10);
1325 // Garet's mother (actor 18) knows how Dora feels: she does not want Isaac
1326 // to go, but knows he must. The crowd nods.
1337 Engine_EventWait(10);
1341 Engine_EventWait(10);
1343 Engine_EventWait(10);
1347 // Actor 15 hops: they will never leave standing around like this, so one
1348 // final farewell.
1349 ObjectMotion_Launch(15, 2, 10);
1350 ObjectMotion_Launch(15, 4, 40);
1351 Event_SayThenWait(15, 10);
1355 Event_SayThenWait(15, 10);
1358 // The crowd nods in three waves, then all jump together: "Farewell!"
1366 Engine_EventWait(10);
1373 Engine_EventWait(10);
1380 Engine_EventWait(80);
1381 ObjectMotion_Launch(11, 4, 0);
1382 ObjectMotion_Launch(14, 4, 0);
1383 ObjectMotion_Launch(17, 4, 0);
1384 ObjectMotion_Launch(20, 4, 0);
1385 ObjectMotion_Launch(23, 4, 0);
1386 ObjectMotion_Launch(26, 4, 0);
1387 ObjectMotion_Launch(29, 4, 0);
1388 ObjectMotion_Launch(12, 4, 0);
1389 ObjectMotion_Launch(15, 4, 0);
1390 ObjectMotion_Launch(18, 4, 0);
1391 ObjectMotion_Launch(21, 4, 0);
1392 ObjectMotion_Launch(24, 4, 0);
1393 ObjectMotion_Launch(27, 4, 0);
1394 ObjectMotion_Launch(13, 4, 0);
1395 ObjectMotion_Launch(16, 4, 0);
1396 ObjectMotion_Launch(19, 4, 0);
1397 ObjectMotion_Launch(22, 4, 0);
1398 ObjectMotion_Launch(25, 4, 0);
1399 ObjectMotion_Launch(28, 4, 0);
1400 Engine_MessageShowCentered(MSGNO(MsgValeFarewell), 1);
1402 Engine_EventWait(80);
1404 {
1405 struct FieldActor *actor = Object_GetById(1);
1406 u8 value = (priorityFlags | actor->priorityFlags);
1407
1408 actor->priorityFlags = value;
1409 }
1411 Actor_ShowEmote(1, EMOTE_IN_FRONT | 2, 80);
1414 Actor_SetSpeed(0, PIXELS(4) / 5, PIXELS(2) / 5);
1415 departureActions = gValeHome_Actor0And1Actions;
1416 Actor_SetActionScript(0, departureActions);
1417 Engine_EventWait(20);
1418 Camera_SetSpeed(PIXELS(2) / 5, PIXELS(1) / 20);
1419 Engine_CameraMoveTo(PIXELS(216), PIXELS(16), PIXELS(905), 1);
1420 Engine_EventWait(20);
1421 Actor_SetSpeed(1, PIXELS(4) / 5, PIXELS(2) / 5);
1422 Actor_SetActionScript(1, departureActions);
1423 Engine_EventWait(60);
1424 work = gEventWork;
1426 work->transitionFrames = 60;
1433}
1434
1435static void Event_SayThenWait(s32 speaker, s32 frames) {
1436 Engine_EventShowMessage(speaker, 0);
1437 Engine_EventWait(frames);
1438}
1439
1440static void ValeHome_FaceDirectionAndWait(s32 actorId, s32 facing, s32 frames) {
1441 Engine_ActorFaceDirection(actorId, facing, 0);
1442 Engine_EventWait(frames);
1443}
1444
1445/// Flashes the caster's palette and emits paired effects every sixteen frames.
1446static void ValeHome_FlashPsynergyPalette(struct FieldActor *actor) {
1447 if ((gFrameCount & 2) != 0) {
1449 } else {
1451 }
1452 if ((gFrameCount & 15) == 0) {
1454 }
1455}
1456
1457/// Cycles six palette banks and emits the caster's paired effects.
1458static void
1460 if ((gFrameCount & 1) != 0) {
1461 s32 palette = Math_RemainderUnsigned(gFrameCount >> 1, 6);
1462 Engine_ObjectSetPartPalettes(actor, palette);
1463 }
1464 if ((gFrameCount & 15) == 0) {
1466 }
1467}
1468
1469/// Cycles the levitated actor through six palette banks.
1470static void ValeHome_CyclePsynergyPalette(struct FieldActor *actor) {
1471 if ((gFrameCount & 1) != 0) {
1472 s32 palette = Math_RemainderUnsigned(gFrameCount >> 1, 6);
1473 Engine_ObjectSetPartPalettes(actor, palette);
1474 }
1475}
1476
1477#include "common/effect_vertical.h"
1478
1479/// Creates the two vertical Psynergy effects using the shared sprite tiles.
1480static void ValeHome_SpawnEffectPair(struct FieldActor *parent) {
1481 struct FieldActor *pair[2];
1482 struct FieldActor *child;
1483 struct AnimationObject *sprite;
1484 struct BattleFxScene *work = gEffectWork;
1485 s32 i;
1486
1488 for (i = 0; i < 2; ++i) {
1489 child = Engine_ObjectCreate(26, parent->x.fixed, parent->y.fixed,
1490 parent->z.fixed);
1491 pair[i] = child;
1492 if (child != NULL) {
1493 child->terrainHeight = parent->terrainHeight;
1494 sprite = child->sprite;
1495 child->motionFlags = 0;
1496 child->timer = 0;
1497 child->linkedObject = parent;
1498 if (sprite != NULL) {
1500 sprite->flags = 0;
1501 Resource_ResetEntry(sprite->slot);
1502 sprite->slot = work->tileSlot;
1503 sprite->retainCacheEntry = 1;
1504 sprite->image.tile =
1505 (gVramBlockCache[sprite->slot].offset >> 5) & 0x3ff;
1506 sprite->image.fullColor = 0;
1507 sprite->image.shape = 1;
1508 sprite->image.size = 2;
1509 sprite->entries[0]->frame = 0;
1510 }
1511 }
1512 }
1513 {
1514 struct FieldActor *effect = pair[0];
1515 struct AnimationObject *effectSprite = effect->sprite;
1516
1517 effect->update = Effect_AnimateVerticalNegative;
1518 effectSprite->image.priority = 2;
1519 }
1520 {
1521 struct FieldActor *effect = pair[1];
1522 struct AnimationObject *effectSprite = effect->sprite;
1523
1524 effectSprite->image.priority = 2;
1525 effect->update = Effect_AnimateVerticalPositive;
1526 effect->priorityFlags = 2;
1527 }
1528}
1529
1530#include "common/effect_psynergy.h"
1531
1532/// Updates the levitating villager's Psynergy display.
1533///
1534/// A callback Event_DemonstrateLevitation adds while the villager lifts.
1537}
1538
1539/// Updates the demonstrating villager's Psynergy display.
1540///
1541/// A callback Event_DemonstratePsynergy adds while the ground shakes.
1544}
1545
1546/// Updates the palette of the levitated actor.
1547///
1548/// A callback Event_DemonstrateLevitation adds while actor 20 rises.
1551}
1552
1553/// Arriving by entrance 99, a debug entrance: sets a preset of story flags,
1554/// which differs by edition, and leaves by exit 40.
1555///
1556/// Called by ValeHome_Initialize from entrance 99. Sets FLAG_NO_ENCOUNTERS
1557/// and flag 0x16d; from the third patch the whole story up to Kalay, before
1558/// it FLAG_TRET_DEFEATED and FLAG_KOLIMA_CURSE_LIFTED.
1561 // XXX: flag 0x16d gates the battle debug key R (plan.c), and the Colosseum
1562 // sets it as Mia takes Jenna's place; a third use would say what it means.
1563 Engine_GameFlagSet(0x16d);
1564#if TBS_PATCH_3
1614#else
1617#endif
1619}
1620
1621// clang-format off
1623 0x1000000, 0x2020101, 0x3030302, 0x5040404, 0x6060505, 0x1000006, 0x3020201, 0x5040403,
1624};
1625
1627 SC_ARG(2),
1628 SC_MOVE(PIXELS(214), 0, PIXELS(721)),
1629 SC_SYNC,
1630 SC_ARG(1),
1631 SC_WAIT(40),
1632 SC_SE(153),
1633 SC_SET(SW_MOTION, 3),
1635 SC_ARG(2),
1636 SC_MOVE(PIXELS(214), 0, PIXELS(763)),
1637 SC_SYNC,
1638 SC_ARG(1),
1639 SC_END,
1640};
1641
1643 SC_SET(SW_SPEED, PIXELS(2)),
1644 SC_SET(SW_ACCEL, PIXELS(2)),
1645 SC_SE(153),
1647 SC_MOVE(PIXELS(114), PIXELS(144), PIXELS(360)),
1648 SC_SYNC,
1650 SC_WAIT(10),
1651 SC_END,
1652};
1653
1655 SC_SET(SW_SPEED, PIXELS(2)),
1656 SC_SET(SW_ACCEL, PIXELS(2)),
1657 SC_SE(153),
1659 SC_MOVE(PIXELS(114), PIXELS(144), PIXELS(343)),
1660 SC_SYNC,
1662 SC_WAIT(10),
1663 SC_END,
1664};
1665
1667 SC_SET(SW_SPEED, PIXELS(2)),
1668 SC_SET(SW_ACCEL, PIXELS(2)),
1669 SC_SE(152),
1671 SC_MOVE(PIXELS(82), PIXELS(144), PIXELS(343)),
1672 SC_SYNC,
1674 SC_WAIT(10),
1675 SC_END,
1676};
1677
1679 SC_SET(SW_SPEED, PIXELS(2)),
1680 SC_SET(SW_ACCEL, PIXELS(2)),
1681 SC_SE(152),
1683 SC_MOVE(PIXELS(82), PIXELS(144), PIXELS(360)),
1684 SC_SYNC,
1686 SC_WAIT(10),
1687 SC_END,
1688};
1689
1691 SC_ARG(5),
1692 SC_WAIT(10),
1693 SC_ARG(6),
1694 SC_SE(153),
1696 SC_MOVE(PIXELS(65), 0, PIXELS(328)),
1697 SC_SYNC,
1698 SC_WAIT(5),
1699 SC_ARG(5),
1700 SC_WAIT(10),
1701 SC_ARG(6),
1702 SC_SE(153),
1704 SC_MOVE(PIXELS(31), 0, PIXELS(338)),
1705 SC_SYNC,
1706 SC_WAIT(5),
1707 SC_ARG(5),
1708 SC_WAIT(10),
1709 SC_ARG(6),
1710 SC_SE(153),
1712 SC_MOVE(0, 0, PIXELS(338)),
1713 SC_SYNC,
1714 SC_POS(0, 0, 0),
1715 SC_END,
1716};
1717
1719 SC_ARG(5),
1720 SC_WAIT(10),
1721 SC_ARG(6),
1723 SC_MOVE(PIXELS(63), 0, PIXELS(374)),
1724 SC_SYNC,
1725 SC_WAIT(5),
1726 SC_ARG(5),
1727 SC_WAIT(10),
1728 SC_ARG(6),
1730 SC_MOVE(PIXELS(17), 0, PIXELS(338)),
1731 SC_SYNC,
1732 SC_WAIT(5),
1733 SC_ARG(5),
1734 SC_WAIT(10),
1735 SC_ARG(6),
1736 SC_SE(153),
1738 SC_MOVE(0, 0, PIXELS(338)),
1739 SC_SYNC,
1740 SC_POS(0, 0, 0),
1741 SC_END,
1742};
1743
1745 SC_CALL(Scene_TurnTowardTarget),
1747};
1748
1750 SC_MOVE(PIXELS(132), 0, PIXELS(636)),
1751 SC_SYNC,
1752 SC_MOVE(PIXELS(171), 0, PIXELS(629)),
1753 SC_SYNC,
1754 SC_MOVE(PIXELS(207), 0, PIXELS(627)),
1755 SC_SYNC,
1756 SC_MOVE(PIXELS(235), 0, PIXELS(625)),
1757 SC_SYNC,
1758 SC_MOVE(PIXELS(261), 0, PIXELS(574)),
1759 SC_SYNC,
1760 SC_MOVE(PIXELS(327), 0, PIXELS(547)),
1761 SC_SYNC,
1762 SC_END,
1763};
1764
1766 SC_MOVE(PIXELS(271), 0, PIXELS(571)),
1767 SC_SYNC,
1768 SC_MOVE(PIXELS(187), 0, PIXELS(577)),
1769 SC_SYNC,
1770 SC_MOVE(PIXELS(154), 0, PIXELS(580)),
1771 SC_SYNC,
1772 SC_MOVE(PIXELS(127), 0, PIXELS(543)),
1773 SC_SYNC,
1774 SC_MOVE(PIXELS(139), 0, PIXELS(498)),
1775 SC_SYNC,
1776 SC_END,
1777};
1778
1780 SC_ARG(2),
1781 SC_MOVE(PIXELS(137), 0, PIXELS(639)),
1782 SC_SYNC,
1783 SC_MOVE(PIXELS(122), 0, PIXELS(692)),
1784 SC_SYNC,
1785 SC_MOVE(PIXELS(141), 0, PIXELS(746)),
1786 SC_SYNC,
1787 SC_SET(SW_SPEED, PIXELS(6) / 5),
1788 SC_SET(SW_ACCEL, PIXELS(3) / 5),
1789 SC_MOVE(PIXELS(148), 0, PIXELS(770)),
1790 SC_SYNC,
1791 SC_ARG(1),
1792 SC_END,
1793};
1794
1796 SC_ARG(2),
1797 SC_MOVE(PIXELS(137), 0, PIXELS(639)),
1798 SC_SYNC,
1799 SC_MOVE(PIXELS(122), 0, PIXELS(692)),
1800 SC_SYNC,
1801 SC_MOVE(PIXELS(141), 0, PIXELS(746)),
1802 SC_SYNC,
1803 SC_SET(SW_SPEED, PIXELS(6) / 5),
1804 SC_SET(SW_ACCEL, PIXELS(3) / 5),
1805 SC_MOVE(PIXELS(164), 0, PIXELS(758)),
1806 SC_SYNC,
1807 SC_ARG(1),
1808 SC_END,
1809};
1810
1812 SC_ARG(2),
1813 SC_MOVE(PIXELS(216), 0, PIXELS(854)),
1814 SC_SYNC,
1815 SC_MOVE(PIXELS(215), 0, PIXELS(921)),
1816 SC_SYNC,
1817 SC_POS(0, 0, 0),
1818 SC_END,
1819};
1820
1822 SC_SET(SW_SPEED, PIXELS(1) / 2),
1823 SC_SET(SW_ACCEL, PIXELS(1) / 20),
1824 SC_SET(SW_COLLISION, 3),
1825 SC_LABEL(1),
1826 SC_ARG(2),
1827 SC_WANDER_HOME(0x40000, 0x80000, 0x100000),
1828 SC_SYNC,
1829 SC_ARG(1),
1830 SC_WAIT(20),
1831 SC_ARG(2),
1832 SC_WANDER_HOME(0x40000, 0x80000, 0x100000),
1833 SC_SYNC,
1834 SC_ARG(1),
1835 SC_WAIT(20),
1836 SC_ARG(2),
1837 SC_WANDER_HOME(0x40000, 0x80000, 0x100000),
1838 SC_SYNC,
1839 SC_ARG(1),
1840 SC_WAIT(60),
1842 SC_END,
1843};
1844
1846 SC_ARG(2),
1847 SC_MOVE(PIXELS(148), 0, PIXELS(758)),
1848 SC_SYNC,
1849 SC_MOVE(PIXELS(128), 0, PIXELS(709)),
1850 SC_SYNC,
1851 SC_MOVE(PIXELS(129), 0, PIXELS(647)),
1852 SC_SYNC,
1853 SC_ARG(1),
1854 SC_POS(0, 0, 0),
1855 SC_END,
1856};
1857
1859 SC_ARG(2),
1860 SC_MOVE(PIXELS(196), 0, PIXELS(774)),
1861 SC_SYNC,
1862 SC_ARG(1),
1863 SC_END,
1864};
1865
1867 SC_ARG(2),
1868 SC_MOVE(PIXELS(196), 0, PIXELS(790)),
1869 SC_SYNC,
1870 SC_ARG(1),
1871 SC_END,
1872};
1873
1875 { 0, CONDITION_ALWAYS, 248, 0, 295, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1876 { 1, CONDITION_ALWAYS, 248, 0, 295, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1877 { 2, CONDITION_ALWAYS, 352, 0, 308, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1878 { 3, CONDITION_ALWAYS, 230, 0, 423, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1879 { 4, CONDITION_ALWAYS, 374, 0, 435, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1880 { 5, CONDITION_ALWAYS, 200, 0, 562, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1881 { 6, CONDITION_ALWAYS, 102, 0, 627, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1882 { 7, CONDITION_ALWAYS, 358, 0, 678, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1883 { 8, CONDITION_ALWAYS, 27, 0, 338, FACING_EAST, 0, -1, -1, -1, -1, 0 },
1884 { 10, CONDITION_ALWAYS, 217, 0, 843, FACING_NORTH, 0, -1, -1, -1, -1, 0 },
1885 { 11, CONDITION_ALWAYS, 186, 0, 474, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
1886 { 12, CONDITION_ALWAYS, 180, 0, 618, FACING_NORTH, 0, -1, -1, -1, -1, 0 },
1887 { 15, CONDITION_ALWAYS, 184, 0, 472, FACING_NORTH, 0, -1, -1, -1, -1, 0 },
1888 { 19, CONDITION_ALWAYS, 27, 0, 338, FACING_EAST, 0, -1, -1, -1, -1, 0 },
1889 { SCENE_TABLE_END },
1890};
1891
1893 SCENE_EXITS(5),
1894 SCENE_EXIT(1, 7, 8),
1895 SCENE_EXIT(2, 8, 3),
1896 SCENE_EXIT(3, 7, 3),
1897 SCENE_EXIT(4, 7, 7),
1898 SCENE_EXIT(5, 7, 4),
1899 SCENE_EXIT(6, 8, 1),
1900 SCENE_EXIT(7, 8, 4),
1901 SCENE_EXIT(8, 4, 5),
1902 SCENE_EXIT(9, 0, 1),
1903 SCENE_EXIT(10, 2, 1),
1904 SCENE_EXIT(11, 28, 5),
1905 SCENE_EXIT(50, 8, 20),
1906#if !TBS_PATCH_3
1907 SCENE_EXIT(40, 30, 1),
1908#else
1909 SCENE_EXIT(40, 12, 0),
1910#endif
1912};
1913
1915 SCENE_EXITS(5),
1916 SCENE_EXIT(1, 7, 8),
1917 SCENE_EXIT(2, 8, 3),
1918 SCENE_EXIT(3, 7, 3),
1919 SCENE_EXIT(4, 7, 7),
1920 SCENE_EXIT(5, 7, 4),
1921 SCENE_EXIT(6, 8, 1),
1922 SCENE_EXIT(7, 8, 4),
1923 SCENE_EXIT(8, 3, 5),
1924 SCENE_EXIT(9, 0, 1),
1926};
1927
1930 PIXELS(186), 0, PIXELS(460), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1932 PIXELS(252), 0, PIXELS(480), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1934 PIXELS(408), 0, PIXELS(560), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1935 { 0x67, CONDITION_ALWAYS, 3,
1936 PIXELS(392), 0, PIXELS(712), FACING_NORTH, TALK_FACE_PARTY, 0 },
1944 PIXELS(168), 0, PIXELS(600), FACING_SOUTH, TALK_FACE_PARTY, 0 },
1946 PIXELS(184), 0, PIXELS(600), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
1950 PIXELS(296), 0, PIXELS(568), FACING_EAST, TALK_FACE_PARTY, 0 },
1952 0, 0, 0, FACING_SOUTHWEST, 3, 0 },
1954 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
1956 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
1958 0, 0, 0, FACING_NORTH, TALK_FACE_PARTY, 0 },
1960 PIXELS(240), 0, PIXELS(760), FACING_NORTH + FACING_STEP, TALK_FACE_PARTY, 0 },
1964 PIXELS(1608), 0, PIXELS(1608), FACING_SOUTH, TALK_FACE_PARTY, 0 },
1966 PIXELS(370), 0, PIXELS(319), FACING_WEST, TALK_FACE_PARTY, 0 },
1968 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
1970 0, 0, 0, FACING_NORTHEAST, TALK_FACE_PARTY, 0 },
1971 { SCENE_TABLE_END },
1972};
1973
1976 PIXELS(186), 0, PIXELS(460), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1978 PIXELS(252), 0, PIXELS(480), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1980 PIXELS(408), 0, PIXELS(560), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1981 { 0x67, CONDITION_ALWAYS, 3,
1982 PIXELS(249), 0, PIXELS(628), FACING_EAST, TALK_FACE_PARTY, 0 },
1984 PIXELS(214), 0, PIXELS(635), FACING_SOUTH, TALK_FACE_PARTY, 0 },
1986 PIXELS(294), 0, PIXELS(670), FACING_SOUTH, TALK_KEEP_FACING, 0 },
1987 { 0x6a, CONDITION_ALWAYS, 3,
1988 PIXELS(136), 0, PIXELS(678), FACING_SOUTH, TALK_FACE_PARTY, 0 },
1990 PIXELS(87), 0, PIXELS(744), FACING_SOUTH, TALK_FACE_PARTY, 0 },
1992 PIXELS(173), 0, PIXELS(568), FACING_SOUTH, TALK_FACE_PARTY, 0 },
1995#if TBS_PATCH_4
1998#else
2001#endif
2003 PIXELS(250), 0, PIXELS(773), FACING_SOUTHWEST, 3, 0 },
2005 PIXELS(56), 0, PIXELS(729), FACING_SOUTH, TALK_FACE_PARTY, 0 },
2007 PIXELS(56), 0, PIXELS(729), FACING_SOUTH, TALK_FACE_PARTY, 0 },
2009 PIXELS(215), 0, PIXELS(709), FACING_NORTH, TALK_FACE_PARTY, 0 },
2011 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
2013 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
2015 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
2017 PIXELS(234), 0, PIXELS(786), FACING_NORTHEAST, TALK_FACE_PARTY, 0 },
2018 { SCENE_TABLE_END },
2019};
2020
2023 PIXELS(186), 0, PIXELS(460), FACING_SOUTH, TALK_KEEP_FACING, 0 },
2025 PIXELS(252), 0, PIXELS(480), FACING_SOUTH, TALK_KEEP_FACING, 0 },
2027 PIXELS(408), 0, PIXELS(560), FACING_SOUTH, TALK_KEEP_FACING, 0 },
2029 PIXELS(225), 0, PIXELS(814), FACING_NORTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2033 PIXELS(184), 0, PIXELS(607), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2039 PIXELS(216), 0, PIXELS(778), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2045 PIXELS(252), 0, PIXELS(787), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2047 PIXELS(234), 0, PIXELS(781), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2049 PIXELS(268), 0, PIXELS(742), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2055 PIXELS(246), 0, PIXELS(762), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2057 PIXELS(227), 0, PIXELS(760), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2063 PIXELS(161), 0, PIXELS(790), FACING_EAST + FACING_STEP, TALK_FACE_PARTY, 0 },
2065 PIXELS(171), 0, PIXELS(815), FACING_EAST + FACING_STEP, TALK_FACE_PARTY, 0 },
2069 0, 0, 0, FACING_NORTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2071 0, 0, 0, FACING_WEST + FACING_STEP, TALK_FACE_PARTY, 0 },
2072 { SCENE_TABLE_END },
2073};
2074
2077 PIXELS(186), 0, PIXELS(460), FACING_SOUTH, TALK_KEEP_FACING, 0 },
2079 PIXELS(252), 0, PIXELS(480), FACING_SOUTH, TALK_KEEP_FACING, 0 },
2081 PIXELS(408), 0, PIXELS(560), FACING_SOUTH, TALK_KEEP_FACING, 0 },
2083 PIXELS(217), 0, PIXELS(804), FACING_WEST, TALK_FACE_PARTY, 0 },
2085 PIXELS(107), 0, PIXELS(765), FACING_EAST, TALK_FACE_PARTY, 0 },
2090 { 0x67, CONDITION_ALWAYS, 3,
2091 PIXELS(391), 0, PIXELS(716), FACING_NORTH, TALK_FACE_PARTY, 0 },
2093 PIXELS(56), 0, PIXELS(617), FACING_NORTH + FACING_STEP, 3, 0 },
2095 PIXELS(166), 0, PIXELS(603), FACING_SOUTH, TALK_FACE_PARTY, 0 },
2097 PIXELS(176), 0, PIXELS(568), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2099 PIXELS(315), 0, PIXELS(823), FACING_SOUTH + FACING_STEP, TALK_FACE_PARTY, 0 },
2101 PIXELS(287), 0, PIXELS(571), FACING_NORTH, TALK_FACE_PARTY, 0 },
2103 PIXELS(370), 0, PIXELS(319), FACING_WEST, TALK_KEEP_FACING, 0 },
2104 { SCENE_TABLE_END },
2105};
2106
2108 { EVENT_TALK, 13, CONDITION_ALWAYS, MSGNO(MsgValeQuietDay) },
2109 { EVENT_TALK, 14, CONDITION_ALWAYS, MSGNO(MsgValeKradenHadVisitors) },
2112 { EVENT_TALK, 11, CONDITION_ALWAYS, MSGNO(MsgValeChosenPeople) },
2113 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgValeProudOfAdeptGrandfather) },
2115 { EVENT_TALK, 16, CONDITION_ALWAYS, MSGNO(MsgValePracticePsynergy) },
2117 { EVENT_TALK, 18, CONDITION_ALWAYS, MSGNO(MsgValeWalkToRecoverPsynergy) },
2118 { EVENT_TALK, 26, CONDITION_ALWAYS, MSGNO(MsgValeFoodStoredForWinter) },
2126 { EVENT_EXIT, 9, CONDITION_ALWAYS, 8 },
2127 { EVENT_EXIT, 11, CONDITION_ALWAYS, 11 },
2132 { SCENE_EVENTS_END },
2133};
2134
2137 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgValeOldWomanCannotUsePsynergy) },
2138 { EVENT_TALK, 13, CONDITION_ALWAYS, MSGNO(MsgValeExhaustedFromFallingRocks) },
2139 { EVENT_TALK, 14, CONDITION_ALWAYS, MSGNO(MsgValeFelixFellInRiver) },
2142 { EVENT_TALK, 19, CONDITION_ALWAYS, MSGNO(MsgValeRaceAgainstTime) },
2152 { SCENE_EVENTS_END },
2153};
2154
2156 { SCENE_EVENTS_END },
2157};
2158
2160 { EVENT_TALK, 13, CONDITION_ALWAYS, MSGNO(MsgValeTremorsSettled) },
2161 { EVENT_TALK, 14, CONDITION_ALWAYS, MSGNO(MsgValeRoadToVault) },
2162 { EVENT_TALK, 23, CONDITION_ALWAYS, MSGNO(MsgValeRoadToGomaRange) },
2163 { EVENT_TALK, 24, CONDITION_ALWAYS, MSGNO(MsgValePsynergyStonePowder) },
2165 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgValeLunpaFoundedNorthernTown) },
2166 { EVENT_TALK, 15, CONDITION_ALWAYS, MSGNO(MsgValeDoraHasBeenCrying) },
2167 { EVENT_TALK, 16, CONDITION_ALWAYS, MSGNO(MsgValeStonesScatteredByEruption) },
2169 { EVENT_TALK, 18, CONDITION_ALWAYS, MSGNO(MsgValeReplenishPsynergyBeforeDungeon) },
2171 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 13, CONDITION_ALWAYS, MSGNO(MsgValeWorriedAboutAnotherEruption) },
2172 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 14, CONDITION_ALWAYS, MSGNO(MsgValeVaultUndergroundPath) },
2173 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 23, CONDITION_ALWAYS, MSGNO(MsgValeGomaWinterCold) },
2174 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 24, CONDITION_ALWAYS, MSGNO(MsgValeStonesPowerAleph) },
2175 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 11, CONDITION_ALWAYS, MSGNO(MsgValeProofOfWiseOne) },
2176 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 12, CONDITION_ALWAYS, MSGNO(MsgValeLunpaThievesChanged) },
2177 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 15, CONDITION_ALWAYS, MSGNO(MsgValeDoraMustBeLonely) },
2178 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 16, CONDITION_ALWAYS, MSGNO(MsgValeLuckyToFindPsynergyStones) },
2179 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 17, CONDITION_ALWAYS, MSGNO(MsgValeComeBackAlive) },
2180 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 18, CONDITION_ALWAYS, MSGNO(MsgValeRecoverPsynergyByWalking) },
2181 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 26, CONDITION_ALWAYS, MSGNO(MsgValeStonesReplenishPsynergy) },
2189 { EVENT_EXIT, 9, CONDITION_ALWAYS, 8 },
2190 { EVENT_EXIT, 11, CONDITION_ALWAYS, 11 },
2195 { SCENE_EVENTS_END },
2196};
2197
2200 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgValeCameBackSooner) },
2201 { EVENT_TALK, 13, CONDITION_ALWAYS, MSGNO(MsgValeMadeFriendsOnJourney) },
2202 { EVENT_TALK, 14, CONDITION_ALWAYS, MSGNO(MsgValeRiverHeatedAndCooled) },
2204 { EVENT_TALK, 16, CONDITION_ALWAYS, MSGNO(MsgValeReturnHowHaveYouBeen) },
2205 { EVENT_TALK, 17, CONDITION_ALWAYS, MSGNO(MsgValeWelcomeHome) },
2206 { EVENT_TALK, 18, CONDITION_ALWAYS, MSGNO(MsgValeWantToMakeFriends) },
2207 { EVENT_TALK, 19, CONDITION_ALWAYS, MSGNO(MsgValeEruptionMadeMess) },
2208 { EVENT_TALK, 20, CONDITION_ALWAYS, MSGNO(MsgValeNorthwestCrack) },
2210 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 11, CONDITION_ALWAYS, MSGNO(MsgValeSurprisedByEarlyReturn) },
2211 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 12, CONDITION_ALWAYS, MSGNO(MsgValeIsaacHasGrown) },
2212 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 13, CONDITION_ALWAYS, MSGNO(MsgValeNewFriendsAreAdepts) },
2213 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 14, CONDITION_ALWAYS, MSGNO(MsgValeEruptionHeatsRiver) },
2214 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 15, CONDITION_ALWAYS, MSGNO(MsgValeStrangeEventsElsewhere) },
2215 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 16, CONDITION_ALWAYS, MSGNO(MsgValeWhenDidYouReturn) },
2216 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 17, CONDITION_ALWAYS, MSGNO(MsgValePlayTogetherAgain) },
2217 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 18, CONDITION_ALWAYS, MSGNO(MsgValeWantToJourney) },
2218 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 19, CONDITION_ALWAYS, MSGNO(MsgValeLavaBurntOtherSide) },
2219 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 20, CONDITION_ALWAYS, MSGNO(MsgValeCrackWidening) },
2221 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 21, CONDITION_ALWAYS, MSGNO(MsgValeEruptionTooMuchForPeople) },
2230 { EVENT_EXIT, 9, CONDITION_ALWAYS, 8 },
2231 { EVENT_EXIT, 11, CONDITION_ALWAYS, 11 },
2236 { SCENE_EVENTS_END },
2237};
2238
2240 MAP_CELL_STEP(0, 57, 2, 2, 1), MAP_CELL_STEP(0, 59, 2, 2, 1), MAP_CELL_STEP(2, 59, 2, 2, 1), MAP_CELL_STEPS_END,
2241};
2242// clang-format on
Ability numbers, named from the English release.
@ ABILITY_MIND_READ
Definition ability_ids.h:16
@ ABILITY_WHIRLWIND
Definition ability_ids.h:13
void ObjectMotion_Launch(u32 objectId, s32 speed, s32 frames)
The event command "actor jump": throws the actor upward at speed pixels per frame with a jump sound (...
void Object_RefreshSelectorById(u32 objectId)
Waits, at most 300 frames, for an actor's script to reach its end (command 0x10).
void Object_LinkObjectAndSetCallback(u32 objectId, u32 linkedObjectId)
Makes an actor follow another (the linked action script): writes its linkedObject.
struct FieldActor * Object_GetById(s32 actor)
Returns an actor, or NULL if it does not exist.
s32 AnimationObjects_SelectAnimation(struct AnimationObject *sprite, s32 animation)
Starts animation flags & 0x7f on every layer of a sprite (bit 7 keeps each layer's place and timer),...
Definition animation.c:317
Animated sprites: their layers, frames and colour modes, and the resource slots they draw from.
void Camera_WaitForArrival(void)
The event command "camera wait for move": waits (at most 600 frames) for the camera to arrive,...
Definition camera.c:125
struct FieldActor * Camera_GetEventObject(void)
The event command "get view centre": returns the camera object.
Definition camera.c:133
Character numbers, with each character's Japanese name.
#define GARET
Jerald.
#define MIA
Mary.
#define IVAN
Ivan.
void Engine_ActorSetSpriteFlags(struct FieldActor *, s32)
struct FieldActor * Engine_ObjectCreate(s32, s32, s32, s32)
The engine calls the debug menus import, and their palette swatch tiles.
static s32 FieldScheduler_AddCallback(SchedulerCallback callback, s32 priority)
Registers a main-image scheduler callback.
Definition engine_call.h:36
FacingObject, the view of an object that turns to face a target.
Field effects, their scripts and the flags that spawn them.
The scene script layer: the engine services a scene's events call, declared once (Engine_EventBegin,...
@ ANIM_WALK
Definition field_event.h:44
@ ANIM_STAND
Definition field_event.h:43
@ ANIM_NOD
Definition field_event.h:45
@ ANIM_SHAKE_HEAD
Definition field_event.h:46
#define SPEAKER_PORTRAIT_LEFT
Definition field_event.h:54
u32 Math_RemainderUnsigned(u32 dividend, u32 divisor)
void Engine_ActorFaceActor(s32 actor, s32 target, s32 frames)
static void Actor_FaceDirection(s32 actor, s32 facing, s32 frames)
void Engine_ActorSetAnimationAndWait(s32 actor, s32 animation)
static void Map_AnimateCells(const u16 *steps, s32 destX, s32 destY)
#define SPEAKER_WINDOW_ABOVE
Definition field_event.h:56
void Engine_ActorSetSpritePriority(s32 actor, s32 priority)
static void Event_ShowMessageAndWait(s32 speaker, s32 flags, s32 frames)
static void Actor_SetBuiltinAction(s32 actor, s32 action)
s32 Engine_EventChooseYesNo(s32 actor, s32 flags)
void Engine_MessageShowCentered(s32 message, s32 flags)
void Engine_ObjectSetPartPalettes(struct FieldActor *object, s32 palette)
s32 Engine_PartyGiveItem(s32 item, s32 flags)
void Engine_EventShowMessageAndWait(s32 speaker, s32 flags, s32 frames)
#define GameFlag_IsSet
#define SPEAKER_PORTRAIT_RIGHT
Definition field_event.h:55
void Engine_CameraSetSpeed(s32 speed, s32 acceleration)
static void Actor_WalkToAndWait(s32 actor, s32 x, s32 z)
static void Camera_SetSpeed(s32 speed, s32 acceleration)
void Engine_CameraMoveTo(s32 fixed_x, s32 fixed_y, s32 fixed_z, s32 pan)
#define EMOTE_IN_FRONT
Definition field_event.h:49
#define MAP_CELL_STEP(srcX, srcY, width, height, frames)
Definition field_event.h:59
void Engine_ActorSetSpeed(s32 actor, s32 speed, s32 acceleration)
void Engine_ActorFaceDirection(s32 actor, s32 facing, s32 frames)
void Engine_EventCloseScreen(void)
void Engine_ActorSetDestination(s32 actor, s32 x, s32 z)
static void Actor_RunActionScriptAndWait(s32 actor, const s32 *script)
Runs a script, waiting at most 300 frames for its final command.
static void Map_CopyCellsTo(s32 srcX, s32 srcY, s32 destX, s32 destY, s32 width, s32 height)
void Engine_ActorWalkToAndWait(s32 actor, s32 x, s32 z)
#define SPEAKER_WINDOW_BELOW
Definition field_event.h:57
static void Actor_WalkTo(s32 actor, s32 x, s32 z)
void Engine_EventWaitForScreen(void)
#define GameFlag_Set
static void Actor_ShowEmote(s32 actor, s32 emote, s32 frames)
s32 Engine_EventAskYesNo(s32 speaker, s32 flags)
void Engine_EventOpenScreen(void)
s32 Engine_EventOpenMessage(s32 speaker, s32 flags)
void Engine_GameFlagSet(s32 flag)
void Engine_GameFlagClear(s32 flag)
static void Actor_SetActionScript(s32 actor, const s32 *script)
The engine encodes either a built-in action or an action-script address.
void Engine_ActorWaitForMove(s32 actor)
static void Map_CopyCellAttributes(s32 srcX, s32 srcY, s32 width, s32 height, s32 destX, s32 destY)
void Engine_ActorStop(s32 actor)
void Engine_ActorRunRepeatedMotion(s32 actor, s32 repeats)
void Engine_ActorWalkTo(s32 actor, s32 x, s32 z)
static void Event_ShowMessage(s32 speaker, s32 flags)
void Engine_ActorSetAttachedEffect(s32 actor, s32 effect)
static void Event_PlayCue(s32 cue)
void Engine_ActorSetChildValue(s32 actor, s32 value)
#define MAP_CELL_STEPS_END
Definition field_event.h:61
static void Actor_SetChildValue(s32 actor, s32 value)
s32 Engine_GameFlagIsSet(s32 flag)
void Engine_ActorStartRepeatedMotion(s32 actor, s32 repeats)
static void Actor_SetSpeed(s32 actor, s32 speed, s32 acceleration)
void Engine_MapRedraw(void)
static void Camera_MoveTo(s32 fixed_x, s32 fixed_y, s32 fixed_z, s32 pan)
static void Actor_SetPosition(s32 actor, s32 fixed_x, s32 fixed_z)
void Engine_ActorFaceEachOther(s32 actor, s32 other, s32 frames)
void Engine_EventWait(s32 frames)
static void Actor_SetAttachedEffect(s32 actor, s32 effect)
Field objects and actors, and the scene transition styles.
@ ACTOR_LINK_KEEP_MOTION
Definition field_obj.h:148
@ TRANSITION_BACKDROP_FADE
Definition field_obj.h:16
@ ACTOR_PRIORITY_AUTOMATIC
The sprite takes its priority from the map cell under it.
Definition field_obj.h:153
#define ACTOR_NO_TARGET
A target coordinate that is not set: the object has no target.
Definition field_obj.h:145
#define SCENE_TRANSITION(style, variant)
Definition field_obj.h:20
The scene table formats: entrances, exits, placements and events, and the macros that write them.
#define SCENE_EVENTS_END
@ EVENT_TOUCH
@ EVENT_EXIT
@ EVENT_TALK
@ FACING_STEP
Definition field_scene.h:36
#define SCENE_EXITS(scene)
Definition field_scene.h:72
#define SCENE_EXIT(exit, scene, entrance)
Definition field_scene.h:73
@ ACTOR_PARTY_LEADER
@ SCENE_TABLE_END
Definition field_scene.h:43
@ CONDITION_ALWAYS
Definition field_scene.h:44
@ FLAG_PARTY_LEFT_VALE
Definition field_scene.h:50
@ TALK_KEEP_FACING
@ TALK_FACE_PARTY
@ TALK_FACE_PARTY_AND_BACK
#define PSYNERGY_ON_ACTOR(ability)
#define EVENT_SCRIPT(script)
@ ACTOR_WANDER
@ ACTOR_STAND
#define SEARCH(target)
#define SCENE_EXITS_END
Definition field_scene.h:77
#define TOUCH_WALKING_INTO(facing)
@ FACING_NORTHEAST
Definition field_scene.h:33
@ FACING_EAST
Definition field_scene.h:26
@ FACING_SOUTHEAST
Definition field_scene.h:27
@ FACING_NORTH
Definition field_scene.h:32
@ FACING_SOUTHWEST
Definition field_scene.h:29
@ FACING_NORTHWEST
Definition field_scene.h:31
@ FACING_SOUTH
Definition field_scene.h:28
@ FACING_WEST
Definition field_scene.h:30
#define PIXELS(value)
@ SEARCH_UNNAMED
The scene service layer: one typed inline for each engine service a scene calls by its own name,...
static void FieldObject_SetTargetAndCallback(s32 object, s32 target, const s32 *actions)
static s32 FieldScheduler_AddOrUpdateCallback(SchedulerCallback callback, s32 priority)
Calls the main-image scheduler through engine_call.h.
static void Event_SetMessage(s32 message)
16.16 fixed-point constants, sine and cosine, and the library division.
#define Q16_ONE
One in the engine's signed 16.16 fixed-point format.
Definition fixed_math.h:10
Game flags, named where their meaning is shown.
#define FLAG_MET_SATUROS_AND_MENARDI
Definition flags.h:99
#define FLAG_VALE_STORM_SECOND_ROCK_FELL
Definition flags.h:474
#define FLAG_NO_ENCOUNTERS
No random encounters while set (Encounter_SelectEnemyGroup), unless flag 0x15f is set; debug entrance...
Definition flags.h:59
#define FLAG_OVERHEARD_KRADEN
Kraden wondered aloud about the strangers.
Definition flags.h:445
#define FLAG_VALE_STORM_RIVER_GATHERING_SEEN
Jenna came back to the river and the scene there ended with ValeStorm_ShowBoulderSweepingDownriver.
Definition flags.h:489
#define FLAG_GARET_CAME_HOME
Back from Kalay, Garet surprised his family at home.
Definition flags.h:524
#define FLAG_VALE_STORM_FOURTH_ROCK_FELL
Definition flags.h:476
#define FLAG_SOL_SANCTUM_FIRST_SMALL_JEWEL_FOUND
The chests: the Small Jewel for each minotaur relief, and a Herb.
Definition flags.h:686
#define FLAG_VALE_STORM_HEARD_GARET
Isaac heard Garet struggling with his things.
Definition flags.h:482
#define FLAG_KEEP_MUSIC
The next scene keeps the music that is playing; scene.c clears FLAG_KEEP_MUSIC as it does,...
Definition flags.h:35
#define FLAG_VALE_STORM_FIRST_ROCK_FELL
The four rocks that fall across the paths (actors 11 to 14).
Definition flags.h:473
#define FLAG_SOL_SANCTUM_SECOND_GEM_PLACED
Definition flags.h:101
#define FLAG_VALE_THIRD_WHIRLWIND_TARGET_CLEARED
Definition flags.h:504
#define FLAG_VALE_STORM_GARET_JOINED
Definition flags.h:483
#define FLAG_REACHED_KALAY
Set whenever Kalay is entered; Vale's villagers then talk of the party's journey.
Definition flags.h:441
#define FLAG_SANCTUM_VISIT_PLANNED
Definition flags.h:96
#define FLAG_SOL_SANCTUM_CENTER_STATUE_MOVED
Definition flags.h:664
#define FLAG_IN_PARTY(character)
Flags 0 to 7: the character with that id (character_ids.h) is in the party (Party_AddActiveOwner).
Definition flags.h:9
#define FLAG_SOL_SANCTUM_MERCURY_STAR_BAGGED
Definition flags.h:679
#define FLAG_VALE_ASKED_IF_GOING_TO_KRADEN
A villager asked whether Isaac is going to Kraden's cottage.
Definition flags.h:461
#define FLAG_VALE_FIRST_WHIRLWIND_TARGET_CLEARED
Whirlwind cleared the three targets (actors 8 to 10) in the village.
Definition flags.h:502
#define FLAG_VALE_BOULDER_FELL
Definition flags.h:484
#define FLAG_NOTHING_HAPPENS
Set before an action on the field; still set afterwards, nothing came of it and the game says so.
Definition flags.h:51
#define FLAG_SOL_SANCTUM_ERUPTED
The volcano has erupted and the sanctum's rooms rumble and shake.
Definition flags.h:660
#define FLAG_VALE_FAREWELL_HERB_RECEIVED
The item shopkeeper gave Isaac a Herb as a farewell gift.
Definition flags.h:522
#define FLAG_SOL_SANCTUM_SECOND_SMALL_JEWEL_FOUND
Definition flags.h:687
#define FLAG_VALE_ROCKSLIDE_SURVIVOR_ESCAPED
He found he was unhurt and ran to the plaza.
Definition flags.h:449
#define FLAG_VALE_SECOND_WHIRLWIND_TARGET_CLEARED
Definition flags.h:503
#define FLAG_SOL_SANCTUM_STAR_ROOM_PASSAGE_OPEN
The floor has opened over the way up to the Elemental Star room.
Definition flags.h:666
#define FLAG_SOL_SANCTUM_LUNA_PICTURE_CHANGED
Kraden has seen the picture of Luna change to Sol.
Definition flags.h:651
#define FLAG_SOL_SANCTUM_FLOOR_SYMBOL_SEEN
Kraden has seen the symbol on the floor change.
Definition flags.h:653
#define FLAG_SOL_SANCTUM_STAR_ROOM_COLLAPSED
Definition flags.h:682
#define FLAG_SOL_SANCTUM_INNER_STATUES_SEEN
Kraden has seen the statues out of his reach behind the blocks.
Definition flags.h:671
#define FLAG_SOL_SANCTUM_NORTHEAST_SEAL_OPEN
Definition flags.h:646
#define FLAG_VALE_STORM
The prologue's stormy night: lightning over Vale, the rockslide and the monsters loose in the village...
Definition flags.h:438
#define FLAG_VALE_STORM_BUMPED_INTO_VILLAGER
A villager running out of his house shoved Isaac.
Definition flags.h:479
#define FLAG_SOL_SANCTUM_SOUTHEAST_SEAL_OPEN
Definition flags.h:648
#define FLAG_SOL_SANCTUM_FOUND
Crossbone Isle's pursuer room: a pursuer is after the leader.
Definition flags.h:641
#define FLAG_SOL_SANCTUM_ENTERED
Definition flags.h:97
#define FLAG_KOLIMA_CURSE_LIFTED
Definition flags.h:103
#define FLAG_VALE_ANGRY_VILLAGER_ARGUED
A villager has scolded Garet once.
Definition flags.h:464
#define FLAG_VALE_RETURNED_FROM_MT_ALEPH
Isaac and Garet followed the elders into the sanctum.
Definition flags.h:535
#define FLAG_SOL_SANCTUM_STATUE_TRAP_SPRUNG
The statues' lights have flashed as Kraden stood among them.
Definition flags.h:657
#define FLAG_CHILDHOOD
the prologue: Isaac and Garet are children
Definition flags.h:10
#define FLAG_VALE_WARNED_AGAINST_MT_ALEPH
A villager stopped Isaac and warned him off the mountain.
Definition flags.h:469
#define FLAG_SOL_SANCTUM_SOUTHWEST_SEAL_OPEN
Definition flags.h:647
#define FLAG_VALE_STORM_GARET_LEFT
Garet ran off, leaving Isaac alone. "Isaac!".
Definition flags.h:491
#define FLAG_SOL_SANCTUM_VENUS_STAR_BAGGED
Definition flags.h:678
#define FLAG_SOL_SANCTUM_ALL_SEALS_OPEN
Definition flags.h:649
#define FLAG_TRET_DEFEATED
Definition flags.h:102
#define FLAG_SOL_SANCTUM_STARS_GIVEN_TO_ALEX
The Jupiter Star is bagged and Alex holds the four Elemental Stars.
Definition flags.h:681
#define FLAG_VALE_STORM_THIRD_ROCK_FELL
Definition flags.h:475
#define FLAG_SOL_SANCTUM_NORTHWEST_SEAL_OPEN
A statue stands on its seal and the seal's light shines.
Definition flags.h:645
#define FLAG_VALE_STORM_SENT_TO_AID_ELDERS
On the stormy night, the villagers sent Isaac to aid the elders holding back the Boulder.
Definition flags.h:500
#define FLAG_SOL_SANCTUM_FIRST_GEM_PLACED
Definition flags.h:100
#define FLAG_VALE_STORM_SAW_RIVER_RESCUE
Isaac saw the villagers trying to pull Felix from the river.
Definition flags.h:486
#define FLAG_SOL_SANCTUM_STAR_ROOM_EXPLAINED
Definition flags.h:677
#define FLAG_SOL_SANCTUM_LUNA_SOL_ROOMS_SEEN
Kraden has seen the Luna and Sol rooms and asked the party to search on.
Definition flags.h:643
#define FLAG_SEARCHING_FOR_HIDDEN_PASSAGE
Definition flags.h:98
volatile u32 gFrameCount
Frames WaitFrames has finished.
GameState, the game's state: play time, coins, the scene and the leader's position,...
#define Battle_SetStart(mode)
Sets the battle start type.
Definition game_state.h:164
struct GameState gGameState
The work slots of gWorkSlot, read through their own names.
void * gMapWork[]
void * gEffectWork
Slot 56: points to a scene-specific structure.
The screen blend's globals and the graphics routines.
Item numbers, named from the English release.
@ ITEM_CATCH_BEADS
Definition item_ids.h:62
@ ITEM_HERB
Definition item_ids.h:40
The map layers' scroll work and the background scroll values.
The reel game's title lettering.
Field object scripts: one s32 command word, then its operands, as gScriptObject_CommandTable runs the...
#define SC_LABEL(n)
Branch destination.
Definition objcmd.h:11
#define SC_SET(w, v)
Write a work value.
Definition objcmd.h:37
#define SC_LOOP(n, to)
Repeat up to n times.
Definition objcmd.h:28
#define SC_POS(x, y, z)
Set position.
Definition objcmd.h:18
#define SC_SYNC
Wait for arrival.
Definition objcmd.h:17
#define SC_FOREVER
Definition objcmd.h:14
#define SC_WANDER_HOME(a, b, c)
Definition objcmd.h:25
#define SC_TO(n)
Definition objcmd.h:12
#define SC_ARG(v)
Definition objcmd.h:44
#define SC_SE(n)
Sound effect.
Definition objcmd.h:46
#define SC_MOVE(x, y, z)
Move toward the target.
Definition objcmd.h:19
#define SC_WAIT(n)
Wait n frames.
Definition objcmd.h:16
#define SC_TOP
Script start.
Definition objcmd.h:13
#define SC_END
Return to the main script.
Definition objcmd.h:32
@ SW_ACCEL
Definition objcmd.h:68
@ SW_COLLISION
Definition objcmd.h:79
@ SW_SPEED
Definition objcmd.h:67
@ SW_MOTION
Definition objcmd.h:75
@ SW_FACING
Definition objcmd.h:57
@ SW_VELOCITY_Y
Definition objcmd.h:65
#define SC_CALL(fn)
Definition objcmd.h:50
void Event_PrepareObjectAndApplyValue(s32 unit, s32 announce)
Adds unit to the party.
Definition events.c:165
void Field_RequestBattleFromEncounterTable(s32 zoneNo, s32 slotNo)
Sets up a battle with enemy group slot of encounter table zone.
Definition requests.c:14
void Event_SetDefeatDestination(s32 scene, s32 entrance)
Sets where the party wakes up after losing a battle (gGameState.defeatScene and defeatEntrance).
Definition requests.c:70
void Event_SetNextDestination(s32 scene, s32 entrance)
Sets the scene and entrance that the field goes to next (gGameState.nextScene and nextEntrance).
Definition requests.c:61
Scene numbers, named after their places.
char SceneId_ValeHome
s32 Scheduler_RemoveCallback(SchedulerCallback callback)
Unschedules the task running callback: clears its routine and gives it order 0x7fff,...
Definition scheduler.c:146
static void Event_SayThenWait(s32 speaker, s32 frames)
Shows the selected message from one speaker and waits the requested frames.
Song and sound effect ids, indices into gSound_SongTable.
#define SE_RECOVERY
Definition songs.h:119
#define SE_107
Definition songs.h:100
#define SE_DOOR_OPEN
Definition songs.h:153
#define SE_131
Definition songs.h:124
#define SE_MAP_EXIT
Definition songs.h:116
#define MUS_061
Definition songs.h:65
#define MUS_017
Definition songs.h:27
#define SE_188
Definition songs.h:183
#define SE_161
Definition songs.h:156
#define SE_289
Definition songs.h:282
void Engine_ActorSetAnimation()
struct EventWork * gEventWork
void Engine_EventRequestExit()
void Engine_ActorSetPosition(u32 actor, s32 x, s32 z)
void Engine_EventEnd(void)
void Engine_AudioPlayCue()
void Engine_EventBegin(void)
void Engine_ActorShowEmote()
void Engine_TaskWait()
void Engine_EventSetMessage()
void Engine_EventShowMessage()
#define NULL
Definition bilibin.h:6
Vale, its home, storm and Babi scenes, Sol Sanctum's eruption and Venus Lighthouse's aerie: Psynergy ...
void Scene_EndCutscenePsynergy(void)
Ends the cutscene's Psynergy and releases its effect work.
void Scene_BeginCutscenePsynergy(void)
Prepares the effect work and spark tiles of Move (ability 140) for the cutscene's Psynergy.
Vale's storm and Vale's homes: going indoors through a door.
static void Vale_RequestBackdropExit(s32 no)
Takes exit no in the backdrop fade over 16 frames, first stopping the storm's lightning while the sto...
Definition vale.h:10
void BattleParty_ApplyDrain(s32 amount, s32 unused)
Gives each character in the party amount PP (PP regenerates as the party walks).
Definition step.c:362
u8 frame
frame shown, frameBase plus the facing offset; 255 none
Definition animspr.h:53
An animated sprite: its image and shadow, scale, rotation, size and up to four animation layers.
Definition animspr.h:108
struct AnimationSpritePart image
Definition animspr.h:109
u8 flags
bits: 1 outlined in ObjectSystemWork's edge and fill colours | 0 shadow drawn (set when created)
Definition animspr.h:128
u8 slot
VRAM cache entry holding its tiles.
Definition animspr.h:112
struct AnimationEntry * entries[4]
its layers; empty ones null
Definition animspr.h:130
u8 retainCacheEntry
Keeps the VRAM cache entry when it is released or off screen.
Definition animspr.h:114
u16 fullColor
256 colours; set for both parts when created
Definition animspr.h:94
u16 tile
first sprite tile in VRAM
Definition animspr.h:99
u16 priority
2 when created
Definition animspr.h:100
The work of a Psynergy effect scene: its caster and target, where it takes place, the map state it re...
Definition fx_scene.h:31
u16 tileSlot
resource entry holding the spark tiles
Definition fx_scene.h:64
void * child
the target's object, or NULL
Definition fx_scene.h:37
The running scene's event work: its placement and event tables, its actors, the triggers and exit it ...
Definition event_work.h:20
s32 startTransition
SCENE_TRANSITION(style, variant).
Definition event_work.h:43
s32 transitionFrames
frames
Definition event_work.h:45
u16 message
the next message, advanced as each window opens
Definition event_work.h:47
A field actor: a person or thing on the field with a position, motion toward a target,...
Definition field_obj.h:30
s32 targetX
16.16 fixed-point pixels; ACTOR_NO_TARGET when unset
Definition field_obj.h:59
u8 motionFlags
ActorMotionFlag bits; zero is free flight in 3D, and 3 is set on creation.
Definition field_obj.h:83
union FieldCoordinate x
16.16 fixed-point pixels
Definition field_obj.h:35
s32 targetZ
16.16 fixed-point pixels; ACTOR_NO_TARGET when unset
Definition field_obj.h:61
s32 bounce
The share of its falling speed kept as it bounces on landing, 16.16 fixed point (0x4000 when created)...
Definition field_obj.h:64
union FieldCoordinate y
16.16 fixed-point pixels
Definition field_obj.h:36
u8 priorityFlags
ActorPriorityFlag bits, read by the scrolling camera.
Definition field_obj.h:51
s32 terrainHeight
16.16 fixed-point pixels
Definition field_obj.h:38
s32 gravity
Taken off the vertical velocity each frame while it is above the ground, in 16.16 fixed-point pixels ...
Definition field_obj.h:68
union FieldCoordinate z
16.16 fixed-point pixels
Definition field_obj.h:37
u16 facing
1/65536 turns
Definition field_obj.h:34
s32 targetY
16.16 fixed-point pixels; ACTOR_NO_TARGET when unset
Definition field_obj.h:60
s32 scaleX
16.16 fixed point, 0x10000 full size
Definition field_obj.h:39
s32 scaleY
16.16 fixed point, 0x10000 full size
Definition field_obj.h:40
void(*) update(union FieldObject *object)
Called each frame before the object's script, while the object is live.
Definition field_obj.h:116
u16 work
The side of the player's next footprint (2 after a stop), or scene scratch.
Definition field_obj.h:112
s16 entrance
Definition game_state.h:37
The field map's work: the followed position, screen shake, tile animations, blend script,...
Definition map_scroll.h:27
s32 * origin
The followed point, read as x, height and z in 16.16 fixed-point pixels; Camera_FollowActor points it...
Definition map_scroll.h:30
A scene entrance: where and facing which way the party arrives, and the camera's bounds there (-1 for...
Definition field_scene.h:54
A scene event: its kind and detail, the trigger it answers, its condition and its value (a message or...
An actor a scene places: its sprite, the condition for placing it, how it behaves,...
Definition field_scene.h:81
A scene's exit region: the box that, while its condition holds, takes the party leader out through it...
u16 offset
bytes from the start of OBJ VRAM
Definition vram_tab.h:25
The system's routines and globals: interrupts, BIOS sound bias, random numbers and sleep.
The integer types, TRUE, UNUSED and the fixed-address macros.
signed int s32
Definition types.h:14
unsigned int u32
Definition types.h:15
unsigned short u16
Definition types.h:13
unsigned char u8
Definition types.h:11
struct FieldCoordinate::@024321007066302143002254325121164243234242211074 part
s32 fixed
16.16 fixed-point pixels
void Party_RestoreHpPp(s32 cureConditions)
Restores every party member's HP and PP; with cureConditions 1 it also cures poison and haunting.
Definition units.c:662
s32 gValeHome_Actor23Actions[]
Definition vale_home.c:1654
static void Event_ClearFirstWhirlwindTarget(void)
Whirlwind clears the first target (actor 8).
Definition vale_home.c:516
const struct SceneEvent * ValeHome_GetEvents(void)
Selects the events: after Kalay, after the party has left, the farewell's (entrance 12),...
Definition vale_home.c:152
s32 gValeHome_FaceTargetActions[]
Definition vale_home.c:1744
static void Event_OpenNortheastDoor(void)
Opens the northeast doorway in two stages and walks inside.
Definition vale_home.c:455
static void Event_OpenCentralWestDoor(void)
Enters through the western door in the village's middle row.
Definition vale_home.c:468
static void Event_LeaveThroughWestPassage(void)
Leaves by the west passage: stepping on cell code 9 on the stormy night takes exit 8.
Definition vale_home.c:496
struct ScenePlacement gValeHome_Placements[]
Definition vale_home.c:1928
static void ValeHome_TurnAndWait(s32 actor, s32 facing, s32 frames)
Definition vale_home.c:83
static void Event_OpenCentralEastDoor(void)
Enters through the eastern door in the village's middle row.
Definition vale_home.c:474
static void Event_DemonstrateLevitation(void)
A villager with some Psynergy left lifts actor 20 into the air.
Definition vale_home.c:328
static void Event_AskAboutTheTravelers(void)
A villager asks whether the travelers went to meet the mayor.
Definition vale_home.c:194
s32 gValeHome_Actor24BounceActions[]
Definition vale_home.c:1718
static void Event_OpenWestEdgeDoor(void)
Definition vale_home.c:484
s32 gValeHome_Actor23BounceActions[]
Definition vale_home.c:1690
struct ScenePlacement gValeHome_PlacementsAfterKalay[]
Definition vale_home.c:2075
const struct ScenePlacement * ValeHome_GetPlacements(void)
Selects the placements: the stormy night's, the farewell's (entrance 12), after Kalay,...
Definition vale_home.c:121
u32 gValeHome_Exits[]
Definition vale_home.c:1892
struct SceneEntrance gValeHome_Entrances[]
Definition vale_home.c:1874
u32 gValeHome_Actor22ActionsHead[]
Definition vale_home.c:1622
static void ValeHome_UpdateActor15Psynergy(void)
Updates the levitating villager's Psynergy display.
Definition vale_home.c:1535
struct SceneEvent gValeHome_EventsAfterKalay[]
Definition vale_home.c:2198
static void Event_OpenSoutheastDoor(void)
Definition vale_home.c:489
static void Event_PsynergyStoneIsGone(void)
The villager searching the ground stops and tells Isaac the Psynergy Stone is gone.
Definition vale_home.c:410
static void Event_DepartForQuest(void)
The villagers give their supplies and farewells before the party leaves Vale.
Definition vale_home.c:1088
static void Event_ClearThirdWhirlwindTarget(void)
Whirlwind clears the third target (actor 10).
Definition vale_home.c:532
s32 gValeHome_Actor12Actions[]
Definition vale_home.c:1795
s32 gValeHome_Actor25Actions[]
Definition vale_home.c:1678
static void Event_MeetSurvivingTravelers(void)
On the stormy night, Isaac overhears the two travelers who survived Sol Sanctum.
Definition vale_home.c:819
static void ValeHome_SpawnEffectPair(struct FieldActor *parent)
Creates the two vertical Psynergy effects using the shared sprite tiles.
Definition vale_home.c:1480
s32 gValeHome_Actor22Actions[]
Definition vale_home.c:1626
static void Event_AskAboutJourney(void)
A villager asks whether Isaac can use Psynergy, then about the Wise One, then about the journey.
Definition vale_home.c:279
struct ScenePlacement gValeHome_StormPlacements[]
Definition vale_home.c:1974
static void Event_UsePsynergyStone(void)
Searching the Psynergy Stone restores the party's PP.
Definition vale_home.c:138
static void Event_OpenSouthwestDoor(void)
Definition vale_home.c:479
s32 gValeHome_Actor31Actions[]
Definition vale_home.c:1765
#define FLAG_VALE_PSYNERGY_STONE_GONE_TOLD
Back from Kalay, the villager searching for the Psynergy Stone has told Isaac it is gone.
Definition vale_home.c:55
u16 gValeHome_DoorOpens[]
Definition vale_home.c:2239
static void ValeHome_UpdateActor17Psynergy(void)
Updates the demonstrating villager's Psynergy display.
Definition vale_home.c:1542
static void ValeHome_UpdateActor20Psynergy(void)
Updates the palette of the levitated actor.
Definition vale_home.c:1549
static void Event_WelcomeIsaacHome(void)
Back from Kalay, a villager welcomes Isaac home; later he only says this is Vale.
Definition vale_home.c:393
static void Event_TalkAboutHelping(void)
On the stormy night, a villager tells Isaac which way the others went, or, once he has been sent to t...
Definition vale_home.c:376
#define FLAG_VALE_WELCOMED_HOME
Back from Kalay, a villager has welcomed Isaac home.
Definition vale_home.c:52
static void ValeHome_FlashPsynergyPalette(struct FieldActor *actor)
Flashes the caster's palette and emits paired effects every sixteen frames.
Definition vale_home.c:1446
s32 gValeHome_Actor11Actions[]
Definition vale_home.c:1779
s32 gValeHome_LeaderActions[]
Definition vale_home.c:1666
s32 gValeHome_Actor24Actions[]
Definition vale_home.c:1642
const u32 * ValeHome_GetExits(void)
Returns the stormy night's exits while FLAG_VALE_STORM is set, else the day's.
Definition vale_home.c:112
const struct SceneEntrance * ValeHome_GetEntrances(void)
Definition vale_home.c:104
static void Event_AskAboutMeditation(void)
A villager asks whether Isaac meditates on the mountain each day.
Definition vale_home.c:171
s32 ValeHome_Initialize(void)
Arriving: hide the cleared Whirlwind targets, run entrances 97 to 99 (the return from the travelers' ...
Definition vale_home.c:545
struct ScenePlacement gValeHome_DeparturePlacements[]
Definition vale_home.c:2021
static s32 ValeHome_TurnAndWaitValue(s32 actor, s32 facing, s32 frames)
Definition vale_home.c:93
static void Event_DemonstratePsynergy(void)
Before the party sets out, a villager shows Isaac his Psynergy and shakes the ground; later he asks w...
Definition vale_home.c:208
static void ValeHome_CyclePsynergyPaletteAndSpawnEffects(struct FieldActor *actor)
Cycles six palette banks and emits the caster's paired effects.
Definition vale_home.c:1459
static void ValeHome_FaceDirectionAndWait(s32 actorId, s32 facing, s32 frames)
Definition vale_home.c:1440
s32 gValeHome_Actor17Actions[]
Definition vale_home.c:1845
u32 gValeHome_StormExits[]
Definition vale_home.c:1914
static void Event_LeaveThroughSouthPassage(void)
Leaves by the south passage once the party has begun its journey.
Definition vale_home.c:505
static void Event_TravelersLeaveAfterBattle(void)
After the battle the travelers leave Isaac and his companion lying in the storm, and the storm ends.
Definition vale_home.c:1003
static void Event_RecallThreeYearsAgo(void)
A villager recalls the difficult time three years ago and asks Isaac about it.
Definition vale_home.c:183
struct SceneEvent gValeHome_DepartureEvents[]
Definition vale_home.c:2155
static void ValeHome_FightTravelers(void)
The travelers catch Isaac eavesdropping and fight; win or lose, the party returns by entrance 19.
Definition vale_home.c:892
static void Event_OpenNorthwestDoor(void)
Definition vale_home.c:446
struct SceneEvent gValeHome_StormEvents[]
Definition vale_home.c:2135
ValeHomeActor
Definition vale_home.c:59
@ ACTOR_STORM_GARET
Garet as a child, who follows Isaac through the night. "Isaac! Wait!".
Definition vale_home.c:66
@ ACTOR_SECOND_TRAVELER
Definition vale_home.c:64
@ ACTOR_FIRST_TRAVELER
The two travelers who survived Sol Sanctum, Saturos and Menardi by their sprites (0x20 and 0x21,...
Definition vale_home.c:63
static void ValeHome_RejoinParty(s32 actorId)
Walks a separate scene actor back to the leader, then hides it.
Definition vale_home.c:649
s32 gValeHome_Actor21Actions[]
Definition vale_home.c:1821
const struct SceneRegion * ValeHome_GetRegions(void)
Definition vale_home.c:108
static void Event_SentToAidElders(void)
On the stormy night, villagers send Isaac and his companion to aid the elders holding back the Boulde...
Definition vale_home.c:667
s32 gValeHome_Actor30Actions[]
Definition vale_home.c:1749
static void Event_OpenDoorAndWalkThrough(s32 cellX, s32 cellZ, s32 x, s32 z)
Opens a door's map cells and sends the leader through its threshold.
Definition vale_home.c:437
static void ValeHome_SetProgressFlagsAndExit(void)
Arriving by entrance 99, a debug entrance: sets a preset of story flags, which differs by edition,...
Definition vale_home.c:1559
static void Event_TalkAboutFallenStone(void)
A villager tells how the stone fell, and the camera looks at it.
Definition vale_home.c:305
static void Event_ClearSecondWhirlwindTarget(void)
Whirlwind clears the second target (actor 9).
Definition vale_home.c:524
s32 gValeHome_Actor25StepActions[]
Definition vale_home.c:1866
struct SceneEvent gValeHome_Events[]
Definition vale_home.c:2107
struct SceneEvent gValeHome_EventsAfterLeaving[]
Definition vale_home.c:2159
#define VALE_HOME_TURN_AND_WAIT
Definition vale_home.c:99
static void ValeHome_CyclePsynergyPalette(struct FieldActor *actor)
Cycles the levitated actor through six palette banks.
Definition vale_home.c:1470
s32 gValeHome_LeaderStepActions[]
Definition vale_home.c:1858
s32 gValeHome_Actor0And1Actions[]
Definition vale_home.c:1811
The patch levels: our groups of the measured changes from the Japanese release.
s32 Resource_ResetEntry(u32 no)
Frees cache entry no: its blocks go back and the entry is marked free (offset 0xffff).
Definition vram_cache.c:106
The sprite VRAM block cache and its owners.
struct VramBlockCacheEntry gVramBlockCache[]
void FieldFx_ResumeLightning(void)
Restarts the lightning: the next flash in 128 frames, repeating.
Definition weather.c:458
void FieldFx_StartLightning(void)
Starts the storm's lightning (FieldFx_UpdateLightning): builds the dark (0x10003) and lit (0x10005) p...
Definition weather.c:425
void FieldFx_StopLightning(void)
Stops the lightning: no flash for 0x7fff frames, and none after.
Definition weather.c:442
void FieldFx_StartGroundParticles(void)
Starts the ground particles (FieldFx_UpdateGroundParticles) with sound 170: loads their tiles and put...
Definition weather.c:105
void FieldFx_LastLightning(void)
One last flash of lightning in 12 frames, then no more.
Definition weather.c:450
void UiWork_FinalizePendingCore(void)
Closes each message channel's window whose text has ended, then waits ten frames.
Definition messages.c:302