aboutsummaryrefslogtreecommitdiff
path: root/src/time.cc
blob: ad42c47f6e788dd5028dcc36ffd4f816920b4a75 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "common.hh"

// IMPORTANT(fusion): `RoundNr` is just the number of seconds since startup which
// is why `GetRoundAtTime` and `GetRoundForNextMinute` straight up uses it as
// seconds. It is incremented every 1 second inside `AdvanceGame`.
uint32 RoundNr = 0;

uint32 ServerMilliseconds = 0;

// NOTE(fusion): This isn't strictly required because each server process is
// single threaded and don't share static memory, which is what the result of
// the regular `localtime` function uses.
struct tm GetLocalTimeTM(time_t t){
	struct tm result;
#if COMPILER_MSVC
	localtime_s(&result, &t);
#else
	localtime_r(&t, &result);
#endif
	return result;
}

void GetRealTime(int *Hour, int *Minute){
	struct tm LocalTime = GetLocalTimeTM(time(NULL));
	*Hour = LocalTime.tm_hour;
	*Minute = LocalTime.tm_min;
}

void GetTime(int *Hour, int *Minute){
	// NOTE(fusion): This maps each real time hour to a game time day.
	struct tm LocalTime = GetLocalTimeTM(time(NULL));
	int Time = LocalTime.tm_sec + LocalTime.tm_min * 60;
	*Hour = (Time / 150);
	*Minute = (Time % 150) * 2 / 5;
}

void GetDate(int *Year, int *Cycle, int *Day){
	// NOTE(fusion): This maps each real time week to a game time year.
	time_t RealTime = time(NULL);
	struct tm LocalTime = GetLocalTimeTM(RealTime);
	*Year = (int)(((RealTime / 86400) + 4) / 7);
	*Cycle = LocalTime.tm_wday;
	*Day = LocalTime.tm_hour;
}

void GetAmbiente(int *Brightness, int *Color){
	int Hour, Minute;
	GetTime(&Hour, &Minute);

	int Time = Minute + Hour * 60;
	if(Time < 60){
		*Brightness = 0x33;
		*Color = 0xD7;
	}else if(Time < 120){
		*Brightness = 0x66;
		*Color = 0xD7;
	}else if(Time < 180){
		*Brightness = 0x99;
		*Color = 0xAD;
	}else if(Time < 240){
		*Brightness = 0xCC;
		*Color = 0xAD;
	}else if(Time <= 1200){
		*Brightness = 0xFF;
		*Color = 0xD7;
	}else if(Time <= 1260){
		*Brightness = 0xCC;
		*Color = 0xD0;
	}else if(Time <= 1320){
		*Brightness = 0x99;
		*Color = 0xD0;
	}else if(Time <= 1380){
		*Brightness = 0x66;
		*Color = 0xD7;
	}else{
		*Brightness = 0x33;
		*Color = 0xD7;
	}
}

uint32 GetRoundAtTime(int Hour, int Minute){
	struct tm LocalTime = GetLocalTimeTM(time(NULL));
	int SecondsToTime = (Hour - LocalTime.tm_hour) * 3600
					+ (Minute - LocalTime.tm_min) * 60
					+ (0 - LocalTime.tm_sec);
	if(SecondsToTime < 0){
		SecondsToTime += 86400;
	}
	return SecondsToTime + RoundNr;
}

uint32 GetRoundForNextMinute(void){
	struct tm LocalTime = GetLocalTimeTM(time(NULL));
	int SecondsToNextMinute = 60 - LocalTime.tm_sec;
	return SecondsToNextMinute + RoundNr + 30;
}