From 290dd34fd092ed16f72832531f91972fb6d8e470 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 28 Nov 2023 08:34:03 +0100 Subject: [PATCH] [MIRROR] rolls Heavy Sleeper into the new All Nighter quirk, which carries extra... baggage [MDB IGNORE] (#25298) * rolls Heavy Sleeper into the new All Nighter quirk, which carries extra... baggage (#79725) ## About The Pull Request Removes the Heavy Sleeper quirk and rolls its effects into the brand new All Nighter! On top of the effects of sleeping longer, All Nighter gives you permanent bags under your eyes as well as a permanent -3 moodlet. ## Why It's Good For The Game I've been wanting for a way to get bags under your eyes for a while, I think it'd be a fun visual aspect that can aid with RP and whatnot. I rolled heavy sleeper into all nighter because the two are both quite similar, and I didn't feel heavy sleeper quite justified itself on it's own. Here's what the bags look like currently on a variety of skin tones and species: ![dreamseeker_Vlc4rDlHaJ](https://github.com/tgstation/tgstation/assets/37246588/9bb5ba08-f5c7-4976-9f44-8b9993e2162e) ## Room for Improvement Currently drafting for a few reasons. looking for input on all this stuff - [x] bag sprites could be improved - [x] bags don't work well on moths/grayer skin tones. cest la vie? - [x] should heavy sleeper stay? ultimately all I want is bags here, is there a better way of doing this? - [x] all quirk elements are not properly applied and removed via VV (no need for input, i can figure this out myself) ## Changelog :cl: add: the All Nighter quirk! remove: Heavy Sleeper (functionality has been rolled into All Nighter) /:cl: * rolls Heavy Sleeper into the new All Nighter quirk, which carries extra... baggage * Adds back heavy sleeper * Reorganizes these quirks * Fixes same icon being used for both quirks --------- Co-authored-by: wesoda25 <37246588+wesoda25@users.noreply.github.com> Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- .../subsystem/processing/quirks.dm | 1 + .../simple_bodypart_overlay.dm | 6 + .../mood_events/generic_negative_events.dm | 4 + .../quirks/negative_quirks/all_nighter.dm | 115 ++++++++++++++++++ .../species/misc/bodypart_overlay_simple.dmi | Bin 1978 -> 2016 bytes .../code/datums/quirks/negative.dm | 100 --------------- .../quirks/negative_quirks/all_nighter.dm | 3 + .../quirks/negative_quirks/blooddeficiency.dm | 20 +++ .../quirks/negative_quirks/brainproblems.dm | 43 +++++++ .../datums/quirks/negative_quirks/gifted.dm | 11 ++ .../quirks/negative_quirks/heavy_sleeper.dm | 1 + .../quirks/negative_quirks/nerve_staple.dm | 23 ++++ .../datums/quirks/neutral_quirks/equipping.dm | 51 ++++++++ .../{neutral.dm => neutral_quirks/lungs.dm} | 52 -------- tgstation.dme | 12 +- 15 files changed, 287 insertions(+), 155 deletions(-) create mode 100644 code/datums/quirks/negative_quirks/all_nighter.dm delete mode 100644 modular_skyrat/master_files/code/datums/quirks/negative.dm create mode 100644 modular_skyrat/master_files/code/datums/quirks/negative_quirks/all_nighter.dm create mode 100644 modular_skyrat/master_files/code/datums/quirks/negative_quirks/blooddeficiency.dm create mode 100644 modular_skyrat/master_files/code/datums/quirks/negative_quirks/brainproblems.dm create mode 100644 modular_skyrat/master_files/code/datums/quirks/negative_quirks/gifted.dm rename {code => modular_skyrat/master_files/code}/datums/quirks/negative_quirks/heavy_sleeper.dm (96%) create mode 100644 modular_skyrat/master_files/code/datums/quirks/negative_quirks/nerve_staple.dm create mode 100644 modular_skyrat/master_files/code/datums/quirks/neutral_quirks/equipping.dm rename modular_skyrat/master_files/code/datums/quirks/{neutral.dm => neutral_quirks/lungs.dm} (62%) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 119180d3699..f6a47fc7f8a 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -31,6 +31,7 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/no_guns, /datum/quirk/nonviolent), list(/datum/quirk/spacer_born, /datum/quirk/oversized), list(/datum/quirk/feline_aspect, /datum/quirk/item_quirk/canine, /datum/quirk/item_quirk/avian), + list(/datum/quirk/all_nighter, /datum/quirk/heavy_sleeper), //SKYRAT EDIT ADDITION END )) diff --git a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm index 72fef44b2d4..7f52d21de53 100644 --- a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm @@ -29,3 +29,9 @@ /datum/bodypart_overlay/simple/creampie icon_state = "creampie_human" layers = EXTERNAL_FRONT + +///bags drawn beneath the eyes +/datum/bodypart_overlay/simple/bags + icon_state = "bags" + draw_color = COLOR_WEBSAFE_DARK_GRAY + layers = EXTERNAL_ADJACENT diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 23a3364adc3..317e155ef5e 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -444,3 +444,7 @@ description = "UNWORTHY, UNWORTHY, UNWORTHY!!!" mood_change = -200 special_screen_obj = "mood_despair" + +/datum/mood_event/all_nighter + description = "I didn't sleep at all last night. I'm exhausted." + mood_change = -5 diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm new file mode 100644 index 00000000000..fbf160cec70 --- /dev/null +++ b/code/datums/quirks/negative_quirks/all_nighter.dm @@ -0,0 +1,115 @@ +#define SLEEP_BANK_MULTIPLIER 10 + +/datum/quirk/all_nighter + name = "All Nighter" + desc = "You didn't get any sleep last night, and people can tell! You'll constantly be in a bad mood and will have a tendency to sleep longer. Stimulants or a nap might help, though." + icon = FA_ICON_BED + value = -4 + mob_trait = TRAIT_HEAVY_SLEEPER + gain_text = span_danger("You feel exhausted.") + lose_text = span_notice("You feel well rested.") + medical_record_text = "Patient appears to be suffering from sleep deprivation." + hardcore_value = 2 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE|QUIRK_MOODLET_BASED|QUIRK_PROCESSES + + mail_goodies = list( + /obj/item/clothing/glasses/blindfold, + /obj/item/bedsheet/random, + /obj/item/clothing/under/misc/pj/red, + /obj/item/clothing/head/costume/nightcap/red, + /obj/item/clothing/under/misc/pj/blue, + /obj/item/clothing/head/costume/nightcap/blue, + /obj/item/pillow/random, + ) + + ///a list of all the reagents which alleviate the negative moodlet + var/list/stimulants = list( + /datum/reagent/medicine/stimulants, + /datum/reagent/drug/methamphetamine, + /datum/reagent/drug/bath_salts, + /datum/reagent/drug/aranesp, + /datum/reagent/drug/pumpup, + /datum/reagent/drug/blastoff, + /datum/reagent/consumable/coffee, + /datum/reagent/consumable/tea + ) + ///essentially our "sleep bank". sleeping charges it up and its drained while awake + var/five_more_minutes = 0 + ///the overlay we put over the eyes + var/datum/bodypart_overlay/simple/bags/bodypart_overlay + + +///adds the corresponding moodlet and visual effects +/datum/quirk/all_nighter/add(client/client_source) + quirk_holder.add_mood_event("all_nighter", /datum/mood_event/all_nighter) + add_bags() + +///removes the corresponding moodlet and visual effects +/datum/quirk/all_nighter/remove(client/client_source) + quirk_holder.clear_mood_event("all_nighter", /datum/mood_event/all_nighter) + remove_bags() + +///adds the bag overlay +/datum/quirk/all_nighter/proc/add_bags(client/client_source) + var/mob/living/carbon/human/sleepy_head = quirk_holder + var/obj/item/bodypart/head/face = sleepy_head.get_bodypart(BODY_ZONE_HEAD) + bodypart_overlay = new() //creates our overlay + face.add_bodypart_overlay(bodypart_overlay) + sleepy_head.update_body_parts() //make sure to update icon + +///removes the bag overlay +/datum/quirk/all_nighter/proc/remove_bags(client/client_source) + var/mob/living/carbon/human/sleepy_head = quirk_holder + var/obj/item/bodypart/head/face = sleepy_head.get_bodypart(BODY_ZONE_HEAD) + //our overlay is stored as a datum var, so referencing it is easy + face.remove_bodypart_overlay(bodypart_overlay) + QDEL_NULL(bodypart_overlay) + sleepy_head.update_body_parts() + +/** +*Here we actively handle our moodlet & eye bags, adding/removing them as necessary +* +**Logic: +**Every second spent sleeping adds to the "sleep bank" with a multiplier of SLEEP_BANK_MULTIPLIER +**Every waking second drains the sleep bank until empty +**An empty sleep bank means you have bags beneath your eyes +**An empty sleep bank AND a lack of stimulants means you have the negative moodlet +* +**Variables: +**happy_camper - FALSE if we should have the negative moodlet +**beauty_sleep - FALSE if we should have bags +*/ +/datum/quirk/all_nighter/process(seconds_per_tick) + var/happy_camper = TRUE + var/beauty_sleep = TRUE + var/stims_present = FALSE + + if(quirk_holder.IsSleeping()) + five_more_minutes += SLEEP_BANK_MULTIPLIER * seconds_per_tick + else if(five_more_minutes > 0) + five_more_minutes -= seconds_per_tick + else + beauty_sleep = FALSE //no sleep means eye bags + + for(var/stimulant in stimulants) + if(quirk_holder.has_reagent(stimulant)) //checking for stims + stims_present = TRUE + break + if(!stims_present) //no stims and no sleep means an unhappy camper + happy_camper = FALSE + + //adjusts the mood event accordingly + if(("all_nighter" in quirk_holder.mob_mood.mood_events) && happy_camper) + quirk_holder.clear_mood_event("all_nighter", /datum/mood_event/all_nighter) + if(!("all_nighter" in quirk_holder.mob_mood.mood_events) && !happy_camper) + quirk_holder.add_mood_event("all_nighter", /datum/mood_event/all_nighter) + to_chat(quirk_holder, span_danger("You start feeling tired again.")) + + //adjusts bag overlay accordingly + if(bodypart_overlay && beauty_sleep) + remove_bags() + if(!bodypart_overlay && !beauty_sleep) + add_bags() + + +#undef SLEEP_BANK_MULTIPLIER diff --git a/icons/mob/human/species/misc/bodypart_overlay_simple.dmi b/icons/mob/human/species/misc/bodypart_overlay_simple.dmi index 55fb5c40a842a37c65d640076eb5a1c5883801d7..8df76eb63147b119adf577b8c0dfca90b16b9f08 100644 GIT binary patch literal 2016 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 ywnzq^wTQNP^;LoFHo(#>Ha47)JyP)xM3U_)>4n