Alchemy
Loading...
Searching...
No Matches

bilibin_interiors.c

Go to the documentation of this file.
1/// @file
2/// Bilibin's shops, inn and dining room before and after Kolima's curse ends.
3/// The event table keeps the two sets of conversations in their native order.
4
6#include "flags.h"
7#include "character_ids.h"
10#include "battle.h"
11#include "debug.h"
12#include "field.h"
13#include "game.h"
14#include "graphics.h"
15#include "menu.h"
16#include "minigame.h"
17#include "sound.h"
18#include "system.h"
19#include "types.h"
20#include "field_event.h"
21#include "field_scene.h"
22#include "call.h"
23#include "text/msg_ids.h"
24#include "ability_ids.h"
25#include "item_ids.h"
26
27enum {
32};
33
34/// Actor slots follow the placement rows, starting at ACTOR_FIRST_PLACED.
35enum {
36 BILIBIN_MIA_ADMIRER = 10, ///< wants to see Mia again. "that angelic" Mia
46};
47
50}
51
52const struct SceneRegion *BilibinInteriors_GetRegions(void) { return 0; }
53
55
56/// Marks placements outside the current room's view before actors are spawned.
60}
61
62/// Opens the weapon shop from across the counter; otherwise discusses Kolima.
64 u32 leaderFacing;
65
68
69 if (FACING_IS_NORTH(leaderFacing)) {
71 } else {
73 Engine_EventSetMessage(MsgBilibinThereWasAbleHealerIn);
74 } else {
75 Engine_EventSetMessage(MsgBilibinOurWeaponsBestCanFind);
76 }
78 }
79
81}
82
83/// Opens the item shop from across the counter, or talks about the curse.
84static void Event_TalkToItemShopkeeper(void) {
85 u32 leaderFacing;
86
89
90 if (FACING_IS_NORTH(leaderFacing)) {
92 } else {
94 Engine_EventSetMessage(MsgBilibinMustUsedTypesDangerBeing);
95 } else {
96 Engine_EventSetMessage(MsgBilibinTurnedOutWarriorsHiredBy);
97 }
99 }
100
102}
103
104/// Returns both story stages' events; conditions choose the current dialogue.
107}
108
109/// Opens the armor shop across the counter, or asks about seeing the ocean.
111 u32 leaderFacing;
112
115 if (FACING_IS_NORTH(leaderFacing)) {
117 } else {
119 Engine_EventSetMessage(MsgBilibinHaveEverHeardOcean);
125 } else {
126 Engine_EventSetMessage(MsgBilibinForSomeReasonOceanFills);
128 }
129 }
131}
132
133/// The chef cannot concentrate on cooking while his hometown is cursed.
134static void Event_TalkToWorriedChef(void) {
136 Engine_EventSetMessage(MsgBilibinImReallyWorriedAboutKolima);
141}
142
143/// A diner's growling stomach leads into a yes/no question about the sound.
144static void Event_TalkToHungryDiner(void) {
146 Engine_EventSetMessage(MsgBilibinGrrr);
151 if (Engine_EventChooseYesNo(0, 0) != 0) {
153 }
157}
158
159/// Asks whether a tree spirit can curse a person, then turns back to the table.
160static void Event_AskAboutTreeSpirit(void) {
162 Engine_EventSetMessage(MsgBilibinDoBelieveTreeSpiritCan);
166 if (Engine_EventChooseYesNo(0, 0) != 0) {
168 }
172}
173
174/// Asks whether Kolima's holy tree survived.
175static void Event_AskAboutHolyTree(void) {
177 Engine_EventSetMessage(MsgBilibinDoKnowIfHolyTree);
180}
181
182/// Asks whether the party knows what silk is.
183static void Event_AskAboutSilk(void) {
185 Engine_EventSetMessage(MsgBilibinDoKnowSilk);
188}
189
190/// Opens the inn across the counter, or discusses the curse in Kolima.
191static void Event_TalkToInnkeeper(void) {
192 u32 leaderFacing;
193
196
197 if (FACING_IS_NORTH(leaderFacing)) {
200 Engine_EventSetMessage(MsgBilibinWasntCurseInKolimaHorrifying);
202 } else {
203 Engine_EventSetMessage(MsgBilibinCurseOnKolimaScaryDevelopment);
205 }
206
208}
209
210/// The chef calls out orders once, then refers diners to the waitress.
211static void Event_TalkToBusyChef(void) {
213 if (GameFlag_IsSet(0x300) == 0) {
214 // The first time (0x300, kept while in the rooms), the chef shouts orders
215 // and the kitchen worker answers.
216 Engine_EventSetMessage(MsgBilibinTwoSpecialsOneDinnerOne);
225 GameFlag_Set(0x300);
226 }
227 // Then, as every later time, he sends the party to the waitress.
229 Engine_EventSetMessage(MsgBilibinIfWantMealSpeakWaitress);
233}
234
235/// The kitchen worker complains about the chef's renewed energy.
236static void Event_TalkToKitchenWorker(void) {
238 Engine_EventSetMessage(MsgBilibinReallyThinkHeadChefHas);
244}
245
246/// The waitress works through serving water and laying the silverware.
247static void Event_TalkToWaitress(void) {
249 Engine_EventSetMessage(MsgBilibinLetsSeeServeThemWater);
255}
256
257/// A satisfied diner asks whether the party enjoys the food.
258static void Event_TalkAboutMeal(void) {
260 Engine_EventSetMessage(MsgBilibinWasSomeMealDontJust);
263}
264
265/// Mind Read on the villager who admires Mia: with Mia in the party (flags 0 to
266/// 7 say who is), even frozen Imil must feel warm with her around.
267static void Event_ReadMiaAdmirersMind(void) {
270 Engine_EventSetMessage(MsgBilibinEvenFrozenImilMustFeel);
271 } else {
272 Engine_EventSetMessage(MsgBilibinWhenSpringComesWantGo);
273 }
276}
277
278/// The rooms open through a window; the diner at the dining room table is drawn
279/// at sprite priority 2, never by the automatic priority.
281 struct FieldActor *actor;
282 u8 *record;
283 s32 bits;
284
287
288 // priorityFlags and the image's priority bits (2 to 3 of byte 9), as bytes.
289 ((u8 *)actor)[0x23] = bits = 0;
290 record = (u8 *)actor->sprite;
291 bits -= 13;
292 bits &= record[9];
293 bits |= 8;
294 record[9] = bits;
295 return 0;
296}
297
299 {0, CONDITION_ALWAYS, 176, 0, 216, FACING_NORTH, 0, -1, -1, -1, -1, 0},
300 {1, CONDITION_ALWAYS, 176, 0, 216, FACING_NORTH, 0, 24, 32, 264, 240, 0},
301 {2, CONDITION_ALWAYS, 400, 0, 264, FACING_NORTH, 0, 256, 0, 496, 288, 0},
302 {3, CONDITION_ALWAYS, 688, 0, 264, FACING_NORTH, 0, 544, 0, 784, 288, 0},
303 {4, CONDITION_ALWAYS, 240, 0, 504, FACING_NORTH, 0, 72, 336, 312, 528, 0},
304 {5, CONDITION_ALWAYS, 576, 0, 536, FACING_NORTH, 0, 400, 304, 640, 552, 0},
305 {6, CONDITION_ALWAYS, 352, 0, 872, FACING_NORTH, 0, 0, 640, 400, 896, 0},
306 {7, CONDITION_ALWAYS, 656, 0, 696, FACING_WEST, 0, 432, 640, 848, 896, 0},
307 {8, CONDITION_ALWAYS, 344, 0, 696, FACING_EAST, 0, 0, 640, 400, 896, 0},
309};
310
312 SCENE_EXITS(31), SCENE_EXIT(1, 30, 4), SCENE_EXIT(2, 30, 5),
313 SCENE_EXIT(3, 30, 6), SCENE_EXIT(4, 30, 8), SCENE_EXIT(5, 30, 7),
314 SCENE_EXIT(6, 30, 3), SCENE_EXIT(7, 31, 8), SCENE_EXIT(8, 31, 7),
316};
317
318// clang-format off
320 { 0x6c, 0x0, ACTOR_STAND,
321 PIXELS(104), 0, PIXELS(168), FACING_SOUTH, TALK_FACE_PARTY, 0 },
322 { 0x6a, 0x0, ACTOR_WANDER,
323 PIXELS(200), 0, PIXELS(136), FACING_SOUTH, TALK_FACE_PARTY, 0 },
324 { 0x65, 0x0, ACTOR_STAND,
325 PIXELS(384), 0, PIXELS(192), FACING_SOUTH, TALK_FACE_PARTY, 0 },
326 { 0x6b, 0x0, ACTOR_WANDER,
327 PIXELS(360), 0, PIXELS(136), FACING_SOUTH, TALK_FACE_PARTY, 0 },
328 { 0x73, 0x0, ACTOR_STAND,
329 PIXELS(640), 0, PIXELS(156), FACING_SOUTH, TALK_FACE_PARTY, 0 },
330 { 0x66, 0x0, ACTOR_WANDER,
331 PIXELS(704), 0, PIXELS(200), FACING_SOUTH, TALK_FACE_PARTY, 0 },
332 { 0x67, 0x0, ACTOR_STAND,
333 PIXELS(456), 0, PIXELS(472), FACING_SOUTH, TALK_FACE_PARTY, 0 },
334 { 0x6f, 0x0, ACTOR_STAND,
336 { 0x7c, 0x0, ACTOR_STAND,
338 { 0x7d, 0x0, ACTOR_STAND,
340 { 0x76, 0x0, ACTOR_STAND,
342 { 0x77, 0x0, ACTOR_STAND,
344 { 0x80, 0x0, ACTOR_STAND,
345 PIXELS(280), 0, PIXELS(760), FACING_SOUTH, TALK_FACE_PARTY, 0 },
346 { 0x84, 0x0, ACTOR_STAND,
347 PIXELS(88), 0, PIXELS(760), FACING_NORTH, TALK_KEEP_FACING, 0 },
348 { 0x84, 0x0, ACTOR_STAND,
349 PIXELS(56), 0, PIXELS(760), FACING_EAST, TALK_KEEP_FACING, 0 },
350 { 0x94, 0x0, ACTOR_STAND,
352 { 0xab, 0x0, ACTOR_STAND,
353 PIXELS(176), 0, PIXELS(744), FACING_SOUTH, TALK_KEEP_FACING, 0 },
354 { 0xab, 0x0, ACTOR_STAND,
356 { 0x74, 0x0, ACTOR_STAND,
357 PIXELS(152), 0, PIXELS(832), FACING_NORTHWEST, TALK_KEEP_FACING, 0 },
358 { 0x87, 0x0, ACTOR_STAND,
360 { 0x67, 0x0, ACTOR_STAND,
362 { 0x90, 0x0, ACTOR_STAND,
363 PIXELS(808), 0, PIXELS(774), FACING_SOUTH, TALK_FACE_PARTY, 0 },
364 { 0x81, 0x0, ACTOR_STAND,
365 PIXELS(568), 0, PIXELS(768), FACING_SOUTHEAST, TALK_FACE_PARTY, 0 },
366 { SCENE_TABLE_END },
367};
368
370 { EVENT_EXIT, 1, CONDITION_ALWAYS, 1 },
371 { EVENT_EXIT, 2, CONDITION_ALWAYS, 2 },
372 { EVENT_EXIT, 3, CONDITION_ALWAYS, 3 },
373 { EVENT_EXIT, 4, CONDITION_ALWAYS, 4 },
374 { EVENT_EXIT, 5, CONDITION_ALWAYS, 5 },
375 { EVENT_EXIT, 6, CONDITION_ALWAYS, 6 },
376 { EVENT_EXIT, 7, CONDITION_ALWAYS, 7 },
377 { EVENT_EXIT, 8, CONDITION_ALWAYS, 8 },
378 { EVENT_TALK, 8, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinThatTreeAtTheEntranceIs) },
379 { EVENT_TALK, 9, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinMccoyHadTheTreesCutDown) },
380 { EVENT_TALK, BILIBIN_MIA_ADMIRER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinTheSnowIsAlreadyPilingUp) },
381 { EVENT_TALK, 11, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinWeRarelySeeAnySnowAround) },
382 { EVENT_TALK, 12, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinHowArePeopleDoingInKolima) },
383 { EVENT_TALK, 13, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIKnowThatGuyWhoTurned) },
384 { EVENT_TALK, 14, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinLongAgoTheLighthouseNearImil) },
385 { EVENT_TALK, 15, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinButEvenTheLegendaryWaterOf) },
390 { EVENT_TALK, 20, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinYouCantReachKolimaNoMatter) },
392 { EVENT_TALK, BILIBIN_KITCHEN_WORKER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinHeyMisterHeadChefAreYou) },
393 { EVENT_TALK, BILIBIN_WAITRESS, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinStartCookingAlready) },
395 { EVENT_TALK, 25, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinWeCameHereBecauseLordMccoy) },
396 { EVENT_TALK, 26, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIThinkThatBigTreeDeep) },
398 { EVENT_TALK, 28, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinICantWaitToSeeTodays) },
399 { EVENT_TALK, 29, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIWentToLordMccoyLooking) },
400 { EVENT_TALK, 30, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIveHeardSongsThatTellOf) },
402 { EVENT_TALK, 9, CONDITION_ALWAYS, MSGNO(MsgBilibinThankGoodnessTheyStoppedConstructionOf) },
403 { EVENT_TALK, BILIBIN_MIA_ADMIRER, CONDITION_ALWAYS, MSGNO(MsgBilibinIAlwaysMissAltinInThe) },
404 { EVENT_TALK, 11, CONDITION_ALWAYS, MSGNO(MsgBilibinMyFatherSaysThatItsWarm) },
405 { EVENT_TALK, 12, CONDITION_ALWAYS, MSGNO(MsgBilibinTheRoadToKolimaIsOpen) },
407 { EVENT_TALK, 14, CONDITION_ALWAYS, MSGNO(MsgBilibinIThoughtISawLightsIn) },
408 { EVENT_TALK, 15, CONDITION_ALWAYS, MSGNO(MsgBilibinHisEyesAreRedBecauseHe) },
413 { EVENT_TALK, 20, CONDITION_ALWAYS, MSGNO(MsgBilibinThereWillBeFewerGuestsNow) },
417 { EVENT_TALK, BILIBIN_HUNGRY_DINER, CONDITION_ALWAYS, MSGNO(MsgBilibinImALittleSurprisedThatThe) },
418 { EVENT_TALK, 25, CONDITION_ALWAYS, MSGNO(MsgBilibinTheresNoBusinessHereSoIm) },
419 { EVENT_TALK, 26, CONDITION_ALWAYS, MSGNO(MsgBilibinTheyServedSoMuchFoodToday) },
421 { EVENT_TALK, 28, CONDITION_ALWAYS, MSGNO(MsgBilibinOooohThatsItITriedMy) },
422 { EVENT_TALK, 29, CONDITION_ALWAYS, MSGNO(MsgBilibinTheIncidentWasResolvedBeforeI) },
423 { EVENT_TALK, 30, CONDITION_ALWAYS, MSGNO(MsgBilibinIWonderWhatThatEerieHowling) },
424 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 8, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinThisIsAllLordMccoysFault) },
425 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 9, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinAhLadyMccoyIWouldJust) },
427 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 11, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinItMustBeDifficultToLive) },
428 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 12, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinICantImagineThatEveryoneIn) },
429 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 13, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinHeSeemedSoHappyAndThen) },
430 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 14, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinCouldTheWaterOfHermesSave) },
431 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 15, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinTheWaterOfHermesVanishedLong) },
432 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_WEAPON_SHOPKEEPER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinTheWorldWillNeverSeeSuch) },
433 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_ARMOR_SHOPKEEPER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIWishICouldSeeAnother) },
434 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_ITEM_SHOPKEEPER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinOnlySomeoneReallyBraveWouldGo) },
435 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_INNKEEPER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIDontBelieveInCursesFrom) },
436 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 20, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinAnyTravelersHeadingEastAreStuck) },
437 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_CHEF, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinFatherMotherIHopeTheyreAll) },
438 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_KITCHEN_WORKER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinShouldIJustForgetThatIm) },
439 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_WAITRESS, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIveHadAllTheCustomerComplaints) },
440 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_HUNGRY_DINER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinArghhhThatsItIJustWant) },
441 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 25, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinICameToBilibinHopingTo) },
442 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 26, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinISeeWhyTheyCallThat) },
443 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_DINER, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinIDontCareWhoDoesIt) },
444 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 28, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinYippeeIsItReadyYetMy) },
445 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 29, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinImGettingALittleScaredHearing) },
446 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 30, FLAG_KOLIMA_CURSE_LIFTED, MSGNO(MsgBilibinItHasBeenSaidThatA) },
447 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 8, CONDITION_ALWAYS, MSGNO(MsgBilibinItTakesManyYearsForA) },
448 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 9, CONDITION_ALWAYS, MSGNO(MsgBilibinSometimesIWishICouldSee) },
449 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_MIA_ADMIRER, CONDITION_ALWAYS, MSGNO(MsgBilibinIWonderIfThereAreStill) },
450 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 11, CONDITION_ALWAYS, MSGNO(MsgBilibinMyFatherHasTraveledAllOver) },
451 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 12, CONDITION_ALWAYS, MSGNO(MsgBilibinTravelingMakesYoungWarriorsStronger) },
452 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 13, CONDITION_ALWAYS, MSGNO(MsgBilibinClothesMadeWithSilkAreSo) },
453 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 14, CONDITION_ALWAYS, MSGNO(MsgBilibinTheresNoDoubtAboutItIts) },
454 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 15, CONDITION_ALWAYS, MSGNO(MsgBilibinWhatsTheBigDealWhyAre) },
455 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_WEAPON_SHOPKEEPER, CONDITION_ALWAYS, MSGNO(MsgBilibinAltinsGotGoodWeaponsButI) },
456 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_ARMOR_SHOPKEEPER, CONDITION_ALWAYS, MSGNO(MsgBilibinIWishICouldGoOut) },
457 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_ITEM_SHOPKEEPER, CONDITION_ALWAYS, MSGNO(MsgBilibinTheyCallThemselvesWarriorsButYou) },
458 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_INNKEEPER, CONDITION_ALWAYS, MSGNO(MsgBilibinWellIWasOnlyActingScared) },
459 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 20, CONDITION_ALWAYS, MSGNO(MsgBilibinItdBeBetterForBusinessIf) },
460 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_CHEF, CONDITION_ALWAYS, MSGNO(MsgBilibinIllGoToKolimaWhenThe) },
461 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_KITCHEN_WORKER, CONDITION_ALWAYS, MSGNO(MsgBilibinLetsSeeSoupSaladAndI) },
462 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_WAITRESS, CONDITION_ALWAYS, MSGNO(MsgBilibinTheHeadChefWasSoLazy) },
463 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_HUNGRY_DINER, CONDITION_ALWAYS, MSGNO(MsgBilibinItUsedToTakeThemSo) },
464 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 25, CONDITION_ALWAYS, MSGNO(MsgBilibinWhenTheyStoppedBuildingThePalace) },
465 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 26, CONDITION_ALWAYS, MSGNO(MsgBilibinIWishICouldEatLike) },
466 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), BILIBIN_DINER, CONDITION_ALWAYS, MSGNO(MsgBilibinIdBetterEatALotThat) },
467 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 28, CONDITION_ALWAYS, MSGNO(MsgBilibinTheFoodIsSuchAGood) },
468 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 29, CONDITION_ALWAYS, MSGNO(MsgBilibinIfAKidLikeThisCould) },
469 { PSYNERGY_ON_ACTOR(ABILITY_MIND_READ), 30, CONDITION_ALWAYS, MSGNO(MsgBilibinItLooksLikeScaryThingsAre) },
470 { SEARCH(SEARCH_BARREL), 100, 0xf52, FIND_ITEM(ITEM_ANTIDOTE) },
471 { SEARCH(SEARCH_BED), 101, 0xf53, FIND_ITEM(ITEM_SLEEP_BOMB) },
472 { SEARCH(SEARCH_BARREL), 102, 0xf54, FIND_ITEM(ITEM_HARD_NUT) },
473 { SEARCH(SEARCH_OVEN), 200, CONDITION_ALWAYS, FIND_MESSAGE(MSGNO(MsgBilibinLooksLikeEggSoupSoftEggs)) },
474 { SEARCH(SEARCH_OVEN), 201, CONDITION_ALWAYS, FIND_MESSAGE(MSGNO(MsgBilibinFreshOmelettesBilibinoOmelettesUseWild)) },
475 { SEARCH(SEARCH_BOOKCASE), 202, CONDITION_ALWAYS, FIND_MESSAGE(MSGNO(MsgBilibinTheresABookEntitledAllAbout)) },
477};
478// clang-format on
Ability numbers, named from the English release.
@ ABILITY_MIND_READ
Definition ability_ids.h:16
struct FieldActor * Object_GetById(s32 actor)
Returns an actor, or NULL if it does not exist.
static void Event_TalkToInnkeeper(void)
Opens the inn across the counter, or discusses the curse in Kolima.
static void Event_AskAboutSilk(void)
Asks whether the party knows what silk is.
static void Event_AskAboutHolyTree(void)
Asks whether Kolima's holy tree survived.
static void Event_TalkToWaitress(void)
The waitress works through serving water and laying the silverware.
const struct SceneEntrance * BilibinInteriors_GetEntrances(void)
static void Event_TalkToKitchenWorker(void)
The kitchen worker complains about the chef's renewed energy.
@ BILIBIN_CHEF
@ BILIBIN_DINER
@ BILIBIN_MIA_ADMIRER
wants to see Mia again. "that angelic" Mia
@ BILIBIN_WAITRESS
@ BILIBIN_KITCHEN_WORKER
@ BILIBIN_ARMOR_SHOPKEEPER
@ BILIBIN_WEAPON_SHOPKEEPER
@ BILIBIN_ITEM_SHOPKEEPER
@ BILIBIN_INNKEEPER
@ BILIBIN_HUNGRY_DINER
static void Event_AskAboutTreeSpirit(void)
Asks whether a tree spirit can curse a person, then turns back to the table.
u32 gBilibinInteriorsExits[]
@ BILIBIN_WEAPON_SHOP
@ BILIBIN_ARMOR_SHOP
@ BILIBIN_INN
@ BILIBIN_ITEM_SHOP
static void Event_TalkToItemShopkeeper(void)
Opens the item shop from across the counter, or talks about the curse.
struct ScenePlacement gBilibinInteriorsPlacements[]
static void Event_TalkToHungryDiner(void)
A diner's growling stomach leads into a yes/no question about the sound.
const u32 * BilibinInteriors_GetExits(void)
static void Event_TalkToWeaponShopkeeper(void)
Opens the weapon shop from across the counter; otherwise discusses Kolima.
s32 BilibinInteriors_Initialize(void)
The rooms open through a window; the diner at the dining room table is drawn at sprite priority 2,...
struct SceneEvent gBilibinInteriorsEvents[]
static void Event_ReadMiaAdmirersMind(void)
Mind Read on the villager who admires Mia: with Mia in the party (flags 0 to 7 say who is),...
struct SceneEntrance gBilibinInteriorsEntrances[]
static void Event_TalkToBusyChef(void)
The chef calls out orders once, then refers diners to the waitress.
const struct ScenePlacement * BilibinInteriors_GetPlacements(void)
Marks placements outside the current room's view before actors are spawned.
static void Event_TalkToArmorShopkeeper(void)
Opens the armor shop across the counter, or asks about seeing the ocean.
const struct SceneRegion * BilibinInteriors_GetRegions(void)
const struct SceneEvent * BilibinInteriors_GetEvents(void)
Returns both story stages' events; conditions choose the current dialogue.
static void Event_TalkToWorriedChef(void)
The chef cannot concentrate on cooking while his hometown is cursed.
static void Event_TalkAboutMeal(void)
A satisfied diner asks whether the party enjoys the food.
Calls through a function pointer, by argument count.
Character numbers, with each character's Japanese name.
#define MIA
Mary.
The engine calls the debug menus import, and their palette swatch tiles.
void ScenePlacement_ClipToView(struct ScenePlacement *placements)
The scene script layer: the engine services a scene's events call, declared once (Engine_EventBegin,...
static s32 Event_OpenMessage(s32 speaker, s32 flags)
void Engine_ActorFaceActor(s32 actor, s32 target, s32 frames)
static void Actor_FaceDirection(s32 actor, s32 facing, s32 frames)
static void Event_ShowMessageAndWait(s32 speaker, s32 flags, s32 frames)
s32 Engine_EventChooseYesNo(s32 actor, s32 flags)
#define GameFlag_IsSet
void Engine_ActorFaceDirection(s32 actor, s32 facing, s32 frames)
void Engine_InnOpen(s32 inn, s32 keeper)
static void Actor_FaceActor(s32 actor, s32 target, s32 frames)
#define GameFlag_Set
s32 Engine_EventAskYesNo(s32 speaker, s32 flags)
static void Event_ShowMessage(s32 speaker, s32 flags)
s32 Engine_GameFlagIsSet(s32 flag)
void Engine_ActorStartRepeatedMotion(s32 actor, s32 repeats)
static s32 Event_AskYesNo(s32 speaker, s32 flags)
void Engine_ShopOpen(s32 shop, s32 keeper)
void Engine_EventWait(s32 frames)
static void Actor_SetAttachedEffect(s32 actor, s32 effect)
@ TRANSITION_WINDOW
Definition field_obj.h:17
#define SCENE_TRANSITION(style, variant)
Definition field_obj.h:20
The scene table formats: entrances, exits, placements and events, and the macros that write them.
#define SCENE_EVENTS_END
#define FIND_ITEM(item)
@ EVENT_EXIT
@ EVENT_TALK
@ FACING_STEP
Definition field_scene.h:36
#define SCENE_EXITS(scene)
Definition field_scene.h:72
#define FIND_MESSAGE(message)
#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
@ TALK_KEEP_FACING
@ TALK_FACE_PARTY
@ TALK_FACE_PARTY_AND_BACK
#define PSYNERGY_ON_ACTOR(ability)
#define EVENT_SCRIPT(script)
@ ACTOR_WANDER
@ ACTOR_STAND
#define SEARCH(target)
#define SCENE_EXITS_END
Definition field_scene.h:77
#define FACING_IS_NORTH(facing)
Definition field_scene.h:38
@ 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_NORTHWEST
Definition field_scene.h:31
@ FACING_SOUTH
Definition field_scene.h:28
@ FACING_WEST
Definition field_scene.h:30
#define PIXELS(value)
@ SEARCH_OVEN
@ SEARCH_BOOKCASE
@ SEARCH_BED
@ SEARCH_BARREL
Game flags, named where their meaning is shown.
#define FLAG_IN_PARTY(character)
Flags 0 to 7: the character with that id (character_ids.h) is in the party (Party_AddActiveOwner).
Definition flags.h:9
#define FLAG_KOLIMA_CURSE_LIFTED
Definition flags.h:103
The screen blend's globals and the graphics routines.
Item numbers, named from the English release.
@ ITEM_ANTIDOTE
Definition item_ids.h:47
@ ITEM_SLEEP_BOMB
Definition item_ids.h:68
@ ITEM_HARD_NUT
Definition item_ids.h:53
The reel game's title lettering.
struct EventWork * gEventWork
void Engine_EventEnd(void)
void Engine_EventBegin(void)
void Engine_EventSetMessage()
void Engine_EventShowMessage()
s32 startTransition
SCENE_TRANSITION(style, variant).
Definition event_work.h:43
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
u16 facing
1/65536 turns
Definition field_obj.h:34
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.
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 char u8
Definition types.h:11