From e6484a22a8219cefc36eec3ea0ec15e307110be2 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 29 Nov 2019 05:34:17 +0100
Subject: [PATCH] Ports tgstation loom changes, and durathred golems.
---
code/__DEFINES/status_effects.dm | 2 +
code/__DEFINES/traits.dm | 5 ++-
code/datums/status_effects/debuffs.dm | 32 +++++++++++++
code/game/objects/items/tools/wirecutters.dm | 21 ++++++---
.../objects/structures/ghost_role_spawners.dm | 3 ++
code/game/objects/structures/loom.dm | 45 ++++++++++++++-----
code/modules/cargo/packs/materials.dm | 2 +-
code/modules/mob/living/carbon/human/human.dm | 15 +++++++
.../mob/living/carbon/human/human_defense.dm | 6 +++
.../mob/living/carbon/human/species.dm | 4 ++
.../carbon/human/species_types/golems.dm | 15 +++++++
code/modules/mob/living/carbon/life.dm | 2 +-
code/modules/ruins/lavaland_ruin_code.dm | 3 +-
13 files changed, 133 insertions(+), 22 deletions(-)
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 0f1a36d663..f9360117bb 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -58,6 +58,8 @@
#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
+#define STATUS_EFFECT_CHOKINGSTRAND /datum/status_effect/strandling //Choking Strand
+
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 60212385f8..50b4954d60 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -120,8 +120,9 @@
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
#define TRAIT_SOOTHED_THROAT "soothed-throat"
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
-#define TRAIT_STRONG_GRABBER "strong_grabber"
-#define TRAIT_CALCIUM_HEALER "calcium_healer"
+#define TRAIT_STRONG_GRABBER "strong_grabber"
+#define TRAIT_CALCIUM_HEALER "calcium_healer"
+#define TRAIT_MAGIC_CHOKE "magic_choke"
#define TRAIT_CAPTAIN_METABOLISM "captain-metabolism"
#define TRAIT_ABDUCTOR_TRAINING "abductor-training"
#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 84ed012b82..ac2d2f37ab 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -541,6 +541,38 @@
icon_state = "ichorial_stain"
alerttooltipstyle = "clockcult"
+
+//GOLEM GANG
+
+/datum/status_effect/strandling //get it, strand as in durathread strand + strangling = strandling hahahahahahahahahahhahahaha i want to die
+ id = "strandling"
+ status_type = STATUS_EFFECT_UNIQUE
+ alert_type = /obj/screen/alert/status_effect/strandling
+
+/datum/status_effect/strandling/on_apply()
+ ADD_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron")
+ return ..()
+
+/datum/status_effect/strandling/on_remove()
+ REMOVE_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron")
+ return ..()
+
+/obj/screen/alert/status_effect/strandling
+ name = "Choking strand"
+ desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand."
+ icon_state = "his_grace"
+ alerttooltipstyle = "hisgrace"
+
+/obj/screen/alert/status_effect/strandling/Click(location, control, params)
+ . = ..()
+ to_chat(mob_viewer, "You attempt to remove the durathread strand from around your neck.")
+ if(do_after(mob_viewer, 35, null, mob_viewer))
+ if(isliving(mob_viewer))
+ var/mob/living/L = mob_viewer
+ to_chat(mob_viewer, "You succesfuly remove the durathread strand.")
+ L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+
+
datum/status_effect/pacify
id = "pacify"
status_type = STATUS_EFFECT_REPLACE
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index fe8b4b2d56..e4b95a5073 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -122,12 +122,21 @@
user.put_in_active_hand(pryjaws)
/obj/item/wirecutters/power/attack(mob/living/carbon/C, mob/user)
- if(istype(C) && C.handcuffed)
- user.visible_message("[user] cuts [C]'s restraints with [src]!")
- qdel(C.handcuffed)
- return
- else
- ..()
+ if(istype(C))
+ if(C.handcuffed)
+ user.visible_message("[user] cuts [C]'s restraints with [src]!")
+ qdel(C.handcuffed)
+ return
+ else if(C.has_status_effect(STATUS_EFFECT_CHOKINGSTRAND))
+ var/man = C == user ? "your" : "[C]'\s"
+ user.visible_message("[user] attempts to remove the durathread strand from around [man] neck.", \
+ "You attempt to remove the durathread strand from around [man] neck.")
+ if(do_after(user, 15, null, C))
+ user.visible_message("[user] succesfuly removes the durathread strand.",
+ "You succesfuly remove the durathread strand.")
+ C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+ return
+ ..()
/obj/item/wirecutters/advanced
name = "advanced wirecutters"
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index e3585b601e..319cf20595 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -151,6 +151,9 @@
log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
+ if(has_owner)
+ var/datum/species/golem/G = H.dna.species
+ G.owner = owner
H.set_cloned_appearance()
if(!name)
if(has_owner)
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
index c4e1968e59..90a05bbad8 100644
--- a/code/game/objects/structures/loom.dm
+++ b/code/game/objects/structures/loom.dm
@@ -1,5 +1,7 @@
-//Loom, turns raw cotton and durathread into their respective fabrics.
+#define FABRIC_PER_SHEET 4
+
+///This is a loom. It's usually made out of wood and used to weave fabric like durathread or cotton into their respective cloth types.
/obj/structure/loom
name = "loom"
desc = "A simple device used to weave cloth and other thread-based fabrics together into usable material."
@@ -8,14 +10,35 @@
density = TRUE
anchored = TRUE
-/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user)
- if(W.is_fabric && W.amount > 1)
- user.show_message("You start weaving the [W.name] through the loom..", 1)
- if(W.use_tool(src, user, W.pull_effort))
+/obj/structure/loom/attackby(obj/item/I, mob/user)
+ if(weave(I, user))
+ return
+ return ..()
+
+/obj/structure/loom/wrench_act(mob/living/user, obj/item/I)
+ ..()
+ default_unfasten_wrench(user, I, 5)
+ return TRUE
+
+///Handles the weaving.
+/obj/structure/loom/proc/weave(obj/item/stack/sheet/cotton/W, mob/user)
+ if(!istype(W))
+ return FALSE
+ if(!anchored)
+ user.show_message("The loom needs to be wrenched down.", 1)
+ return FALSE
+ if(W.amount < FABRIC_PER_SHEET)
+ user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", 1)
+ return FALSE
+ user.show_message("You start weaving \the [W.name] through the loom..", 1)
+ if(W.use_tool(src, user, W.pull_effort))
+ if(W.amount >= FABRIC_PER_SHEET)
new W.loom_result(drop_location())
- user.show_message("You weave the [W.name] into a workable fabric.", 1)
- W.amount = (W.amount - 2)
- if(W.amount < 1)
- qdel(W)
- else
- user.show_message("You need a valid fabric and at least 2 of said fabric before using this.", 1)
\ No newline at end of file
+ W.use(FABRIC_PER_SHEET)
+ user.show_message("You weave \the [W.name] into a workable fabric.", 1)
+ return TRUE
+
+/obj/structure/loom/unanchored
+ anchored = FALSE
+
+#undef FABRIC_PER_SHEET
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index 615fbfe827..8bee679b9d 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -195,7 +195,7 @@
name = "Loom"
desc = "A large pre-made loom."
cost = 1000
- contains = list(/obj/structure/loom)
+ contains = list(/obj/structure/loom/unanchored)
crate_name = "loom crate"
crate_type = /obj/structure/closet/crate/large
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9eab9054f5..3ae2e3bdbd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1043,6 +1043,21 @@
/mob/living/carbon/human/species/golem/plastic
race = /datum/species/golem/plastic
+/mob/living/carbon/human/species/golem/bronze
+ race = /datum/species/golem/bronze
+
+/mob/living/carbon/human/species/golem/cardboard
+ race = /datum/species/golem/cardboard
+
+/mob/living/carbon/human/species/golem/leather
+ race = /datum/species/golem/leather
+
+/mob/living/carbon/human/species/golem/bone
+ race = /datum/species/golem/bone
+
+/mob/living/carbon/human/species/golem/durathread
+ race = /datum/species/golem/durathread
+
/mob/living/carbon/human/species/golem/clockwork
race = /datum/species/golem/clockwork
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 327ad6760c..f9fa5d84da 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -661,6 +661,12 @@
if(health >= 0)
if(src == M)
+ if(has_status_effect(STATUS_EFFECT_CHOKINGSTRAND))
+ to_chat(src, "You attempt to remove the durathread strand from around your neck.")
+ if(do_after(src, 35, null, src))
+ to_chat(src, "You succesfuly remove the durathread strand.")
+ remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+ return
var/to_send = ""
visible_message("[src] examines [p_them()]self.", \
"You check yourself for injuries.")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 7ff4f355d5..ba7acf76d7 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1537,6 +1537,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.lastattacker = user.real_name
target.lastattackerckey = user.ckey
+ user.dna.species.spec_unarmedattacked(user, target)
if(user.limb_destroyer)
target.dismembering_strike(user, affecting.body_zone)
@@ -1550,6 +1551,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(target.lying)
target.forcesay(GLOB.hit_appends)
+/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
+ return
+
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
// CITADEL EDIT slap mouthy gits and booty
var/aim_for_mouth = user.zone_selected == "mouth"
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index edd0be01b0..70e5e28365 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -944,6 +944,21 @@
grab_sound = 'sound/weapons/whipgrab.ogg'
attack_sound = 'sound/weapons/whip.ogg'
+/datum/species/golem/durathread
+ name = "Durathread Golem"
+ id = "durathread golem"
+ prefix = "Durathread"
+ limbs_id = "d_golem"
+ special_names = list("Boll","Weave")
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES)
+ fixed_mut_color = null
+ inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
+
+/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
+ . = ..()
+ target.apply_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+
/datum/species/golem/bone
name = "Bone Golem"
id = "bone golem"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 3c587a05dd..16a9f07ceb 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -98,7 +98,7 @@
var/datum/gas_mixture/breath
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && lungs.organ_flags & ORGAN_FAILING))
+ if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || HAS_TRAIT(src, TRAIT_MAGIC_CHOKE) || (lungs && lungs.organ_flags & ORGAN_FAILING))
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
else if(health <= crit_threshold)
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index d12195cc52..b6e0db2646 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -85,7 +85,8 @@
/obj/item/stack/tile/bronze = /datum/species/golem/bronze,
/obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard,
/obj/item/stack/sheet/leather = /datum/species/golem/leather,
- /obj/item/stack/sheet/bone = /datum/species/golem/bone)
+ /obj/item/stack/sheet/bone = /datum/species/golem/bone,
+ /obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread)
if(istype(I, /obj/item/stack))
var/obj/item/stack/O = I