From 05143d20720a066698df4351313d50c0043e568e Mon Sep 17 00:00:00 2001 From: Fira Date: Tue, 10 Oct 2023 12:55:05 +0100 Subject: [PATCH] bring back halloween carvable pumpkin helmets --- code/modules/decorators/halloween.dm | 34 ++++++++++ .../holidays/halloween/pumpkins/patches.dm | 58 ++++++++++++++++++ .../holidays/halloween/pumpkins/wearable.dm | 55 +++++++++++++++++ colonialmarines.dme | 2 + icons/misc/events/pumpkins.dmi | Bin 0 -> 6865 bytes 5 files changed, 149 insertions(+) create mode 100644 code/modules/holidays/halloween/pumpkins/patches.dm create mode 100644 code/modules/holidays/halloween/pumpkins/wearable.dm create mode 100644 icons/misc/events/pumpkins.dmi diff --git a/code/modules/decorators/halloween.dm b/code/modules/decorators/halloween.dm index af19d80bbb23..420edc999f3c 100644 --- a/code/modules/decorators/halloween.dm +++ b/code/modules/decorators/halloween.dm @@ -13,6 +13,40 @@ if(cur_mon == 11 && cur_day < 4) return 0 +/// Pumpkins decorator: adds patches of carvable/wearable pumpkins around the ground level +/datum/decorator/halloween/pumpkins + var/list/obj/structure/pumpkin_patch/placed_pumpkins = list() //! List of pumpkins to avoid placing in proximity + var/pumpkin_prob = 4 //! Chance to place a pumpkin + var/pumpkin_prob_corruption = 20 + var/pumpkin_prob_decrease = 0.6 //! Chance reduction per day before halloween + var/exclusion_range = 8 + +/datum/decorator/halloween/pumpkins/get_decor_types() + return typesof(/turf/open/gm) + typesof(/turf/open/auto_turf) + typesof(/turf/open/jungle) + typesof(/turf/open/desert) + typesof(/turf/open/mars) + typesof(/turf/open/mars_cave) + +/datum/decorator/halloween/pumpkins/decorate(turf/open/turf) + if(!is_ground_level(turf.z)) + return + + var/event_progress = get_event_progress() + var/placement_chance = pumpkin_prob + if(!prob(placement_chance)) + return + + var/corruption_chance = pumpkin_prob_corruption - (event_progress * pumpkin_prob_decrease) + + for(var/pumpkin in placed_pumpkins) + if(get_dist(turf, pumpkin) <= exclusion_range) + return + + var/obj/structure/pumpkin_patch/patch + if(prob(corruption_chance)) + patch = new /obj/structure/pumpkin_patch/corrupted(turf) + else + patch = new /obj/structure/pumpkin_patch(turf) + placed_pumpkins += patch + + /// Cobweb decorator: adds more and more cobwebs as you go through the month /datum/decorator/halloween/cobwebs /// How much prob() chance to put a cobweb during halloween proper diff --git a/code/modules/holidays/halloween/pumpkins/patches.dm b/code/modules/holidays/halloween/pumpkins/patches.dm new file mode 100644 index 000000000000..97ceaf9e108b --- /dev/null +++ b/code/modules/holidays/halloween/pumpkins/patches.dm @@ -0,0 +1,58 @@ +/// Patches of pumpkins spawned at roundstart from where marines can get their carvable pumpkins +/obj/structure/pumpkin_patch + icon = 'icons/misc/events/pumpkins.dmi' + name = "patch of pumpkins" + + can_block_movement = FALSE + unslashable = TRUE + health = 400 // To avoid explosions and stray gunfire destroying them too easily + layer = LOWER_ITEM_LAYER + + var/has_vines = TRUE //! Whether there's still vines to display or not + var/pumpkin_count = 3 //! Amount of pumpkins currently in the patch + var/icon_prefix //! Prefix to prepend to icon states, for corrupted pumpkins + var/pumpkin_type = /obj/item/clothing/head/pumpkin + +/obj/structure/pumpkin_patch/Initialize(mapload, ...) + . = ..() + update_icon() + +/obj/structure/pumpkin_patch/update_icon() + overlays?.Cut() + . = ..() + switch(pumpkin_count) + if(3) icon_state = "[icon_prefix]pumpkins_full" + if(2) icon_state = "[icon_prefix]pumpkins_half" + if(1) icon_state = "[icon_prefix]pumpkin" + else icon_state = "" + if(has_vines) + overlays += image(icon, loc, "[icon_prefix]vines") + +/obj/structure/pumpkin_patch/attack_hand(mob/user) + if(pumpkin_count < 1) + to_chat(user, SPAN_WARNING("No more pumpkins here...")) + return + if(!user.get_active_hand()) //if active hand is empty + pumpkin_count-- + var/obj/item/clothing/head/pumpkin/pumpkin = new pumpkin_type(loc) + user.put_in_hands(pumpkin) + update_icon() + if(pumpkin_count < 1 && !has_vines) + qdel(src) + return + return ..() + +/obj/structure/pumpkin_patch/attackby(obj/item/tool, mob/user) + if(has_vines && (tool.sharp == IS_SHARP_ITEM_ACCURATE || tool.sharp == IS_SHARP_ITEM_BIG)) + to_chat(user, SPAN_NOTICE("You cut down the vines.")) + has_vines = FALSE + update_icon() + if(pumpkin_count < 1 && !has_vines) + qdel(src) + return + return ..() + +/obj/structure/pumpkin_patch/corrupted + icon_prefix = "cor_" + name = "patch of corrupted pumpkins" + pumpkin_type = /obj/item/clothing/head/pumpkin/corrupted diff --git a/code/modules/holidays/halloween/pumpkins/wearable.dm b/code/modules/holidays/halloween/pumpkins/wearable.dm new file mode 100644 index 000000000000..57692c3dfcb5 --- /dev/null +++ b/code/modules/holidays/halloween/pumpkins/wearable.dm @@ -0,0 +1,55 @@ +/// Carved Pumpkin from the Halloween event +/obj/item/clothing/head/pumpkin + name = "pumpkin" + icon = 'icons/misc/events/pumpkins.dmi' + item_icons = list( + WEAR_HEAD = 'icons/misc/events/pumpkins.dmi', + ) + w_class = SIZE_MEDIUM + flags_inventory = COVEREYES|COVERMOUTH + flags_inv_hide = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEALLHAIR + flags_armor_protection = BODY_FLAG_HEAD|BODY_FLAG_EYES + var/prefix = "" //! Icon state prefix for corrupted pumpkin variants + var/carved_icon = "" //! Currently carved pumpkin overlay + var/carvable_icons = list("smile", "cheeky", "bugeyes", "upside_down_smile", "skelly", "ff") + +/obj/item/clothing/head/pumpkin/Initialize(mapload, ...) + . = ..() + update_icon() + +/obj/item/clothing/head/pumpkin/update_icon() + . = ..() + if(carved_icon) + icon_state = "[prefix]pumpkin_carved" + else + icon_state = "[prefix]pumpkin" + item_state_slots = list( + WEAR_HEAD = "[prefix]pumpkin_onmob", + ) + +/obj/item/clothing/head/pumpkin/mob_can_equip(mob/user, slot, disable_warning) + if(slot == WEAR_HEAD && !carved_icon) + to_chat(user, SPAN_WARNING("You can't put on a full pumpkin! Empty and carve it with a sharp object first.")) + return FALSE + . = ..() + +/obj/item/clothing/head/pumpkin/attackby(obj/item/tool, mob/user) + if(!carved_icon && (tool.sharp == IS_SHARP_ITEM_ACCURATE || tool.sharp == IS_SHARP_ITEM_BIG)) + var/choice = tgui_input_list(user, "Select the pattern to carve on your pumpkin!", "Pumpkin Carving", carvable_icons) + if(choice) + carved_icon = choice + name = "carved pumpkin" + update_icon() + else + return ..() + +/obj/item/clothing/head/pumpkin/get_mob_overlay(mob/user_mob, slot) + var/image/pumpkin = ..() + if(carved_icon && slot == WEAR_HEAD) + var/image/overlay = overlay_image(icon, "[prefix]pumpkin_[carved_icon]") + pumpkin.overlays += overlay + return pumpkin + +/obj/item/clothing/head/pumpkin/corrupted + prefix = "cor_" + carvable_icons = list("cry", "sob", "sad", "why", "spooky", "ff") diff --git a/colonialmarines.dme b/colonialmarines.dme index 63140be5e458..7db9fd61375e 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1694,6 +1694,8 @@ s// DM Environment file for colonialmarines.dme. #include "code\modules\gear_presets\survivors\sorokyne_strata\preset_sorokyne_strata.dm" #include "code\modules\gear_presets\survivors\trijent\crashlanding_upp_bar_insert_trijent.dm" #include "code\modules\gear_presets\survivors\trijent\preset_trijent.dm" +#include "code\modules\holidays\halloween\pumpkins\patches.dm" +#include "code\modules\holidays\halloween\pumpkins\wearable.dm" #include "code\modules\hydroponics\botany_disks.dm" #include "code\modules\hydroponics\grown_inedible.dm" #include "code\modules\hydroponics\hydro_tools.dm" diff --git a/icons/misc/events/pumpkins.dmi b/icons/misc/events/pumpkins.dmi new file mode 100644 index 0000000000000000000000000000000000000000..aa78c74c1a363f78fa85719e12ad9188211f0847 GIT binary patch literal 6865 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