summaryrefslogtreecommitdiff
path: root/src/engine/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/clock.c')
-rw-r--r--src/engine/clock.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/engine/clock.c b/src/engine/clock.c
new file mode 100644
index 000000000..1f2aac9fd
--- /dev/null
+++ b/src/engine/clock.c
@@ -0,0 +1,90 @@
+#include "global.h"
+#include "clock.h"
+#include "berry.h"
+#include "dewford_trend.h"
+#include "event_data.h"
+#include "field_specials.h"
+#include "field_weather.h"
+#include "lottery_corner.h"
+#include "main.h"
+#include "rom4.h"
+#include "rtc.h"
+#include "time_events.h"
+#include "tv.h"
+#include "wallclock.h"
+
+static void InitTimeBasedEvents(void);
+static void UpdatePerDay(struct Time *time);
+static void UpdatePerMinute(struct Time *time);
+static void ReturnFromStartWallClock(void);
+
+static void InitTimeBasedEvents(void)
+{
+ FlagSet(SYS_CLOCK_SET);
+ RtcCalcLocalTime();
+ gSaveBlock2.lastBerryTreeUpdate = gLocalTime;
+ VarSet(VAR_DAYS, gLocalTime.days);
+}
+
+void DoTimeBasedEvents(void)
+{
+ if (FlagGet(SYS_CLOCK_SET))
+ {
+ RtcCalcLocalTime();
+ UpdatePerDay(&gLocalTime);
+ UpdatePerMinute(&gLocalTime);
+ }
+}
+
+static void UpdatePerDay(struct Time *time)
+{
+ u16 *varPtr = GetVarPointer(VAR_DAYS);
+ int days = *varPtr;
+ u16 newDays;
+
+ if (days != time->days && days <= time->days)
+ {
+ newDays = time->days - days;
+ ClearUpperFlags();
+ UpdateDewfordTrendPerDay(newDays);
+ UpdateTVShowsPerDay(newDays);
+ UpdateWeatherPerDay(newDays);
+ UpdatePartyPokerusTime(newDays);
+ UpdateMirageRnd(newDays);
+ UpdateBirchState(newDays);
+ SetShoalItemFlag(newDays);
+ SetRandomLotteryNumber(newDays);
+ *varPtr = time->days;
+ }
+}
+
+static void UpdatePerMinute(struct Time *time)
+{
+ struct Time newTime;
+ s32 minutes;
+
+ CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time);
+ minutes = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes;
+
+ // there's no way to get the correct assembly other than with this nested if check. so dumb.
+ if (minutes != 0)
+ {
+ if (minutes >= 0)
+ {
+ BerryTreeTimeUpdate(minutes);
+ gSaveBlock2.lastBerryTreeUpdate = *time;
+ }
+ }
+}
+
+static void ReturnFromStartWallClock(void)
+{
+ InitTimeBasedEvents();
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+}
+
+void StartWallClock(void)
+{
+ SetMainCallback2(CB2_StartWallClock);
+ gMain.savedCallback = ReturnFromStartWallClock;
+}