I was about to reply that it was too hard to be worth the trouble... then it got me thinking, and I realized that although it is a bit tricky, it is certainly not too hard.
I whipped up a script that does it, and an example rpg file to demonstrate it.
The demo rpg is here
And this is the script:
Code: Select all
script, calc weekday number, y, m, d, begin
# Return value is:
#
# 0 = Sunday
# 1 = Monday
# 2 = Tuesday
# 3 = Wednesday
# 4 = Thursday
# 5 = Friday
# 6 = Saturday
#
# This function is only smart enough to handle days starting with 1900AD
variable(dnum)
dnum := 1 # January 1900 began on a Monday
variable(i)
for(i, 1900, y -- 1) do(
dnum += days in year(i)
)
for(i, 1, m -- 1) do(
dnum += days in month(y, i)
)
dnum += d -- 1
exit returning(dnum ,mod, 7)
end
script, days in month, y, m, begin
variable(d)
switch(m) do(
case(1) d := 31
case(2) d := days in february(y)
case(3) d := 31
case(4) d := 30
case(5) d := 31
case(6) d := 30
case(7) d := 31
case(8) d := 31
case(9) d := 30
case(10) d := 31
case(11) d := 30
case(12) d := 31
)
exit returning(d)
end
script, days in february, y, begin
if(is leap year(y)) then(
exit returning(29)
)
exit returning(28)
end
script, days in year, y, begin
if(is leap year(y)) then(
exit returning(366)
)
exit returning(365)
end
script, is leap year, y, begin
variable(leap year)
leap year := false # Common year
if((y ,mod, 4) == 0) then(
leap year := true # Leap year
if(y ,mod, 100 == 0) then(
leap year := false # Exceptional Common Year
if(y ,mod, 400 == 0) then(
leap year := true # Century leap year
)
)
)
exit returning(leap year)
end
Example:
Code: Select all
variable(n)
n := calc weekday number(system year, system month, system day)
switch(n) do(
case(0) $0="Sunday"
case(1) $0="Monday"
case(2) $0="Tuesday"
case(3) $0="Wednesday"
case(4) $0="Thursday"
case(5) $0="Friday"
case(6) $0="Saturday"
)
show string(0)