Your Cart

0 Assets

Your cart is empty

Verse13 Sept 2026Free

Real Time Module [Cred. Gorosuke]

#time#module

Shared by Cred1t

Verse · 547 lines
1# Credit: JPN: @GorosukeSan, EN: @GorosukeEN
2# A follow on X (Twitter) or credit within the map would be greatly appreciated (optional)
3# If you have any bug reports or feature requests, please contact the account mentioned above.
4
5using { /Verse.org/Simulation }
6
7ProjectTimeZone<public>:time_zone = time_zone_bst{}
8
9time_date<public> := struct<concrete>:
10 @editable
11 Year:int = 0
12
13 @editable
14 Month:int = 0
15
16 @editable
17 Day:int = 0
18
19 @editable
20 Hour:int = 0
21
22 @editable
23 Minute:int = 0
24
25 @editable
26 Second:int = 0
27
28 @editable
29 Millisecond:int = 0
30
31time_span<public> := struct<concrete>:
32 @editable
33 Years:int = 0
34
35 @editable
36 Months:int = 0
37
38 @editable
39 Days:int = 0
40
41 @editable
42 Hours:int = 0
43
44 @editable
45 Minutes:int = 0
46
47 @editable
48 Seconds:int = 0
49
50 @editable
51 Milliseconds:int = 0
52
53time_zone<public> := class<computes>:
54 Time<public>:float
55
56time_zone_gmt<public> := class<computes>(time_zone):
57 Time<override>:float = 0.0
58
59time_zone_bst<public> := class<computes>(time_zone):
60 Time<override>:float = 3600.0
61
62time_zone_tokyo<public> := class<computes>(time_zone):
63 Time<override>:float = 32400.0
64
65GetCurrentTimeDate<public>()<transacts>:time_date=
66 MakeTimeDate(GetSecondsSinceEpoch())
67
68GetCurrentBritishTimeDate<public>()<transacts>:time_date=
69 UtcDate := MakeTimeDate(GetSecondsSinceEpoch())
70 if(IsBritishSummerTime[UtcDate]):
71 UtcDate + time_span{Hours := 1}
72 else:
73 UtcDate
74
75MakeTimeDate<public>(InEpochTime:float)<transacts>:time_date=
76 CurrentTime := Max(InEpochTime + ProjectTimeZone.Time, 0.0)
77
78 EpochTimeSeconds := Floor[CurrentTime] or 0
79 MilliSeconds := Mod[Floor[CurrentTime * 1000], 1000] or 0
80 Seconds := Mod[EpochTimeSeconds, 60] or 0
81 Minutes := Mod[Floor(EpochTimeSeconds / 60), 60] or 0
82 Hours := Mod[Floor(EpochTimeSeconds / 3600), 24] or 0
83 Days := Floor(EpochTimeSeconds / 86400) or 0
84
85 var Years:int = 1970
86 var TotalDays:int = Days
87 loop:
88 DaysInYear :=
89 if(IsLeapYear[Years]):
90 366
91 else:
92 365
93 if(TotalDays >= DaysInYear):
94 set TotalDays -= DaysInYear
95 set Years += 1
96 else:
97 break
98
99 var Month:int = 0
100 loop:
101 CurrentDay :=
102 if(Month = 2 and IsLeapYear[Years]):
103 29
104 else:
105 DaysInMonth[Month] or 0
106
107 if(TotalDays >= CurrentDay):
108 set TotalDays -= CurrentDay
109 set Month += 1
110 else:
111 break
112
113 time_date:
114 Year := Years
115 Month := Month + 1
116 Day := TotalDays + 1
117 Hour := Hours
118 Minute := Minutes
119 Second := Seconds
120 Millisecond := MilliSeconds
121
122(InTimeDate:time_date).ToFloat<public>()<transacts>:float=
123 var TotalDays:int = 0
124 for:
125 CurrentYear := 1970..InTimeDate.Year - 1
126 do:
127 set TotalDays +=
128 if(IsLeapYear[CurrentYear]):
129 366
130 else:
131 365
132
133 for:
134 CurrentMonthIndex := 0..InTimeDate.Month - 1 - 1
135 CurrentDays := DaysInMonth[CurrentMonthIndex]
136 do:
137 set TotalDays +=
138 if(CurrentMonthIndex = 1 and IsLeapYear[InTimeDate.Year]):
139 29
140 else:
141 CurrentDays
142
143 var TotalSeconds:float = (TotalDays * 86400.0)
144 set TotalSeconds += (InTimeDate.Day - 1) * 86400.0
145 set TotalSeconds += InTimeDate.Hour * 3600.0
146 set TotalSeconds += InTimeDate.Minute * 60.0
147 set TotalSeconds += InTimeDate.Second * 1.0
148 set TotalSeconds += InTimeDate.Millisecond * 0.001
149 set TotalSeconds -= ProjectTimeZone.Time
150 TotalSeconds
151
152(InTimeDate:time_date).ToBritishTime<public>()<transacts>:float=
153 BritishOffset := if(IsBritishSummerTime[InTimeDate]){3600.0}else{0.0}
154 InTimeDate.ToFloat() + ProjectTimeZone.Time - BritishOffset
155
156MakeTimeSpan<public>(InTime:float)<transacts>:time_span=
157 CurrentTime := Max(InTime, 0.0)
158
159 TimeSeconds := Floor[CurrentTime] or 0
160 MilliSeconds := Mod[Floor(TimeSeconds * 1000), 1000] or 0
161 Seconds := Mod[TimeSeconds, 60] or 0
162 Minutes := Mod[Floor(TimeSeconds / 60), 60] or 0
163 Hours := Mod[Floor(TimeSeconds / 3600), 24] or 0
164 Days := Floor(TimeSeconds / 86400) or 0
165
166 var Years:int = 0
167 var TotalDays:int = Days
168 loop:
169 DaysInYear :=
170 if(IsLeapYear[Years]):
171 366
172 else:
173 365
174 if(TotalDays >= DaysInYear):
175 set TotalDays -= DaysInYear
176 set Years += 1
177 else:
178 break
179
180 var Month:int = 0
181 loop:
182 CurrentDay :=
183 if(Month = 2 and IsLeapYear[Years]):
184 29
185 else:
186 DaysInMonth[Month] or 0
187
188 if(TotalDays >= CurrentDay):
189 set TotalDays -= CurrentDay
190 set Month += 1
191 else:
192 break
193
194 time_span:
195 Years := Years
196 Months := Month
197 Days := TotalDays
198 Hours := Hours
199 Minutes := Minutes
200 Seconds := Seconds
201 Milliseconds := MilliSeconds
202
203(InTimeSpan:time_span).ToFloat<public>()<transacts>:float=
204 var TotalDays:int = 0
205 for:
206 CurrentYear := 0..InTimeSpan.Years - 1
207 do:
208 set TotalDays +=
209 if(IsLeapYear[CurrentYear]):
210 366
211 else:
212 365
213
214 for:
215 CurrentMonthIndex := 0..InTimeSpan.Months - 1
216 CurrentDays := DaysInMonth[CurrentMonthIndex]
217 do:
218 set TotalDays +=
219 if(CurrentMonthIndex = 1 and IsLeapYear[InTimeSpan.Years]):
220 29
221 else:
222 CurrentDays
223
224 var TotalSeconds:float = (TotalDays * 86400.0)
225 set TotalSeconds += InTimeSpan.Days * 86400.0
226 set TotalSeconds += InTimeSpan.Hours * 3600.0
227 set TotalSeconds += InTimeSpan.Minutes * 60.0
228 set TotalSeconds += InTimeSpan.Seconds * 1.0
229 set TotalSeconds += InTimeSpan.Milliseconds * 0.001
230 TotalSeconds
231
232Equal<public>(X:time_date, Y:time_date)<transacts><decides>:void=
233 X.ToFloat() = Y.ToFloat()
234
235GreaterThan<public>(X:time_date, Y:time_date)<transacts><decides>:void=
236 X.ToFloat() > Y.ToFloat()
237
238EqualOrGreaterThan<public>(X:time_date, Y:time_date)<transacts><decides>:void=
239 X.ToFloat() >= Y.ToFloat()
240
241LessThan<public>(X:time_date, Y:time_date)<transacts><decides>:void=
242 X.ToFloat() < Y.ToFloat()
243
244EqualOrLessThan<public>(X:time_date, Y:time_date)<transacts><decides>:void=
245 X.ToFloat() <= Y.ToFloat()
246
247Distance<public>(X:time_date, Y:time_date)<transacts>:time_span=
248 TimeDifference := Abs(X.ToFloat() - Y.ToFloat())
249 MakeTimeSpan(TimeDifference)
250
251operator'+'<public>(X:time_date, Y:time_span)<transacts>:time_date=
252 Result := X.ToFloat() + Y.ToFloat()
253 MakeTimeDate(Result)
254
255operator'-'<public>(X:time_date, Y:time_span)<transacts>:time_date=
256 Result := Max(X.ToFloat() - Y.ToFloat(), 0.0)
257 MakeTimeDate(Result)
258
259operator'*'<public>(X:time_date, Y:float)<transacts>:time_span=
260 Result := X.ToFloat() * Y
261 MakeTimeSpan(Result)
262
263operator'/'<public>(X:time_date, Y:float)<transacts>:time_span=
264 Result := X.ToFloat() / Y
265 MakeTimeSpan(Result)
266
267operator'*'<public>(X:time_date, Y:time_span)<transacts>:time_span=
268 Result := X.ToFloat() * Y.ToFloat()
269 MakeTimeSpan(Result)
270
271operator'/'<public>(X:time_date, Y:time_span)<transacts>:time_span=
272 Result := X.ToFloat() / Y.ToFloat()
273 MakeTimeSpan(Result)
274
275operator'+'<public>(X:time_span, Y:time_span)<transacts>:time_span=
276 Result := X.ToFloat() + Y.ToFloat()
277 MakeTimeSpan(Result)
278
279operator'-'<public>(X:time_span, Y:time_span)<transacts>:time_span=
280 Result := Max(X.ToFloat() - Y.ToFloat(), 0.0)
281 MakeTimeSpan(Result)
282
283operator'*'<public>(X:time_span, Y:float)<transacts>:time_span=
284 Result := X.ToFloat() * Y
285 MakeTimeSpan(Result)
286
287operator'/'<public>(X:time_span, Y:float)<transacts>:time_span=
288 Result := X.ToFloat() / Y
289 MakeTimeSpan(Result)
290
291operator'*'<public>(X:time_span, Y:time_span)<transacts>:time_span=
292 Result := X.ToFloat() * Y.ToFloat()
293 MakeTimeSpan(Result)
294
295operator'/'<public>(X:time_span, Y:time_span)<transacts>:time_span=
296 Result := X.ToFloat() / Y.ToFloat()
297 MakeTimeSpan(Result)
298
299day_of_week<public> := enum:
300 Sunday
301 Monday
302 Tuesday
303 Wednesday
304 Thursday
305 Friday
306 Saturday
307
308GetDayOfWeek<public>(InTimeDate:time_date)<transacts>:day_of_week=
309 TimeSeconds := InTimeDate.ToFloat()
310 TotalDays := Floor[TimeSeconds / 86400.0] or 0
311 DayIndex := Mod[TotalDays + 4, 7] or 0
312 DayOfWeeks[DayIndex] or day_of_week.Sunday
313
314GetDayOfWeekIndex(InDayOfWeek:day_of_week)<computes>:int=
315 case(InDayOfWeek):
316 day_of_week.Sunday => 0
317 day_of_week.Monday => 1
318 day_of_week.Tuesday => 2
319 day_of_week.Wednesday => 3
320 day_of_week.Thursday => 4
321 day_of_week.Friday => 5
322 day_of_week.Saturday => 6
323
324GetLastSundayAt<public>(InYear:int, InMonth:int, InHour:int)<transacts>:time_date=
325 LastDay := time_date:
326 Year := InYear
327 Month := InMonth
328 Day := DaysInMonth[InMonth - 1] or 0
329 Hour := InHour
330
331 DaysAfterSunday := GetDayOfWeekIndex(GetDayOfWeek(LastDay))
332 LastDay - time_span{Days := DaysAfterSunday}
333
334IsBritishSummerTime<public>(InUtcDate:time_date)<transacts><decides>:void=
335 MarchStart := GetLastSundayAt(InUtcDate.Year, 3, 1)
336 OctoberEnd := GetLastSundayAt(InUtcDate.Year, 10, 1)
337
338 EqualOrGreaterThan[InUtcDate, MarchStart] and LessThan[InUtcDate, OctoberEnd]
339
340DaysInMonth<public>:[]int = array{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
341IsLeapYear<public>(InYear:int)<computes><decides>:void=
342 (Mod[InYear, 4] = 0, Mod[InYear, 100] <> 0) or (Mod[InYear, 400] = 0)
343
344DayOfWeeks<public>:[]day_of_week = array:
345 day_of_week.Sunday
346 day_of_week.Monday
347 day_of_week.Tuesday
348 day_of_week.Wednesday
349 day_of_week.Thursday
350 day_of_week.Friday
351 day_of_week.Saturday
352
353GetEventState<public>(Args:event_args)<transacts>:void=
354 CurrentDate := GetCurrentTimeDate()
355 GetEventState(CurrentDate, Args)
356
357GetEventState<public>(Args:event_repeat_args)<transacts>:void=
358 CurrentDate := GetCurrentTimeDate()
359 GetEventState(CurrentDate, Args)
360
361event_args<public> := struct:
362 StartDate:time_date
363 Duration:time_span
364
365event_repeat_args<public> := struct:
366 StartDate:time_date
367 Duration:time_span
368 Interval:time_span
369
370event_state<public> := enum:
371 NotStarted
372 Ongoing
373 WaitingForNext
374 Ended
375
376GetEventState<public>(InCurrentDate:time_date, Args:event_args)<transacts>:event_state=
377 if:
378 LessThan[InCurrentDate, Args.StartDate]
379 then:
380 event_state.NotStarted
381 else if:
382 EqualOrGreaterThan[InCurrentDate, Args.StartDate] and LessThan[InCurrentDate, Args.StartDate + Args.Duration]
383 then:
384 event_state.Ongoing
385 else:
386 event_state.Ended
387
388GetEventState<public>(InCurrentDate:time_date, Args:event_repeat_args)<transacts>:event_state=
389 if:
390 LessThan[InCurrentDate, Args.StartDate]
391 then:
392 event_state.NotStarted
393 else:
394 EventStartDate := GetEventStartDate(InCurrentDate, Args)
395 if:
396 EqualOrGreaterThan[InCurrentDate, EventStartDate] and LessThan[InCurrentDate, EventStartDate + Args.Duration]
397 then:
398 event_state.Ongoing
399 else:
400 event_state.WaitingForNext
401
402GetEventStartDate<public>(InCurrentDate:time_date, Args:event_repeat_args)<transacts>:time_date=
403 if:
404 LessThan[InCurrentDate, Args.StartDate]
405 then:
406 Args.StartDate
407 else:
408 ElapsedTime := Distance(Args.StartDate, InCurrentDate)
409 Interval := Args.Duration + Args.Interval
410 ElpasedSize := ElapsedTime / Interval
411 TempStartTime := Args.StartDate + (Interval * ElpasedSize.ToFloat())
412 if:
413 EqualOrGreaterThan[InCurrentDate, TempStartTime + Args.Duration]
414 then:
415 TempStartTime + Interval
416 else:
417 TempStartTime
418
419date_type<public> := enum:
420 Year
421 Month
422 Day
423 Hour
424 Minute
425 Second
426
427(InDateType:date_type).GetTier<public>()<computes>:int=
428 case(InDateType):
429 date_type.Year => 0
430 date_type.Month => 1
431 date_type.Day => 2
432 date_type.Hour => 3
433 date_type.Minute => 4
434 date_type.Second => 5
435
436(InTimeDate:time_date).Override<public>(InDateType:date_type, InValue:int)<transacts>:time_date=
437 ArgTier := InDateType.GetTier()
438 YearTier := date_type.Year.GetTier()
439 MonthTier := date_type.Month.GetTier()
440 DayTier := date_type.Day.GetTier()
441 HourTier := date_type.Hour.GetTier()
442 MinuteTier := date_type.Minute.GetTier()
443 SecondTier := date_type.Second.GetTier()
444
445 time_date:
446 Year :=
447 if(ArgTier = YearTier):
448 InValue
449 else if(ArgTier < YearTier):
450 0
451 else:
452 InTimeDate.Year
453 Month :=
454 if(ArgTier = MonthTier):
455 InValue
456 else if(ArgTier < MonthTier):
457 1
458 else:
459 InTimeDate.Month
460 Day :=
461 if(ArgTier = DayTier):
462 InValue
463 else if(ArgTier < DayTier):
464 1
465 else:
466 InTimeDate.Day
467 Hour :=
468 if(ArgTier = HourTier):
469 InValue
470 else if(ArgTier < HourTier):
471 0
472 else:
473 InTimeDate.Hour
474 Minute :=
475 if(ArgTier = MinuteTier):
476 InValue
477 else if(ArgTier < MinuteTier):
478 0
479 else:
480 InTimeDate.Minute
481 Second :=
482 if(ArgTier = SecondTier):
483 InValue
484 else if(ArgTier < SecondTier):
485 0
486 else:
487 InTimeDate.Second
488
489(InTimeDate:time_date).Today<public>()<transacts>:time_date=
490 time_date:
491 Year := InTimeDate.Year
492 Month := InTimeDate.Month
493 Day := InTimeDate.Day
494 Hour := 0
495 Minute := 0
496 Second := 0
497 Millisecond := 0
498
499(InTimeDate:time_date).Yesterday<public>()<transacts>:time_date=
500 InTimeDate.Today() - time_span{Days := 1}
501
502(InTimeDate:time_date).Tomorrow<public>()<transacts>:time_date=
503 InTimeDate.Today() + time_span{Days := 1}
504
505(InTimeDate:time_date).Today<public>(Hour:int)<transacts>:time_date=
506 if(InTimeDate.Hour < Hour):
507 InTimeDate.Yesterday() + time_span{Hours := Hour}
508 else:
509 InTimeDate.Today() + time_span{Hours := Hour}
510
511(InTimeDate:time_date).Tomorrow<public>(Hour:int)<transacts>:time_date=
512 InTimeDate.Today(Hour) + time_span{Days := 1}
513
514(InTimeDate:time_date).Yesterday<public>(Hour:int)<transacts>:time_date=
515 InTimeDate.Today(Hour) - time_span{Days := 1}
516
517ToString<public>(InTimeDate:time_date)<computes>:string=
518 "{InTimeDate.Year}-{InTimeDate.Month}-{InTimeDate.Day} {InTimeDate.Hour}:{InTimeDate.Minute}:{InTimeDate.Second}.{InTimeDate.Millisecond}"
519
520ToString<public>(InTimeSpan:time_span)<computes>:string=
521 "{InTimeSpan.Years} years, {InTimeSpan.Months} months, {InTimeSpan.Days} days, {InTimeSpan.Hours} hours, {InTimeSpan.Minutes} minutes, {InTimeSpan.Seconds} seconds"
522
523ToString<public>(InDateTime:day_of_week)<computes>:string=
524 case(InDateTime):
525 day_of_week.Sunday=> "Sunday"
526 day_of_week.Monday=> "Monday"
527 day_of_week.Tuesday=> "Tuesday"
528 day_of_week.Wednesday=> "Wednesday"
529 day_of_week.Thursday=> "Thursday"
530 day_of_week.Friday=> "Friday"
531 day_of_week.Saturday=> "Saturday"
532
533ToString<public>(InDateType:date_type)<computes>:string=
534 case(InDateType):
535 date_type.Year=> "Year"
536 date_type.Month=> "Month"
537 date_type.Day=> "Day"
538 date_type.Hour=> "Hour"
539 date_type.Minute=> "Minute"
540 date_type.Second=> "Second"
541
542ToString<public>(InEventState:event_state)<computes>:string=
543 case(InEventState):
544 event_state.NotStarted=> "NotStarted"
545 event_state.Ongoing=> "Ongoing"
546 event_state.WaitingForNext=> "WaitingForNext"
547 event_state.Ended=> "Ended"

Community

★★★★★— · 0 ratings
🪙 How tips and review rewards workExpand

Tips. You can send 1 to 500 credits from your wallet to the creator as a thank-you. Tips appear in the comments with your name and cannot be undone, unless the snippet is later removed for breaking the rules, in which case they are returned to you.

Reviews. A written 20+ character review with 4 or 5 stars earns the creator 5 credits, paid 7 days later if the review still stands. You earn nothing for reviewing, so say what you really think. Reviews count only from established members: a linked Discord account, a purchase in the store, or an account at least 14 days old with 3+ reviews on snippets by 2+ different creators.

Comments

Sign in to join the conversation.

Sign in

Loading…

More Verse Snippets