data/claims/animal-crossing.yamlAnimal Crossing (the ACreTeam decompilation of the USA GameCube release, ACreTeam/ac-decomp)
Game: Animal Crossing.
In the USA GameCube release of Animal Crossing (GAFE01_00, the build ACreTeam/ac-decomp rebuilds), the turnip market keeps one price per weekday, a 7-entry daily_price table indexed Sunday (0) to Saturday (6), with the market type and the date the table was set. The turnip seller (kabuPeddler) charges the Sunday entry per turnip, times 10, 50, or 100 for a bag. The shop buys at Kabu_get_price, the entry for the clock's current weekday, times 10, 50, or 100 for a bag and 0 for a spoiled turnip. The price doesn't change within a day. animal-crossing/turnip-week
About: Animal Crossing Price fluctuation
Value
{
"pricesPerWeek": 7,
"bagSizes": [
10,
50,
100
],
"spoiledPrice": 0
}include/m_kabu_manager.h#L25-L29/* 0x00 */ u16 daily_price[lbRTC_WEEKDAYS_MAX];
/* 0x0E */ u16 trade_market;
/* 0x10 */ lbRTC_time_c update_time;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · include/lb_rtc.h#L45-L54lbRTC_SUNDAY = lbRTC_WEEKDAYS_BEGIN,
lbRTC_MONDAY,ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_kabu_manager.c#L204-L206return Save_Get(kabu_price_schedule.daily_price[Common_Get(time.rtc_time.weekday)]);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/actor/npc/event/ac_ev_kabuPeddler_move.c_inc#L81-L96static int sell_sum[aEKPD_KABU_TYPE_NUM] = { 10, 50, 100, 0 };
…
price = Save_Get(kabu_price_schedule).daily_price[lbRTC_SUNDAY] * sell_sum[kabuPeddler->kabu_type];ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/actor/npc/ac_npc_shop_common.c#L2985-L2999static int kabu_sum[4] = { 10, 50, 100, 0 };
…
value += Kabu_get_price() * kabu_sum[item - ITM_KABU_START] * counter;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · include/m_name_table.h#L2776-L2780#define ITM_KABU_SPOILED (ITM_KABU_START + 3)Checked by claude, 2026-10-22 — read Kabu_price_c, the weekday enum, Kabu_get_price, the peddler's price lines, and the shop's buy-check at the pinned commit; Kabu_get_price reads only the weekday, so the price holds all dayThe shop's quantity counter is set to 1 when more than one item is sold at once. Later games in the series quote morning and afternoon prices; this release has one a day.
Cited by: Animal Crossing, Price fluctuation
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), Kabu_decide_price_sunday sets the Sunday price to 100 × (1 + (r − 0.5) × 0.6), with r from fqrand in [0, 1), stored in a 16-bit integer: a whole number of bells from 70 to 130 (computed with f32 rounding). 130 comes only from the generator's top value, 1 − 2⁻²³, where 1.29999995 × 100 rounds to 130.0; that is one 23-bit draw in 2²³. A decompiler's comment gives the range as [70, 129]. animal-crossing/turnip-sunday-price
About: Animal Crossing Price fluctuation
Value
{
"base": 100,
"spread": 0.6,
"min": 70,
"max": 130,
"maxOdds": 1.1920929e-7
}src/game/m_kabu_manager.c#L164-L174#define TRADE_MARKET_SUNDAY_BASE_PRICE 100.0f
…
* Prices will always been in the range of [70, 129] bells.
…
f32 price = 1.0f + (fqrand() - 0.5f) * 0.6f;
Save_Set(kabu_price_schedule.daily_price[lbRTC_SUNDAY], price * TRADE_MARKET_SUNDAY_BASE_PRICE); /* [0.7, 1.3) * 100.0f = [70, 130) bells */ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/static/libc64/qrand.c#L15-L20__qrand_itemp = __qrand_idum >> 9 | 0x3F800000;
…
return *(float*)&__qrand_itemp - 1.0f;Checked by claude, 2026-10-22 — read Kabu_decide_price_sunday and fqrand at the pinned commit: fqrand puts the generator's top 23 bits in the mantissa of a float in [1, 2) and subtracts 1, so its largest output is 1 − 2⁻²³; evaluating L172–L173 in single precision (rounded after each operation, and also with the multiply and add fused) for the top 5,000 mantissas gives 130 only at the top one, and 70 at r = 0; the u16 store truncatesThe 32-bit generator has a full period, so each 23-bit value comes up 512 times per period; whether the compiled code keeps every intermediate in single precision is read from the C, not measured.
Cited by: Animal Crossing, Price fluctuation
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), Kabu_decide_trade_market picks the week's market type from last week's with one fqrand draw: after type A, A 50%, B 30%, C 20%; after type B, A 60%, B 20%, C 20%; after type C, A 60%, B 30%, C 10%. The tables hold the A and B odds and C takes the rest. The decompilers' comments call A a spike trend, B random, and C falling. animal-crossing/turnip-trend
About: Animal Crossing Price fluctuation
Value
{
"A": {
"A": 0.5,
"B": 0.3,
"C": 0.2
},
"B": {
"A": 0.6,
"B": 0.2,
"C": 0.2
},
"C": {
"A": 0.6,
"B": 0.3,
"C": 0.1
}
}include/m_kabu_manager.h#L11-L19Kabu_TRADE_MARKET_TYPE_A = Kabu_TRADE_MARKET_TYPE_START, /* spike trend */
Kabu_TRADE_MARKET_TYPE_B, /* random trend */
Kabu_TRADE_MARKET_TYPE_C, /* falling trend */ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_kabu_manager.c#L31-L73static f32 next_trade_market_typeA[TRADE_MARKET_ODDS_NUM] = {
0.5f, /* Type A (50%) */
0.3f /* Type B (30%) */
…
for (i = 0; i < TRADE_MARKET_ODDS_NUM; i++) {
if (chosen < *next_type_market) {
break;
}
chosen -= *next_type_market;Checked by claude, 2026-10-22 — read the three odds tables and the loop at the pinned commit: TRADE_MARKET_ODDS_NUM is 2, so a draw past both entries leaves i at 2, type C; the commented-out third entries in the B and C tables (0.1f) aren't usedThe B table's commented-out third entry reads 0.1f with a comment of 20%; the remainder the code leaves is 20%.
Cited by: Animal Crossing, Price fluctuation
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), a type B week (Kabu_decide_price_schedule_typeB) walks from the Sunday price through Monday to Saturday. Each day an fqrand draw below the drop chance (10% at first) multiplies the price by 0.7, caps it at 0.8 × the Sunday price (the code's min_price, which works as a ceiling here), and multiplies the drop chance by 0.3, capped at 10%. Any other day multiplies the price by a factor that starts at 1.05 and grows by 0.01 after each rise, and adds 0.14 to the drop chance. Each day's price is stored as a whole number; the walk keeps the fraction. animal-crossing/turnip-random-trend
About: Animal Crossing Price fluctuation
Value
{
"dropChanceStart": 0.1,
"dropFactor": 0.7,
"dropCap": 0.8,
"dropChanceAfterDrop": 0.3,
"riseStart": 1.05,
"riseStep": 0.01,
"dropChanceStep": 0.14
}src/game/m_kabu_manager.c#L102-L145#define TRADE_MARKET_B_SUNDAY_PRICE_MULT 0.8f /* 0.8x (80%) minimum possible price */
…
if (fqrand() < price_decrease_percent) {
current_price *= TRADE_MARKET_B_PRICE_DECREASE_RATE; /* decrease price */
if (current_price > min_price) {
…
current_price = min_price;
…
price_decrease_percent *= TRADE_MARKET_B_PRICE_DECREASE_LOWER_RATE;
…
current_price *= current_price_mult;
current_price_mult += TRADE_MARKET_B_PRICE_INCREASE_RATE;
…Checked by claude, 2026-10-22 — read typeB and its seven macros at the pinned commit; the drop branch sets the price to min_price only when the dropped price is above it, so 0.8 × Sunday is an upper bound after a drop, not the floor its macro comment namesIn the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), a type A week (Kabu_decide_price_schedule_typeA) first builds a type B week, then sets one day, Monday to Friday with equal odds (fqrand × 5, truncated, plus Monday), to 8 × the Sunday price: 560 to 1,040 bells (computed; 1,040 only from a 130-bell Sunday, see turnip-sunday-price). animal-crossing/turnip-spike-trend
About: Animal Crossing Price fluctuation
Value
{
"spikeMultiplier": 8,
"spikeDays": [
1,
2,
3,
4,
5
],
"min": 560,
"max": 1040
}src/game/m_kabu_manager.c#L80-L100#define TRADE_MARKET_A_SPIKE_DAYS 5
#define TRADE_MARKET_A_SPIKE_DAY_BEGIN lbRTC_MONDAY
#define TRADE_MARKET_A_SPIKE_MULTIPLIER 8.0f
…
Kabu_decide_price_schedule_typeB(); /* start with a 'random' trend */
…
spike_day = fqrand() * TRADE_MARKET_A_SPIKE_DAYS;
spike_day += lbRTC_MONDAY;Checked by claude, 2026-10-22 — read typeA at the pinned commit; the spike overwrites that day's type B price; 70 × 8 and 130 × 8 from the Sunday rangeCited by: Animal Crossing
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), a type C week (Kabu_decide_price_schedule_typeC) multiplies the price each day from Monday to Saturday by 0.8 + 0.14999998 × r, with r from fqrand in [0, 1), so each day is 80% to 95% of the day before; a decompiler's comment says the constant stands for 0.15. animal-crossing/turnip-falling-trend
About: Animal Crossing Price fluctuation
Value
{
"factorMin": 0.8,
"factorSpread": 0.15
}src/game/m_kabu_manager.c#L147-L162#define TRADE_MARKET_C_ADJUST_MULT_SPREAD 0.14999998f /* mwcc doesn't generate the same */ //0.15f
#define TRADE_MARKET_C_ADJUST_MULT_BASE 0.8f
…
current_price *= (TRADE_MARKET_C_ADJUST_MULT_BASE + TRADE_MARKET_C_ADJUST_MULT_SPREAD * fqrand()); /* [80%, 95%) */Checked by claude, 2026-10-22 — read typeC at the pinned commitCited by: Animal Crossing
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), Kabu_manager runs at the start of play and whenever the clock's day of the month changes during play. On the date the week's table was set (a Sunday), it picks a new market type and new Monday-to-Saturday prices and keeps the Sunday price. On any other date it redraws the whole week, Sunday price included, only if the clock is at or past that Sunday 00:00 plus 7 days, or earlier than that Sunday minus 7 days; the new table is dated the Sunday at or before the clock's date. So a clock moved to any date from the Sunday 7 days before the table's Sunday through the Saturday after it keeps the whole table, except the table's Sunday itself, which keeps only the Sunday price. animal-crossing/turnip-schedule-reset
About: Animal Crossing Time-travel penalty
Codeac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) ·src/game/m_kabu_manager.c#L217-L245if (lbRTC_IsEqualDate(
…
Kabu_decide_price_schedule_without_sunday(); /* reset non-sunday prices & the trend type */
…
lbRTC_Add_DD(&week_ahead, lbRTC_WEEK);
…
lbRTC_Sub_DD(&week_behind, lbRTC_WEEK);
…
if (lbRTC_IsOverTime(&week_ahead, Common_GetPointer(time.rtc_time)) == lbRTC_OVER ||
lbRTC_IsOverTime(&week_behind, Common_GetPointer(time.rtc_time)) == lbRTC_LESSac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_kabu_manager.c#L12-L26kabu_update_time->hour = 0;
…
lbRTC_Sub_DD(kabu_update_time, kabu_update_time->weekday);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_kabu_manager.c#L187-L199Kabu_decide_trade_market();
Kabu_decide_price_without_sunday();
Kabu_set_schedule_day();ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/lb_rtc.c#L420-L456if (t1->year < t0->year) {
return lbRTC_LESS;
…
return lbRTC_OVER;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_time.c#L508-L511if (Common_Get(time.rtc_time.day) != day) {
Kabu_manager();ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_start_data_init.c#L535-L556extern void mSDI_StartInitAfter(GAME* game, int renew_mode, int malloc_flag) {
…
Kabu_manager();Checked by claude, 2026-10-22 — read Kabu_manager, Kabu_set_schedule_day, lbRTC_IsOverTime, and both callers at the pinned commit; IsOverTime(t0, t1) returns lbRTC_OVER when t1 is at or after t0, the reverse of its doc commentmTM_time_init (m_time.c lines 431–435) makes the same day-of-month check. A new town and the player-select scene call Kabu_decide_price_schedule directly (ac_npc_guide_move.c_inc line 769, m_select.c line 28). The comparison is on the day field alone, so a jump of exactly a month during play doesn't call Kabu_manager until the next start.
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), the town's daily update (mAGrw_RenewalFgItem_ovl) runs when the outdoor town scene is built and no event notice is showing, and compares the clock with the time of the last update. If the clock is earlier than that time, it runs a back-in-time pass (mAGrw_GROW_FIRST_FORCE; the decompilers' comment says "Used when you go back in time"). Otherwise it runs the daily pass only once the clock reaches the first 6:00 after the last update: 6:00 the same day if that update came before 6:00, or the next day's. Either pass then records the clock as the last update. animal-crossing/town-renewal
About: Animal Crossing Time-travel penalty
Value
{
"dayStartsAt": 6
}src/game/m_all_grow_ovl.c#L3075-L3128if (Save_Get(scene_no) == SCENE_FG) {
…
if (Common_Get(event_notification_active) != TRUE) {
…
is_over_time = lbRTC_IsOverTime(last_grow_time, now_time);
…
if (is_grow_time_equal == TRUE || is_over_time == lbRTC_LESS) {
…
proc_type = mAGrw_GROW_FIRST_FORCE;
…
if (grow_time.hour >= 6) {
lbRTC_Add_DD(&grow_time, 1);
…ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L3110lbRTC_TimeCopy(last_grow_time, now_time);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L3150lbRTC_TimeCopy(last_grow_time, now_time);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · include/m_all_grow_ovl.h#L27-L37mAGrw_GROW_FIRST_FORCE, /* Used when you go back in time */ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/lb_rtc.c#L420-L456if (t1->year < t0->year) {
return lbRTC_LESS;
…
return lbRTC_OVER;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_field_make.c#L1196-L1220extern void mFM_FieldInit(GAME_PLAY* play) {
…
mAGrw_RenewalFgItem(Common_GetPointer(time.rtc_time));Checked by claude, 2026-10-22 — read mAGrw_RenewalFgItem_ovl whole at the pinned commit; the first branch also runs, as mAGrw_GROW_FIRST, when the saved time equals the clear code, a town never updatedmFM_FieldInit runs when a field scene is set up; the update itself returns unless the scene is SCENE_FG, the outdoor town. The back-in-time pass also handles the first update of a new town.
Cited by: Animal Crossing, Time of day
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), the daily pass of the town update turns turnips into spoiled turnips once the clock is at or past the first Sunday 6:00 at or after the pass's own 6:00 start; so a turnip bought after an update made on a Sunday at or after 6:00 spoils at the first update from 6:00 the next Sunday (computed). It spoils turnips on the ground in town and on the island's ground, in every player's pockets (and a visitor's), on every floor of every house, and in each house's gyroid storage (haniwa). The same pass first clears spoiled turnips lying on the ground in town and on the island. animal-crossing/turnip-spoil
About: Animal Crossing Time-travel penalty
Value
{
"spoilsAt": {
"weekday": 0,
"hour": 6
}
}src/game/m_all_grow_ovl.c#L316-L334if (temp.weekday != lbRTC_SUNDAY && temp.weekday < lbRTC_WEEK) {
days = lbRTC_WEEK - temp.weekday;
…
if (lbRTC_IsOverTime(&temp, now) == lbRTC_OVER) {
spoil = TRUE;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L3128-L3140spoil_kabu = mAGrw_CheckSpoilKabuTime(&grow_time, now_time);
…
mAGr_GrowIslandFgItem(now_time, &grow_time, flower_time, spoil_kabu, mAGrw_GROW);
…
mAGrw_SpoilAllPossession(spoil_kabu);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L1623-L1631static mAGrw_GROW_PROC grow_proc[] = { &mAGrw_ClearSpoiledKabu, &mAGrw_SpoilKabu,
…
static mAGrw_GROW_PROC grow_island_proc[] = { &mAGrw_ClearSpoiledKabu, &mAGrw_SpoilKabu, &mAGrw_GrowPlant };ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L765-L792if (grow_info->spoil_kabu == TRUE) {
*item = ITM_KABU_SPOILED;
…
if (*item == ITM_KABU_SPOILED) {
*item = EMPTY_NO;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L2509-L2543for (i = 0; i < PLAYER_NUM; i++) {
mAGrw_SpoilPossession(priv->inventory.pockets, mPr_POCKETS_SLOT_COUNT);
…
if (Common_Get(player_no) == mPr_FOREIGNER) {
…
mAGrw_SpoilPossession((&Save_Get(homes[i]).floors[j].layer_main)[k].items[0], UT_TOTAL_NUM);
…
mAGrw_SpoilKabu(&haniwa_item->item, NULL);Checked by claude, 2026-10-22 — read mAGrw_CheckSpoilKabuTime, the daily branch, the proc tables, SpoilKabu, ClearSpoiledKabu, and SpoilAllPossession at the pinned commit; the pass's start is the first 6:00 after the last update (town-renewal), and a Sunday start spoils at onceThe spoil check on a turnip ends that square's proc chain whether or not it spoils, so a turnip on the ground doesn't also grow or count as a plant. Turnips in the island cottage are spoiled only by mAGrw_SpoilKabuIsland, which only ac_npc_sendo_move.c_inc (line 427) calls; the atlas hasn't read when.
Cited by: Animal Crossing, Time-travel penalty
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), when the town update finds the clock earlier than its last update (the back-in-time pass), mAGrw_ZuruSpoilKabu spoils the turnips on the ground in town and on the island's ground, in pockets, in houses, and in gyroid storage if a save exists and the clock's date is earlier than the date stored with the save. That pass adds no weeds. animal-crossing/rollback-spoil
About: Animal Crossing Time-travel penalty
Codeac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) ·src/game/m_all_grow_ovl.c#L3034-L3042if (Save_Get(save_exist) == TRUE &&
lbRTC_IsEqualDate(now_time->year, now_time->month, now_time->day, Save_Get(save_check).time.year,
Save_Get(save_check).time.month, Save_Get(save_check).time.day) < lbRTC_EQUAL) {
mAGrw_ZuruSpoilKabuFieldFgItem();
mAGrw_ZuruSpoilKabuIslandFgItem(Save_GetPointer(island));
mAGrw_SpoilAllPossession(TRUE);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L3090-L3111if (is_grow_time_equal == TRUE || is_over_time == lbRTC_LESS) {
…
mAGrw_ZuruSpoilKabu(now_time);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L2983-L3007grow_info.spoil_kabu = TRUE;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_flashrom.c#L223-L230lbRTC_TimeCopy(&save_check->time, &common_data.time.rtc_time);Checked by claude, 2026-10-22 — read the back-in-time branch (lines 3090–3111, which has no mAGrw_SetGrass call), ZuruSpoilKabu and its field and island helpers, and mFRm_SetSaveCheckData, which the memory-card code calls when it savesThe same branch handles a new town's first update, when no save exists yet. Setting the clock back within the same day as the save, or to a later time on an earlier day than the last update but not before the save's date, runs the pass without spoiling. The island cottage isn''t covered (see turnip-spoil).
Cited by: Animal Crossing, Time-travel penalty
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), when play starts with the clock earlier than the time stored with the save, the player-select code sets two save flags, cheated_flag and npc_force_go_home (a decompiler's comment: the player "cheated"). While cheated_flag is set, mail_event_check sends no birthday or Christmas cards and schedules no Valentine's Day mail; it then calls mGH_animal_return_init if npc_force_go_home is set, and clears both flags. animal-crossing/rollback-flags
About: Animal Crossing Time-travel penalty
Codeac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) ·src/actor/npc/ac_npc_p_sel2_talk.c_inc#L1188-L1192// If the current time is before the last save time, the player "cheated" so set the cheated flag
if (lbRTC_IsOverTime(&Save_Get(save_check).time, Common_GetPointer(time.rtc_time)) == lbRTC_LESS) {
Save_Set(cheated_flag, TRUE);
Save_Set(npc_force_go_home, TRUE);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/actor/ac_event_manager.c#L4468-L4539static int mail_event_check(void) {
…
if (Save_Get(cheated_flag) == FALSE &&
…
mNpc_SendEventBirthdayCard2(&priv[i].player_ID, i);
…
mNpc_SendEventXmasCard(&priv[i].player_ID, i);
…
Save_Get(event_save_common).valentines_day_date = target_date.raw;
…
if (Save_Get(npc_force_go_home) == TRUE) {
mGH_animal_return_init();
…Checked by claude, 2026-10-22 — read aNPS2_game_start_wait's check and mail_event_check at the pinned commit; what mGH_animal_return_init resets wasn't readThe atlas hasn't read where else these flags are read (ac_npc_restart.c copies both; m_event.c's mGH_check_delete also tests npc_force_go_home), so the claim lists only the mail effect.
Cited by: Animal Crossing
In the USA GameCube release (GAFE01_00, ACreTeam/ac-decomp), the daily pass of the town update adds up to 5 weeds for each 6:00 passed since the last update (computed from mAGrw_GetGrassMax), with no cap on the days counted. Each weed goes on a random empty square, in a random town block that has one, that is plantable ground (mCoBG_PLANT4) and not marked off by the cancel map; weeds stop when no such square is left. The weed kinds cycle through a shuffled table of 12. While clear_grass is set (a decompilers' comment: "set by Wisp, removes all weeds"), the next update removes every weed, adds none, and clears the flag; the back-in-time pass adds none either. animal-crossing/weeds-per-day
About: Animal Crossing Time-travel penalty
Value
{
"weedsPerDay": 5,
"grassTable": 12
}src/game/m_all_grow_ovl.c#L2744-L2760delta_days++;
if (delta_days > 1 && now_time->hour < 6) {
delta_days--;
}
return delta_days * mAGrw_GRASS_PER_DAY;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · include/m_all_grow_ovl.h#L19-L25#define mAGrw_GRASS_TABLE_NUM 12
…
#define mAGrw_GRASS_PER_DAY 5ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/lb_rtc.c#L542-L609days += t1->day - 1;
days += total_days[over_leap][t1->month - 1];ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L2762-L2792if (((cancel[0] >> ut_x) & 1) != 1 && (items[0] == EMPTY_NO) &&
(mCoBG_Attribute2CheckPlant(col->data.unit_attribute, &wpos_temp) == mCoBG_PLANT4)) {ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L2835-L2918grass_max = mAGrw_GetGrassMax(now_time, grow_time);
…
for (i = 0; i < grass_max; i++) {
if (candidate_blocks > 0) {
…
selected_block = RANDOM(candidate_blocks);
…
grass_table_idx++;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L3078-L3080if (Save_Get(clear_grass)) {
mAGrw_ClearGrass();ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L2920-L2936if (IS_ITEM_GRASS(items[0])) {
items[0] = EMPTY_NO;ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · src/game/m_all_grow_ovl.c#L3143-L3155if (Save_Get(clear_grass) == FALSE) {
mAGrw_SetGrass(now_time, &grow_time, l_cancel_ut);
…
Save_Set(clear_grass, FALSE);ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp) · include/m_common_data.h#L139/* 0x021395 */ u8 clear_grass; /* set by Wisp, removes all weeds */Checked by claude, 2026-10-22 — read GetGrassMax, GetChangeAbleGrass, PutGrassBlock, SetGrass, and the daily branch at the pinned commit; grow_time is the first 6:00 after the last update and the daily branch runs only at or past it, so the date difference plus one, less one before 6:00, counts the 6:00s passed; GetIntervalDays compares dates, not hours, after its ordering checksThe weeds are placed one at a time with RANDOM (fqrand × n, truncated). Trees use a separate catch-up count capped at 5 days (mAGrw_MAX_PAST_DAYS), which the atlas hasn't followed.
Cited by: Animal Crossing, Time of day, Time-travel penalty