Appreciation Day (#17427)

* Appreciation Day

A new little system to create and announce Appreciation Days for certain species, and a few other funny things.

The first announcement is 90 minutes into the shift, where a random species will be chosen. This species is one from either a long list, or one of the crew's own species! This is then remembered and further announcements (on average less than every two hours) will use the same thing to appreciate for the rest of that shift.

It seems suitably horribly corporate to me, with some potential for comedy.

* Update appreciation.dm

* Terrible factoids

* Update appreciation.dm

* Update appreciation.dm

* Fixes some things

* unfuck that

* .

* .

* .

* cut it

* fix it

* .

* Set the test values back to proper values

* Update appreciation.dm

* resume

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
SatinIsle
2025-03-28 19:05:00 +01:00
committed by GitHub
co-authored by Kashargul
parent e9721220a1
commit c9e13dcc96
4 changed files with 241 additions and 0 deletions
@@ -0,0 +1,110 @@
//A system to create fun little species appreciation announcements, build primarily by following ATC as an example
//The system is simple, it just creates an appreciation message about 90 minutes into a shift, where it picks a species to appreciate for the day. Then will make infrequent reminders of this throughout the rest of the shift.
//It also has the ability to choose a random player's species to appreciate, even if it's a custom one, as long as there at least 5 human mob players.
SUBSYSTEM_DEF(appreciation)
name = "Appreciation Messages"
priority = FIRE_PRIORITY_APPRECIATE
runlevels = RUNLEVEL_GAME
wait = 2 MINUTES //This really does not need to fire very often at all
flags = SS_NO_INIT | SS_BACKGROUND
VAR_PRIVATE/next_tick = 0
VAR_PRIVATE/delay_min = 90 MINUTES //How long between announcements, minimum
VAR_PRIVATE/delay_max = 180 MINUTES //Ditto, maximum
//Shorter delays are probably too spammy, 90-180 minutes means a message every two hours or so, which shouldn't be too intrusive.
VAR_PRIVATE/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins.
VAR_PRIVATE/initial_delay = 90 MINUTES //How long to wait before sending the first message of the shift.
VAR_PRIVATE/squelched = FALSE //If appreciation messages are squelched currently
var/list/current_player_list = list()
var/list/human_list = list()
var/appreciated
var/required_humans = 5 //The minimum number of humans in the list needed to allow it to choose one of their species.
/datum/controller/subsystem/appreciation/fire(resumed = FALSE)
if(times_fired < 1)
return
if(times_fired == 1)
next_tick = world.time + initial_delay
return
if(!resumed)
if(world.time < next_tick)
return
if(squelched)
next_tick = world.time + backoff_delay
return
next_tick = world.time + rand(delay_min,delay_max)
if(appreciated)
do_appreciate()
return
current_player_list = player_list.Copy()
while(current_player_list.len)
var/mob/M = current_player_list[current_player_list.len]
current_player_list.len--
if(ishuman(M))
var/mob/living/carbon/human/H = M
human_list += H
if (MC_TICK_CHECK)
return
current_player_list.Cut()
build_appreciation()
human_list.Cut()
if(squelched)
next_tick = world.time + backoff_delay
return
do_appreciate()
/datum/controller/subsystem/appreciation/proc/build_appreciation()
if(human_list.len < required_humans)
appreciated = pick(loremaster.appreciation_targets)
return
if(prob(50))
appreciated = pick(loremaster.appreciation_targets)
return
var/mob/living/carbon/human/H = pick(human_list)
if(!istype(H))
appreciated = pick(loremaster.appreciation_targets)
return
if(H.custom_species)
appreciated = H.custom_species
return
appreciated = H.species.name
/datum/controller/subsystem/appreciation/proc/do_appreciate()
var/appreciation_message = pick(loremaster.appreciation_messages)
var/terrible_factoid = pick(loremaster.terrible_factoids)
msg("Today is [appreciated] appreciation day! [terrible_factoid] [appreciation_message]")
/datum/controller/subsystem/appreciation/proc/msg(var/message,var/sender)
ASSERT(message)
global_announcer.autosay("[message]", sender ? sender : "Cultural Awareness")
/datum/controller/subsystem/appreciation/proc/is_squelched()
return squelched
/datum/controller/subsystem/appreciation/proc/cancel_appreciation(var/yes = 1,var/silent = FALSE)
if(yes)
if(!squelched && !silent)
msg("Today's appreciation day has been suspended.")
squelched = 1
return
if(squelched && !silent)
msg("Appreciation day has been resumed, get appreciating!")
squelched = 0