🎉 Celebrating 25 Years of GameDev.net! 🎉

Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!

In Game Time?

Started by
6 comments, last by alnite 5 years, 3 months ago

The development team (my cousin) is currently at the point where we want to implement an in-game time system which will also obviously act as a foundation for our day/night cycle.

We are  wondering if any of you guys has done something like this before and would be willing to share some code, or if you would know of something on github. We haven't been able to find anything online and decided to ask on here before we go hack it out ourselves.
 

Any suggestions on how to do this would also help.

For a better description of what we want, it's a time system similar to stardew valley or harvest moon with minute/hour/day cycle.

 

Thanks for the help ?

Advertisement

A simple game-time system is written very easy! We had a way more complex one in our Medival City Building game that also controlled the sun-states. Start with a long integer (UInt64 in C#) at zero; this is your initial time (like the beginning of the year you want to start at, maybe 1761 for example) so your initial time is the time you choose to start at (1761) + the year value of your integer.

You then add a value to that integer in your update loop that determines how fast your time increases. We have had a day-night cycle of 24 hours in 20 minutes per day.

Then you could calculate your time by some simple formatting


secondsPerDay = (24 * 60 * 60)
days = seconds / secondsPerDay
seconds %= secondsPerDay

second = (seconds % 60)
minute = ((seconds % 3600) / 60)
hour = (seconds / 3600)

year = <your starting year>
month = 0;

while (days >= GetDaysOfYear(year)) //<-- if you want to respect leap years this is <yourDaysPerYear> + (!((year) % 4) && (((year) % 100) || !((year) % 400)));
do
    days -= daysOfCurrentYear
    year++
end
while (days >= GetDaysOfMonth(year, month)) //<-- grab the current month's day count from a table in your calendar; for example day[0] (January) 31 and maybe add a day if you are in a leap year
do
    days -= daysOfCurrentMonth
    month++
end
day = (days + 1) //<-- do this to start at 01.01 not 01.00

 

There is also no reason why game world times need to match Earth and human times.

If all you need is day/night you might decide that 50000 time steps equals one day in your game, then divide the current time to get the portion of the day. Maybe you decide that time % 50000 uses 0 as dawn, 12500 for noon, 25000 for dusk, and 37500 for midnight. 

Or you can stick with real world times.

Don't go with the system's clock and system time, since those have many difficult situations. Humans adjusting the time and date, automatic time corrections from time servers, adjustments for time zones, daylight saving, discontinuities due to system sleeping/hibernating, lots of situations happen when using real world time.

1 hour ago, frob said:

Don't go with the system's clock and system time, since those have many difficult situations. Humans adjusting the time and date, automatic time corrections from time servers, adjustments for time zones, daylight saving, discontinuities due to system sleeping/hibernating, lots of situations happen when using real world time.

Yeah that's the first thing I read... We want a time that seperate from anything in real life, and that goes in 17 minute cycles... We haven't had time to utilize the system @Shaarigan shared with us yet, so I want to wait till we do that before I post more questions or comments :)

On 3/29/2019 at 11:09 PM, SIr Pep said:

and that goes in 17 minute cycles

If you want 17 Minutes per day just add 1 to the seconds on every real-time second and use (17 * 60) for the secondsPerDay constant. This will divide your seconds through a 17 minute cycle as required. This will add a full day every 1020 seconds in real-time.

Just as a tipp: If you want to have nights go faster (as we wanted to in our game) just double the time you add to the seconds variable in every update so nights will run faster ;)

It's going to be an RPG. So the point is that you go to sleep when it gets dark ? Thanks for the help :) I wanted to ask you some more questions, but the programmer wants to figure the rest out himself so he can learn and know how to fool around with it in future. I'll post a clip here with his code if I think about it :)

 

I highly recommend using a simple integer to keep track of the number of seconds since the epoch of your game, like the UNIX timestamp. All you need to do is to increment/decrement this number by however you want. Only do the conversion to actual year/month/day when you need to display them to players.
 


gameTime = 0; // the beginning of time in your game

gameTime += 10000; // fast forward 10000 seconds later

gameTime -= 10000; // travel backward 10000 seconds before

 

This topic is closed to new replies.

Advertisement