Files
AlexisandGitHub 080e131b50 Refactors the safe Christmas trees to use a safe present subtype by way of a blacklist (#5027)
## About The Pull Request
Updates the safe tree to use a proper blacklist instead of being boring
and just giving bloodthirsty spacemen and women toys... They were good
all year, they crave violence. This replaces the round start Christmas
trees with the safe trees, which no longer only give out toys, but also
no longer give out admin/debug gear. A compromise for all, just in time
for Christmas!

The Christmas event present spawns have all been replaced with the safe
variants that utilize the blacklist, the other means of acquiring
presents have been left untouched.
## Why It's Good For The Game
People not getting admin tools out of Christmas presents and causing
headaches for staff is probably good for the game, maybe.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="418" height="452" alt="image"
src="https://github.com/user-attachments/assets/df6554ee-084a-40c2-9592-94c88f6569c4"
/>

</details>

## Changelog
🆑 xPokee, LT3
balance: All Christmas event presents have been replaced with the safe
variants.
refactor: The safe Christmas tree subtype now uses a blacklist instead
of just giving toys.
admin: Added a new verb in the 'game' tab to blacklist presents on the
fly.
/🆑
2025-12-27 16:20:08 -08:00

95 lines
4.1 KiB
Plaintext

/obj/item/toy/xmas_cracker
name = "xmas cracker"
icon = 'icons/obj/holiday/christmas.dmi'
icon_state = "cracker"
desc = "Directions for use: Requires two people, one to pull each end."
w_class = WEIGHT_CLASS_TINY
/// The crack state of the toy. If set to TRUE, you can no longer crack it by attacking.
var/cracked = FALSE
/obj/item/toy/xmas_cracker/attack(mob/target, mob/user)
if( !cracked && ishuman(target) && (target.stat == CONSCIOUS) && !target.get_active_held_item() )
target.visible_message(span_notice("[user] and [target] pop \an [src]! *pop*"), span_notice("You pull \an [src] with [target]! *pop*"), span_hear("You hear a pop."))
var/obj/item/paper/joke_paper = new /obj/item/paper(user.loc)
joke_paper.name = "[pick("awful","terrible","unfunny")] joke"
joke_paper.add_raw_text(pick("What did one snowman say to the other?\n\n<i>'Is it me or can you smell carrots?'</i>",
"Why couldn't the snowman get laid?\n\n<i>He was frigid!</i>",
"Where are Santa's helpers educated?\n\n<i>Nowhere, they're ELF-taught.</i>",
"What happened to the man who stole advent calanders?\n\n<i>He got 25 days.</i>",
"What does Santa get when he gets stuck in a chimney?\n\n<i>Claus-trophobia.</i>",
"Where do you find chili beans?\n\n<i>The north pole.</i>",
"What do you get from eating tree decorations?\n\n<i>Tinsilitis!</i>",
"What do snowmen wear on their heads?\n\n<i>Ice caps!</i>",
"Why is Christmas just like life on ss13?\n\n<i>You do all the work and the fat guy gets all the credit.</i>",
"Why doesn't Santa have any children?\n\n<i>Because he only comes down the chimney.</i>"))
joke_paper.update_appearance()
new /obj/item/clothing/head/costume/festive(target.loc)
user.update_icons()
cracked = TRUE
icon_state = "cracker1"
var/obj/item/toy/xmas_cracker/other_half = new /obj/item/toy/xmas_cracker(target)
other_half.cracked = 1
other_half.icon_state = "cracker2"
target.put_in_active_hand(other_half)
playsound(user, 'sound/effects/snap.ogg', 50, TRUE)
return TRUE
return ..()
/obj/item/clothing/head/costume/festive
name = "festive paper hat"
icon_state = "xmashat"
desc = "A crappy paper hat that you are REQUIRED to wear."
flags_inv = 0
armor_type = /datum/armor/none
dog_fashion = /datum/dog_fashion/head/festive
/obj/effect/spawner/xmastree
name = "christmas tree spawner"
icon = 'icons/effects/landmarks_static.dmi'
icon_state = "x2"
layer = FLY_LAYER
plane = ABOVE_GAME_PLANE
/// Christmas tree, no presents included.
var/festive_tree = /obj/structure/flora/tree/pine/xmas
/// Christmas tree, presents included.
var/christmas_tree = /obj/structure/flora/tree/pine/xmas/presents/safe // BUBBER EDIT - Previous: /obj/structure/flora/tree/pine/xmas/presents
/obj/effect/spawner/xmastree/Initialize(mapload)
. = ..()
if(check_holidays(CHRISTMAS) && christmas_tree)
new christmas_tree(get_turf(src))
else if(check_holidays(FESTIVE_SEASON) && festive_tree)
new festive_tree(get_turf(src))
/obj/effect/spawner/xmastree/rdrod
name = "festivus pole spawner"
festive_tree = /obj/structure/festivus
christmas_tree = null
/datum/round_event_control/santa
name = "Visit by Santa"
holidayID = CHRISTMAS
typepath = /datum/round_event/ghost_role/santa
weight = 20
max_occurrences = 1
earliest_start = 30 MINUTES
category = EVENT_CATEGORY_HOLIDAY
description = "Spawns Santa, who shall roam the station, handing out gifts."
/datum/round_event/ghost_role/santa
role_name = "Santa"
var/mob/living/carbon/human/santa //who is our santa?
/datum/round_event/ghost_role/santa/announce(fake)
priority_announce("Santa is coming to town!", "Unknown Transmission")
/datum/round_event/ghost_role/santa/start()
var/mob/chosen_one = SSpolling.poll_ghost_candidates("Santa is coming to town! Do you want to be [span_notice("Santa")]?", poll_time = 15 SECONDS, alert_pic = /obj/item/clothing/head/costume/santa, role_name_text = "Santa", amount_to_pick = 1)
if(isnull(chosen_one))
return NOT_ENOUGH_PLAYERS
santa = new /mob/living/carbon/human(pick(GLOB.blobstart))
santa.PossessByPlayer(chosen_one.key)
var/datum/antagonist/santa/A = new
santa.mind.add_antag_datum(A)