Time-travel penalty
A game on a real clock checks for the clock being moved and makes the jump cost something.
On this page
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
| Game | Year | How | Note |
|---|---|---|---|
| Animal Crossing | 2001 | Counted as time away | 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 |
| Animal Crossing | 2001 | Rollback check | 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 |
Every claim about this mechanic, by game (6)
References
- ^ 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 frommAGrw_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. Whileclear_grassis 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-decompHow 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.
- ^ 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-decomprevisedHow 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.
- ^ 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_ZuruSpoilKabuspoils 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-decomprevisedHow 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.
- ^ 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-decompHow 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 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_flagandnpc_force_go_home(a decompiler's comment: the player "cheated"). Whilecheated_flagis set,mail_event_checksends no birthday or Christmas cards and schedules no Valentine's Day mail; it then callsmGH_animal_return_initifnpc_force_go_homeis set, and clears both flags.CodeACreTeam/ac-decompHow 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.
Sources
Code
- ACreTeam contributors. 2026. “ac-decomp: a decompilation of Animal Crossing for the GameCube (ACreTeam/ac-decomp).” Commit 09ca8e8. ACreTeam/ac-decomp @ 09ca8e8 · licence, all uses