On this page
  1. Related
  2. Games
  3. References
  4. Sources

A time-travel penalty is what a game on a real clock charges a player who moves the clock. The GameCube Animal Crossing adds 5 weeds for each 6:00 passed since its last update1 and spoils turnips once a Sunday 6:00 has passed2. A clock set back before the date of the save spoils the turnips in town, in pockets, and in houses at once3.

  • Counted as time awayAnimal Crossing (2001). The town updates once per 6:00 passed: 5 weeds for each, with no cap, and turnips spoil once a Sunday 6:00 has passed.4,1,2
  • Rollback checkAnimal Crossing (2001). A clock set back before the save's date spoils the turnips in town, in pockets, and in houses, and one set back before the save's time holds back the event mail.4,3,5

Games

GameYearHowNote
Animal Crossing2001Counted as time awaythe town updates once per 6:00 passed: 5 weeds for each, with no cap, and turnips spoil once a Sunday 6:00 has passed
Animal Crossing2001Rollback checka clock set back before the save's date spoils the turnips in town, in pockets, and in houses, and one set back before the save's time holds back the event mail
Every claim about this mechanic, by game (6)
Animal Crossing 2001In 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.Code
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.Code
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.Code
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.Code
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.Code
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.Code

References

  1. ^ abIn 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.CodeACreTeam/ac-decomp
    How we know
    2754    delta_days++;
    2755    if (delta_days > 1 && now_time->hour < 6) {
    2756        delta_days--;
    ⋮
    2759    return delta_days * mAGrw_GRASS_PER_DAY;
    
    src/game/m_all_grow_ovl.c lines 2744–2760 at 09ca8e8 · upstream ↗
    19#define mAGrw_GRASS_TABLE_NUM 12
    ⋮
    25#define mAGrw_GRASS_PER_DAY 5
    
    include/m_all_grow_ovl.h lines 19–25 at 09ca8e8 · upstream ↗
    601  days += t1->day - 1;
    602  days += total_days[over_leap][t1->month - 1];
    
    src/lb_rtc.c lines 542–609 at 09ca8e8 · upstream ↗
    2778            if (((cancel[0] >> ut_x) & 1) != 1 && (items[0] == EMPTY_NO) &&
    2779                (mCoBG_Attribute2CheckPlant(col->data.unit_attribute, &wpos_temp) == mCoBG_PLANT4)) {
    
    src/game/m_all_grow_ovl.c lines 2762–2792 at 09ca8e8 · upstream ↗
    2856    grass_max = mAGrw_GetGrassMax(now_time, grow_time);
    ⋮
    2876    for (i = 0; i < grass_max; i++) {
    2877        if (candidate_blocks > 0) {
    ⋮
    2883            selected_block = RANDOM(candidate_blocks);
    ⋮
    2910            grass_table_idx++;
    
    src/game/m_all_grow_ovl.c lines 2835–2918 at 09ca8e8 · upstream ↗
    3078        if (Save_Get(clear_grass)) {
    3079            mAGrw_ClearGrass();
    
    src/game/m_all_grow_ovl.c lines 3078–3080 at 09ca8e8 · upstream ↗
    2929            if (IS_ITEM_GRASS(items[0])) {
    2930                items[0] = EMPTY_NO;
    
    src/game/m_all_grow_ovl.c lines 2920–2936 at 09ca8e8 · upstream ↗
    3143                    if (Save_Get(clear_grass) == FALSE) {
    3144                        mAGrw_SetGrass(now_time, &grow_time, l_cancel_ut);
    ⋮
    3155            Save_Set(clear_grass, FALSE);
    
    src/game/m_all_grow_ovl.c lines 3143–3155 at 09ca8e8 · upstream ↗
    139    /* 0x021395 */ u8 clear_grass; /* set by Wisp, removes all weeds */
    
    include/m_common_data.h line 139 at 09ca8e8 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  2. ^ abIn 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.CodeACreTeam/ac-decomprevised
    How we know
    323    if (temp.weekday != lbRTC_SUNDAY && temp.weekday < lbRTC_WEEK) {
    324        days = lbRTC_WEEK - temp.weekday;
    ⋮
    329    if (lbRTC_IsOverTime(&temp, now) == lbRTC_OVER) {
    330        spoil = TRUE;
    
    src/game/m_all_grow_ovl.c lines 316–334 at 09ca8e8 · upstream ↗
    3129                    spoil_kabu = mAGrw_CheckSpoilKabuTime(&grow_time, now_time);
    ⋮
    3132                                          mAGrw_GROW);
    3133                    mAGr_GrowIslandFgItem(now_time, &grow_time, flower_time, spoil_kabu, mAGrw_GROW);
    ⋮
    3140                    mAGrw_SpoilAllPossession(spoil_kabu);
    
    src/game/m_all_grow_ovl.c lines 3128–3140 at 09ca8e8 · upstream ↗
    1623    static mAGrw_GROW_PROC grow_proc[] = { &mAGrw_ClearSpoiledKabu, &mAGrw_SpoilKabu,
    ⋮
    1631    static mAGrw_GROW_PROC grow_island_proc[] = { &mAGrw_ClearSpoiledKabu, &mAGrw_SpoilKabu, &mAGrw_GrowPlant };
    
    src/game/m_all_grow_ovl.c lines 1623–1631 at 09ca8e8 · upstream ↗
    770            if (grow_info->spoil_kabu == TRUE) {
    771                *item = ITM_KABU_SPOILED;
    ⋮
    774            *item = ITM_KABU_SPOILED;
    ⋮
    786    if (*item == ITM_KABU_SPOILED) {
    787        *item = EMPTY_NO;
    
    src/game/m_all_grow_ovl.c lines 765–792 at 09ca8e8 · upstream ↗
    2520        for (i = 0; i < PLAYER_NUM; i++) {
    2521            mAGrw_SpoilPossession(priv->inventory.pockets, mPr_POCKETS_SLOT_COUNT);
    ⋮
    2525        if (Common_Get(player_no) == mPr_FOREIGNER) {
    ⋮
    2532                    mAGrw_SpoilPossession((&Save_Get(homes[i]).floors[j].layer_main)[k].items[0], UT_TOTAL_NUM);
    ⋮
    2538                mAGrw_SpoilKabu(&haniwa_item->item, NULL);
    
    src/game/m_all_grow_ovl.c lines 2509–2543 at 09ca8e8 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

  3. ^ abIn 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.CodeACreTeam/ac-decomprevised
    How we know
    3035    if (Save_Get(save_exist) == TRUE &&
    3036        lbRTC_IsEqualDate(now_time->year, now_time->month, now_time->day, Save_Get(save_check).time.year,
    3037                          Save_Get(save_check).time.month, Save_Get(save_check).time.day) < lbRTC_EQUAL) {
    3038        mAGrw_ZuruSpoilKabuFieldFgItem();
    3039        mAGrw_ZuruSpoilKabuIslandFgItem(Save_GetPointer(island));
    3040        mAGrw_SpoilAllPossession(TRUE);
    
    src/game/m_all_grow_ovl.c lines 3034–3042 at 09ca8e8 · upstream ↗
    3090            if (is_grow_time_equal == TRUE || is_over_time == lbRTC_LESS) {
    ⋮
    3109                mAGrw_ZuruSpoilKabu(now_time);
    
    src/game/m_all_grow_ovl.c lines 3090–3111 at 09ca8e8 · upstream ↗
    2991    grow_info.spoil_kabu = TRUE;
    
    src/game/m_all_grow_ovl.c lines 2983–3007 at 09ca8e8 · upstream ↗
    229    lbRTC_TimeCopy(&save_check->time, &common_data.time.rtc_time);
    
    src/game/m_flashrom.c lines 223–230 at 09ca8e8 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

  4. ^ abIn 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.CodeACreTeam/ac-decomp
    How we know
    3075    if (Save_Get(scene_no) == SCENE_FG) {
    ⋮
    3086        if (Common_Get(event_notification_active) != TRUE) {
    ⋮
    3088            is_over_time = lbRTC_IsOverTime(last_grow_time, now_time);
    ⋮
    3090            if (is_grow_time_equal == TRUE || is_over_time == lbRTC_LESS) {
    ⋮
    3095                    proc_type = mAGrw_GROW_FIRST_FORCE;
    ⋮
    3117                if (grow_time.hour >= 6) {
    3118                    lbRTC_Add_DD(&grow_time, 1);
    ⋮
    3126                grow_time.hour = 6;
    ⋮
    3128                if (lbRTC_IsOverTime(&grow_time, now_time) == lbRTC_OVER) {
    
    src/game/m_all_grow_ovl.c lines 3075–3128 at 09ca8e8 · upstream ↗
    3110                lbRTC_TimeCopy(last_grow_time, now_time);
    
    src/game/m_all_grow_ovl.c line 3110 at 09ca8e8 · upstream ↗
    3150                    lbRTC_TimeCopy(last_grow_time, now_time);
    
    src/game/m_all_grow_ovl.c line 3150 at 09ca8e8 · upstream ↗
    30  mAGrw_GROW_FIRST_FORCE, /* Used when you go back in time */
    
    include/m_all_grow_ovl.h lines 27–37 at 09ca8e8 · upstream ↗
    421  if (t1->year < t0->year) {
    422    return lbRTC_LESS;
    ⋮
    435                      return lbRTC_LESS;
    ⋮
    439                  return lbRTC_LESS;
    ⋮
    443              return lbRTC_LESS;
    ⋮
    447          return lbRTC_LESS;
    ⋮
    451      return lbRTC_LESS;
    ⋮
    455  return lbRTC_OVER;
    
    src/lb_rtc.c lines 420–456 at 09ca8e8 · upstream ↗
    1196extern void mFM_FieldInit(GAME_PLAY* play) {
    ⋮
    1220    mAGrw_RenewalFgItem(Common_GetPointer(time.rtc_time));
    
    src/game/m_field_make.c lines 1196–1220 at 09ca8e8 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  5. ^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.CodeACreTeam/ac-decomp
    How we know
    1188            // If the current time is before the last save time, the player "cheated" so set the cheated flag
    1189            if (lbRTC_IsOverTime(&Save_Get(save_check).time, Common_GetPointer(time.rtc_time)) == lbRTC_LESS) {
    1190                Save_Set(cheated_flag, TRUE);
    1191                Save_Set(npc_force_go_home, TRUE);
    
    src/actor/npc/ac_npc_p_sel2_talk.c_inc lines 1188–1192 at 09ca8e8 · upstream ↗
    4468static int mail_event_check(void) {
    ⋮
    4483    if (Save_Get(cheated_flag) == FALSE &&
    ⋮
    4498                        mNpc_SendEventBirthdayCard2(&priv[i].player_ID, i);
    ⋮
    4508                    mNpc_SendEventXmasCard(&priv[i].player_ID, i);
    ⋮
    4525            Save_Get(event_save_common).valentines_day_date = target_date.raw;
    ⋮
    4532    if (Save_Get(npc_force_go_home) == TRUE) {
    4533        mGH_animal_return_init();
    ⋮
    4536    Save_Set(cheated_flag, FALSE);
    4537    Save_Set(npc_force_go_home, FALSE);
    
    src/actor/ac_event_manager.c lines 4468–4539 at 09ca8e8 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

Sources

Code