#include "m_soncho.h" #include "m_common_data.h" #include "m_name_table.h" #include "m_event.h" #include "m_play.h" #include "m_room_type.h" #include "m_msg.h" #include "m_item_name.h" #include "m_string.h" #include "m_font.h" #include "ac_taisou_npc0.h" #include "m_player_lib.h" static u8 event_table[mSC_EVENT_NUM] = { mEv_EVENT_SONCHO_NEW_YEARS_DAY, mEv_EVENT_SONCHO_FOUNDERS_DAY, mEv_EVENT_SONCHO_GRADUATION_DAY, mEv_EVENT_SONCHO_APRILFOOLS_DAY, mEv_EVENT_SONCHO_TOWN_DAY, mEv_EVENT_SONCHO_MOTHERS_DAY, mEv_EVENT_SONCHO_SALE_DAY, mEv_EVENT_SONCHO_CHERRY_BLOSSOM_FESTIVAL, mEv_EVENT_SONCHO_SPRING_SPORTS_FAIR, mEv_EVENT_SONCHO_NATURE_DAY, mEv_EVENT_SONCHO_SPRING_CLEANING, mEv_EVENT_SONCHO_FATHERS_DAY, mEv_EVENT_SONCHO_FISHING_TOURNEY_1, mEv_EVENT_SONCHO_GROUNDHOG_DAY, mEv_EVENT_SONCHO_EXPLORERS_DAY, mEv_EVENT_SONCHO_FIREWORKS_SHOW, mEv_EVENT_METEOR_SHOWER, mEv_EVENT_HARVEST_MOON_FESTIVAL, mEv_EVENT_SONCHO_MAYORS_DAY, mEv_EVENT_SONCHO_OFFICERS_DAY, mEv_EVENT_SONCHO_FALL_SPORTS_FAIR, mEv_EVENT_SONCHO_HALLOWEEN, mEv_EVENT_SONCHO_FISHING_TOURNEY_2, mEv_EVENT_SONCHO_SNOW_DAY, mEv_EVENT_SONCHO_LABOR_DAY, mEv_EVENT_SONCHO_TOY_DAY, mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_EVENT_SONCHO_HARVEST_FESTIVAL }; extern u8 mSC_get_soncho_event() { u8* event_table_p = event_table; int i = 0; for (i = 0; i < mSC_EVENT_NUM; i++) { if (i != mSC_EVENT_FISHING_TOURNEY_2 && mEv_check_status(event_table[i], mEv_STATUS_RUN) != FALSE) { return i; } } if (mEv_check_status(mEv_EVENT_SONCHO_FISHING_TOURNEY_2, mEv_STATUS_RUN)) { return mSC_EVENT_FISHING_TOURNEY_2; } if (mEv_check_status(mEv_EVENT_SONCHO_VACATION_JANUARY, mEv_STATUS_RUN)) { return mSC_SPECIAL_EVENT_JAN_VACATION; } if (mEv_check_status(mEv_EVENT_SONCHO_VACATION_FEBRUARY, mEv_STATUS_RUN)) { return mSC_SPECIAL_EVENT_FEB_VACATION; } if (mEv_check_status(mEv_EVENT_MORNING_AEROBICS, mEv_STATUS_RUN)) { return mSC_SPECIAL_EVENT_MORNING_AEROBICS; } return 0xFF; } extern int mSC_get_soncho_field_event() { if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, mEv_STATUS_RUN)) { return mSC_FIELD_EVENT_FOOT_RACE; } if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, mEv_STATUS_RUN)) { return mSC_FIELD_EVENT_BALL_TOSS; } if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, mEv_STATUS_RUN)) { return mSC_FIELD_EVENT_TUG_O_WAR; } return mSC_FIELD_EVENT_AEROBICS; // mEv_EVENT_SPORTS_FAIR_AEROBICS } extern void mSC_delete_soncho(ACTOR* actor, GAME_PLAY* play) { u8 event = mSC_get_soncho_event(); switch (event) { case mSC_EVENT_NEW_YEARS_DAY: { ACTOR* ev_miko = Actor_info_name_search(&play->actor_info, mAc_PROFILE_EV_MIKO, ACTOR_PART_NPC); if (ev_miko != NULL) { Actor_delete(ev_miko); } break; } case mSC_EVENT_FOUNDERS_DAY: case mSC_EVENT_GRADUATION_DAY: case mSC_EVENT_APRILFOOLS_DAY: case mSC_EVENT_TOWN_DAY: case mSC_EVENT_MOTHERS_DAY: case mSC_EVENT_SALE_DAY: case mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL: case mSC_EVENT_NATURE_DAY: case mSC_EVENT_SPRING_CLEANING: case mSC_EVENT_FATHERS_DAY: case mSC_EVENT_FISHING_TOURNEY_1: case mSC_EVENT_GROUNDHOG_DAY: case mSC_EVENT_EXPLORERS_DAY: case mSC_EVENT_FIREWORKS_SHOW: case mSC_EVENT_METEOR_SHOWER: case mSC_EVENT_HARVEST_MOON_FESTIVAL: case mSC_EVENT_MAYORS_DAY: case mSC_EVENT_OFFICERS_DAY: case mSC_EVENT_HALLOWEEN: case mSC_EVENT_FISHING_TOURNEY_2: case mSC_EVENT_SNOW_DAY: case mSC_EVENT_LABOR_DAY: case mSC_EVENT_TOY_DAY: case mSC_EVENT_NEW_YEARS_EVE_COUNTDOWN: case mSC_EVENT_HARVEST_FESTIVAL: { mEv_actor_dying_message(event_table[event], actor); break; } case mSC_EVENT_SPRING_SPORTS_FAIR: case mSC_EVENT_FALL_SPORTS_FAIR: { if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, mEv_STATUS_SHOW)) { mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, actor); } else if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, mEv_STATUS_SHOW)) { mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, actor); } else if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, mEv_STATUS_SHOW)) { mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, actor); } break; } case mSC_SPECIAL_EVENT_JAN_VACATION: { mEv_actor_dying_message(mEv_EVENT_SONCHO_VACATION_JANUARY, actor); break; } case mSC_SPECIAL_EVENT_FEB_VACATION: { mEv_actor_dying_message(mEv_EVENT_SONCHO_VACATION_FEBRUARY, actor); break; } case 0xFF: { break; } } } extern int mSC_trophy_get(u8 num) { int res = FALSE; if (num <= mSC_TROPHY_MAX) { if (num >= mSC_EVENT_NUM) { if ((Common_Get(now_private)->soncho_trophy_field1 & (1 << (u8)(num - mSC_EVENT_NUM))) != 0) { res = TRUE; } } else if ((Common_Get(now_private)->soncho_trophy_field0 & (1 << num)) != 0) { res = TRUE; } } return res; } extern void mSC_trophy_set(u8 num) { if (num > mSC_TROPHY_MAX) { return; } if (num >= mSC_EVENT_NUM) { Common_Get(now_private)->soncho_trophy_field1 |= (1 << (u8)(num - mSC_EVENT_NUM)); } else { Common_Get(now_private)->soncho_trophy_field0 |= (1 << num); } } extern mActor_name_t mSC_trophy_item(u8 soncho_event) { static mActor_name_t soncho_item_table[mSC_EVENT_NUM] = { ITM_FOOD_APPLE, // mSC_EVENT_NEW_YEARS_DAY FTR_WEED_MODEL, // mSC_EVENT_FOUNDERS_DAY FTR_NEEDLEWORK_MODEL, // mSC_EVENT_GRADUATION_DAY FTR_SUPER_TORTIMER, // mSC_EVENT_APRILFOOLS_DAY ITM_FOOD_APPLE, // mSC_EVENT_TOWN_DAY FTR_LOVELY_PHONE, // mSC_EVENT_MOTHERS_DAY FTR_MARKET_MODEL, // mSC_EVENT_SALE_DAY FTR_PINK_TREE_MODEL, // mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL FTR_SPRING_MEDAL, // mSC_EVENT_SPRING_SPORTS_FAIR FTR_TREE_MODEL, // mSC_EVENT_NATURE_DAY FTR_DUMP_MODEL, // mSC_EVENT_SPRING_CLEANING FTR_LOCOMOTIVE_MODEL, // mSC_EVENT_FATHERS_DAY FTR_ANGLER_TROPHY, // mSC_EVENT_FISHING_TOURNEY_1 ITM_FOOD_PEAR, // mSC_EVENT_GROUNDHOG_DAY FTR_BOTTLED_SHIP, // mSC_EVENT_EXPLORERS_DAY FTR_BOTTLE_ROCKET, // mSC_EVENT_FIREWORKS_SHOW FTR_TELESCOPE, // mSC_EVENT_METEOR_SHOWER FTR_MOON, // mSC_EVENT_HARVEST_MOON_FESTIVAL FTR_WELL_MODEL, // mSC_EVENT_MAYORS_DAY FTR_POLICE_MODEL, // mSC_EVENT_OFFICERS_DAY FTR_AUTUMN_MEDAL, // mSC_EVENT_FALL_SPORTS_FAIR FTR_FORTUNE_TENT_MODEL, // mSC_EVENT_HALLOWEEN FTR_FISHING_TROPHY, // mSC_EVENT_FISHING_TOURNEY_2 FTR_SNOWMAN, // mSC_EVENT_SNOW_DAY FTR_SHOP_MDOEL, // mSC_EVENT_LABOR_DAY ITM_FOOD_APPLE, // mSC_EVENT_TOY_DAY FTR_NOISEMAKER, // mSC_EVENT_NEW_YEARS_EVE_COUNTDOWN FTR_CORNUCOPIA // mSC_EVENT_HARVEST_FESTIVAL }; mActor_name_t item = ITM_FOOD_APPLE; if (soncho_event < mSC_EVENT_NUM) { switch (soncho_event) { case mSC_EVENT_NEW_YEARS_DAY: { /* @BUG - devs have another off-by-one error here, as there are 16 diaries but this can only generate the first 15 */ #ifndef BUGFIXES item = (RANDOM(DIARY_NUM-1) & 15) + ITM_DIARY_START; #else item = RANDOM(DIARY_NUM) + ITM_DIARY_START; #endif break; } case mSC_EVENT_TOY_DAY: { if (Common_Get(now_private)->gender == mPr_SEX_MALE) { item = FTR_MINI_CAR; } else { item = FTR_DOLLY; } break; } case mSC_EVENT_TOWN_DAY: { item = mSP_GetRandomStationToyItemNo(); break; } case mSC_EVENT_GROUNDHOG_DAY: { item = mRmTp_FtrIdx2FtrItemNo(0x4DE + RANDOM(9), mRmTp_DIRECT_SOUTH); // random flower model break; } case mSC_EVENT_FOUNDERS_DAY: case mSC_EVENT_GRADUATION_DAY: case mSC_EVENT_APRILFOOLS_DAY: case mSC_EVENT_MOTHERS_DAY: case mSC_EVENT_SALE_DAY: case mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL: case mSC_EVENT_SPRING_SPORTS_FAIR: case mSC_EVENT_NATURE_DAY: case mSC_EVENT_SPRING_CLEANING: case mSC_EVENT_FATHERS_DAY: case mSC_EVENT_FISHING_TOURNEY_1: case mSC_EVENT_EXPLORERS_DAY: case mSC_EVENT_FIREWORKS_SHOW: case mSC_EVENT_METEOR_SHOWER: case mSC_EVENT_HARVEST_MOON_FESTIVAL: case mSC_EVENT_MAYORS_DAY: case mSC_EVENT_OFFICERS_DAY: case mSC_EVENT_FALL_SPORTS_FAIR: case mSC_EVENT_HALLOWEEN: case mSC_EVENT_FISHING_TOURNEY_2: case mSC_EVENT_SNOW_DAY: case mSC_EVENT_LABOR_DAY: default: { item = soncho_item_table[soncho_event]; break; } } } return item; } extern void mSC_item_string_set(mActor_name_t item, int str_no) { u8 item_name[mIN_ITEM_NAME_LEN]; mMsg_Window_c* window = mMsg_Get_base_window_p(); mIN_copy_name_str(item_name, item); mMsg_Set_item_str_art(window, str_no, item_name, mIN_ITEM_NAME_LEN, mIN_get_item_article(item)); } extern void mSC_get_event_name_str(u8* buf, int buf_len, int soncho_event) { static int chg_string_idx[mSC_EVENT_NUM + 1] = { 0, // New Year's Day 14, // Founder's Day 8, // Graduation Day 3, // April Fools' Day 11, // "Town" Day 7, // Mother's Day 24, // Sale Day 4, // Cherry Festival 2, // Sports Fair 5, // Nature Day 6, // Spring Cleaning 9, // Father's Day 10, // Fishing Tourney 1, // Groundhog Day 18, // Explorer's Day 12, // Fireworks Show 13, // Meteor Shower 17, // Harvest Moon 20, // Mayor's Day 21, // Officer's Day 16, // Sports Fair 19, // Halloween 22, // Fishing Tourney 25, // Snow Day 15, // Labor Day 26, // Toy Day 27, // New Year's Eve 23, // Harvest Festival 28 // birthday }; mString_Load_StringFromRom(buf, buf_len, mString_SONCHO_EVENT_NAME_START + chg_string_idx[soncho_event & 0x7F]); } extern void mSC_event_name_set(u8 soncho_event) { u8 event_name_buf[mIN_ITEM_NAME_LEN]; int ofs = 0; // for town day name if (soncho_event < mSC_EVENT_NUM) { if (soncho_event == mSC_EVENT_TOWN_DAY) { mLd_CopyLandName(event_name_buf, Save_Get(land_info).name); ofs = mMl_strlen(event_name_buf, LAND_NAME_SIZE, CHAR_SPACE); } mSC_get_event_name_str(event_name_buf + ofs, mIN_ITEM_NAME_LEN - ofs, soncho_event); mMsg_Set_item_str(mMsg_Get_base_window_p(), mMsg_ITEM_STR1, event_name_buf, mIN_ITEM_NAME_LEN); } } extern void mSC_set_free_str_number(int free_str_no, u32 num) { u8 number[mIN_ITEM_NAME_LEN]; int fig; if (num >= 100) { fig = 3; } else if (num >= 10) { fig = 2; } else { fig = 1; } mFont_UnintToString(number, 3, num, fig, TRUE, FALSE, TRUE); mMsg_Set_free_str(mMsg_Get_base_window_p(), free_str_no, number, fig); } static int mSC_Radio_many_taisou_card() { int i; int cards; Private_c* priv = Common_Get(now_private); for (i = 0, cards = 0; i < 13; i++) { cards += mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); } return cards; } static mActor_name_t mSC_Radio_have_taisou_card() { int i; Private_c* priv = Common_Get(now_private); for (i = 0; i < 13; i++) { if (mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL) > 0) { return ITM_EXCERCISE_CARD00 + i; } } return ITM_EXCERCISE_CARD00; } static int mSC_Radio_time_check() { Private_c* priv = Common_Get(now_private); int equal_date; if (Common_Get(time.rtc_time).year != priv->radiocard.last_date.year) { return 0; } equal_date = lbRTC_IsEqualDate( Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, priv->radiocard.last_date.year, priv->radiocard.last_date.month, priv->radiocard.last_date.day ); switch (equal_date) { case lbRTC_LESS: return mSC_RADIO_TIME_LESS; case lbRTC_EQUAL: return mSC_RADIO_TIME_SAME_DAY; case lbRTC_OVER: return mSC_RADIO_TIME_OVER; default: return mSC_RADIO_TIME_LESS; } } static int mSC_Radio_limit_check() { if (Common_Get(time.rtc_time).month >= lbRTC_AUGUST && Common_Get(time.rtc_time).day >= 19) { return FALSE; } return TRUE; } static void mSC_Radio_delete_taisou_card() { int i; Private_c* priv = Common_Get(now_private); for (i = 0; i < 13; i++) { int idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); while (idx != -1) { mPr_SetPossessionItem(Common_Get(now_private), idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); // probably a macro idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); } } } static void mSC_Radio_change_taisou_card(mActor_name_t old_card, mActor_name_t new_card) { Private_c* priv = Common_Get(now_private); int idx = mPr_GetPossessionItemIdxWithCond(priv, old_card, mPr_ITEM_COND_NORMAL); if (idx != -1) { mPr_SetPossessionItem(Common_Get(now_private), idx, new_card, mPr_ITEM_COND_NORMAL); // again, probably a macro } } static void mSC_Radio_stamp_card(lbRTC_day_t days) { const lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; radiocard->last_date.year = rtc_time->year; radiocard->last_date.month = rtc_time->month; radiocard->last_date.day = rtc_time->day; radiocard->days = days; } static int mSC_Radio_msg(TAISOU_NPC0_ACTOR* taisou_actor, int idx) { return 0x3280 + taisou_actor->soncho_event * 10 + idx; } extern int mSC_Radio_Set_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor) { u8 item_name[mIN_ITEM_NAME_LEN]; mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; int msg_no; taisou_actor->talk_proc = mSCR_TALK_9; if (taisou_actor->soncho_event == mSC_SPECIAL_EVENT_MORNING_AEROBICS) { int time_check = mSC_Radio_time_check(); int num_cards = mSC_Radio_many_taisou_card(); mActor_name_t card; int article; if (Common_Get(player_no) == mPr_FOREIGNER) { msg_no = 0x343B; } else if (time_check == mSC_RADIO_TIME_SAME_DAY) { msg_no = 0x3433; taisou_actor->talk_state = 18 + RANDOM(3); taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { int action = mSCR_ACTION_TOO_LATE; if (num_cards <= 0) { int limit_check = mSC_Radio_limit_check(); if (limit_check == FALSE && (radiocard->days == mSC_RADIO_DAYS || time_check == mSC_RADIO_TIME_LESS)) { action = mSCR_ACTION_TOO_LATE; } else { switch (time_check) { case mSC_RADIO_TIME_LESS: action = mSCR_ACTION_NEW_CARD; break; case mSC_RADIO_TIME_OVER: { if (radiocard->days == (mSC_RADIO_DAYS - 1)) { action = mSCR_ACTION_LOST_CARD_AND_FINISH; } else if (radiocard->days < mSC_RADIO_DAYS) { action = mSCR_ACTION_LOST_CARD; } else { action = mSCR_ACTION_NEW_CARD; } break; } } } } else if (num_cards > 1) { action = mSCR_ACTION_DELETE_OLD_CARD; } else { card = mSC_Radio_have_taisou_card(); switch (time_check) { case mSC_RADIO_TIME_LESS: action = mSCR_ACTION_DELETE_OLD_CARD; break; case mSC_RADIO_TIME_SAME_DAY: break; case mSC_RADIO_TIME_OVER: { radiocard->days = card - ITM_EXCERCISE_CARD00; radiocard->days++; if (radiocard->days >= mSC_RADIO_DAYS) { action = mSCR_ACTION_FINISH_CARD; } else { action = mSCR_ACTION_STAMP_CARD; } break; } } } switch (action) { case mSCR_ACTION_TOO_LATE: { msg_no = 0x3437; taisou_actor->talk_state = 22 + RANDOM(3); taisou_actor->talk_proc = mSCR_TALK_NEXT; break; } case mSCR_ACTION_DELETE_OLD_CARD: { taisou_actor->talk_proc = mSCR_TALK_PICKUP_ALL; msg_no = 0x343C; mSC_Radio_delete_taisou_card(); break; } case mSCR_ACTION_NEW_CARD: { taisou_actor->talk_state = mSCR_TALK_NEXT_INSPECTION; msg_no = 0x3422; if ( mCD_calendar_event_check( Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event ) ) { msg_no = 0x3423; } if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; taisou_actor->held_item = ITM_EXCERCISE_CARD00; mPr_SetFreePossessionItem(Common_Get(now_private), ITM_EXCERCISE_CARD00, mPr_ITEM_COND_NORMAL); mSC_Radio_stamp_card(0); taisou_actor->talk_state++; } break; } case mSCR_ACTION_LOST_CARD: { taisou_actor->talk_state = 14; msg_no = 0x342E; mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 2); if ( mCD_calendar_event_check( Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event ) ) { msg_no = 0x342F; } if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; radiocard->days++; taisou_actor->held_item = ITM_EXCERCISE_CARD00 + radiocard->days; mPr_SetFreePossessionItem(Common_Get(now_private), taisou_actor->held_item, mPr_ITEM_COND_NORMAL); mSC_Radio_stamp_card(radiocard->days); taisou_actor->talk_state++; } break; } case mSCR_ACTION_STAMP_CARD: { taisou_actor->talk_proc = mSCR_TALK_INSPECTION; card = mSC_Radio_have_taisou_card(); mSC_Radio_stamp_card(radiocard->days); mSC_Radio_change_taisou_card(card, ITM_EXCERCISE_CARD00 + radiocard->days); mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 1); taisou_actor->talk_state = mSCR_TALK_NEXT; msg_no = 0x3427; break; } case mSCR_ACTION_FINISH_CARD: { taisou_actor->talk_proc = mSCR_TALK_INSPECTION; card = mSC_Radio_have_taisou_card(); mSC_Radio_stamp_card(radiocard->days); taisou_actor->held_item = FTR_AEROBICS_RADIO; mSC_Radio_change_taisou_card(card, taisou_actor->held_item); mIN_copy_name_str(item_name, taisou_actor->held_item); article = mIN_get_item_article(taisou_actor->held_item); mMsg_Set_free_str_art(mMsg_Get_base_window_p(), mMsg_FREE_STR1, item_name, mIN_ITEM_NAME_LEN, article); taisou_actor->talk_state = 9; msg_no = 0x342A; break; } case mSCR_ACTION_LOST_CARD_AND_FINISH: { taisou_actor->talk_state = 28; msg_no = 0x342E; mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 2); if ( mCD_calendar_event_check( Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event ) ) { msg_no = 0x342F; } if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; radiocard->days++; taisou_actor->held_item = FTR_AEROBICS_RADIO; mPr_SetFreePossessionItem(Common_Get(now_private), taisou_actor->held_item, mPr_ITEM_COND_NORMAL); mIN_copy_name_str(item_name, taisou_actor->held_item); article = mIN_get_item_article(taisou_actor->held_item); mMsg_Set_free_str_art(mMsg_Get_base_window_p(), mMsg_FREE_STR1, item_name, mIN_ITEM_NAME_LEN, article); mSC_Radio_stamp_card(radiocard->days); taisou_actor->talk_state--; } break; } default: { msg_no = 0x3437; taisou_actor->talk_state = 22 + RANDOM(3); taisou_actor->talk_proc = mSCR_TALK_NEXT; break; } } } } else if (Common_Get(player_no) == mPr_FOREIGNER) { msg_no = mSC_Radio_msg(taisou_actor, 9); taisou_actor->talk_proc = mSCR_TALK_8; } else if (mSC_trophy_get(taisou_actor->soncho_event) != FALSE) { if ( mCD_calendar_event_check( Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event ) ) { msg_no = mSC_Radio_msg(taisou_actor, 6 + RANDOM(3)); } else { msg_no = mSC_Radio_msg(taisou_actor, 5); } taisou_actor->talk_proc = mSCR_TALK_7; } else { taisou_actor->talk_proc = mSCR_TALK_BEFORE_GIVE; if ( mCD_calendar_event_check( Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event ) ) { msg_no = mSC_Radio_msg(taisou_actor, 1); } else { msg_no = mSC_Radio_msg(taisou_actor, 0); } } return msg_no; } static void mSCR_talk_pickup_all(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { switch (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9)) { case 1: { mPlib_request_main_give_type1(play, ITM_EXCERCISE_CARD00, 7, FALSE, FALSE); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); mMsg_Set_LockContinue(mMsg_Get_base_window_p()); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); break; } case 2: { if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { mMsg_Unset_LockContinue(mMsg_Get_base_window_p()); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); taisou_actor->talk_proc = mSCR_TALK_9; } break; } } } static void mSCR_talk_inspection(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; switch (order) { case 1: { mPlib_request_main_give_type1(play, ITM_EXCERCISE_CARD00, 8, FALSE, FALSE); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); taisou_actor->talk_state++; break; } case 2: { if (Common_Get(clip).handOverItem_clip->request_mode == aHOI_REQUEST_TRANS_WAIT) { mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); Common_Get(clip).handOverItem_clip->player_after_mode = 8; mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 3); mMsg_Unset_LockContinue(msg_win); taisou_actor->npc_actor_class.talk_info.default_animation = 30; } break; } case 3: { if ((mMsg_Get_msg_num(msg_win) == 0x342B || mMsg_Get_msg_num(msg_win) == 0x3428) && mMsg_Check_MainNormalContinue(msg_win)) { mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 4); mMsg_Set_LockContinue(mMsg_Get_base_window_p()); } break; } case 4: { if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { taisou_actor->npc_actor_class.talk_info.default_animation = -1; mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); if (radiocard->days >= mSC_RADIO_DAYS) { taisou_actor->talk_proc = mSCR_TALK_NEWCARD; } else { taisou_actor->talk_proc = mSCR_TALK_9; } mMsg_Unset_LockContinue(msg_win); mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); taisou_actor->talk_state++; } break; } } } static void mSCR_talk_newcard(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); if (order == 2) { mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, taisou_actor->held_item); mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); if (taisou_actor->talk_state == 28) { mMsg_Set_continue_msg_num(msg_win, 0x342D); /* dialog after giving aerobics radio */ } else { mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); taisou_actor->talk_state++; } taisou_actor->talk_proc = mSCR_TALK_9; } } static void mSCR_talk_before_give(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); if (mMsg_Check_MainNormalContinue(msg_win)) { if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 2)); taisou_actor->talk_proc = mSCR_TALK_9; } else { mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 3)); taisou_actor->talk_proc = mSCR_TALK_GIVE; } } } static void mSCR_talk_give(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); if (order == 2) { mActor_name_t trophy_item = mSC_trophy_item(taisou_actor->soncho_event); mSC_item_string_set(trophy_item, mMsg_ITEM_STR0); mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, trophy_item); mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); mPr_SetFreePossessionItem(Common_Get(now_private), trophy_item, mPr_ITEM_COND_NORMAL); mSC_trophy_set(taisou_actor->soncho_event); taisou_actor->talk_proc = mSCR_TALK_9; } } static void mSCR_talk_next(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); if (mMsg_Check_MainNormalContinue(msg_win)) { mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); taisou_actor->talk_proc++; taisou_actor->talk_state++; } } typedef void (*mSCR_TALK_PROC)(TAISOU_NPC0_ACTOR*, GAME_PLAY*); extern mSC_Radio_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { static mSCR_TALK_PROC proc[mSCR_TALK_NUM] = { &mSCR_talk_pickup_all, &mSCR_talk_inspection, &mSCR_talk_next, &mSCR_talk_newcard, &mSCR_talk_before_give, &mSCR_talk_give, &mSCR_talk_next, (mSCR_TALK_PROC)&none_proc1, (mSCR_TALK_PROC)&none_proc1, (mSCR_TALK_PROC)&none_proc1 }; (*proc[taisou_actor->talk_proc])(taisou_actor, play); } extern int mSC_LightHouse_get_period(lbRTC_time_c* time) { lbRTC_time_c lh_start_time; lbRTC_time_c lh_end_time; lbRTC_time_c lh_max_time; lbRTC_ymd_c* renew_time = &Save_Get(LightHouse).renew_time; int equal; if (Save_Get(LightHouse).renew_time.day == 0) { return mSC_LIGHTHOUSE_PERIOD_NONE; } mTM_ymd_2_time(&lh_start_time, renew_time); lbRTC_TimeCopy(&lh_end_time, &lh_start_time); lbRTC_Add_DD(&lh_end_time, lbRTC_WEEK); lbRTC_TimeCopy(&lh_max_time, &lh_start_time); lbRTC_Add_DD(&lh_max_time, mSC_LIGHTHOUSE_DAYS); equal = lbRTC_IsEqualDate( lh_start_time.year, lh_start_time.month, lh_start_time.day, time->year, time->month, time->day ); if (equal == lbRTC_OVER) { return mSC_LIGHTHOUSE_PERIOD_NONE; // start date is after the current date (time travelled backwards) } if (equal == lbRTC_EQUAL) { return mSC_LIGHTHOUSE_PERIOD_0; // start date is current date } if ( lbRTC_IsEqualDate( lh_end_time.year, lh_end_time.month, lh_end_time.day, time->year, time->month, time->day ) != lbRTC_LESS ) { return mSC_LIGHTHOUSE_PERIOD_1; } else if (lbRTC_IsEqualDate( lh_max_time.year, lh_max_time.month, lh_max_time.day, time->year, time->month, time->day ) != lbRTC_LESS ) { return mSC_LIGHTHOUSE_PERIOD_2; } return mSC_LIGHTHOUSE_PERIOD_NONE; } extern int mSC_LightHouse_day(const lbRTC_time_c* time) { lbRTC_time_c lh_start_time; int days; lbRTC_ymd_c* renew_time = &Save_Get(LightHouse).renew_time; if (Save_Get(LightHouse).renew_time.day == 0) { return 0; } mTM_ymd_2_time(&lh_start_time, renew_time); if (lbRTC_IsOverTime(&lh_start_time, time) == lbRTC_LESS) { return 0; } days = lbRTC_GetIntervalDays(&lh_start_time, time) - 1; if (days < 0) { return 0; } return days <= (lbRTC_WEEK - 1) ? days : (lbRTC_WEEK - 1); } extern int mSC_LightHouse_Event_Check(int player_no) { LightHouse_c* lh = Save_GetPointer(LightHouse); if (player_no == -1) { player_no = Common_Get(player_no); } if (player_no >= mPr_FOREIGNER) { return 0; } if (mSC_LightHouse_get_period(Common_GetPointer(time.rtc_time)) != mSC_LIGHTHOUSE_PERIOD_2) { return 0; } if ((lh->players_completed & (1 << player_no)) != 0) { return 0; } if ((lh->days_switched_on & 0x7F) == 0x7F) { if ((lh->players_quest_started & (u8)(1 << (player_no + 4))) != 0) { if (lh->renew_time.month == lbRTC_JANUARY) { return 1; } else { return 3; } } } else if ((lh->players_quest_started & (u8)(1 << Common_Get(player_no))) != 0) { if (lh->renew_time.month == lbRTC_JANUARY) { return 2; } else { return 4; } } return 0; } extern void mSC_LightHouse_Event_Clear(int player_no) { LightHouse_c* lh = Save_GetPointer(LightHouse); if (player_no == -1) { player_no = Common_Get(player_no); } if (player_no < mPr_FOREIGNER) { int check; lh->players_completed |= (1 << player_no); check = mSC_LightHouse_Event_Check(player_no); if (check == 2 || check == 4) { lh->players_completed |= 0b1111; } } } extern mActor_name_t mSC_LightHouse_Event_Present_Item() { if (Save_Get(LightHouse).renew_time.month == lbRTC_JANUARY) { return FTR_LIGHTHOUSE_MODEL; } return FTR_CHOCOLATES; } static void mSC_LightHouse_clear_data() { mem_clear((u8*)Save_GetPointer(LightHouse), sizeof(LightHouse_c), 0); } extern int mSC_LightHouse_Event_Start() { LightHouse_c* lh = Save_GetPointer(LightHouse); lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); if (lh->renew_time.day == 0) { return TRUE; } if (mSC_LightHouse_get_period(rtc_time) != mSC_LIGHTHOUSE_PERIOD_NONE) { return FALSE; } mSC_LightHouse_clear_data(); return TRUE; } extern int mSC_LightHouse_Talk_After_Check() { LightHouse_c* lh = Save_GetPointer(LightHouse); lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); if (mSC_LightHouse_get_period(rtc_time) == mSC_LIGHTHOUSE_PERIOD_NONE) { return FALSE; } return (lh->players_quest_started & 0b1111) != 0; } extern void mSC_LightHouse_Quest_Start() { LightHouse_c* lh = Save_GetPointer(LightHouse); lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); mSC_LightHouse_clear_data(); mTM_set_renew_time(&lh->renew_time, rtc_time); lh->players_quest_started |= (u8)(1 << Common_Get(player_no)); } extern int mSC_LightHouse_Switch_Check() { lbRTC_time_c adjusted_rtc_time; LightHouse_c* lh = Save_GetPointer(LightHouse); lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); int day; lbRTC_TimeCopy(&adjusted_rtc_time, rtc_time); lbRTC_Sub_hh(&adjusted_rtc_time, 6); if (lh->renew_time.day == 0) { return TRUE; } if (mSC_LightHouse_get_period(&adjusted_rtc_time) != mSC_LIGHTHOUSE_PERIOD_1) { return TRUE; } day = mSC_LightHouse_day(&adjusted_rtc_time); return (lh->days_switched_on & (1 << day)) != 0; } extern int mSC_LightHouse_In_Check() { lbRTC_time_c time; LightHouse_c* lh = Save_GetPointer(LightHouse); lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); int day; if (Common_Get(player_no) >= mPr_FOREIGNER) { return FALSE; } if (mEv_CheckFirstJob() != FALSE) { return FALSE; } lbRTC_TimeCopy(&time, rtc_time); if (lh->renew_time.day == 0) { return FALSE; } if (mSC_LightHouse_get_period(&time) != mSC_LIGHTHOUSE_PERIOD_1) { return FALSE; } if (time.hour < 18 || time.hour >= 22) { return FALSE; } day = mSC_LightHouse_day(&time); return (lh->days_switched_on & (1 << day)) == 0; } extern void mSC_LightHouse_Switch_On() { LightHouse_c* lh = Save_GetPointer(LightHouse); lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); int day; int player_no; day = mSC_LightHouse_day(rtc_time); lh->days_switched_on |= (1 << day); player_no = Common_Get(player_no); if (player_no < mPr_FOREIGNER) { lh->players_quest_started |= (u8)(1 << (player_no + 4)); } } extern void mSC_LightHouse_Delete_Player(int player_no) { Save_Get(LightHouse).players_quest_started &= ~(u8)(1 << (player_no + 4)); } extern int mSC_LightHouse_travel_check() { switch (mSC_LightHouse_get_period(Common_GetPointer(time.rtc_time))) { case mSC_LIGHTHOUSE_PERIOD_1: return TRUE; default: return FALSE; } } extern void mSC_change_player_freeze(GAME_PLAY* play) { if (mPlib_get_player_actor_main_index((GAME*)play) != 74) { mPlib_request_main_demo_wait_type1(play, 0, NULL); } } extern u32 mSC_check_ArbeitPlayer() { return mSC_trophy_get(32); }