Alchemy
Loading...
Searching...
No Matches

vale.c

Go to the documentation of this file.
1/// @file
2/// Vale's plaza and the paths around it in daytime: the game opens here three
3/// years after the storm with Isaac mending his roof (entrances 16 and 17), and
4/// the villagers talk of the story before the party leaves, after it has left
5/// and after its return from Kalay.
6///
7/// FLAG_SCENE_TEMP_02: the roof has just been mended. FLAG_SCENE_TEMP_04: Isaac
8/// is in the northern passage. FLAG_SCENE_TEMP_10: the upper path's cells are
9/// in place. FLAG_SCENE_TEMP_41: the villager watching Isaac is paused. Group
10/// flags 0x303 and 0x304: Garet has talked with his sister and with the
11/// villager he asks to protect his family. 0x305: set by an unused scene.
12/// 0x307: a villager asked about the lack of travelers. 0x308: the roof-mending
13/// end has played. 0x314 to 0x316: the movable object's column.
14
15#include "game_state.h"
16#include "vram_tab.h"
17#include "unit/import.h"
18#include "unit/scene/vale.h"
22#include "unit/object/object.h"
24#include "unit/field/field.h"
25#include "unit/window/window.h"
28#include "battle.h"
29#include "debug.h"
30#include "field.h"
31#include "game.h"
32#include "graphics.h"
33#include "menu.h"
34#include "minigame.h"
35#include "sound.h"
36#include "system.h"
37#include "mem.h"
38#include "global_cells.h"
39#include "edition.h"
40#include "vale.h"
41#include "types.h"
42#include "call.h"
43#include "field_event.h"
44#include "field_service.h"
45#include "field_scene.h"
46#include "iwram_call.h"
47#include "text/msg_ids.h"
48#include "ability_ids.h"
49#include "objcmd.h"
50#include "field_obj.h"
51#include "field_effect.h"
52#include "map_scroll.h"
53#include "fixed_math.h"
54#include "macros.h"
55#include "flags.h"
56#include "songs.h"
57
58#if TBS_PATCH_2
59#define VALE_GARET_REUNION_Z 829
60#else
61#define VALE_GARET_REUNION_Z 827
62#endif
63
64#if TBS_PATCH_4
65#define VALE_SOUTH_VILLAGER_Z 887
66#else
67#define VALE_SOUTH_VILLAGER_Z 889
68#endif
69
70static void Vale_HaveJennaStopTheAlephDetour(void);
71static void Vale_AskAboutSneakingToAleph(const s32 *leaderActions,
72 const s32 *villagerActions);
73static void Vale_MoveActorAlongLowerZPath(s32 actorId, s32 approachAnimationId,
74 s32 departureAnimationId,
75 s32 resumeMotion);
76static void Vale_MoveActorAlongHigherZPath(s32 actorId, s32 approachAnimationId,
77 s32 departureAnimationId,
78 s32 resumeMotion);
79static void SceneActor_ResetActorRun(s32 first, u32 count, s32 mode);
80static void Event_MendingTheRoof(void);
81static void Event_RoofMended(void);
82static void Vale_UpdateGaretPaletteAndEffects(void);
84static void Vale_CycleVillagerNinePalette(void);
85static void Vale_CycleFirstBoardPalette(void);
86static void Vale_CycleSecondBoardPalette(void);
87static void Vale_CycleActor25Palette(void);
88#ifdef UBFIX
89static void Vale_HaveVillagerWatchTheLeader(union FieldObject *fieldObject);
90#else
91static s32 Vale_HaveVillagerWatchTheLeader(union FieldObject *fieldObject);
92#endif
93static void Effect_ConfigureSpawnedParticle(union FieldObject *fieldObject);
94static void Effect_SpawnRisingDustBurst(struct FieldActor *emitter);
95static void Effect_UpdateParticlePosition(struct FieldActor *particle,
96 s32 distance, s32 angle);
97static void Event_SettleMovedObject(void);
98static void Effect_PlayStepSound(void);
101static void Vale_FlashActorAndSpawnEffects(struct FieldActor *actor);
102static void Vale_CycleActorPaletteAndSpawnEffects(struct FieldActor *actor);
103static void Vale_CycleActorPalette(struct FieldActor *actor);
104
106
107enum { ANIM_HAMMER = 11 };
108
110
111const struct SceneEntrance *Vale_GetEntrances(void) { return gVale_Entrances; }
112
113const struct SceneRegion *Vale_GetRegions(void) { return NULL; }
114
115const u32 *Vale_GetExits(void) { return gVale_Exits; }
116
117/// Places the villagers for the story so far, or for the roof repair (entrance
118/// 16).
120 u8 *scene_state = (u8 *)&gGameState;
121 if (((struct GameState *)scene_state)->entrance == 16)
127 return gVale_Placements;
128}
129
130/// Catch on the Nut hanging in the plaza: the party gets it.
131static void Event_CatchNut(void) {
133 Engine_ActorSetPosition(26, 0, 0);
134 Engine_GameFlagSet(0xfd0);
138}
139
140/// The same Nut after Kalay, where it is actor 20.
141static void Event_CatchNutAfterKalay(void) {
143 Engine_ActorSetPosition(20, 0, 0);
144 Engine_GameFlagSet(0xfd0);
148}
149
150/// The villagers talk of the story so far.
151const struct SceneEvent *Vale_GetEvents(void) {
156 return gVale_Events;
157}
158
159/// Asks about the mayor before departure, or the tremors after returning.
163 Engine_EventSetMessage(MsgValeTheGroundStillShakes);
165 } else {
166 Engine_EventSetMessage(MsgValeYourGrandpaIsTheMayor);
169 }
171}
172
173/// Warns about the mountain path, with a shorter repeat greeting.
178 Engine_EventSetMessage(MsgValeKradenHasntComeBack);
180 } else if (Engine_GameFlagIsSet(flag) == 0) {
181 Engine_GameFlagSet(flag);
182 Engine_EventSetMessage(MsgValeDoYouNeedToGo);
185 } else {
186 Engine_EventSetMessage(MsgValeDontGoBeyondKradensCottage);
189 }
191}
192
193/// A villager scolds Garet; afterwards the villager only threatens him.
194/// "Garet, you make me so mad sometimes!"
199 Engine_EventSetMessage(MsgValeYouMakeMeSoMad);
202 Event_ShowMessageAndWait(18, 0, 6);
204 Engine_ActorJump(18, 2, 20);
205 Event_ShowMessageAndWait(18, 0, 6);
208 Event_ShowMessageAndWait(18, 0, 10);
210 } else {
212 Engine_EventSetMessage(MsgValeIllGetYouForMy);
213 Event_ShowMessageAndWait(18, 0, 20);
214 }
216}
217
218/// A villager talks of the weather, differently right after the roof repair.
219static void Event_TalkAboutTheWeather(void) {
222 Engine_EventSetMessage(MsgValeIToldGaretItWas);
223 } else {
224 Engine_EventSetMessage(MsgValeItWontRainForSome);
225 }
228}
229
230/// Back from Kalay, a villager asks whether Jenna is back.
234 Engine_EventSetMessage(MsgValeIsJennaBackYet);
238}
239
240/// Shakes the view before the villager reacts to another tremor.
241static void Event_ReactToAnotherTremor(void) {
244 Engine_TaskWait(10);
245 Map_SetShake(-1, -1, 9 * Q16_ONE / 10);
246 Engine_EventSetMessage(MsgValeIFeltAnotherOne);
247 Event_ShowMessageAndWait(17, 0, 20);
249 Event_ShowMessage(17, 0);
251}
252
253/// Asks about the quiet roads after the eruption.
259 Engine_EventSetMessage(MsgValeNoTravelersSinceTheEruption);
261 Engine_GameFlagSet(0x307);
263}
264
265/// Walking onto the upper path: its collision cells change, remembered in
266/// FLAG_SCENE_TEMP_10.
267static void Event_SetPathCellOverride(void) {
269 Map_CopyCellAttributes(40, 84, 7, 4, 10, 84);
270}
271
272/// Walking off the upper path restores its collision cells.
275 Map_CopyCellAttributes(40, 89, 7, 4, 10, 84);
276}
277
278/// Opens the sanctum door, walks inside and takes its scene exit.
279static void Event_EnterSanctum(void) {
284}
285
286/// The mountain path: Jenna stops Isaac until Kraden has planned the visit.
287/// The path leads to Mt. Aleph; Jenna says "Kraden is waiting for us".
288static void Event_ApproachMtAleph(void) {
291 } else {
294 }
295}
296
297/// The northern path toward Kraden's cottage.
298static void Event_LeaveByNorthPath(void) {
301}
302
303/// The southern path toward Kraden's cottage.
304static void Event_LeaveBySouthPath(void) {
307}
308
309/// Leaves through the exit leading back to the house.
310static void Event_LeaveTowardHome(void) {
313}
314
315/// Animates the eastern house door before entering.
316static void Event_EnterEastHouse(void) {
321}
322
323/// Animates the central house door before entering.
324static void Event_EnterCentralHouse(void) {
329}
330
331/// Isaac's house: after the party has left and before Kalay, Dora will not
332/// open. "My Isaac would keep his promise... Go away."
333static void Event_EnterIsaacsHouse(void) {
337 Engine_EventSetMessage(MsgValeYouCantBeIsaac);
339 if (Engine_EventChooseYesNo(0, 0) == 0) {
342 } else {
343 u16 *message = &gEventWork->message;
344
345 *message = *message + 2;
348 }
350 } else {
355 }
356}
357
358/// Opens the southeastern door and enters its interior.
359static void Event_EnterSoutheastHouse(void) {
364}
365
366/// Opens the far southern door and enters its interior.
367static void Event_EnterFarSouthHouse(void) {
372}
373
374/// Opens the southwestern door and enters its interior.
375static void Event_EnterSouthwestHouse(void) {
380}
381
382/// Brings Jenna out to remind Isaac that Kraden is waiting.
384 struct FieldActor *leader;
385 struct FieldActor *jenna;
386 struct FieldActor *actor;
387
389 jenna = Object_GetById(JENNA);
391 jenna->x.fixed = leader->x.fixed;
392 jenna->y.fixed = leader->y.fixed;
393 jenna->z.fixed = leader->z.fixed;
394 jenna->targetX = ACTOR_NO_TARGET;
395 jenna->targetY = ACTOR_NO_TARGET;
396 jenna->targetZ = ACTOR_NO_TARGET;
397 SET_VELOCITY(jenna, 0, 0, 0);
398 jenna->terrainHeight = leader->y.fixed;
400 Actor_SetSpeed(JENNA, PIXELS(1), PIXELS(1) / 2);
401 Actor_WalkToAndWait(JENNA, 110, 283);
403 Engine_EventSetMessage(MsgValeKradenIsWaitingForUs);
404 if (leader->x.fixed < jenna->x.fixed) {
405 Event_ShowMessageAndWait(0xa005, 0, 2);
406 } else {
408 }
413 if (actor != NULL) {
414 Actor_SetDestination(JENNA, actor->x.part.pixel, actor->z.part.pixel);
415 }
420}
421
422/// Pans down to the puppies and returns the camera to the leader.
423static void Event_WatchThePuppies(void) {
424 struct MapScrollWork *map;
425 s32 *savedOrigin;
426 struct FieldActor *leader;
427 s32 frame;
428 s32 cameraPosition[3];
429
431 map = gMapWork[0];
433 Actor_SetSpeed(0, PIXELS(1), PIXELS(1) / 2);
436 Engine_EventSetMessage(MsgValeRrruffRrrruff);
440 SET_VECTOR(cameraPosition, leader->x.fixed, leader->y.fixed,
441 leader->z.fixed);
442 savedOrigin = map->origin;
443 map->origin = cameraPosition;
444 frame = 0;
445 // Pan down to the puppies while the leader stays in place.
446 do {
447 cameraPosition[2] += PIXELS(2);
449 frame++;
451 } while (frame != 40);
453 Engine_MessageShowCentered(MsgValePuppiesPlayingOver, 1);
454 frame = 0;
456 do {
457 cameraPosition[2] -= PIXELS(2);
459 frame++;
461 } while (frame != 40);
462 // Return camera ownership to the normal follow target.
463 map->origin = savedOrigin;
465 Actor_WalkToAndWait(0, 70, 741);
467 }
468}
469
470/// Shows the puppies message from the opposite approach.
472 s32 msg;
473
477 msg = MsgValeRrruffRrrruff;
479 Event_ShowMessageAndWait(15, 0, 2);
480 Event_ShowMessageAndWait(16, 0, 2);
481 Engine_MessageShowCentered(msg + 2, 1);
485 }
486}
487
488/// Changes the passage collision and moves through its northern end.
489static void Event_EnterNorthernPassage(void) {
491 Map_CopyCellAttributes(49, 53, 8, 4, 20, 50);
492 Vale_MoveActorAlongLowerZPath(0, 10, 11, 1);
495}
496
497/// Moves back through the passage and restores its collision attributes.
500 Vale_MoveActorAlongHigherZPath(0, 13, 10, 1);
502 Map_CopyCellAttributes(49, 46, 8, 4, 20, 50);
504}
505
506/// A villager jumps out in front of Isaac, then keeps watching him.
507/// "You're not planning on sneaking up to Mt. Aleph...?"
509 struct FieldActor *villager;
510 struct FieldActor *actor;
511
512 villager = Object_GetById(22);
518 Actor_SetPosition(22, PIXELS(166), PIXELS(375));
520 villager->steeringFlags = (villager->steeringFlags ^ 1);
521 Actor_SetSpeed(22, PIXELS(5) / 2, PIXELS(5) / 2);
522 Engine_ActorJump(22, 4, 0);
523 Actor_WalkToAndWait(22, 202, 395);
531 Actor_SetSpeed(22, PIXELS(3) / 2, PIXELS(1));
540 Actor_WalkToAndWait(22, 256, 456);
545 Engine_EventSetMessage(MsgValeNotSneakingUpMtAleph);
546 Event_AskYesNo(22, 0);
547 actor = Actor_Get(22);
548#ifdef UBFIX
550#else
551 actor->update =
553#endif
557}
558
559/// Repeats the warning when the villager reaches the first pause.
561 struct FieldActor *villager = Object_GetById(22);
563 if (villager->timer == 1) {
565 }
566 }
567}
568
569/// Asks about the Aleph detour, then resumes each actor's response actions.
570static void Vale_AskAboutSneakingToAleph(const s32 *leaderActions,
571 const s32 *villagerActions) {
572 const s32 *replyActions;
573 struct FieldActor *villager;
574 struct FieldActor *actor;
575
576 replyActions = villagerActions;
577 villager = Object_GetById(22);
580 Actor_ShowEmote(22, EMOTE_IN_FRONT | 0, 20);
586 Actor_RunActionScriptAndWait(22, replyActions);
590 villager->scaleX = Q16_ONE;
591 villager->scaleY = Q16_ONE;
593 actor->scaleX = Q16_ONE;
594 actor->scaleY = Q16_ONE;
595 Engine_EventSetMessage(MsgValeNotSneakingUpMtAleph);
596 Event_AskYesNo(22, 0);
597 actor = Actor_Get(22);
598#ifdef UBFIX
600#else
601 actor->update =
603#endif
606}
607
608/// Repeats the warning when the villager reaches the second pause.
610 struct FieldActor *villager = Object_GetById(22);
612 if (villager->timer == 2) {
614 }
615 }
616}
617
618/// Chooses the warning approach matching the current villager pause.
620 struct FieldActor *villager = Object_GetById(22);
622 s32 pause;
623 pause = villager->timer;
624 if (pause == 1) {
626 } else if (pause == 2) {
628 }
629 }
630}
631
633 struct FieldActor *leader;
634 struct FieldActor *actor;
635 u8 leaderMotionFlags;
636 u8 *leaderMotion;
637 s32 i;
638
640 Camera_MoveTo(-1, -1, -1, 0);
642 actor->motionFlags = 0;
643 Camera_MoveTo(PIXELS(383), PIXELS(160), PIXELS(877), 0);
646 Map_CopyCellAttributes(49, 41, 7, 3, 20, 50);
647 Map_CopyCellsTo(2, 102, 84, 41, 2, 1);
648 Map_CopyCellsTo(1, 102, 83, 41, 1, 1);
649 Map_CopyCellsTo(0, 103, 82, 42, 1, 1);
651 leaderMotion = &leader->motionFlags;
652 leaderMotionFlags = *leaderMotion;
653 *leaderMotion = 0;
668 Actor_SetSpeed(JENNA, PIXELS(1) / 2, PIXELS(1) / 4);
669 Actor_SetSpeed(GARET, PIXELS(1) / 2, PIXELS(1) / 4);
672
674 leader->scaleX = Q16_ONE;
675 leader->scaleY = Q16_ONE;
690 Actor_SetSpeed(ACTOR_BOARD, PIXELS(3) / 10, PIXELS(3) / 20);
701 Engine_EventWait(200);
702 Map_CopyCellsTo(7, 102, 84, 41, 2, 1);
703
705 leader->scaleX = Q16_ONE;
706 leader->scaleY = Q16_ONE;
717 Actor_SetSpeed(ACTOR_BOARD, PIXELS(3) / 10, PIXELS(3) / 20);
728 Engine_EventWait(200);
729 Map_CopyCellsTo(6, 102, 83, 41, 1, 1);
730
732 leader->scaleX = Q16_ONE;
733 leader->scaleY = Q16_ONE;
744 Actor_SetSpeed(ACTOR_LAST_BOARD, PIXELS(3) / 10, PIXELS(3) / 20);
755 Engine_EventWait(200);
756 Map_CopyCellsTo(5, 103, 82, 42, 1, 1);
758 leader->scaleX = Q16_ONE;
759 leader->scaleY = Q16_ONE;
760
761 Engine_EventSetMessage(MsgValeGoodJob);
766 Actor_SetSpeed(ACTOR_DORA, PIXELS(3) / 10, PIXELS(3) / 20);
794 }
798 Engine_EventSetMessage(MsgValeWorkingYourselvesBone);
809 }
815 Engine_EventSetMessage(MsgValeDevastatedWhenKyle);
840
841 Camera_SetSpeed(PIXELS(2) / 5, PIXELS(1) / 20);
842 Camera_MoveTo(PIXELS(377), PIXELS(160), PIXELS(860), 1);
843 Actor_SetSpeed(JENNA, PIXELS(1), PIXELS(1) / 2);
844 Actor_SetSpeed(GARET, PIXELS(1), PIXELS(1) / 2);
845 Actor_WalkTo(GARET, 369, 904);
846 Actor_WalkToAndWait(JENNA, 392, 904);
855 Engine_ActorJump(JENNA, 4, 0);
856 Actor_WalkToAndWait(JENNA, 392, 843);
871 Actor_SetSpeed(JENNA, PIXELS(3) / 10, PIXELS(3) / 20);
872 Actor_SetSpeed(GARET, PIXELS(3) / 10, PIXELS(3) / 20);
873 Actor_WalkTo(GARET, 392, 843);
874 Actor_Get(JENNA)->steeringFlags &= ~ACTOR_FACES_MOTION;
875 Actor_WalkToAndWait(JENNA, 408, 843);
877 Actor_Get(JENNA)->steeringFlags |= ACTOR_FACES_MOTION;
902 Engine_EventWait(100);
935 Camera_SetSpeed(PIXELS(3) / 5, PIXELS(3) / 40);
936 Camera_MoveTo(PIXELS(373), PIXELS(160), PIXELS(837), 1);
955 }
958
959 Engine_EventSetMessage(MsgValeAsStubbornAsYourFather);
968 Event_ShowTwoMessagesAndWait(ACTOR_DORA, 14, 2, 24, 2, GARET, 10, 14, 4, 14,
969 0);
970 actor = Actor_Get(ACTOR_DORA);
971 actor->sprite->flags = 0;
976 for (i = 0; i != 4; i++) {
977 actor->z.fixed += PIXELS(3) / 2;
978 actor->scaleY -= 0x1999;
980 }
982 Actor_SetSpeed(GARET, PIXELS(3), PIXELS(3) / 2);
983 Engine_ActorJump(GARET, 6, 0);
984 Actor_WalkToAndWait(GARET, 374, 827);
991 Engine_ActorJump(GARET, 2, 5);
993 Map_CopyCellsTo(1, 102, 83, 41, 1, 1);
997 Map_SetShake(-1, -1, 9 * Q16_ONE / 10);
1001 actor->scaleY = 0x8000;
1003 for (i = 0; i != 5; i++) {
1004 actor->scaleY += 0x1999;
1006 }
1007 Engine_EventWait(60);
1012 Engine_EventWait(60);
1014 Engine_EventWait(20);
1016 Camera_SetSpeed(PIXELS(3) / 10, PIXELS(3) / 80);
1017 Camera_MoveTo(PIXELS(372), PIXELS(160), PIXELS(859), 1);
1021 Engine_EventWait(30);
1024 Engine_EventWait(30);
1025 actor = Actor_Get(ACTOR_DORA);
1033 Engine_EventWait(80);
1037 Engine_EventWait(20);
1041 Engine_EventWait(10);
1044 Engine_ActorJump(GARET, 6, 0);
1047 actor = Actor_Get(GARET);
1049 Actor_SetDestination(GARET, 403, 827);
1058 Engine_ActorJump(GARET, 2, 5);
1060 Map_CopyCellsTo(2, 102, 84, 41, 2, 1);
1061 Map_SetShake(0, PIXELS(4), Q16_ONE);
1063 Map_SetShake(-1, -1, 9 * Q16_ONE / 10);
1066 Actor_SetSpeed(JENNA, PIXELS(3) / 10, PIXELS(3) / 20);
1067 Actor_WalkToAndWait(JENNA, 408, 855);
1068 Engine_EventWait(60);
1073 Engine_EventWait(80);
1076 Engine_EventWait(10);
1078 Engine_EventWait(80);
1080 Engine_EventWait(10);
1087 Engine_EventWait(60);
1096 Engine_EventWait(30);
1100 Engine_EventWait(20);
1105 Engine_EventWait(10);
1109 Engine_EventWait(20);
1112 Engine_EventWait(20);
1114 Engine_EventWait(10);
1119 Engine_EventWait(30);
1122 Actor_SetSpeed(GARET, PIXELS(1), PIXELS(1) / 2);
1124 Engine_ActorJump(GARET, 4, 0);
1125 Actor_WalkToAndWait(GARET, 398, 828);
1126 Engine_EventWait(60);
1130 Engine_EventWait(60);
1132 Engine_EventWait(60);
1133
1134 actor = Actor_Get(GARET);
1136 actor = Actor_Get(JENNA);
1139 Actor_SetSpeed(GARET, PIXELS(1), PIXELS(1) / 2);
1140 Actor_SetSpeed(JENNA, PIXELS(1), PIXELS(1) / 2);
1142 Actor_WalkTo(JENNA, actor->x.part.pixel + 16, actor->z.part.pixel);
1143 Actor_WalkToAndWait(GARET, actor->x.part.pixel + 16,
1144 actor->z.part.pixel - 16);
1150 Engine_EventWait(40);
1151 Actor_WalkToAndWait(JENNA, actor->x.part.pixel, actor->z.part.pixel);
1152 Actor_SetPosition(JENNA, 0, 0);
1153 Actor_WalkToAndWait(GARET, actor->x.part.pixel, actor->z.part.pixel);
1154 Actor_SetPosition(GARET, 0, 0);
1156 Camera_MoveTo(PIXELS(377), PIXELS(160), PIXELS(887), 1);
1160 Actor_Get(ACTOR_DORA)->steeringFlags |= ACTOR_FACES_MOTION;
1167 Engine_EventWait(20);
1170 Engine_EventWait(100);
1173 *leaderMotion = leaderMotionFlags;
1175}
1176
1177/// Arriving: play the roof mending (entrance 16) or its end (entrance 17,
1178/// once), place the Nut and the movable object, and restore the paths' cells.
1180 struct FieldActor *actor;
1181 s32 set;
1182
1183 if (gGameState.entrance == 16) {
1184 PaletteGlow_Update(((u8 *)&gGameState)[517], ((u8 *)&gGameState)[518]);
1186 } else {
1187 if (!Engine_GameFlagIsSet(0xfd0)) {
1189 Scene_FloatNut(26);
1190 } else {
1191 Scene_FloatNut(20);
1192 }
1193 }
1194 Map_CopyCellsTo(2, 102, 84, 41, 2, 1);
1195 Map_CopyCellsTo(1, 102, 83, 41, 1, 1);
1196 actor =
1199 if (Engine_GameFlagIsSet(0x314)) {
1200 actor->x.fixed = 181 << 17;
1201 } else if (Engine_GameFlagIsSet(0x316)) {
1202 actor->x.fixed = 197 << 17;
1203 } else {
1204 actor->x.fixed = 189 << 17;
1205 }
1206 actor->z.fixed = PIXELS(584);
1207 actor->y.fixed = PIXELS(192);
1209 actor->terrainId = 3;
1210 actor->motionFlags = 0;
1212 0xc80);
1213#if TBS_PATCH_4
1217 Map_CopyCellAttributes(49, 53, 8, 4, 20, 50);
1218 }
1221 }
1222 }
1223 } else {
1224#else
1226#endif
1228 actor = Object_GetById(21);
1230 actor->scaleX = 0x28f;
1231 actor->scaleY = 0x28f;
1232 }
1234 Engine_ActorSetPosition(15, 0, 0);
1235 Engine_ActorSetPosition(16, 0, 0);
1236 Engine_ActorSetPosition(17, 0, 0);
1237 }
1239 if (set == 0) {
1242 Actor_SetPosition(22, PIXELS(256), PIXELS(456));
1243#ifdef UBFIX
1245#else
1246 Object_GetById(22)->update =
1248#endif
1250 }
1251 } else {
1252 Object_GetById(22)->paused = set;
1254 }
1255 if (gGameState.entrance != 16 &&
1258 }
1259 }
1260 if (!GameFlag_IsSet(0x308) && gGameState.entrance == 17) {
1262 Engine_GameFlagSet(0x308);
1263 }
1264#if TBS_PATCH_4
1267 Map_CopyCellAttributes(49, 53, 8, 4, 20, 50);
1268 }
1271 }
1272 }
1273 {
1274 s32 priority;
1275 s32 actor;
1276
1277 priority = ((u32)(u8)set >> 8) + 2;
1278 actor = ACTOR_DORA;
1279 Engine_ActorSetSpritePriority(actor, priority);
1280 }
1281#endif
1282 }
1283#if !TBS_PATCH_4
1286 Map_CopyCellAttributes(49, 53, 8, 4, 20, 50);
1287 }
1290 }
1291 }
1292#endif
1295 Engine_TaskWait(1);
1296 }
1297 return 0;
1298}
1299
1300/// Back from Kalay, Garet meets his sister. "Ah! It's been a while... You're
1301/// back?" ("Sis...").
1302static void Event_GaretMeetsHisSister(void) {
1303 struct FieldActor *record;
1304 s32 msg;
1305
1309 msg = MsgValeAh;
1312 Event_ShowMessageAndWait(8, 0, 20);
1313 Camera_SetSpeed(PIXELS(1), PIXELS(1) / 8);
1314 Camera_MoveTo(PIXELS(398), -1, PIXELS(582), 1);
1316 Actor_SetSpeed(GARET, PIXELS(4) / 5, PIXELS(2) / 5);
1320 record = Object_GetById(0);
1321 if (record != 0) {
1322 Actor_SetPosition(GARET, record->x.fixed, record->z.fixed);
1323 }
1324 Actor_WalkToAndWait(GARET, 402, 608);
1332 Engine_EventWait(20);
1335 if (Engine_EventChooseYesNo(0, 0) == 1) {
1338 }
1340 Actor_ShowEmote(8, EMOTE_IN_FRONT | 5, 60);
1341 Engine_EventSetMessage(msg + 6);
1344 Engine_EventWait(40);
1357 Engine_EventWait(40);
1362 Engine_EventWait(20);
1365 record = Object_GetById(0);
1366 if (record != 0) {
1367 Actor_SetDestination(GARET, record->x.part.pixel, record->z.part.pixel);
1368 }
1370 Actor_SetPosition(GARET, 0, 0);
1371 GameFlag_Set(0x303);
1373}
1374
1375/// Back from Kalay, Garet asks a villager to protect his family. "WHATEVER YOU
1376/// DO, you must protect the family while I'm gone."
1378 struct FieldActor *record;
1379
1381 Camera_MoveTo(PIXELS(357), -1, PIXELS(738), 1);
1384 record = Object_GetById(0);
1385 if (record != 0) {
1386 Actor_SetPosition(GARET, record->x.fixed, record->z.fixed);
1387 }
1388 Actor_WalkToAndWait(GARET, 346, 745);
1390 Engine_EventSetMessage(MsgValeHowHaveYouBeen);
1397 Event_ShowMessageAndWait(9, 0, 20);
1402 Event_ShowMessageAndWait(9, 0, 20);
1407 Event_ShowMessageAndWait(9, 0, 20);
1411 Event_ShowMessage(9, 0);
1415 Engine_EventWait(20);
1418 Event_ShowMessageAndWait(9, 0, 20);
1423 Event_ShowMessageAndWait(9, 0, 20);
1426 if (Engine_EventChooseYesNo(0, 0) == 0) {
1428 } else {
1430 }
1433 Engine_EventSetMessage(MsgValeEverProtectFamily);
1436 Event_ShowMessageAndWait(9, 0, 20);
1438 Engine_EventWait(20);
1443 record = Object_GetById(0);
1444 if (record != 0) {
1445 Actor_SetDestination(GARET, record->x.part.pixel, record->z.part.pixel);
1446 }
1448 Actor_SetPosition(GARET, 0, 0);
1449 GameFlag_Set(0x304);
1451}
1452
1454 struct FieldActor *actor;
1455 const s32 *actions;
1456
1458 actor = Actor_Get(ACTOR_A);
1460 actor = Actor_Get(ACTOR_B);
1462 actor = Actor_Get(ACTOR_C);
1467 Engine_TaskWait(20);
1469 actions = gVillagerAction;
1471 Engine_TaskWait(10);
1473 Map_SetShake(-1, -1, 9 * Q16_ONE / 10);
1474 Engine_TaskWait(20);
1479 Engine_EventSetMessage(MsgValeIUsedToPlayHere);
1484 GameFlag_Set(0x305);
1486}
1487
1488/// Traverses the passage toward lower Z, changing animations at its lip.
1489static void Vale_MoveActorAlongLowerZPath(s32 actorId, s32 approachAnimationId,
1490 s32 departureAnimationId,
1491 s32 resumeMotion) {
1492 s32 departureAnimation;
1493 s32 approachAnimation;
1494 s32 restoreMotion;
1495 struct FieldActor *actor;
1496 struct AnimationObject *sprite;
1497
1498 restoreMotion = resumeMotion;
1499 approachAnimation = approachAnimationId;
1500 departureAnimation = departureAnimationId;
1501 actor = Object_GetById(actorId);
1502 sprite = actor->sprite;
1503 Actor_SetSpeed(actorId, PIXELS(1), PIXELS(1) / 2);
1504 Actor_WalkToAndWait(actorId, 392, 886);
1506 actor->motionFlags = 0;
1507 sprite->flags = 0;
1508 Engine_ActorSetAnimation(actorId, approachAnimation);
1509 Actor_SetSpeed(actorId, PIXELS(3) / 10, PIXELS(3) / 20);
1510 Actor_MoveToAndWait(actorId, 392, 875);
1511 Engine_EventWait(10);
1512 Engine_ActorSetAnimation(actorId, departureAnimation);
1513 Actor_SetSpeed(actorId, PIXELS(1), PIXELS(1) / 2);
1514 Actor_MoveToAndWait(actorId, 392, 859);
1515 sprite->flags = 1;
1516 if (restoreMotion != 0) {
1517 actor->motionFlags = 3;
1518 }
1519 Engine_EventWait(10);
1521}
1522
1523/// Traverses the passage toward higher Z and restores falling motion if
1524/// requested.
1525static void Vale_MoveActorAlongHigherZPath(s32 actorId, s32 approachAnimationId,
1526 s32 departureAnimationId,
1527 s32 resumeMotion) {
1528 s32 departureAnimation;
1529 s32 approachAnimation;
1530 s32 restoreMotion;
1531 struct FieldActor *actor;
1532 struct AnimationObject *sprite;
1533
1534 restoreMotion = resumeMotion;
1535 approachAnimation = approachAnimationId;
1536 departureAnimation = departureAnimationId;
1537 actor = Object_GetById(actorId);
1538 sprite = actor->sprite;
1539 Actor_SetSpeed(actorId, PIXELS(1), PIXELS(1) / 2);
1540 Actor_WalkToAndWait(actorId, 392, 859);
1541 Actor_FaceDirection(actorId, FACING_NORTH, 10);
1542 actor->motionFlags = 0;
1543 sprite->flags = 0;
1544 Engine_ActorSetAnimation(actorId, approachAnimation);
1545 Actor_SetSpeed(actorId, PIXELS(1), PIXELS(1) / 2);
1546 Actor_MoveToAndWait(actorId, 392, 875);
1547 Engine_EventWait(10);
1548 Actor_SetSpeed(actorId, PIXELS(3) / 10, PIXELS(3) / 20);
1549 Engine_ActorSetAnimation(actorId, departureAnimation);
1550 Actor_MoveToAndWait(actorId, 392, 890);
1551 actor->velocityY = 0x20000;
1552 sprite->flags = 1;
1553 if (restoreMotion != 0) {
1554 actor->motionFlags = 3;
1555 }
1557}
1558
1559/// Resets consecutive repair actors to their staging position or hides them.
1560static void SceneActor_ResetActorRun(s32 first, u32 count, s32 mode) {
1561 s32 selector = first;
1562 u32 i;
1563
1564 if (mode == 0) {
1565 for (i = 0; i < count; i++) {
1566 struct FieldActor *actor = Object_GetById(selector);
1567
1568 actor->motionFlags = 0;
1570 actor->x.fixed = PIXELS(390);
1571 actor->y.fixed = PIXELS(160);
1572 actor->z.fixed = PIXELS(842);
1573 selector++;
1574 }
1575 return;
1576 }
1577
1578 for (i = 0; i < count; i++) {
1579 Engine_ActorSetPosition(selector, 0, 0);
1580 selector++;
1581 }
1582}
1583
1584/// Arriving by entrance 16, the game's opening: Isaac is mending the roof.
1585/// "Three years later... Isaac! Haven't you finished mending the roof yet?"
1586static void Event_MendingTheRoof(void) {
1587 u32 i;
1588 /* FAKEMATCH: repairActor's dead zero initializer and the stoppedMotionFlags
1589 * temporary preserve register allocation throughout the scene; without the
1590 * initializer, 170 instructions differ in tbs-en. */
1591 struct FieldActor *repairActor = NULL;
1592 struct FieldActor *leader;
1593 struct FieldActor *dustEmitter;
1594 struct FieldActor *actor;
1595 s32 stoppedMotionFlags;
1596 s32 message;
1597
1599 dustEmitter = Object_GetById(14);
1600
1601 // Prepare the damaged house and start Isaac's hammering behind the caption.
1603 Camera_MoveTo(-1, -1, -1, 0);
1604 Engine_TaskWait(1);
1606 Engine_TaskWait(1);
1607 Map_CopyCellAttributes(49, 53, 8, 4, 20, 50);
1608 Map_CopyCellsTo(2, 102, 84, 41, 2, 1);
1609 Map_CopyCellsTo(1, 102, 83, 41, 1, 1);
1610 Map_CopyCellsTo(0, 103, 82, 42, 1, 1);
1611 repairActor = Object_GetById(11);
1612 repairActor->motionFlags = 0;
1613 repairActor->x.fixed = PIXELS(388);
1614 repairActor->y.fixed = PIXELS(160);
1615 repairActor->z.fixed = PIXELS(840);
1616 Engine_ActorSetSpriteFlags(repairActor, 0);
1617 repairActor = Object_GetById(12);
1618 repairActor->motionFlags = 0;
1619 repairActor->y.fixed = PIXELS(160);
1620 repairActor->z.fixed = PIXELS(844);
1621 repairActor->x.fixed = PIXELS(388);
1622 Engine_ActorSetSpriteFlags(repairActor, 0);
1623 repairActor = Object_GetById(13);
1624 repairActor->motionFlags = 0;
1625 repairActor->z.fixed = PIXELS(848);
1626 repairActor->y.fixed = PIXELS(160);
1627 repairActor->x.fixed = PIXELS(388);
1628 Engine_ActorSetSpriteFlags(repairActor, 0);
1629 actor = Object_GetById(11);
1631 actor = Object_GetById(12);
1636 message = MsgValeRepairCaption;
1637 UiText_ShowCenteredMessage(message, 0, 0);
1639
1640 // Follow Jenna through the village until she notices the repair work.
1641 Camera_MoveTo(PIXELS(339), PIXELS(160), PIXELS(1173), 0);
1643 Engine_TaskWait(1);
1644 Camera_SetSpeed(PIXELS(33) / 100, PIXELS(33) / 800);
1645 Camera_MoveTo(PIXELS(296), PIXELS(160), PIXELS(921), 1);
1646 Actor_SetPosition(JENNA, PIXELS(409), PIXELS(1134));
1647 Engine_TaskWait(1);
1648 Actor_SetSpeed(JENNA, PIXELS(7) / 10, PIXELS(7) / 20);
1649 Actor_WalkTo(JENNA, 420, 1068);
1654 Actor_SetSpeed(JENNA, PIXELS(1), PIXELS(1) / 2);
1655 Actor_WalkToAndWait(JENNA, 341, 1064);
1656 Actor_SetSpeed(JENNA, PIXELS(4) / 5, PIXELS(2) / 5);
1657 Actor_WalkToAndWait(JENNA, 359, 1033);
1658 Actor_SetSpeed(8, PIXELS(1) / 2, PIXELS(1) / 4);
1659 Actor_WalkTo(8, 318, 947);
1661 Actor_WalkToAndWait(JENNA, 412, 1033);
1662 Actor_WalkToAndWait(JENNA, 412, 1019);
1663 Actor_WalkToAndWait(JENNA, 374, 1008);
1664 Actor_WalkToAndWait(JENNA, 347, 955);
1665 Actor_WalkToAndWait(8, 318, 947);
1669 Engine_EventWait(10);
1670 Actor_WalkTo(8, 379, 1017);
1671 Camera_SetSpeed(PIXELS(1) / 2, PIXELS(1) / 16);
1672 Actor_WalkToAndWait(JENNA, 333, 920);
1673 Actor_WalkToAndWait(JENNA, 299, 924);
1675 Engine_EventWait(10);
1678 Engine_EventWait(20);
1679 Camera_SetSpeed(PIXELS(2), PIXELS(1) / 4);
1680 Camera_MoveTo(PIXELS(387), PIXELS(160), PIXELS(866), 1);
1682 Engine_ActorJump(10, 2, 20);
1683 Engine_EventSetMessage(message + 1);
1685 leader->scaleX = Q16_ONE;
1686 leader->scaleY = Q16_ONE;
1691 Engine_EventWait(40);
1693 Engine_EventWait(40);
1699 Engine_EventWait(40);
1702 Actor_WalkToAndWait(JENNA, 312, 759);
1703 Actor_WalkToAndWait(JENNA, 361, 760);
1704 Engine_EventWait(20);
1707 Event_ShowMessageAndWait(0x6001, 0, 10);
1709 Engine_ActorJump(JENNA, 4, 40);
1712 Engine_EventWait(40);
1715 Engine_EventWait(10);
1716 Camera_SetSpeed(PIXELS(4), PIXELS(1) / 2);
1717 Camera_MoveTo(PIXELS(396), -1, PIXELS(588), 1);
1718 Actor_WalkToAndWait(JENNA, 456, 739);
1720 Engine_EventWait(10);
1723 Engine_EventWait(20);
1724
1725 // Garet's repair effect trails dust across the house.
1730 for (i = 0; i < 60; i++) {
1732 Engine_TaskWait(1);
1733 }
1737 actor = Object_GetById(14);
1739 stoppedMotionFlags = 0;
1740 dustEmitter->motionFlags = stoppedMotionFlags;
1741 dustEmitter->x.fixed = PIXELS(428);
1742 dustEmitter->y.fixed = PIXELS(208);
1743 dustEmitter->z.fixed = PIXELS(584);
1744 dustEmitter->facing = 0x8000;
1747 Actor_SetSpeed(14, PIXELS(2), PIXELS(2));
1748 FieldObject_SetPosition(dustEmitter, PIXELS(408), PIXELS(208), PIXELS(584));
1749 Engine_EventWait(40);
1750 Actor_SetSpeed(9, PIXELS(3) / 20, PIXELS(3) / 40);
1751 Actor_SetSpeed(14, PIXELS(3) / 20, PIXELS(3) / 40);
1752 Object_GetById(9);
1753 Engine_ObjectSetPosition(dustEmitter, PIXELS(392), PIXELS(208), PIXELS(584));
1754 Actor_MoveToAndWait(9, 378, 584);
1755 Engine_EventWait(20);
1757 dustEmitter->update = (void (*)(union FieldObject *))stoppedMotionFlags;
1759 Actor_Get(GARET)->priorityFlags |= ACTOR_PRIORITY_AUTOMATIC;
1762 Engine_TaskWait(1);
1764 Actor_SetChildValue(9, 0);
1767 Effect_SpawnRisingDustBurst(dustEmitter);
1769
1770 // Finish the reunion conversation after the repair effects settle.
1771 Engine_EventWait(10);
1772 Actor_WalkToAndWait(JENNA, 424, 624);
1775 Engine_EventWait(10);
1776 Event_ShowMessageAndWait(0x6001, 0, 20);
1778 Engine_EventWait(10);
1782 Engine_EventWait(10);
1786 Engine_EventWait(10);
1790 Engine_EventWait(10);
1793 Engine_EventWait(10);
1794 Actor_WalkToAndWait(JENNA, 388, 604);
1797 Engine_EventWait(10);
1800 Engine_EventWait(10);
1803 Engine_EventWait(10);
1806 Event_ShowTwoMessagesAndWait(1, 1, 2, 25, 2, 5, 10, 14, 4, 14,
1807 stoppedMotionFlags);
1808 Engine_EventWait(40);
1811 Engine_EventWait(80);
1815 Engine_EventWait(80);
1817 Engine_EventWait(10);
1821 Engine_EventWait(40);
1823 Engine_EventWait(20);
1826 Engine_EventWait(10);
1831 Engine_EventWait(10);
1832 Actor_WalkToAndWait(JENNA, 380, 620);
1833 Engine_EventWait(10);
1837 Engine_EventWait(80);
1839 Engine_EventWait(10);
1840 Event_ShowMessageAndWait(0x6001, 0, 20);
1842 Engine_EventWait(10);
1845 Engine_EventWait(10);
1846 Actor_SetSpeed(GARET, PIXELS(4) / 5, PIXELS(2) / 5);
1847 Actor_WalkToAndWait(GARET, 412, 604);
1850 Engine_EventWait(10);
1853 Engine_ActorJump(JENNA, 4, 30);
1856 Engine_EventWait(10);
1857 Event_ShowMessageAndWait(0x6001, 0, 20);
1858 Engine_EventWait(30);
1864 Actor_SetSpeed(JENNA, PIXELS(4) / 5, PIXELS(2) / 5);
1865 Actor_WalkTo(JENNA, 428, 628);
1866 Engine_EventWait(20);
1869 Event_ShowMessage(0x5001, 0);
1871 Engine_EventWait(60);
1874 Actor_WalkToAndWait(JENNA, 428, 628);
1877 Engine_EventWait(10);
1879 Engine_EventWait(10);
1882 Engine_EventWait(40);
1883 Event_ShowMessageAndWait(0x5001, 0, 20);
1886 Engine_EventWait(10);
1887 Actor_SetSpeed(JENNA, PIXELS(1) / 2, PIXELS(1) / 4);
1888 Actor_SetSpeed(GARET, PIXELS(1) / 2, PIXELS(1) / 4);
1889 Actor_WalkTo(JENNA, 450, 750);
1890 Actor_WalkTo(GARET, 450, 750);
1891 Engine_EventWait(60);
1897}
1898
1899/// Arriving by entrance 17 after the opening: Dora praises the mended roof.
1900/// "Good job, Isaac. You patched it nicely."
1901static void Event_RoofMended(void) {
1902 struct FieldActor *leader;
1903 struct FieldActor *actor;
1904 u32 i;
1905 s32 turnBack;
1906 s32 turnSide;
1907 struct FieldActor *turned;
1908 s32 none;
1909 s32 flag;
1910 SchedulerCallback callbackA;
1911 SchedulerCallback callbackB;
1912 SchedulerCallback callbackC;
1913 SchedulerCallback callbackD;
1914 SchedulerCallback callbackE;
1915 SchedulerCallback callbackF;
1916
1917 leader = Actor_Get(ACTOR_PARTY_LEADER);
1919 Camera_MoveTo(-1, -1, -1, 0);
1920 Engine_TaskWait(1);
1921 Map_CopyCellAttributes(49, 53, 8, 4, 20, 50);
1922 Map_CopyCellsTo(2, 102, 84, 41, 2, 1);
1923 Map_CopyCellsTo(1, 102, 83, 41, 1, 1);
1924 Map_CopyCellsTo(0, 103, 82, 42, 1, 1);
1926 turned = Actor_Get(ACTOR_DORA);
1927
1928 turned->facing = 0;
1929 turnBack = 0xc000;
1930 turned->facing = turnBack;
1931 Actor_SetPosition(GARET, PIXELS(298), PIXELS(736));
1932 turned = Actor_Get(GARET);
1933 turnSide = 0x4000;
1934 turned->facing = turnSide;
1935 Actor_SetPosition(JENNA, PIXELS(298), PIXELS(760));
1936 turned = Actor_Get(JENNA);
1937 turned->facing = turnSide;
1940 actor = Actor_Get(23);
1941 actor->motionFlags = 0;
1942 actor->x.fixed = PIXELS(388);
1943 actor->y.fixed = PIXELS(160);
1944 actor->z.fixed = PIXELS(840);
1946 actor = Actor_Get(24);
1947 actor->motionFlags = 0;
1948 actor->x.fixed = PIXELS(388);
1949 actor->y.fixed = PIXELS(160);
1950 actor->z.fixed = PIXELS(844);
1952 actor = Actor_Get(25);
1953 actor->motionFlags = 0;
1954 actor->x.fixed = PIXELS(388);
1955 actor->y.fixed = PIXELS(160);
1956 actor->z.fixed = PIXELS(848);
1958 ((u8 *)Engine_EventGetViewCenter())[85] = 0;
1959 Engine_TaskWait(1);
1960 Camera_MoveTo(PIXELS(383), PIXELS(160), PIXELS(877), 0);
1962 Engine_TaskWait(1);
1965 Actor_SetSpeed(JENNA, PIXELS(1) / 2, turnSide);
1966 Actor_SetSpeed(GARET, PIXELS(1) / 2, turnSide);
1969 Engine_EventWait(40);
1971 leader->scaleX = Q16_ONE;
1972 leader->scaleY = Q16_ONE;
1975 Engine_EventWait(10);
1978 Engine_EventWait(10);
1981 Engine_EventWait(20);
1986 for (i = 0; i < 40; i++) {
1988 Engine_TaskWait(1);
1989 }
1991
1993 Task_AddCallback(callbackA, 3200);
1994 callbackB = Vale_CycleFirstBoardPalette;
1995 Task_AddCallback(callbackB, 3200);
1996 Actor_SetSpeed(23, PIXELS(1) / 5, PIXELS(1) / 10);
1997 Actor_MoveToAndWait(23, 390, 832);
1999 Actor_MoveToAndWait(23, 400, 826);
2000 Engine_EventWait(20);
2001 {
2002 struct FieldActor *record = Actor_Get(ACTOR_PARTY_LEADER);
2003
2005 }
2008 Scheduler_RemoveCallback(callbackA);
2009 Scheduler_RemoveCallback(callbackB);
2010 Engine_TaskWait(1);
2012 Actor_SetChildValue(23, 0);
2013 Actor_SetPosition(23, 0, 0);
2014 Engine_EventWait(20);
2017 Engine_EventWait(120);
2018 Map_CopyCellsTo(7, 102, 84, 41, 2, 1);
2020 leader->scaleX = Q16_ONE;
2021 leader->scaleY = Q16_ONE;
2023 Engine_EventWait(40);
2030 for (i = 0; i < 40; i++) {
2032 Engine_TaskWait(1);
2033 }
2036 Task_AddCallback(callbackC, 3200);
2037 callbackD = Vale_CycleSecondBoardPalette;
2038 Task_AddCallback(callbackD, 3200);
2039 Actor_SetSpeed(24, PIXELS(1) / 5, PIXELS(1) / 10);
2040 Actor_MoveToAndWait(24, 390, 832);
2042 Actor_MoveToAndWait(24, 377, 828);
2043 Engine_EventWait(20);
2044 {
2045 struct FieldActor *record = Actor_Get(ACTOR_PARTY_LEADER);
2046
2048 }
2051 Scheduler_RemoveCallback(callbackC);
2052 Scheduler_RemoveCallback(callbackD);
2053 Engine_TaskWait(1);
2055 Actor_SetChildValue(24, 0);
2056 Actor_SetPosition(24, 0, 0);
2057 Engine_EventWait(20);
2060 Engine_EventWait(120);
2061 Map_CopyCellsTo(6, 102, 83, 41, 1, 1);
2063 leader->scaleX = Q16_ONE;
2064 leader->scaleY = Q16_ONE;
2066 Engine_EventWait(40);
2074 for (i = 0; i < 40; i++) {
2076 Engine_TaskWait(1);
2077 }
2080 Task_AddCallback(callbackE, 3200);
2081 callbackF = Vale_CycleActor25Palette;
2082 FieldScheduler_AddCallback(callbackF, 3200);
2083 Actor_SetSpeed(25, PIXELS(1) / 5, PIXELS(1) / 10);
2084 Actor_MoveToAndWait(25, 390, 832);
2086 Actor_MoveToAndWait(25, 360, 837);
2087 Engine_EventWait(20);
2088 {
2089 struct FieldActor *record = Actor_Get(ACTOR_PARTY_LEADER);
2090
2092 }
2095 Scheduler_RemoveCallback(callbackE);
2096 Scheduler_RemoveCallback(callbackF);
2097 Engine_TaskWait(1);
2099 Actor_SetChildValue(25, 0);
2100 Actor_SetPosition(25, 0, 0);
2101 Engine_EventWait(20);
2104 Engine_EventWait(120);
2106 Map_CopyCellsTo(5, 103, 82, 42, 1, 1);
2108 leader->scaleX = Q16_ONE;
2109 leader->scaleY = Q16_ONE;
2111 Engine_EventSetMessage(MsgValeGoodJob);
2114 Vale_MoveActorAlongLowerZPath(21, 5, 6, 0);
2115 Actor_SetSpeed(ACTOR_DORA, PIXELS(3) / 10, PIXELS(3) / 20);
2117 Engine_EventWait(20);
2124 Engine_EventWait(20);
2134 Engine_EventWait(20);
2137 if (Engine_EventChooseYesNo(0, 0) == 0) {
2140 } else {
2142 }
2144 Engine_EventSetMessage(MsgValeWorkingYourselvesBone);
2146 Engine_EventWait(10);
2152 if (Engine_EventChooseYesNo(0, 0) == 1) {
2154 }
2158 Engine_EventSetMessage(MsgValeDevastatedWhenKyle);
2161 Engine_EventWait(10);
2163 Engine_EventWait(60);
2170 Engine_EventWait(20);
2172 Engine_EventWait(20);
2180 Camera_SetSpeed(PIXELS(2) / 5, PIXELS(1) / 20);
2181 Camera_MoveTo(PIXELS(377), PIXELS(160), PIXELS(860), 1);
2182 Actor_SetSpeed(JENNA, PIXELS(1), PIXELS(1) / 2);
2183 Actor_SetSpeed(GARET, PIXELS(1), PIXELS(1) / 2);
2184 Actor_WalkTo(GARET, 369, 904);
2185 Actor_WalkToAndWait(JENNA, 392, 904);
2187 Vale_MoveActorAlongLowerZPath(5, 10, 11, 0);
2191 Engine_EventWait(10);
2194 Engine_ActorJump(JENNA, 4, 0);
2195 Actor_WalkToAndWait(JENNA, 392, 843);
2206 Vale_MoveActorAlongLowerZPath(1, 10, 11, 0);
2207 Actor_SetSpeed(JENNA, PIXELS(3) / 10, PIXELS(3) / 20);
2208 Actor_SetSpeed(GARET, PIXELS(3) / 10, PIXELS(3) / 20);
2209 Actor_WalkTo(GARET, 392, 843);
2211 Actor_WalkToAndWait(JENNA, 408, 843);
2213 {
2214 struct FieldActor *record = Actor_Get(JENNA);
2215
2217 }
2225 Engine_EventWait(20);
2231 Engine_EventWait(60);
2235 Actor_ShowEmote(ACTOR_DORA, 257, 80);
2242 Engine_EventWait(80);
2246 Engine_EventWait(10);
2247 Actor_ShowEmote(ACTOR_DORA, 261, 60);
2252 Engine_EventWait(20);
2255 Engine_EventWait(40);
2259 Engine_EventWait(20);
2268 Engine_EventWait(20);
2271 Camera_SetSpeed(PIXELS(3) / 5, PIXELS(3) / 40);
2272 Camera_MoveTo(PIXELS(373), PIXELS(160), PIXELS(837), 1);
2280 Engine_EventWait(20);
2288 none = 0;
2289
2290 if (Engine_EventChooseYesNo(0, 0) == 1) {
2292 }
2294 Engine_EventSetMessage(MsgValeAsStubbornAsYourFather);
2295 Actor_ShowEmote(ACTOR_DORA, 259, 0);
2302 Event_ShowTwoMessagesAndWait(21, 14, 2, 24, 2, 1, 10, 14, 4, 14, none);
2304 actor = Actor_Get(ACTOR_DORA);
2305 actor->sprite->flags = none;
2306 actor->steeringFlags &= 0xfe;
2310 for (i = 0; i != 4; i++) {
2311 actor->z.fixed += PIXELS(3) / 2;
2312 actor->scaleY += -0x1999;
2314 }
2316 Actor_SetSpeed(GARET, PIXELS(3), PIXELS(3) / 2);
2317 Engine_ActorJump(GARET, 6, 0);
2319#if TBS_PATCH_2
2321#endif
2324 Actor_ShowEmote(JENNA, 256, 0);
2326 Actor_ShowEmote(GARET, 256, 10);
2328 Engine_ActorJump(GARET, 2, 5);
2330 Map_SetShake(0, PIXELS(4), Q16_ONE);
2331 Map_CopyCellsTo(1, 102, 83, 41, 1, 1);
2335 Map_SetShake(-1, -1, 9 * Q16_ONE / 10);
2337 Actor_ShowEmote(GARET, 258, 80);
2339 actor->scaleY = 0x8000;
2341 for (i = 0; i != 5; i++) {
2342 actor->scaleY += 0x1999;
2344 }
2345 Engine_EventWait(60);
2350 Engine_EventWait(60);
2352 Engine_EventWait(20);
2354 Camera_SetSpeed(PIXELS(3) / 10, PIXELS(3) / 80);
2355 Camera_MoveTo(PIXELS(372), PIXELS(160), PIXELS(859), 1);
2359 Engine_EventWait(20);
2362 actor->priorityFlags &= 0xfe;
2364 Actor_ShowEmote(ACTOR_DORA, 257, 80);
2369 Engine_EventWait(80);
2371 Actor_ShowEmote(GARET, 258, 80);
2376 Engine_EventWait(10);
2379 Engine_ActorJump(GARET, 6, 0);
2382 actor = Actor_Get(GARET);
2391 Actor_ShowEmote(GARET, 256, 0);
2393 Engine_ActorJump(GARET, 2, 5);
2395 Map_CopyCellsTo(2, 102, 84, 41, 2, 1);
2397 Map_SetShake(0, PIXELS(4), Q16_ONE);
2399 Map_SetShake(-1, -1, 9 * Q16_ONE / 10);
2401 Actor_ShowEmote(GARET, 258, 30);
2402 Actor_SetSpeed(JENNA, PIXELS(3) / 10, PIXELS(3) / 20);
2403 Actor_WalkToAndWait(JENNA, 408, 855);
2404 Engine_EventWait(60);
2406 Actor_ShowEmote(ACTOR_DORA, 261, 60);
2409 Engine_EventWait(80);
2412 Engine_EventWait(10);
2414 Engine_EventWait(80);
2416 Engine_EventWait(10);
2423 Engine_EventWait(60);
2425 Actor_ShowEmote(ACTOR_DORA, 261, 80);
2429 Actor_ShowEmote(JENNA, 257, 0);
2430 Actor_ShowEmote(GARET, 257, 60);
2432 Engine_EventWait(30);
2436 Engine_EventWait(20);
2441 Engine_EventWait(10);
2445 Engine_EventWait(20);
2448 Engine_EventWait(20);
2450 Engine_EventWait(10);
2453 Actor_ShowEmote(ACTOR_DORA, 256, 0);
2455 Engine_EventWait(30);
2458 Actor_SetSpeed(GARET, PIXELS(1), PIXELS(1) / 2);
2460 Engine_ActorJump(GARET, 4, 0);
2461 Engine_ActorWalkToAndWait(1, 398, 828);
2462 Engine_EventWait(60);
2466 Engine_EventWait(60);
2468 Engine_EventWait(60);
2469 actor = Actor_Get(GARET);
2470 flag = 1;
2471 actor->steeringFlags |= flag;
2472 actor = Actor_Get(JENNA);
2473 actor->steeringFlags |= flag;
2475 Actor_SetSpeed(GARET, PIXELS(1), PIXELS(1) / 2);
2476 Actor_SetSpeed(JENNA, PIXELS(1), PIXELS(1) / 2);
2478 Actor_WalkTo(JENNA, actor->x.part.pixel + 16, actor->z.part.pixel);
2479 Actor_WalkToAndWait(GARET, actor->x.part.pixel + 16,
2480 actor->z.part.pixel - 16);
2486 Engine_EventWait(40);
2487 Actor_WalkToAndWait(JENNA, actor->x.part.pixel, actor->z.part.pixel);
2488 Actor_SetPosition(JENNA, 0, 0);
2489 Actor_WalkToAndWait(GARET, actor->x.part.pixel, actor->z.part.pixel);
2490 Actor_SetPosition(GARET, 0, 0);
2492 Camera_MoveTo(PIXELS(377), PIXELS(160), PIXELS(887), 1);
2493 Vale_MoveActorAlongHigherZPath(0, 13, 10, 0);
2496 {
2497 struct FieldActor *record = Actor_Get(ACTOR_DORA);
2498
2499 record->steeringFlags = flag | record->steeringFlags;
2500 }
2501 Vale_MoveActorAlongHigherZPath(21, 6, 5, 0);
2507 Engine_EventWait(20);
2510 Engine_EventWait(100);
2511 Map_CopyCellAttributes(49, 46, 8, 4, 20, 50);
2514#if TBS_PATCH_1
2515 leader->motionFlags = 3;
2516 leader->y.fixed = PIXELS(160);
2517 leader->targetY = 0x80000000;
2518 leader->velocityY = 0;
2519#else
2521#endif
2523}
2524
2525#include "common/effect_psynergy.h"
2526
2527/// Cycles palettes on Garet and periodically spawns attached effects.
2530}
2531
2532/// Cycles the leader palette and periodically spawns attached effects.
2535}
2536
2537/// Cycles actor 9 palette during the repair scene.
2540}
2541
2542/// Cycles the first board palette while its repair effect runs.
2545}
2546
2547/// Cycles the second board palette while its repair effect runs.
2550}
2551
2552/// Cycles actor 25 palette during the repair scene.
2553static void Vale_CycleActor25Palette(void) {
2555}
2556
2558 s32 *second_position) {
2559 s32 delta_x = (*first_position++ - *second_position++) >> 16;
2560 s32 delta_y = (*first_position++ - *second_position++) >> 16;
2561 s32 delta_z = (*first_position - *second_position) >> 16;
2562 s32 delta_x_squared = delta_x * delta_x;
2563 s32 delta_y_squared = delta_y * delta_y;
2564 s32 delta_z_squared = delta_z * delta_z;
2565
2566 return Iwram_Sqrt(delta_x_squared + delta_y_squared + delta_z_squared);
2567}
2568
2569static s32 Vale_TestFacing(struct FieldActor *obj, struct FieldActor *target,
2570 s32 range, s32 force) {
2571 s32 result;
2572 u32 angle;
2573 u32 left;
2574 u32 right;
2575 u32 dir;
2576
2577 result = 0;
2578 if (obj->paused == 1) {
2579 if (obj->riseCounter == 0) {
2580 Object_SetMode(obj, 1);
2581 return 1;
2582 }
2583 }
2584 if (Runtime_ComputeFixedPointDistance(&target->x.fixed, &obj->x.fixed) <
2585 range ||
2586 force != 0) {
2587 angle = (u16)ArcTan2(target->z.fixed - obj->z.fixed,
2588 target->x.fixed - obj->x.fixed);
2589 left = (angle - 0x1000) & 0xf000;
2590 right = (angle + 0x1000) & 0xf000;
2591 angle &= 0xf000;
2592 dir = obj->facing & 0xf000;
2593 if (angle == dir || right == dir || left == dir || force != 0) {
2594 obj->paused = 1;
2595 Object_SetMode(obj, 1);
2596 result = 1;
2597 obj->riseCounter = result;
2598 } else {
2599 obj->paused = 0;
2600 Object_SetMode(obj, 2);
2601 obj->riseCounter = 0;
2602 }
2603 } else {
2604 obj->paused = 0;
2605 Object_SetMode(obj, 2);
2606 obj->riseCounter = 0;
2607 }
2608 return result;
2609}
2610
2611// UB: calling this s32 function through a void update hook is incompatible.
2612// Plain void changes 48 to 44 bytes in tbs-en.
2613#ifdef UBFIX
2614static void Vale_HaveVillagerWatchTheLeader(union FieldObject *fieldObject) {
2615#else
2617#endif
2618 struct FieldActor *villager = &fieldObject->actor;
2620 if (villager->targetX == ACTOR_NO_TARGET &&
2621 villager->targetZ == ACTOR_NO_TARGET)
2622#ifdef UBFIX
2623 return;
2624#else
2625 return 0;
2626#endif
2627 Vale_TestFacing(villager, leader, 18, 0);
2628#ifdef UBFIX
2629 return;
2630#else
2631 return 0;
2632#endif
2633}
2634
2635/// Emits one dust particle below the moving source actor.
2636static void Effect_ConfigureSpawnedParticle(union FieldObject *fieldObject) {
2637 struct FieldActor *source = &fieldObject->actor;
2638 s32 spawnPosition[3];
2639 s32 randomDistance;
2640 struct FieldActor *particle;
2641 SET_VECTOR(spawnPosition, source->x.fixed,
2642 source->y.fixed - (Engine_RandomNext() << 4) - PIXELS(8),
2643 source->z.fixed);
2644 randomDistance = Engine_RandomNext();
2645 Vector_AddPolarOffset(((randomDistance << 1) + randomDistance) << 4,
2646 Engine_RandomNext(), spawnPosition);
2647 particle = Engine_ObjectCreate(0x11d, spawnPosition[0], spawnPosition[1],
2648 spawnPosition[2]);
2649 if (particle != 0) {
2650 particle->motionFlags = 2;
2651 particle->gravity = 0x1999;
2652 particle->wait = 12;
2653 Engine_ActorSetSpriteFlags(particle, 0);
2654 Object_SetMode(particle, 0);
2656 {
2657 struct AnimationObject *record = particle->sprite;
2658 s32 priorityFlags = ~12;
2659 priorityFlags &= ((u8 *)&record->image)[9];
2660 priorityFlags |= 4;
2661 ((u8 *)&record->image)[9] = priorityFlags;
2662 }
2663 }
2665}
2666
2667/// Shrinks and raises the emitter, scatters dust, then clears its motion
2668/// targets.
2669static void Effect_SpawnRisingDustBurst(struct FieldActor *emitter) {
2670 s32 frameCountdown;
2671
2673
2674 for (frameCountdown = 30; frameCountdown >= 0; frameCountdown--) {
2675 emitter->y.fixed += PIXELS(1);
2676 emitter->facing = (u16)(emitter->facing + 0x2000);
2677 emitter->scaleX += -2048;
2678 emitter->scaleY += -2048;
2679 Engine_TaskWait(1);
2680 }
2681
2682 for (frameCountdown = 7; frameCountdown >= 0; frameCountdown--) {
2683 struct FieldActor *particle = Engine_ObjectCreate(
2684 0x11d, emitter->x.fixed, emitter->y.fixed, emitter->z.fixed);
2685
2686 if (particle != 0) {
2687 s32 verticalSpeed;
2688
2689 Engine_ActorSetSpriteFlags(particle, 0);
2690 Engine_ObjectSetScript(particle, (const void *)&gDustBurstScript[1]);
2691
2692 verticalSpeed = Engine_RandomNext() + PIXELS(1);
2693 particle->acceleration = Q16_ONE;
2694 particle->speed = verticalSpeed;
2695 particle->motionFlags = 2;
2696 particle->gravity = 0x0a3d;
2697
2699
2701 particle, ((Engine_RandomNext() * 3) << 3) + PIXELS(8),
2703 }
2704 }
2705
2707
2708 emitter->x.fixed = 0;
2709 emitter->y.fixed = 0;
2710 emitter->z.fixed = 0;
2711 emitter->targetX = ACTOR_NO_TARGET;
2712 emitter->targetY = ACTOR_NO_TARGET;
2713 emitter->targetZ = ACTOR_NO_TARGET;
2714 SET_VELOCITY(emitter, 0, 0, 0);
2715}
2716
2717/// Moves a particle outward in the horizontal plane without changing its
2718/// height.
2719static void Effect_UpdateParticlePosition(struct FieldActor *particle,
2720 s32 distance, s32 angle) {
2721 s32 position[3];
2722 if (particle != 0) {
2723 SET_VECTOR(position, particle->x.fixed, particle->y.fixed,
2724 particle->z.fixed);
2725 Vector_AddPolarOffset(distance, angle, position);
2726 Engine_ObjectSetPosition(particle, position[0], position[1], position[2]);
2727 }
2728}
2729
2730/// Pushing the movable object (actor 20; 21 after Kalay) moves it a cell.
2731static void Event_PushObject(void) {
2732#if !TBS_PATCH_1
2733 // Japanese edition only: look up a villager but do not use the return value.
2736 else
2737 Object_GetById(20);
2738#endif
2739 Map_CopyCellAttributes(17, 0, 3, 1, 22, 36);
2740 StagedActor_AdvancePair();
2742}
2743
2744/// After Move or a push, record the object's column in group flags 0x314 to
2745/// 0x316 and block the cell it now stands on.
2746static void Event_SettleMovedObject(void) {
2747 struct FieldActor *actor;
2748 s32 column;
2749
2750 Map_CopyCellAttributes(17, 0, 3, 1, 22, 36);
2752 actor = Object_GetById(21);
2753 else
2754 actor = Object_GetById(20);
2755 if (actor == NULL)
2756 return;
2757 GameFlag_Clear(0x314);
2758 GameFlag_Clear(0x315);
2759 GameFlag_Clear(0x316);
2760 column = actor->x.fixed >> 20;
2761 if (column == 22) {
2762 Map_CopyCellAttributes(17, 1, 1, 1, column, 36);
2763 Engine_GameFlagSet(0x314);
2764 } else if (column == 23) {
2765 Map_CopyCellAttributes(17, 1, 1, 1, column, 36);
2766 Engine_GameFlagSet(0x315);
2767 } else {
2768 Map_CopyCellAttributes(17, 1, 1, 1, 24, 36);
2769 Engine_GameFlagSet(0x316);
2770 }
2771}
2772
2773static void Effect_PlayStepSound(void) {
2774 if ((*(u32 *)&gFrameCount & 15) == 0)
2776}
2777
2778/// Tells the player that this door will not open.
2779static void Event_SearchTheLockedDoor(void) {
2781 Engine_MessageShowCentered(MsgValeDoorWontOpen, 1);
2783}
2784
2785/// Pauses the Aleph villager while the corresponding event flag is set.
2787 s32 pauseFlag;
2788
2790 pauseFlag = GameFlag_IsSet(FLAG_MENU_OPEN);
2791 if (pauseFlag == 0) {
2792 Object_GetById(22)->paused = pauseFlag;
2794 }
2795 } else {
2796 if (GameFlag_IsSet(FLAG_MENU_OPEN) != 0) {
2797 Object_GetById(22)->paused = 1;
2799 }
2800 }
2801}
2802
2803/// Keeps raised villager priority consistent with the leader height.
2806 struct FieldActor *villager;
2808 villager = Object_GetById(21);
2809 else
2810 villager = Object_GetById(20);
2811 if (villager != 0) {
2812 if (leader->y.fixed > PIXELS(200))
2813 villager->priorityFlags = 3;
2814 else
2815 villager->priorityFlags = 1;
2816 }
2817}
2818
2819#include "common/object_orbit.h"
2820
2821static void Vale_FlashActorAndSpawnEffects(struct FieldActor *actor) {
2822
2823 if ((gFrameCount & 2) != 0)
2825 else
2827 if ((gFrameCount & 0xf) == 0)
2829}
2830
2832 if ((gFrameCount & 1) != 0)
2833 Engine_ObjectSetPartPalettes(actor, (gFrameCount >> 1) % 6);
2834 if ((gFrameCount & 0xf) == 0)
2836}
2837
2838static void Vale_CycleActorPalette(struct FieldActor *actor) {
2839 if ((gFrameCount & 1) != 0)
2840 Engine_ObjectSetPartPalettes(actor, (gFrameCount >> 1) % 6);
2841}
2842
2843#include "common/effect_vertical.h"
2845
2846/// Pixel step by direction: X in the upper halfword, Z in the lower.
2847#define DIRECTION_STEP(dx, dz) (((dx) << 16) | ((dz) & 0xffff))
2848
2850 DIRECTION_STEP(16, 0), DIRECTION_STEP(16, 0), DIRECTION_STEP(16, 0),
2851 DIRECTION_STEP(0, 16), DIRECTION_STEP(0, 16), DIRECTION_STEP(0, 16),
2852 DIRECTION_STEP(0, 16), DIRECTION_STEP(-16, 0), DIRECTION_STEP(-16, 0),
2853 DIRECTION_STEP(-16, 0), DIRECTION_STEP(-16, 0), DIRECTION_STEP(0, -16),
2854 DIRECTION_STEP(0, -16), DIRECTION_STEP(0, -16), DIRECTION_STEP(0, -16),
2855 DIRECTION_STEP(16, 0),
2856};
2857
2858// clang-format off
2860 207, 205, 228, 229, 298, 297,
2861};
2862
2864 -32, -8, 32, 8,
2865 -8, -32, 8, 32,
2866 -32, -16, 32, 0,
2867 -8, -32, 8, 32,
2868 -32, -8, 32, 8,
2869 -8, -32, 8, 32,
2870};
2871
2873 SC_SET(SW_SPEED, 0x8000),
2874 SC_SET(SW_ACCEL, 0x4000),
2875 SC_SET(0x23, 2),
2876 SC_LABEL(1),
2877 SC_ARG(2),
2878 SC_MOVE(PIXELS(296), 0, PIXELS(456)),
2879 SC_SYNC,
2880 SC_SET(0x23, 3),
2881 SC_MOVE(PIXELS(296), 0, PIXELS(420)),
2882 SC_SYNC,
2883 SC_ARG(1),
2884 SC_WAIT(10),
2886 SC_WAIT(5),
2888 SC_WAIT(10),
2890 SC_WAIT(5),
2892 SC_WAIT(5),
2894 SC_WAIT(5),
2896 SC_WAIT(10),
2897 SC_ARG(2),
2898 SC_MOVE(PIXELS(296), 0, PIXELS(456)),
2899 SC_SYNC,
2900 SC_SET(0x23, 2),
2901 SC_MOVE(PIXELS(256), 0, PIXELS(456)),
2902 SC_SYNC,
2903 SC_ARG(1),
2904 SC_WAIT(15),
2906 SC_WAIT(5),
2908 SC_WAIT(60),
2909 SC_ARG(2),
2910 SC_MOVE(PIXELS(212), 0, PIXELS(456)),
2911 SC_SYNC,
2912 SC_SET(0x23, 1),
2913 SC_MOVE(PIXELS(212), 0, PIXELS(388)),
2914 SC_SYNC,
2915 SC_ARG(1),
2916 SC_WAIT(20),
2918 SC_WAIT(5),
2920 SC_WAIT(40),
2921 SC_ARG(2),
2922 SC_MOVE(PIXELS(212), 0, PIXELS(429)),
2923 SC_SYNC,
2924 SC_ARG(1),
2925 SC_WAIT(10),
2927 SC_WAIT(5),
2929 SC_WAIT(30),
2931 SC_WAIT(5),
2933 SC_WAIT(20),
2935 SC_WAIT(5),
2937 SC_WAIT(5),
2938 SC_ARG(2),
2939 SC_MOVE(PIXELS(212), 0, PIXELS(456)),
2940 SC_SYNC,
2941 SC_SET(0x23, 2),
2942 SC_MOVE(PIXELS(256), 0, PIXELS(456)),
2943 SC_SYNC,
2944 SC_ARG(1),
2945 SC_WAIT(10),
2947 SC_WAIT(5),
2949 SC_WAIT(40),
2951 SC_WAIT(5),
2953 SC_WAIT(20),
2955 SC_WAIT(5),
2957 SC_WAIT(5),
2959};
2960
2962 SC_LABEL(1),
2963 SC_ADD(SW_SCALE_Y, 1966),
2964 SC_WAIT(12),
2965 SC_SET(SW_SCALE_Y, 0x10000),
2966 SC_WAIT(12),
2968 SC_END,
2969};
2970
2972 SC_ARG(2),
2973 SC_MOVE(PIXELS(300), 0, PIXELS(880)),
2974 SC_SYNC,
2975 SC_MOVE(PIXELS(300), 0, PIXELS(904)),
2976 SC_SYNC,
2977 SC_ARG(1),
2978 SC_SET(SW_FACING, 0xd000),
2979 SC_END,
2980};
2981
2983 SC_ARG(2),
2984 SC_MOVE(PIXELS(300), 0, PIXELS(904)),
2985 SC_SYNC,
2986 SC_MOVE(PIXELS(321), 0, PIXELS(904)),
2987 SC_SYNC,
2988 SC_ARG(1),
2989 SC_SET(SW_FACING, 0xd000),
2990 SC_END,
2991};
2992
2994 SC_ARG(1),
2995 SC_POS(PIXELS(266), 0, PIXELS(1230)),
2996 SC_SET(SW_SCALE_X, 0x1999),
2997 SC_SET(SW_SCALE_Y, 0x1999),
2998 SC_WAIT(1),
2999 SC_LABEL(1),
3000 SC_ADD(SW_SCALE_X, 3932),
3001 SC_ADD(SW_SCALE_Y, 0x147a),
3002 SC_WAIT(1),
3003 SC_LOOP(24, SC_TO(1)),
3004 SC_POS(0, 0, 0),
3005 SC_WAIT(1),
3006 SC_END,
3007};
3008
3010 SC_FREE,
3011 SC_SYNC,
3012 SC_SET(SW_SPEED, 0x1000),
3013 SC_ARG(0),
3014 SC_WAIT(10),
3015 SC_FREE,
3016};
3017
3019 { 0, CONDITION_ALWAYS, 167, 0, 1281, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3020 { 1, CONDITION_ALWAYS, 256, 0, 440, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3021 { 2, CONDITION_ALWAYS, 113, 0, 303, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3022 { 3, CONDITION_ALWAYS, 38, 0, 636, FACING_EAST, 0, -1, -1, -1, -1, 0 },
3023 { 4, CONDITION_ALWAYS, 29, 0, 792, FACING_EAST, 0, -1, -1, -1, -1, 0 },
3024 { 5, CONDITION_ALWAYS, 458, 0, 1393, FACING_WEST, 0, -1, -1, -1, -1, 0 },
3025 { 6, CONDITION_ALWAYS, 406, 0, 743, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3026 { 7, CONDITION_ALWAYS, 262, 0, 821, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3027 { 8, CONDITION_ALWAYS, 340, 0, 904, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3028 { 9, CONDITION_ALWAYS, 326, 0, 1142, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3029 { 10, CONDITION_ALWAYS, 374, 0, 1254, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3030 { 11, CONDITION_ALWAYS, 102, 0, 1222, FACING_SOUTH, 0, -1, -1, -1, -1, 0 },
3031 { 16, CONDITION_ALWAYS, 400, 0, 852, FACING_NORTH, 0, -1, -1, -1, -1, 0 },
3032 { 17, CONDITION_ALWAYS, 400, 0, 852, FACING_NORTH, 0, -1, -1, -1, -1, 0 },
3033 { SCENE_TABLE_END },
3034};
3035
3037 SCENE_EXITS(4),
3038 SCENE_EXIT(1, 19, 1),
3039 SCENE_EXIT(2, 5, 8),
3040 SCENE_EXIT(3, 6, 1),
3041 SCENE_EXIT(4, 6, 2),
3042 SCENE_EXIT(5, 7, 6),
3043 SCENE_EXIT(6, 7, 5),
3044 SCENE_EXIT(7, 8, 6),
3045 SCENE_EXIT(8, 7, 2),
3046 SCENE_EXIT(9, 7, 1),
3047 SCENE_EXIT(10, 7, 2),
3048 SCENE_EXIT(11, 9, 1),
3049 SCENE_EXIT(12, 4, 17),
3051};
3052
3055 0, 0, 0, FACING_NORTH, TALK_FACE_PARTY, 0 },
3057 0, 0, 0, FACING_NORTH, TALK_FACE_PARTY, 0 },
3060 { 0x73, CONDITION_ALWAYS, 3,
3061 PIXELS(92), 0, PIXELS(508), FACING_SOUTH, TALK_FACE_PARTY, 0 },
3063 PIXELS(252), 0, PIXELS(620), FACING_WEST, TALK_FACE_PARTY, 0 },
3065 PIXELS(164), 0, PIXELS(1236), FACING_NORTH, TALK_FACE_PARTY_AND_BACK, 0 },
3067 PIXELS(268), 0, PIXELS(1276), FACING_WEST, TALK_FACE_PARTY_AND_BACK, 0 },
3069 PIXELS(276), 0, PIXELS(1044), FACING_NORTH, TALK_FACE_PARTY, 0 },
3071 PIXELS(19), 0, PIXELS(614), FACING_EAST, TALK_FACE_PARTY, 0 },
3072 { 0x68, CONDITION_ALWAYS, 4,
3073 PIXELS(50), 0, PIXELS(795), FACING_WEST, TALK_FACE_PARTY, 0 },
3074 { 0x68, CONDITION_ALWAYS, 4,
3075 PIXELS(65), 0, PIXELS(800), FACING_WEST, TALK_FACE_PARTY, 0 },
3076 { 0x68, CONDITION_ALWAYS, 4,
3077 PIXELS(57), 0, PIXELS(805), FACING_WEST, TALK_FACE_PARTY, 0 },
3083 PIXELS(378), 0, PIXELS(584), FACING_EAST, TALK_KEEP_FACING, 0 },
3087 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3088 { 0xce, CONDITION_ALWAYS, 7,
3089 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3090 { 0xce, CONDITION_ALWAYS, 7,
3091 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3092 { 0xce, CONDITION_ALWAYS, 7,
3093 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3094 { 0x16, 0xfd0, 7,
3095 PIXELS(152), 0, PIXELS(1016), FACING_SOUTH, TALK_KEEP_FACING, 0 },
3096 { SCENE_TABLE_END },
3097};
3098
3101 0, 0, 0, FACING_NORTH, TALK_FACE_PARTY, 0 },
3103 0, 0, 0, FACING_NORTH, TALK_FACE_PARTY, 0 },
3106 { 0x73, CONDITION_ALWAYS, 3,
3107 PIXELS(92), 0, PIXELS(508), FACING_SOUTH, TALK_FACE_PARTY, 0 },
3109 PIXELS(252), 0, PIXELS(620), FACING_WEST, TALK_FACE_PARTY, 0 },
3111 PIXELS(164), 0, PIXELS(1236), FACING_NORTH, TALK_FACE_PARTY_AND_BACK, 0 },
3113 PIXELS(268), 0, PIXELS(1276), FACING_WEST, TALK_FACE_PARTY_AND_BACK, 0 },
3115 PIXELS(276), 0, PIXELS(1044), FACING_NORTH, TALK_FACE_PARTY, 0 },
3117 PIXELS(19), 0, PIXELS(614), FACING_EAST, TALK_FACE_PARTY, 0 },
3118 { 0x68, CONDITION_ALWAYS, 4,
3119 PIXELS(50), 0, PIXELS(795), FACING_WEST, TALK_FACE_PARTY, 0 },
3120 { 0x68, CONDITION_ALWAYS, 4,
3121 PIXELS(65), 0, PIXELS(800), FACING_WEST, TALK_FACE_PARTY, 0 },
3122 { 0x68, CONDITION_ALWAYS, 4,
3123 PIXELS(57), 0, PIXELS(805), FACING_WEST, TALK_FACE_PARTY, 0 },
3125 PIXELS(412), 0, PIXELS(586), FACING_WEST, 3, 0 },
3127 PIXELS(398), 0, PIXELS(616), FACING_NORTH, 3, 0 },
3129 PIXELS(378), 0, PIXELS(584), FACING_EAST, TALK_KEEP_FACING, 0 },
3131 PIXELS(335), 0, PIXELS(869), FACING_SOUTH, TALK_FACE_PARTY, 0 },
3133 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3134 { 0xce, CONDITION_ALWAYS, 7,
3135 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3136 { 0xce, CONDITION_ALWAYS, 7,
3137 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3138 { 0xce, CONDITION_ALWAYS, 7,
3139 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3140 { 0x16, 0xfd0, 7,
3141 PIXELS(152), 0, PIXELS(1016), FACING_SOUTH, TALK_KEEP_FACING, 0 },
3142 { SCENE_TABLE_END },
3143};
3144
3147 0, 0, 0, FACING_NORTH, TALK_FACE_PARTY, 0 },
3149 PIXELS(412), 0, PIXELS(586), FACING_NORTH + FACING_STEP, 3, 0 },
3153 PIXELS(164), 0, PIXELS(1236), FACING_NORTH, TALK_FACE_PARTY_AND_BACK, 0 },
3155 PIXELS(268), 0, PIXELS(1276), FACING_WEST, TALK_KEEP_FACING, 0 },
3157 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3159 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3161 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3163 0, 0, 0, FACING_EAST, TALK_FACE_PARTY, 0 },
3166 { 0x73, CONDITION_ALWAYS, 3,
3167 PIXELS(92), 0, PIXELS(508), FACING_SOUTH, TALK_KEEP_FACING, 0 },
3171 PIXELS(276), 0, PIXELS(1044), FACING_NORTH, TALK_KEEP_FACING, 0 },
3172 { 0x16, 0xfd0, ACTOR_STAND,
3173 PIXELS(152), 0, PIXELS(1016), FACING_SOUTH, TALK_KEEP_FACING, 0 },
3175 PIXELS(378), 0, PIXELS(584), FACING_EAST, TALK_KEEP_FACING, 0 },
3176 { SCENE_TABLE_END },
3177};
3178
3181 PIXELS(409), 0, PIXELS(1134), FACING_NORTH, TALK_FACE_PARTY, 0 },
3183 PIXELS(428), 0, PIXELS(588), FACING_WEST, TALK_FACE_PARTY, 0 },
3185 PIXELS(204), 0, PIXELS(924), FACING_EAST, TALK_FACE_PARTY, 0 },
3187 PIXELS(394), 0, PIXELS(584), FACING_SOUTH, TALK_KEEP_FACING, 0 },
3191 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3193 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3195 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3197 0, 0, 0, FACING_SOUTH, TALK_FACE_PARTY, 0 },
3198 { SCENE_TABLE_END },
3199};
3200
3202 { EVENT_TALK, 8, CONDITION_ALWAYS, MSGNO(MsgValeMtAlephLooksBeautifulTodayIts) },
3203 { EVENT_TALK, 9, CONDITION_ALWAYS, MSGNO(MsgValeValeStaysPristineBecauseOfMt) },
3205 { EVENT_TALK, 11, CONDITION_ALWAYS, MSGNO(MsgValeThisPlaceLooksJustLikeIt) },
3206 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgValeIsaacWatchOutDontGetToo) },
3207 { EVENT_TALK, 13, CONDITION_ALWAYS, MSGNO(MsgValeValeMustRemainHiddenPsynergysSecrets) },
3210 { EVENT_TALK, 19, CONDITION_ALWAYS, MSGNO(MsgValeYoureInTroubleNowGaretYour) },
3212 { EVENT_TALK, 22, CONDITION_ALWAYS, MSGNO(MsgValeMtAlephIsASacredPeak) },
3239 { SCENE_EVENTS_END },
3240};
3241
3243 { EVENT_TALK, 8, CONDITION_ALWAYS, MSGNO(MsgValeValeIsSavedThanksToThe) },
3244 { EVENT_TALK, 9, CONDITION_ALWAYS, MSGNO(MsgValeEverSinceTheTremorsStartedMt) },
3246 { EVENT_TALK, 11, CONDITION_ALWAYS, MSGNO(MsgValeSighNoLongerWillISee) },
3247 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgValeIDontBlameFelixIfOnly) },
3248 { EVENT_TALK, 13, CONDITION_ALWAYS, MSGNO(MsgValeTheMayorWasTooKindTo) },
3250 { EVENT_TALK, 18, CONDITION_ALWAYS, MSGNO(MsgValeYouGuysAreSoLuckyGaret) },
3251 { EVENT_TALK, 19, CONDITION_ALWAYS, MSGNO(MsgValePleaseTakeCareOfMyBrother) },
3252 { EVENT_TALK, 22, CONDITION_ALWAYS, MSGNO(MsgValeItIsVeryDangerousToGo) },
3253 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 22, CONDITION_ALWAYS, MSGNO(MsgValeIAmAllAloneInThis) },
3254 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 18, CONDITION_ALWAYS, MSGNO(MsgValeGeeIWishICouldSee) },
3255 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 19, CONDITION_ALWAYS, MSGNO(MsgValeMyBrothersStrengthIsHisBest) },
3256 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 11, CONDITION_ALWAYS, MSGNO(MsgValeImGladThatFelixIsAlive) },
3257 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 12, CONDITION_ALWAYS, MSGNO(MsgValeFelixWasAGoodPersonI) },
3258 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 14, CONDITION_ALWAYS, MSGNO(MsgValePoorKradenWasTakenToSome) },
3259 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 8, CONDITION_ALWAYS, MSGNO(MsgValeValeWasSavedBecausePeopleLike) },
3260 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 9, CONDITION_ALWAYS, MSGNO(MsgValeICantBelieveAnyoneWouldClimb) },
3261 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 10, CONDITION_ALWAYS, MSGNO(MsgValeIJustDontFeelSafeKnowing) },
3262 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 13, CONDITION_ALWAYS, MSGNO(MsgValeThePeopleOfValeWillNever) },
3289 { SCENE_EVENTS_END },
3290};
3291
3294 { EVENT_TALK, 8, CONDITION_ALWAYS, MSGNO(MsgValeICanTellJustByLooking) },
3296 { EVENT_TALK, 9, CONDITION_ALWAYS, MSGNO(MsgValeIWillDoMyBestTo) },
3298 { EVENT_TALK, 10, CONDITION_ALWAYS, MSGNO(MsgValePromiseMeIsaacPromiseMeYoull) },
3299 { EVENT_TALK, 11, CONDITION_ALWAYS, MSGNO(MsgValeIUsedToPlayHere) },
3300 { EVENT_TALK, 16, CONDITION_ALWAYS, MSGNO(MsgValeMtAlephsEruptionWasSoPowerful) },
3302 { EVENT_TALK, 18, CONDITION_ALWAYS, MSGNO(MsgValeTheySayTheDangerIsGone) },
3305 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 8, CONDITION_ALWAYS, MSGNO(MsgValeYouGuysAreWorkingSoHard) },
3307 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 9, CONDITION_ALWAYS, MSGNO(MsgValeICouldGoWithYouIf) },
3309 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 10, CONDITION_ALWAYS, MSGNO(MsgValeYouDidntBringJennaWithYou) },
3310 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 11, CONDITION_ALWAYS, MSGNO(MsgValeFelixMustBeProtectingJennaIm) },
3311 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 16, CONDITION_ALWAYS, MSGNO(MsgValeTheEarthquakesArentCausedByEruptions) },
3312 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 17, CONDITION_ALWAYS, MSGNO(MsgValeAhhICantStandTheseEarthquakes) },
3313 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 18, CONDITION_ALWAYS, MSGNO(MsgValeTheSmokeFromMtAlephIsnt) },
3315 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 19, CONDITION_ALWAYS, MSGNO(MsgValeHavingNoTravelersIsNoFun) },
3336 { SCENE_EVENTS_END },
3337};
3338// clang-format on
3339
3341 MAP_CELL_STEP(0, 98, 2, 2, 2),
3342 MAP_CELL_STEP(2, 98, 2, 2, 2),
3344};
3345
3347 MAP_CELL_STEP(0, 96, 2, 2, 2),
3348 MAP_CELL_STEP(2, 96, 2, 2, 2),
3350};
3351
3353 MAP_CELL_STEP(4, 98, 2, 2, 2),
3354 MAP_CELL_STEP(4, 98, 2, 2, 2),
3356};
3357
3359 MAP_CELL_STEP(4, 96, 2, 2, 2),
3360 MAP_CELL_STEP(4, 96, 2, 2, 2),
3362};
3363
3365 SC_ARG(5), SC_MOVE(PIXELS(199), 0, PIXELS(446)),
3366 SC_SYNC, SC_MOVE(PIXELS(215), 0, PIXELS(472)),
3367 SC_SYNC, SC_MOVE(PIXELS(239), 0, PIXELS(461)),
3368 SC_SYNC, SC_ARG(1),
3369 SC_END,
3370};
3371
3373 SC_ARG(2), SC_MOVE(PIXELS(199), 0, PIXELS(446)),
3374 SC_SYNC, SC_MOVE(PIXELS(215), 0, PIXELS(472)),
3375 SC_SYNC, SC_MOVE(PIXELS(239), 0, PIXELS(461)),
3376 SC_SYNC, SC_ARG(1),
3377 SC_END,
3378};
3379
3381 SC_SET(SW_SPEED, 0x20000),
3382 SC_SET(SW_ACCEL, 0x20000),
3383 SC_ARG(5),
3384 SC_MOVE(PIXELS(224), 0, PIXELS(458)),
3385 SC_SYNC,
3386 SC_MOVE(PIXELS(256), 0, PIXELS(458)),
3387 SC_SYNC,
3388 SC_MOVE(PIXELS(256), 0, PIXELS(474)),
3389 SC_SYNC,
3390 SC_ARG(1),
3391 SC_WAIT(5),
3393 SC_WAIT(5),
3395 SC_END,
3396};
3397
3399 SC_SET(SW_SPEED, 0x18000),
3400 SC_SET(SW_ACCEL, 0x10000),
3401 SC_ARG(2),
3402 SC_MOVE(PIXELS(216), 0, PIXELS(458)),
3403 SC_SYNC,
3404 SC_MOVE(PIXELS(256), 0, PIXELS(456)),
3405 SC_SYNC,
3406 SC_ARG(1),
3407 SC_WAIT(5),
3409 SC_WAIT(5),
3411 SC_END,
3412};
3413
3415 SC_SET(SW_SPEED, 0x20000),
3416 SC_SET(SW_ACCEL, 0x20000),
3417 SC_ARG(5),
3418 SC_MOVE(PIXELS(256), 0, PIXELS(458)),
3419 SC_SYNC,
3420 SC_MOVE(PIXELS(256), 0, PIXELS(474)),
3421 SC_SYNC,
3422 SC_ARG(1),
3423 SC_WAIT(5),
3425 SC_WAIT(5),
3427 SC_END,
3428};
3429
3431 SC_SET(SW_SPEED, 0x18000),
3432 SC_SET(SW_ACCEL, 0x10000),
3433 SC_ARG(2),
3434 SC_MOVE(PIXELS(256), 0, PIXELS(456)),
3435 SC_SYNC,
3436 SC_ARG(1),
3437 SC_WAIT(5),
3439 SC_WAIT(5),
3441 SC_END,
3442};
Ability numbers, named from the English release.
@ ABILITY_MIND_READ
Definition ability_ids.h:16
@ ABILITY_CATCH
Definition ability_ids.h:23
@ ABILITY_MOVE
Definition ability_ids.h:15
void Object_RefreshSelectorById(u32 objectId)
Waits, at most 300 frames, for an actor's script to reach its end (command 0x10).
struct FieldActor * Object_GetById(s32 actor)
Returns an actor, or NULL if it does not exist.
s32 gStagedActor_DirectionSteps[]
Pixel step by direction: X in the upper halfword, Z in the lower.
s32 gStagedActor_FootprintBounds[]
#define DIRECTION_STEP(dx, dz)
Pixel step by direction: X in the upper halfword, Z in the lower.
u32 gStagedActor_FootprintKinds[]
Calls through a function pointer, by argument count.
void(*) SchedulerCallback(void)
#define GARET
Jerald.
#define JENNA
Jasmine.
void Engine_ActorSetSpriteFlags(struct FieldActor *, s32)
struct FieldActor * Engine_ObjectCreate(s32, s32, s32, s32)
static void Event_CatchNut(void)
Catch on the Nut circling in the first room: the party gets it.
The engine calls the debug menus import, and their palette swatch tiles.
The edition's language, for C to compare (LANGUAGE == LANGUAGE_GERMAN).
static s32 FieldScheduler_AddCallback(SchedulerCallback callback, s32 priority)
Registers a main-image scheduler callback.
Definition engine_call.h:36
void ObjectSystem_ResumeProjectionAndHideLayers(void)
Resumes the object camera updates and hides BG1-3 and the sprites.
Definition objects.c:566
void ObjectSystem_SuspendProjectionAndShowSprites(void)
Suspends the object camera updates, starts the palette back to normal and, a frame later,...
Definition objects.c:552
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,...
void Engine_ObjectSetPosition(struct FieldActor *object, s32 fixed_x, s32 fixed_y, s32 fixed_z)
@ 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
static s32 Event_OpenMessage(s32 speaker, s32 flags)
void Engine_ActorFaceActor(s32 actor, s32 target, s32 frames)
static void Actor_SetDestination(s32 actor, s32 x, s32 z)
static void Actor_FaceDirection(s32 actor, s32 facing, s32 frames)
void Engine_ActorSetAnimationAndWait(s32 actor, s32 animation)
void Object_SetMode(struct FieldActor *object, 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)
void Engine_PartyAddMembers(s32 first, s32 second)
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
static void Actor_WalkToAndWait(s32 actor, s32 x, s32 z)
static void Camera_SetSpeed(s32 speed, s32 acceleration)
void Engine_ActorJump(s32 actor, s32 height, s32 frames)
#define EMOTE_IN_FRONT
Definition field_event.h:49
static void Actor_MoveToAndWait(s32 actor, s32 x, s32 z)
#define MAP_CELL_STEP(srcX, srcY, width, height, frames)
Definition field_event.h:59
void Engine_ItemShowFound(s32 item, s32 height)
void Engine_EventCloseScreen(void)
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)
static void Actor_FaceActor(s32 actor, s32 target, s32 frames)
#define SPEAKER_WINDOW_BELOW
Definition field_event.h:57
static void Actor_WalkTo(s32 actor, s32 x, s32 z)
#define GameFlag_Clear
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_ObjectSetScript(struct FieldActor *object, const s32 *script)
static void Event_ShowTwoMessagesAndWait(s32 speaker, s32 x, s32 y, s32 arg, s32 extra, s32 otherSpeaker, s32 otherX, s32 otherY, s32 otherArg, s32 otherExtra, s32 flags)
void Engine_EventOpenScreen(void)
s32 Engine_EventOpenMessage(s32 speaker, s32 flags)
void Engine_GameFlagSet(s32 flag)
void Engine_MapRenderWaitForValues(void)
void Engine_GameFlagClear(s32 flag)
void Engine_CameraWaitForMove(void)
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)
void Engine_CameraFollowActor(s32 actor, s32 keep_position)
static void Map_CopyCellAttributes(s32 srcX, s32 srcY, s32 width, s32 height, s32 destX, s32 destY)
void Engine_ActorRunRepeatedMotion(s32 actor, s32 repeats)
void Engine_ActorWalkTo(s32 actor, s32 x, s32 z)
static void Event_ShowMessage(s32 speaker, s32 flags)
s32 Engine_RandomNext()
static void Event_PlayCue(s32 cue)
static void Map_SetShake(s32 horizontal, s32 vertical, s32 decay)
Sets shake amplitudes in fixed-point pixels and the per-frame decay factor.
#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_MapAnimateCells(const u16 *steps, s32 destX, s32 destY)
void Engine_ActorStartRepeatedMotion(s32 actor, s32 repeats)
struct FieldActor * Engine_EventGetViewCenter(void)
static s32 Event_AskYesNo(s32 speaker, s32 flags)
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)
static struct FieldActor * Actor_Get(s32 actor)
Field objects and actors, and the scene transition styles.
@ 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
@ ACTOR_FACES_MOTION
turns toward its velocity, 1/16 turn a frame
Definition field_obj.h:166
The scene table formats: entrances, exits, placements and events, and the macros that write them.
#define SCENE_EVENTS_END
@ EVENT_TOUCH
@ 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_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 s32 Task_AddCallback(void(*callback)(void), s32 priority)
Calls the main-image scheduler through engine_call.h.
static void FieldObject_SetPosition(struct FieldActor *object, s32 fixed_x, s32 fixed_y, s32 fixed_z)
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_SHOW_LOCATION_NAME
Definition flags.h:94
#define FLAG_VALE_ASKED_IF_JENNA_IS_BACK
Back from Kalay, a villager asked whether Jenna is back yet.
Definition flags.h:466
#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_VALE_ASKED_IF_GOING_TO_KRADEN
A villager asked whether Isaac is going to Kraden's cottage.
Definition flags.h:461
#define FLAG_SCENE_TEMP_02
Definition flags.h:715
#define FLAG_KEEP_PARTY_POSITION
Definition flags.h:93
#define FLAG_VALE_ANGRY_VILLAGER_ARGUED
A villager has scolded Garet once.
Definition flags.h:464
#define FLAG_SCENE_TEMP_10
Definition flags.h:729
#define FLAG_VALE_WARNED_AGAINST_MT_ALEPH
A villager stopped Isaac and warned him off the mountain.
Definition flags.h:469
#define FLAG_SCENE_TEMP_04
Definition flags.h:717
#define FLAG_SCENE_TEMP_41
Definition flags.h:778
#define FLAG_MENU_OPEN
Set while the field menu is open; scenes hold their moving actors still.
Definition flags.h:23
volatile u32 gFrameCount
Frames WaitFrames has finished.
GameState, the game's state: play time, coins, the scene and the leader's position,...
struct GameState gGameState
The work slots of gWorkSlot, read through their own names.
void * gMapWork[]
The screen blend's globals and the graphics routines.
The main-image routines scene overlays import.
@ ITEM_NUT
Definition item_ids.h:41
The IWRAM call layer: the routines the game keeps resident in IWRAM, each at its fixed address,...
static s32 Iwram_Sqrt(s32 value)
Definition iwram_call.h:63
Small statement macros both games use for positions, velocities and bounds.
#define SET_VELOCITY(p, vx, vy, vz)
Definition macros.h:18
#define SET_VECTOR(v, x, y, z)
Sets the x, y and z of a three-part vector: a position about to be projected, a per-frame step,...
Definition macros.h:12
The map layers' scroll work and the background scroll values.
void Vector_AddPolarOffset(s32 radius, s32 angle, void *position)
Moves the point position by radius in direction angle on the ground plane: x by the cosine,...
Definition math.c:23
s32 ArcTan2(s32 x, s32 y)
Returns the angle of the vector (x, y), in 1/65536 turns, measured from the y axis: 0 along +y,...
Definition math.c:36
The heaps: allocating and freeing blocks.
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_FREE
Release.
Definition objcmd.h:43
#define SC_SYNC
Wait for arrival.
Definition objcmd.h:17
#define SC_FOREVER
Definition objcmd.h:14
#define SC_TO(n)
Definition objcmd.h:12
#define SC_ADD(w, v)
Definition objcmd.h:38
#define SC_ARG(v)
Definition objcmd.h:44
#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_SCALE_Y
Definition objcmd.h:63
@ SW_SPEED
Definition objcmd.h:67
@ SW_FACING
Definition objcmd.h:57
@ SW_SCALE_X
Definition objcmd.h:62
void PaletteGlow_Update(s32 phase, s32 brightness)
Sets the window colours (BG palette 15, colours 4 to 10) for a window hue (0 to 23) and brightness (0...
Definition options.c:152
#define ACTOR_ACTION_IDLE
void BattleFx_SetQueuedSoundAndPlay(s32 soundId)
Plays SE_298, then soundId (SE_289 for -1), and remembers soundId for BattleFx_PlayQueuedSound in the...
Definition requests.c:90
@ ACTOR_DORA
Definition sanctum.c:58
void Audio_PlayCueFromEventWork(void)
Starts the current scene's field music, chosen by Scene_ResolveInteractionResult.
Definition scene.c:355
s32 Scheduler_RemoveCallback(SchedulerCallback callback)
Unschedules the task running callback: clears its routine and gives it order 0x7fff,...
Definition scheduler.c:146
Song and sound effect ids, indices into gSound_SongTable.
#define SE_170
Definition songs.h:165
#define SE_DOOR_OPEN
Definition songs.h:153
#define SE_143
Definition songs.h:136
#define SE_131
Definition songs.h:124
#define SE_MAP_EXIT
Definition songs.h:116
#define SE_CAST
Definition songs.h:149
#define SE_188
Definition songs.h:183
#define SE_ITEM_BREAK
Definition songs.h:131
#define SE_161
Definition songs.h:156
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_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.
void Scene_FloatNut(s32 id)
Draws actor id as the Nut's icon and starts it floating, 32 pixels up unless the party returns to whe...
void WorldMap_CreateLinkedEffects(struct FieldActor *parent)
Attaches two rising particles to the actor, sharing the effect's cached tiles.
#define ACTOR_A
Definition vale.h:8
#define ACTOR_C
Definition vale.h:10
#define ACTOR_D
Definition vale.h:11
#define ACTOR_B
Definition vale.h:9
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 count
layers in use, up to the last one present
Definition animspr.h:129
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
s16 timer
The parameter its action script reads (a follow distance or an angle to face), the player's frames to...
Definition field_obj.h:109
s32 speed
speed limit, 16.16 fixed-point pixels per frame
Definition field_obj.h:55
s32 targetX
16.16 fixed-point pixels; ACTOR_NO_TARGET when unset
Definition field_obj.h:59
u8 steeringFlags
ActorSteeringFlag bits.
Definition field_obj.h:92
u8 motionFlags
ActorMotionFlag bits; zero is free flight in 3D, and 3 is set on creation.
Definition field_obj.h:83
u8 riseCounter
not read by the engine; scene code's own counter
Definition field_obj.h:105
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
u8 paused
nonzero skips its script and motion, not its update
Definition field_obj.h:93
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 velocityY
16.16 fixed-point pixels per frame
Definition field_obj.h:53
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 acceleration
Added toward the target each frame, or taken off the speed when there is none, in 16....
Definition field_obj.h:58
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 wait
the object script's wait, in frames (ScriptMotionObject)
Definition field_obj.h:98
u8 terrainId
The map layer (0 to 3) its ground height is read from, which the scrolling camera updates from the ce...
Definition field_obj.h:47
The game's state: play time, coins, the scene and the leader's position, the active party and the opt...
Definition game_state.h:14
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...
The system's routines and globals: interrupts, BIOS sound bias, random numbers and sleep.
static void Event_PushObject(void)
Walking into a pushable object pushes it along.
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
#define UNUSED
Definition types.h:22
unsigned char u8
Definition types.h:11
struct FieldCoordinate::@024321007066302143002254325121164243234242211074 part
s32 fixed
16.16 fixed-point pixels
An object on the field, read as an actor or as an effect.
struct FieldActor actor
static void Event_EnterFarSouthHouse(void)
Opens the far southern door and enters its interior.
Definition vale.c:367
static void Event_LeaveTowardHome(void)
Leaves through the exit leading back to the house.
Definition vale.c:310
u16 gValeCellAnimB[]
Definition vale.c:3352
static void Event_EnterIsaacsHouse(void)
Isaac's house: after the party has left and before Kalay, Dora will not open.
Definition vale.c:333
@ ANIM_HAMMER
Definition vale.c:107
static void Event_EnterEastHouse(void)
Animates the eastern house door before entering.
Definition vale.c:316
static void Event_EnterSouthwestHouse(void)
Opens the southwestern door and enters its interior.
Definition vale.c:375
s32 gLeaderHammerAction[]
Definition vale.c:2961
static void Event_GaretAsksToProtectFamily(void)
Back from Kalay, Garet asks a villager to protect his family.
Definition vale.c:1377
static void Event_CatchNutAfterKalay(void)
The same Nut after Kalay, where it is actor 20.
Definition vale.c:141
const struct SceneRegion * Vale_GetRegions(void)
Definition vale.c:113
s32 gVillagerAction[]
Definition vale.c:2993
struct ScenePlacement gVale_Placements[]
Definition vale.c:3053
s32 gValePairTableC[]
Definition vale.c:3414
static void Event_MendingTheRoof(void)
Arriving by entrance 16, the game's opening: Isaac is mending the roof.
Definition vale.c:1586
static void Vale_HaveJennaStopTheAlephDetour(void)
Brings Jenna out to remind Isaac that Kraden is waiting.
Definition vale.c:383
static void Event_RepeatMtAlephWarningFromSecondApproach(void)
Repeats the warning when the villager reaches the second pause.
Definition vale.c:609
static void Vale_AskAboutSneakingToAleph(const s32 *leaderActions, const s32 *villagerActions)
Asks about the Aleph detour, then resumes each actor's response actions.
Definition vale.c:570
const struct ScenePlacement * Vale_GetPlacements(void)
Places the villagers for the story so far, or for the roof repair (entrance 16).
Definition vale.c:119
HouseActor
Definition vale.c:105
@ ACTOR_LAST_BOARD
Definition vale.c:105
@ ACTOR_BOARD
Definition vale.c:105
static void Event_SettleMovedObject(void)
After Move or a push, record the object's column in group flags 0x314 to 0x316 and block the cell it ...
Definition vale.c:2746
static void Effect_ConfigureSpawnedParticle(union FieldObject *fieldObject)
Emits one dust particle below the moving source actor.
Definition vale.c:2636
static void Event_GaretMeetsHisSister(void)
Back from Kalay, Garet meets his sister.
Definition vale.c:1302
static void Event_LeaveByNorthPath(void)
The northern path toward Kraden's cottage.
Definition vale.c:298
static void Event_ReturnThroughSouthernPassage(void)
Moves back through the passage and restores its collision attributes.
Definition vale.c:498
struct SceneEvent gVale_EventsAfterLeaving[]
Definition vale.c:3242
s32 gJennaAction[]
Definition vale.c:2982
static void Vale_UpdateLeaderPaletteAndEffects(void)
Cycles the leader palette and periodically spawns attached effects.
Definition vale.c:2533
static void Vale_MoveActorAlongHigherZPath(s32 actorId, s32 approachAnimationId, s32 departureAnimationId, s32 resumeMotion)
Traverses the passage toward higher Z and restores falling motion if requested.
Definition vale.c:1525
static void Event_AskWhetherJennaHasReturned(void)
Back from Kalay, a villager asks whether Jenna is back.
Definition vale.c:231
static s32 Vale_HaveVillagerWatchTheLeader(union FieldObject *fieldObject)
Definition vale.c:2616
s32 gDustBurstScript[]
Definition vale.c:3009
static void Event_EnterNorthernPassage(void)
Changes the passage collision and moves through its northern end.
Definition vale.c:489
const struct SceneEntrance * Vale_GetEntrances(void)
Definition vale.c:111
s32 gValePairTableD[]
Definition vale.c:3430
static void Effect_SpawnRisingDustBurst(struct FieldActor *emitter)
Shrinks and raises the emitter, scatters dust, then clears its motion targets.
Definition vale.c:2669
s32 gValeActor22WalkActions[]
Definition vale.c:3372
static void Vale_CycleActor25Palette(void)
Cycles actor 25 palette during the repair scene.
Definition vale.c:2553
static void Event_SearchTheLockedDoor(void)
Tells the player that this door will not open.
Definition vale.c:2779
static void Vale_CycleSecondBoardPalette(void)
Cycles the second board palette while its repair effect runs.
Definition vale.c:2548
static void Event_TalkAboutTheWeather(void)
A villager talks of the weather, differently right after the roof repair.
Definition vale.c:219
u16 gValeCellAnimC[]
Definition vale.c:3340
static UNUSED void HouseScene_RunRepairMorning(void)
Definition vale.c:632
static void Event_SetPathCellOverride(void)
Walking onto the upper path: its collision cells change, remembered in FLAG_SCENE_TEMP_10.
Definition vale.c:267
const u32 * Vale_GetExits(void)
Definition vale.c:115
static void Vale_CycleActorPaletteAndSpawnEffects(struct FieldActor *actor)
Definition vale.c:2831
struct ScenePlacement gVale_RepairPlacements[]
Definition vale.c:3179
u16 gValeCellAnimA[]
Definition vale.c:3346
static void Vale_SynchronizeAlephVillagerPause(void)
Pauses the Aleph villager while the corresponding event flag is set.
Definition vale.c:2786
static void Event_ClearPathCellOverride(void)
Walking off the upper path restores its collision cells.
Definition vale.c:273
static void Event_ApproachMtAleph(void)
The mountain path: Jenna stops Isaac until Kraden has planned the visit.
Definition vale.c:288
static void Event_RoofMended(void)
Arriving by entrance 17 after the opening: Dora praises the mended roof.
Definition vale.c:1901
u16 gValeCellAnimD[]
Definition vale.c:3358
struct ScenePlacement gVale_PlacementsAfterLeaving[]
Definition vale.c:3099
static void Event_WarnAgainstSneakingUpMtAleph(void)
A villager jumps out in front of Isaac, then keeps watching him.
Definition vale.c:508
static void Event_ArgueWithTheAngryVillager(void)
A villager scolds Garet; afterwards the villager only threatens him.
Definition vale.c:195
#define VALE_GARET_REUNION_Z
Definition vale.c:61
s32 gGaretAction[]
Definition vale.c:2971
static void Event_TurnBackFromThePuppies(void)
Shows the puppies message from the opposite approach.
Definition vale.c:471
static void Vale_CycleFirstBoardPalette(void)
Cycles the first board palette while its repair effect runs.
Definition vale.c:2543
static void Event_ReactToAnotherTremor(void)
Shakes the view before the villager reacts to another tremor.
Definition vale.c:241
static void Event_WarnAboutGoingBeyondKradensCottage(void)
Warns about the mountain path, with a shorter repeat greeting.
Definition vale.c:174
#define VALE_SOUTH_VILLAGER_Z
Definition vale.c:67
static void Event_EnterSanctum(void)
Opens the sanctum door, walks inside and takes its scene exit.
Definition vale.c:279
static void Event_RepeatMtAlephWarningFromFirstApproach(void)
Repeats the warning when the villager reaches the first pause.
Definition vale.c:560
static void Vale_FlashActorAndSpawnEffects(struct FieldActor *actor)
Definition vale.c:2821
static s32 Runtime_ComputeFixedPointDistance(s32 *first_position, s32 *second_position)
Definition vale.c:2557
s32 gValePairTableA[]
Definition vale.c:3380
static void Event_EnterCentralHouse(void)
Animates the central house door before entering.
Definition vale.c:324
static void Effect_UpdateParticlePosition(struct FieldActor *particle, s32 distance, s32 angle)
Moves a particle outward in the horizontal plane without changing its height.
Definition vale.c:2719
static void Vale_CycleActorPalette(struct FieldActor *actor)
Definition vale.c:2838
struct SceneEvent gVale_EventsAfterKalay[]
Definition vale.c:3292
static void Vale_AdjustVillagerPriorityForLeaderHeight(void)
Keeps raised villager priority consistent with the leader height.
Definition vale.c:2804
struct SceneEvent gVale_Events[]
Definition vale.c:3201
static void Event_LeaveBySouthPath(void)
The southern path toward Kraden's cottage.
Definition vale.c:304
static s32 Vale_TestFacing(struct FieldActor *obj, struct FieldActor *target, s32 range, s32 force)
Definition vale.c:2569
static void SceneActor_ResetActorRun(s32 first, u32 count, s32 mode)
Resets consecutive repair actors to their staging position or hides them.
Definition vale.c:1560
s32 gValeActor22Actions[]
Definition vale.c:2872
static void Event_WatchThePuppies(void)
Pans down to the puppies and returns the camera to the leader.
Definition vale.c:423
static void Effect_PlayStepSound(void)
Definition vale.c:2773
s32 gValePairTableB[]
Definition vale.c:3398
static void Event_TalkAboutTheMayorAndTremors(void)
Asks about the mayor before departure, or the tremors after returning.
Definition vale.c:160
static void Event_AskAboutTheLackOfTravelers(void)
Asks about the quiet roads after the eruption.
Definition vale.c:254
struct ScenePlacement gVale_PlacementsAfterKalay[]
Definition vale.c:3145
static void Event_RepeatMtAlephWarningAtEitherPause(void)
Chooses the warning approach matching the current villager pause.
Definition vale.c:619
const struct SceneEvent * Vale_GetEvents(void)
The villagers talk of the story so far.
Definition vale.c:151
static void Vale_UpdateGaretPaletteAndEffects(void)
Cycles palettes on Garet and periodically spawns attached effects.
Definition vale.c:2528
static void Vale_MoveActorAlongLowerZPath(s32 actorId, s32 approachAnimationId, s32 departureAnimationId, s32 resumeMotion)
Traverses the passage toward lower Z, changing animations at its lip.
Definition vale.c:1489
u32 gVale_Exits[]
Definition vale.c:3036
s32 Vale_Initialize(void)
Arriving: play the roof mending (entrance 16) or its end (entrance 17, once), place the Nut and the m...
Definition vale.c:1179
static void Vale_CycleVillagerNinePalette(void)
Cycles actor 9 palette during the repair scene.
Definition vale.c:2538
static UNUSED void FieldScene_RunCompanionActorSequence(void)
Definition vale.c:1453
s32 gValeLeaderWalkActions[]
Definition vale.c:3364
static void Event_EnterSoutheastHouse(void)
Opens the southeastern door and enters its interior.
Definition vale.c:359
struct SceneEntrance gVale_Entrances[]
Definition vale.c:3018
The sprite VRAM block cache and its owners.
void UiText_ShowCenteredMessage(s32 message, s32 mode, s32 yOffset)
Shows a message centred on the screen (yOffset tiles lower) and waits until it is typed out,...
Definition messages.c:325