From d4db51175f34adb7de8377f16050f31ef5cbeb99 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sat, 9 Jan 2021 15:39:06 -0700
Subject: [PATCH] Merge pull request #13965 from Xantholne/GoodNightDisky
Good Night Disky
---
code/datums/elements/bed_tucking.dm | 60 +++++++++++++++++++
code/game/objects/items/devices/paicard.dm | 1 +
code/game/objects/items/plushes.dm | 1 +
.../objects/structures/beds_chairs/bed.dm | 10 ++++
code/game/objects/structures/bedsheet_bin.dm | 4 ++
.../nukeop/equipment/nuclearbomb.dm | 14 +++++
tgstation.dme | 1 +
7 files changed, 91 insertions(+)
create mode 100644 code/datums/elements/bed_tucking.dm
diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm
new file mode 100644
index 00000000..602c93fa
--- /dev/null
+++ b/code/datums/elements/bed_tucking.dm
@@ -0,0 +1,60 @@
+/// Tucking element, for things that can be tucked into bed.
+/datum/element/bed_tuckable
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ /// our pixel_x offset - how much the item moves x when in bed (+x is closer to the pillow)
+ var/x_offset = 0
+ /// our pixel_y offset - how much the item move y when in bed (-y is closer to the middle)
+ var/y_offset = 0
+ /// our rotation degree - how much the item turns when in bed (+degrees turns it more parallel)
+ var/rotation_degree = 0
+
+/datum/element/bed_tuckable/Attach(obj/target, x = 0, y = 0, rotation = 0)
+ . = ..()
+ if(!isitem(target))
+ return ELEMENT_INCOMPATIBLE
+
+ x_offset = x
+ y_offset = y
+ rotation_degree = rotation
+ RegisterSignal(target, COMSIG_ITEM_ATTACK_OBJ, .proc/tuck_into_bed)
+
+/datum/element/bed_tuckable/Detach(obj/target)
+ . = ..()
+ UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_PICKUP))
+
+/**
+ * Tuck our object into bed.
+ *
+ * tucked - the object being tucked
+ * target_bed - the bed we're tucking them into
+ * tucker - the guy doing the tucking
+ */
+/datum/element/bed_tuckable/proc/tuck_into_bed(obj/item/tucked, obj/structure/bed/target_bed, mob/living/tucker)
+
+
+ if(!istype(target_bed))
+ return
+
+ if(!tucker.transferItemToLoc(tucked, target_bed.drop_location()))
+ return
+
+ to_chat(tucker, "You lay [tucked] out on [target_bed].")
+ tucked.pixel_x = x_offset
+ tucked.pixel_y = y_offset
+ if(rotation_degree)
+ tucked.transform = turn(tucked.transform, rotation_degree)
+ RegisterSignal(tucked, COMSIG_ITEM_PICKUP, .proc/untuck)
+
+ return COMPONENT_NO_AFTERATTACK
+
+/**
+ * If we rotate our object, then we need to un-rotate it when it's picked up
+ *
+ * tucked - the object that is tucked
+ */
+/datum/element/bed_tuckable/proc/untuck(obj/item/tucked)
+
+
+ tucked.transform = turn(tucked.transform, -rotation_degree)
+ UnregisterSignal(tucked, COMSIG_ITEM_PICKUP)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 673a134d..454ebaa9 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -17,6 +17,7 @@
/obj/item/paicard/Initialize()
SSpai.pai_card_list += src
add_overlay("pai-off")
+ AddElement(/datum/element/bed_tuckable, 6, -5, 90)
return ..()
/obj/item/paicard/Destroy()
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 8a2959c5..5289fdb5 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -34,6 +34,7 @@
/obj/item/toy/plush/Initialize()
. = ..()
AddComponent(/datum/component/squeak, squeak_override)
+ AddElement(/datum/element/bed_tuckable, 6, -5, 90)
//have we decided if Pinocchio goes in the blue or pink aisle yet?
if(gender == NEUTER)
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 50874c39..8ceae94a 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -40,6 +40,16 @@
if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1))
W.play_tool_sound(src)
deconstruct(TRUE)
+ else if(istype(W, /obj/item/bedsheet))
+ if(user.transferItemToLoc(W, drop_location()))
+ to_chat(user, "You make \the [src] with [W].")
+ W.pixel_x = 0
+ W.pixel_y = 0
+ else if(istype(W, /obj/item/disk/nuclear))
+ if(user.transferItemToLoc(W, drop_location()))
+ to_chat(user, "You tuck little disky into bed. Good night disky.")
+ W.pixel_x = 6 //make sure they reach the pillow
+ W.pixel_y = -6
else
return ..()
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 3eb9a933..23eb45bb 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -22,6 +22,10 @@ LINEN BINS
dog_fashion = /datum/dog_fashion/head/ghost
var/list/dream_messages = list("white")
+/obj/item/bedsheet/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/bed_tuckable, 0, 0, 0)
+
/obj/item/bedsheet/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
..()
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 17611e2f..aee440c0 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -626,6 +626,8 @@ This is here to make the tiles around the station mininuke change when it's arme
/obj/item/disk/nuclear/Initialize()
. = ..()
+ AddElement(/datum/element/bed_tuckable, 6, -6, 0)
+
if(!fake)
GLOB.poi_list |= src
last_disk_move = world.time
@@ -640,7 +642,19 @@ This is here to make the tiles around the station mininuke change when it's arme
STOP_PROCESSING(SSobj, src)
CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck")
var/turf/newturf = get_turf(src)
+
if(newturf && lastlocation == newturf)
+
+ // How comfy is disky?
+ var/disk_comfort_level = 0
+
+ // Checking for items that make disky comfy
+ for(var/obj/comfort_item in loc)
+ if(istype(comfort_item, /obj/item/bedsheet) || istype(comfort_item, /obj/structure/bed))
+ disk_comfort_level++
+
+ if(disk_comfort_level >= 2) //Sleep tight, disky.
+ visible_message("[src] sleeps soundly. Sleep tight, disky.")
if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001))
var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
if(istype(loneop))
diff --git a/tgstation.dme b/tgstation.dme
index 855cf5a3..9f689647 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -463,6 +463,7 @@
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\diseases\advance\symptoms\youth.dm"
#include "code\datums\elements\_element.dm"
+#include "code\datums\elements\bed_tucking.dm"
#include "code\datums\elements\cleaning.dm"
#include "code\datums\elements\earhealing.dm"
#include "code\datums\elements\flavor_text.dm"