Files
Bubberstation/code/modules/holiday/holidays.dm
2017-08-16 10:38:51 -03:00

495 lines
12 KiB
Plaintext

/datum/holiday
var/name = "Bugsgiving"
var/begin_day = 1
var/begin_month = 0
var/end_day = 0 // Default of 0 means the holiday lasts a single day
var/end_month = 0
var/begin_week = FALSE //If set to a number, then this holiday will begin on certain week
var/begin_weekday = FALSE //If set to a weekday, then this will trigger the holiday on the above week
var/always_celebrate = FALSE // for christmas neverending, or testing.
// This proc gets run before the game starts when the holiday is activated. Do festive shit here.
/datum/holiday/proc/celebrate()
return
// When the round starts, this proc is ran to get a text message to display to everyone to wish them a happy holiday
/datum/holiday/proc/greet()
return "Have a happy [name]!"
// Returns special prefixes for the station name on certain days. You wind up with names like "Christmas Object Epsilon". See new_station_name()
/datum/holiday/proc/getStationPrefix()
//get the first word of the Holiday and use that
var/i = findtext(name," ",1,0)
return copytext(name,1,i)
// Return 1 if this holidy should be celebrated today
/datum/holiday/proc/shouldCelebrate(dd, mm, yy, ww, ddd)
if(always_celebrate)
return TRUE
if(!end_day)
end_day = begin_day
if(!end_month)
end_month = begin_month
if(begin_week && begin_weekday)
if(begin_week == ww && begin_weekday == ddd)
return TRUE
if(end_month > begin_month) //holiday spans multiple months in one year
if(mm == end_month) //in final month
if(dd <= end_day)
return TRUE
else if(mm == begin_month)//in first month
if(dd >= begin_day)
return TRUE
else if(mm in begin_month to end_month) //holiday spans 3+ months and we're in the middle, day doesn't matter at all
return TRUE
else if(end_month == begin_month) // starts and stops in same month, simplest case
if(mm == begin_month && (dd in begin_day to end_day))
return TRUE
else // starts in one year, ends in the next
if(mm >= begin_month && dd >= begin_day) // Holiday ends next year
return TRUE
if(mm <= end_month && dd <= end_day) // Holiday started last year
return TRUE
return FALSE
// The actual holidays
/datum/holiday/new_year
name = NEW_YEAR
begin_day = 30
begin_month = DECEMBER
end_day = 2
end_month = JANUARY
/datum/holiday/new_year/getStationPrefix()
return pick("Party","New","Hangover","Resolution")
/datum/holiday/groundhog
name = "Groundhog Day"
begin_day = 2
begin_month = FEBRUARY
/datum/holiday/valentines
name = VALENTINES
begin_day = 13
end_day = 15
begin_month = FEBRUARY
/datum/holiday/valentines/getStationPrefix()
return pick("Love","Amore","Single","Smootch","Hug")
/datum/holiday/birthday
name = "Birthday of Space Station 13"
begin_day = 16
begin_month = FEBRUARY
/datum/holiday/birthday/greet()
var/game_age = text2num(time2text(world.timeofday, "YY")) - 3
var/Fact
switch(game_age)
if(16)
Fact = " SS13 is now old enough to drive!"
if(18)
Fact = " SS13 is now legal!"
if(21)
Fact = " SS13 can now drink!"
if(26)
Fact = " SS13 can now rent a car!"
if(30)
Fact = " SS13 can now go home and be a family man!"
if(40)
Fact = " SS13 can now suffer a midlife crisis!"
if(50)
Fact = " Happy golden anniversary!"
if(65)
Fact = " SS13 can now start thinking about retirement!"
if(96)
Fact = " Please send a time machine back to pick me up, I need to update the time formatting for this feature!" //See you later suckers
if(!Fact)
Fact = " SS13 is now [game_age] years old!"
return "Say 'Happy Birthday' to Space Station 13, first publicly playable on February 16th, 2003![Fact]"
/datum/holiday/random_kindness
name = "Random Acts of Kindness Day"
begin_day = 17
begin_month = FEBRUARY
/datum/holiday/random_kindness/greet()
return "Go do some random acts of kindness for a stranger!" //haha yeah right
/datum/holiday/leap
name = "Leap Day"
begin_day = 29
begin_month = FEBRUARY
/datum/holiday/pi
name = "Pi Day"
begin_day = 14
begin_month = MARCH
/datum/holiday/no_this_is_patrick
name = "St. Patrick's Day"
begin_day = 17
begin_month = MARCH
/datum/holiday/no_this_is_patrick/getStationPrefix()
return pick("Blarney","Green","Leprechaun","Booze")
/datum/holiday/april_fools
name = APRIL_FOOLS
begin_day = 1
end_day = 2
begin_month = APRIL
/datum/holiday/april_fools/celebrate()
SSticker.login_music = 'sound/ambience/clown.ogg'
for(var/mob/dead/new_player/P in GLOB.mob_list)
if(P.client)
P.client.playtitlemusic()
/datum/holiday/fourtwenty
name = "Four-Twenty"
begin_day = 20
begin_month = APRIL
/datum/holiday/fourtwenty/getStationPrefix()
return pick("Snoop","Blunt","Toke","Dank")
/datum/holiday/earth
name = "Earth Day"
begin_day = 22
begin_month = APRIL
/datum/holiday/labor
name = "Labor Day"
begin_day = 1
begin_month = MAY
/datum/holiday/firefighter
name = "Firefighter's Day"
begin_day = 4
begin_month = MAY
/datum/holiday/firefighter/getStationPrefix()
return pick("Burning","Blazing","Plasma","Fire")
/datum/holiday/summersolstice
name = "Summer Solstice"
begin_day = 21
begin_month = JUNE
/datum/holiday/doctor
name = "Doctor's Day"
begin_day = 1
begin_month = JULY
/datum/holiday/UFO
name = "UFO Day"
begin_day = 2
begin_month = JULY
/datum/holiday/UFO/getStationPrefix() //Is such a thing even possible?
return pick("Ayy","Truth","Tsoukalos","Mulder") //Yes it is!
/datum/holiday/writer
name = "Writer's Day"
begin_day = 8
begin_month = JULY
/datum/holiday/friendship
name = "Friendship Day"
begin_day = 30
begin_month = JULY
/datum/holiday/friendship/greet()
return "Have a magical [name]!"
/datum/holiday/beer
name = "Beer Day"
begin_day = 5
begin_month = AUGUST
/datum/holiday/pirate
name = "Talk-Like-a-Pirate Day"
begin_day = 19
begin_month = SEPTEMBER
/datum/holiday/pirate/greet()
return "Ye be talkin' like a pirate today or else ye'r walkin' tha plank, matey!"
/datum/holiday/pirate/getStationPrefix()
return pick("Yarr","Scurvy","Yo-ho-ho")
/datum/holiday/programmers
name = "Programmers' Day"
/datum/holiday/programmers/shouldCelebrate(dd, mm, yy, ww, ddd) //Programmer's day falls on the 2^8th day of the year
if(mm == 9)
if(yy/4 == round(yy/4)) //Note: Won't work right on September 12th, 2200 (at least it's a Friday!)
if(dd == 12)
return 1
else
if(dd == 13)
return 1
return 0
/datum/holiday/programmers/getStationPrefix()
return pick("span>","DEBUG: ","null","/list","EVENT PREFIX NOT FOUND") //Portability
/datum/holiday/questions
name = "Stupid-Questions Day"
begin_day = 28
begin_month = SEPTEMBER
/datum/holiday/questions/greet()
return "Are you having a happy [name]?"
/datum/holiday/animal
name = "Animal's Day"
begin_day = 4
begin_month = OCTOBER
/datum/holiday/animal/getStationPrefix()
return pick("Parrot","Corgi","Cat","Pug","Goat","Fox")
/datum/holiday/smile
name = "Smiling Day"
begin_day = 7
begin_month = OCTOBER
/datum/holiday/boss
name = "Boss' Day"
begin_day = 16
begin_month = OCTOBER
/datum/holiday/halloween
name = HALLOWEEN
begin_day = 30
begin_month = OCTOBER
end_day = 2
end_month = NOVEMBER
/datum/holiday/halloween/greet()
return "Have a spooky Halloween!"
/datum/holiday/halloween/getStationPrefix()
return pick("Bone-Rattling","Mr. Bones' Own","2SPOOKY","Spooky","Scary","Skeletons")
/datum/holiday/vegan
name = "Vegan Day"
begin_day = 1
begin_month = NOVEMBER
/datum/holiday/kindness
name = "Kindness Day"
begin_day = 13
begin_month = NOVEMBER
/datum/holiday/flowers
name = "Flowers Day"
begin_day = 19
begin_month = NOVEMBER
/datum/holiday/hello
name = "Saying-'Hello' Day"
begin_day = 21
begin_month = NOVEMBER
/datum/holiday/hello/greet()
return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy"))]! " + ..()
/datum/holiday/human_rights
name = "Human-Rights Day"
begin_day = 10
begin_month = DECEMBER
/datum/holiday/monkey
name = "Monkey Day"
begin_day = 14
begin_month = DECEMBER
/datum/holiday/thanksgiving
name = "Thanksgiving in the United States"
begin_week = 4
begin_month = NOVEMBER
begin_weekday = THURSDAY
/datum/holiday/thanksgiving/canada
name = "Thanksgiving in Canada"
begin_week = 2
begin_month = OCTOBER
begin_weekday = MONDAY
/datum/holiday/columbus
name = "Columbus Day"
begin_week = 2
begin_month = OCTOBER
begin_weekday = MONDAY
/datum/holiday/mother
name = "Mother's Day"
begin_week = 2
begin_month = MAY
begin_weekday = SUNDAY
/datum/holiday/mother/greet()
return "Happy Mother's Day in most of the Americas, Asia, and Oceania!"
/datum/holiday/father
name = "Father's Day"
begin_week = 3
begin_month = JUNE
begin_weekday = SUNDAY
/datum/holiday/ramadan
name = "Start of Ramadan"
/*
For anyone who stumbles on this some time in the future: this was calibrated to 2017
Calculated based on the start and end of Ramadan in 2000 (First year of the Gregorian Calendar supported by BYOND)
This is going to be accurate for at least a decade, likely a lot longer
Since the date fluctuates, it may be inaccurate one year and then accurate for several after
Inaccuracies will never be by more than one day for at least a hundred years
Finds the number of days since the day in 2000 and gets the modulo of that and the average length of a Muslim year since the first one (622 AD, Gregorian)
Since Ramadan is an entire month that lasts 29.5 days on average, the start and end are holidays and are calculated from the two dates in 2000
*/
/datum/holiday/ramadan/shouldCelebrate(dd, mm, yy, ww, ddd)
if (round(((world.realtime - 285984000) / 864000) % 354.373435326843) == 0)
return TRUE
return FALSE
/datum/holiday/ramadan/getStationPrefix()
return pick("Harm","Halaal","Jihad","Muslim")
/datum/holiday/ramadan/end
name = "End of Ramadan"
/datum/holiday/ramadan/end/shouldCelebrate(dd, mm, yy, ww, ddd)
if (round(((world.realtime - 312768000) / 864000) % 354.373435326843) == 0)
return TRUE
return FALSE
/datum/holiday/doomsday
name = "Mayan Doomsday Anniversary"
begin_day = 21
begin_month = DECEMBER
/datum/holiday/xmas
name = CHRISTMAS
begin_day = 23
begin_month = DECEMBER
end_day = 25
/datum/holiday/xmas/greet()
return "Have a merry Christmas!"
/datum/holiday/festive_season
name = FESTIVE_SEASON
begin_day = 1
begin_month = DECEMBER
end_day = 31
/datum/holiday/festive_season/greet()
return "Have a nice festive season!"
/datum/holiday/boxing
name = "Boxing Day"
begin_day = 26
begin_month = DECEMBER
/datum/holiday/friday_thirteenth
name = "Friday the 13th"
/datum/holiday/friday_thirteenth/shouldCelebrate(dd, mm, yy, ww, ddd)
if(dd == 13 && ddd == FRIDAY)
return TRUE
return FALSE
/datum/holiday/friday_thirteenth/getStationPrefix()
return pick("Mike","Friday","Evil","Myers","Murder","Deathly","Stabby")
/datum/holiday/easter
name = EASTER
var/const/days_early = 1 //to make editing the holiday easier
var/const/days_extra = 1
/datum/holiday/easter/shouldCelebrate(dd, mm, yy, ww, ddd)
// Easter's celebration day is as snowflakey as Uhangi's code
if(!begin_month)
var/yy_string = "[yy]"
// year = days after March 22that Easter falls on that year.
// For 2015 Easter is on April 5th, so 2015 = 14 since the 5th is 14 days past the 22nd
// If it's 2040 and this is still in use, invent a time machine and teach me a better way to do this. Also tell us about HL3.
var/list/easters = list(
"15" = 14,\
"16" = 6,\
"17" = 25,\
"18" = 10,\
"19" = 30,\
"20" = 22,\
"21" = 13,\
"22" = 26,\
"23" = 18,\
"24" = 9,\
"25" = 29,\
"26" = 14,\
"27" = 6,\
"28" = 25,\
"29" = 10,\
"30" = 30,\
"31" = 23,\
"32" = 6,\
"33" = 26,\
"34" = 18,\
"35" = 3,\
"36" = 22,\
"37" = 14,\
"38" = 34,\
"39" = 19,\
"40" = 9,\
)
begin_day = easters[yy_string]
if(begin_day <= 9)
begin_day += 22
begin_month = MARCH
else
begin_day -= 9
begin_month = APRIL
end_day = begin_day + days_extra
end_month = begin_month
if(end_day >= 32 && end_month == MARCH) //begins in march, ends in april
end_day -= 31
end_month++
if(end_day >= 31 && end_month == APRIL) //begins in april, ends in june
end_day -= 30
end_month++
begin_day -= days_early
if(begin_day <= 0)
if(begin_month == APRIL)
begin_day += 31
begin_month-- //begins in march, ends in april
// to_chat(world, "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]")
return ..()
/datum/holiday/easter/celebrate()
GLOB.maintenance_loot += list(
/obj/item/reagent_containers/food/snacks/egg/loaded = 15,
/obj/item/storage/bag/easterbasket = 15)