Log In  


increment_second = function(this)
	this.second = (this.second + 1) % 60
	if this.second == 0 then
		this.minute = (this.minute + 1) % 60
		if this.minute == 0 then
			this.hour = (this.hour + 1) % 24
			if this.hour == 0 then
				this.day = this.day + 1
				if this.day > days_in_a_month[this.month] or this.day > 29 and this.month == 2 and this.year % 4 == 0 then
					this.day = 1
					this.month = (this.month % 12) + 1
					if this.month == 1 then
						this.year += 1
					end
				end
			end
		end
	end
end

I'm creating a tamagotchi kit, and since os.clock is no longer part of the API, I figured it'd be okay if the user would have to type his/her current time at every launch.

Currently at 1500 tokens, with a datetime input screen, an "are you sure this is correct?" screen, a class for stats/resources (ie. health, hunger, random_event_countdown, etc...), a class for date calculations, and plenty of overflow control for both classes.

Nearly done, but before I submit it, I'd like to inquire if there's a possible improvement to this eye sore of a function?



Seems fine to me! If you want to reduce the amount of indenting you can use early returns:

increment_second = function(this)
    this.second = (this.second + 1) % 60
    if (this.second != 0) return
    this.minute = (this.minute + 1) % 60
    if (this.minute != 0) return
    this.hour = (this.hour + 1) % 24
    if (this.hour != 0) return
    this.day = this.day + 1
    if this.day > days_in_a_month[this.month] or this.day > 29 and this.month == 2 and this.year % 4 == 0 then
        this.day = 1
        this.month = (this.month % 12) + 1
        if this.month == 1 then
            this.year += 1
        end
    end
end

Ahhh! Thank you.

I'm a big fan of early returns, so it's a bit strange that this never occurred to me. It will in the future, tho! So that's good... Thanks, haha.


Here is an imbrication-free way and, thanks to inline tests, a shorter one:

function increment_second(this)
 this.second+=1
 if(this.second>=60)this.second=this.second%60 this.minute+=1
 if(this.minute>=60)this.minute=this.minute%60 this.hour+=1
 if(this.hour>=24)this.hour=this.hour%24 this.day+=1
 if(this.day>getdaysinmonth(this))this.day=this.day%getdaysinmonth(this) this.month+=1
 if(this.month>12)this.month=this.month%12 this.year+=1
end

Note that it needs a getdaysinmonth function, which returns how many days are in this.month (based on this.year obviously). Functions are better for this than locally managing this, as you may need it elsewhere.

And just for nitpicking, a leap year is not just a multiple of 4, it also must not be a multiple of 100 unless it is a multiple of 400 (wikipedia). That's right, 2100 is not a leap year. What would your players then think of that bug? :D
Hopefully you'll have and call isleapyear(this.year) function ;).


Yep, don't think it can get any better without changing the architecture. Thanks ElGregos!


What if you didn't need any conditionals...

function tick()
  t.second += 1
  t.minute += flr(t.second/60)
  t.second %= 60
  t.hour += flr(t.minute/60)
  t.minute %= 60
 -- etc
end


[Please log in to post a comment]