#=============================================================================== # 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) time = pbGetTimeNow if !time return (time.hour>=5 && time.hour<20) end # Returns true if it's night. def self.isNight?(time=nil) time = pbGetTimeNow if !time return (time.hour>=20 || time.hour<5) end # Returns true if it's morning. def self.isMorning?(time=nil) time = pbGetTimeNow if !time return (time.hour>=5 && time.hour<10) end # Returns true if it's the afternoon. def self.isAfternoon?(time=nil) time = pbGetTimeNow if !time return (time.hour>=14 && time.hour<17) end # Returns true if it's the evening. def self.isEvening?(time=nil) 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 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] # 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