Files
infinitefusion-e18/Data/Scripts/012_Overworld/003_Overworld_Time.rb
2023-11-12 21:45:07 -05:00

341 lines
9.4 KiB
Ruby

#===============================================================================
# Day and night system
#===============================================================================
def pbGetTimeNow
return Time.now
end
module PBDayNight
HourlyTones = [
Tone.new(-70, -90, 15, 55), # Night # Midnight
Tone.new(-70, -90, 15, 55), # Night
Tone.new(-70, -90, 15, 55), # Night
Tone.new(-70, -90, 15, 55), # Night
Tone.new(-60, -70, -5, 50), # Night
Tone.new(-40, -50, -35, 50), # Day/morning
Tone.new(-40, -50, -35, 50), # Day/morning # 6AM
Tone.new(-40, -50, -35, 50), # Day/morning
Tone.new(-40, -50, -35, 50), # Day/morning
Tone.new(-20, -25, -15, 20), # Day/morning
Tone.new(0, 0, 0, 0), # Day
Tone.new(0, 0, 0, 0), # Day
Tone.new(0, 0, 0, 0), # Day # Noon
Tone.new(0, 0, 0, 0), # Day
Tone.new(0, 0, 0, 0), # Day/afternoon
Tone.new(0, 0, 0, 0), # Day/afternoon
Tone.new(0, 0, 0, 0), # Day/afternoon
Tone.new(0, 0, 0, 0), # Day/afternoon
Tone.new(-5, -30, -20, 0), # Day/evening # 6PM
Tone.new(-15, -60, -10, 20), # Day/evening
Tone.new(-15, -60, -10, 20), # Day/evening
Tone.new(-40, -75, 5, 40), # Night
Tone.new(-70, -90, 15, 55), # Night
Tone.new(-70, -90, 15, 55) # Night
]
@cachedTone = nil
@dayNightToneLastUpdate = nil
@oneOverSixty = 1 / 60.0
# Returns true if it's day.
def self.isDay?(time = nil)
return false if darknessEffectOnCurrentMap()
time = pbGetTimeNow if !time
return (time.hour >= 5 && time.hour < 20)
end
# Returns true if it's night.
def self.isNight?(time = nil)
return true if darknessEffectOnCurrentMap()
time = pbGetTimeNow if !time
return (time.hour >= 20 || time.hour < 5)
end
# Returns true if it's morning.
def self.isMorning?(time = nil)
return false if darknessEffectOnCurrentMap()
time = pbGetTimeNow if !time
return (time.hour >= 5 && time.hour < 10)
end
# Returns true if it's the afternoon.
def self.isAfternoon?(time = nil)
return false if darknessEffectOnCurrentMap()
time = pbGetTimeNow if !time
return (time.hour >= 14 && time.hour < 17)
end
# Returns true if it's the evening.
def self.isEvening?(time = nil)
return false if darknessEffectOnCurrentMap()
time = pbGetTimeNow if !time
return (time.hour >= 17 && time.hour < 20)
end
# Gets a number representing the amount of daylight (0=full night, 255=full day).
def self.getShade
time = pbGetDayNightMinutes
time = (24 * 60) - time if time > (12 * 60)
return 255 * time / (12 * 60)
end
# Gets a Tone object representing a suggested shading
# tone for the current time of day.
def self.getTone
@cachedTone = Tone.new(0, 0, 0) if !@cachedTone
return @cachedTone if !Settings::TIME_SHADING
if !@dayNightToneLastUpdate ||
Graphics.frame_count - @dayNightToneLastUpdate >= Graphics.frame_rate * 30
getToneInternal
@dayNightToneLastUpdate = Graphics.frame_count
end
return @cachedTone
end
def self.pbGetDayNightMinutes
return 0 if darknessEffectOnCurrentMap() #midnight
now = pbGetTimeNow # Get the current in-game time
return (now.hour * 60) + now.min
end
private
def self.getToneInternal
# Calculates the tone for the current frame, used for day/night effects
realMinutes = pbGetDayNightMinutes
hour = realMinutes / 60
minute = realMinutes % 60
tone = PBDayNight::HourlyTones[hour]
nexthourtone = PBDayNight::HourlyTones[(hour + 1) % 24]
darkness_tone = Tone.new(-80, -100, 05, 55)
if $game_switches[SWITCH_KANTO_DARKNESS] || darknessEffectOnCurrentMap()
tone = darkness_tone
nexthourtone = darkness_tone
end
# Calculate current tint according to current and next hour's tint and
# depending on current minute
@cachedTone.red = ((nexthourtone.red - tone.red) * minute * @oneOverSixty) + tone.red
@cachedTone.green = ((nexthourtone.green - tone.green) * minute * @oneOverSixty) + tone.green
@cachedTone.blue = ((nexthourtone.blue - tone.blue) * minute * @oneOverSixty) + tone.blue
@cachedTone.gray = ((nexthourtone.gray - tone.gray) * minute * @oneOverSixty) + tone.gray
end
end
def pbDayNightTint(object)
return if !$scene.is_a?(Scene_Map)
if Settings::TIME_SHADING && GameData::MapMetadata.exists?($game_map.map_id) &&
GameData::MapMetadata.get($game_map.map_id).outdoor_map
tone = PBDayNight.getTone
object.tone.set(tone.red, tone.green, tone.blue, tone.gray)
else
object.tone.set(0, 0, 0, 0)
end
end
#===============================================================================
# Moon phases and Zodiac
#===============================================================================
# Calculates the phase of the moon.
# 0 - New Moon
# 1 - Waxing Crescent
# 2 - First Quarter
# 3 - Waxing Gibbous
# 4 - Full Moon
# 5 - Waning Gibbous
# 6 - Last Quarter
# 7 - Waning Crescent
def moonphase(time = nil)
# in UTC
time = pbGetTimeNow if !time
transitions = [
1.8456618033125,
5.5369854099375,
9.2283090165625,
12.9196326231875,
16.6109562298125,
20.3022798364375,
23.9936034430625,
27.6849270496875]
yy = time.year - ((12 - time.mon) / 10.0).floor
j = (365.25 * (4712 + yy)).floor + (((time.mon + 9) % 12) * 30.6 + 0.5).floor + time.day + 59
j -= (((yy / 100.0) + 49).floor * 0.75).floor - 38 if j > 2299160
j += (((time.hour * 60) + time.min * 60) + time.sec) / 86400.0
v = (j - 2451550.1) / 29.530588853
v = ((v - v.floor) + (v < 0 ? 1 : 0))
ag = v * 29.53
for i in 0...transitions.length
return i if ag <= transitions[i]
end
return 0
end
# Calculates the zodiac sign based on the given month and day:
# 0 is Aries, 11 is Pisces. Month is 1 if January, and so on.
def zodiac(month, day)
time = [
3, 21, 4, 19, # Aries
4, 20, 5, 20, # Taurus
5, 21, 6, 20, # Gemini
6, 21, 7, 20, # Cancer
7, 23, 8, 22, # Leo
8, 23, 9, 22, # Virgo
9, 23, 10, 22, # Libra
10, 23, 11, 21, # Scorpio
11, 22, 12, 21, # Sagittarius
12, 22, 1, 19, # Capricorn
1, 20, 2, 18, # Aquarius
2, 19, 3, 20 # Pisces
]
for i in 0...12
return i if month == time[i * 4] && day >= time[i * 4 + 1]
return i if month == time[i * 4 + 2] && day <= time[i * 4 + 3]
end
return 0
end
# Returns the opposite of the given zodiac sign.
# 0 is Aries, 11 is Pisces.
def zodiacOpposite(sign)
return (sign + 6) % 12
end
# 0 is Aries, 11 is Pisces.
def zodiacPartners(sign)
return [(sign + 4) % 12, (sign + 8) % 12]
end
# 0 is Aries, 11 is Pisces.
def zodiacComplements(sign)
return [(sign + 1) % 12, (sign + 11) % 12]
end
#===============================================================================
# Days of the week
#===============================================================================
def pbIsWeekday(wdayVariable, *arg)
timenow = pbGetTimeNow
wday = timenow.wday
ret = false
for wd in arg
ret = true if wd == wday
end
if wdayVariable > 0
$game_variables[wdayVariable] = [
_INTL("Sunday"),
_INTL("Monday"),
_INTL("Tuesday"),
_INTL("Wednesday"),
_INTL("Thursday"),
_INTL("Friday"),
_INTL("Saturday")][wday]
$game_map.need_refresh = true if $game_map
end
return ret
end
#===============================================================================
# Months
#===============================================================================
def pbIsMonth(monVariable, *arg)
timenow = pbGetTimeNow
thismon = timenow.mon
ret = false
for wd in arg
ret = true if wd == thismon
end
if monVariable > 0
$game_variables[monVariable] = pbGetMonthName(thismon)
$game_map.need_refresh = true if $game_map
end
return ret
end
def pbGetMonthName(month)
return [_INTL("January"),
_INTL("February"),
_INTL("March"),
_INTL("April"),
_INTL("May"),
_INTL("June"),
_INTL("July"),
_INTL("August"),
_INTL("September"),
_INTL("October"),
_INTL("November"),
_INTL("December")][month - 1]
end
def pbGetAbbrevMonthName(month)
return ["",
_INTL("Jan."),
_INTL("Feb."),
_INTL("Mar."),
_INTL("Apr."),
_INTL("May"),
_INTL("Jun."),
_INTL("Jul."),
_INTL("Aug."),
_INTL("Sep."),
_INTL("Oct."),
_INTL("Nov."),
_INTL("Dec.")][month]
end
#===============================================================================
# Seasons
#===============================================================================
def pbGetSeason
return (pbGetTimeNow.mon - 1) % 4
end
def pbIsSeason(seasonVariable, *arg)
thisseason = pbGetSeason
ret = false
for wd in arg
ret = true if wd == thisseason
end
if seasonVariable > 0
$game_variables[seasonVariable] = [
_INTL("Spring"),
_INTL("Summer"),
_INTL("Autumn"),
_INTL("Winter")][thisseason]
$game_map.need_refresh = true if $game_map
end
return ret
end
def pbIsSpring
return pbIsSeason(0, 0);
end
# Jan, May, Sep
def pbIsSummer
return pbIsSeason(0, 1);
end
# Feb, Jun, Oct
def pbIsAutumn
return pbIsSeason(0, 2);
end
# Mar, Jul, Nov
def pbIsFall
return pbIsAutumn;
end
def pbIsWinter
return pbIsSeason(0, 3);
end
# Apr, Aug, Dec
def pbGetSeasonName(season)
return [_INTL("Spring"),
_INTL("Summer"),
_INTL("Autumn"),
_INTL("Winter")][season]
end