ecs/servers/game/logic/game_time.go
2025-07-16 10:05:22 +08:00

104 lines
1.9 KiB
Go

package logic
import (
"github.com/oylshe1314/framework/util"
)
const GameDailyResetHour int64 = 0
const GameDailyResetTime int64 = 3600 * GameDailyResetHour
type GameTime struct {
Timestamp int64
Days int64
Weeks int64
Months int64
Years int64
}
func NewGameTime(timestamp int64) *GameTime {
if timestamp < 0 {
timestamp = util.NowUnix()
}
var gt = &GameTime{
Timestamp: timestamp,
}
if gt.Timestamp == 0 {
return gt
}
util.NowUnix()
gt.Days, gt.Weeks, gt.Months, gt.Years = absDate(gt.Timestamp)
return gt
}
func leapYear(years int64) bool {
return years%4 == 0 && (years%100 != 0 || years%400 == 0)
}
const (
endJanuary int64 = 31
endFebruary = endJanuary + 28
endMarch = endFebruary + 31
endApril = endMarch + 30
endMay = endApril + 31
endJune = endMay + 30
endJuly = endJune + 31
endAugust = endJuly + 31
endSeptember = endAugust + 30
endOctober = endSeptember + 31
endNovember = endOctober + 30
endDecember = endNovember + 31
)
var monthlyBefore = [...]int64{
0,
endJanuary,
endFebruary,
endMarch,
endApril,
endMay,
endJune,
endJuly,
endAugust,
endSeptember,
endOctober,
endNovember,
endDecember,
}
func absDate(timestamp int64) (days int64, weeks int64, months int64, years int64) {
timestamp -= GameDailyResetTime
days = (timestamp - (timestamp+util.UTC8TimezoneOffset)%util.DayTotalSeconds + util.UTC8TimezoneOffset) / util.DayTotalSeconds
weeks = (days + 3) / 7
var leapYears = (days + 730) / 1461
years = (days - leapYears) / 365
var yearDays = days - (365*years + leapYears)
months = years * 12
if yearDays < endJanuary {
months += 1
return
}
if leapYear(years) {
yearDays--
}
var month = yearDays / 31
var end = monthlyBefore[month+1]
if yearDays >= end {
month++
}
months += month
return
}