From a02e928e2e8b15177568fcfd3078d73e75f8865e Mon Sep 17 00:00:00 2001
From: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com>
Date: Sat, 31 Jul 2021 18:58:55 -0300
Subject: [PATCH] Turns rust component into bespoke element (#60496)
---
code/datums/components/rust.dm | 84 -------------------
code/datums/elements/rust.dm | 63 ++++++++++++++
code/game/atoms.dm | 2 +-
code/game/turfs/closed/wall/misc_walls.dm | 36 ++++----
code/game/turfs/open/floor/iron_floor.dm | 2 +-
code/game/turfs/open/floor/misc_floor.dm | 17 +++-
.../revenant/revenant_abilities.dm | 4 +-
tgstation.dme | 2 +-
8 files changed, 103 insertions(+), 107 deletions(-)
delete mode 100644 code/datums/components/rust.dm
create mode 100644 code/datums/elements/rust.dm
diff --git a/code/datums/components/rust.dm b/code/datums/components/rust.dm
deleted file mode 100644
index 54fe02ae807..00000000000
--- a/code/datums/components/rust.dm
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Adding this component to an Atom will have it automatically render an overlay.
- * The overlay can be specified in new as the first paramter; if not set it defaults to rust_overlay's rust_default
- */
-/datum/component/rust
- dupe_mode = COMPONENT_DUPE_UNIQUE
- /// Internal variable to store the rust overlay we are using to avoid regenerating it every overlay update call
- var/mutable_appearance/rust_overlay
-
-/turf/closed/wall/rust/New()
- var/atom/wall_new = new /turf/closed/wall(src)
- wall_new.AddComponent(/datum/component/rust)
-
-/turf/closed/wall/r_wall/rust/New()
- var/atom/wall_new = new /turf/closed/wall/r_wall(src)
- wall_new.AddComponent(/datum/component/rust)
-
-/turf/open/floor/plating/rust/New()
- var/atom/wall_new = new /turf/open/floor/plating(src)
- wall_new.AddComponent(/datum/component/rust)
-
-/datum/component/rust/Initialize(mutable_appearance/overlay)
- . = ..()
- if(!isatom(parent))
- return COMPONENT_INCOMPATIBLE
- rust_overlay = overlay || mutable_appearance('icons/effects/rust_overlay.dmi', "rust_default")
- // Unfortunately registering with parent sometimes doesn't cause an overlay update
- ADD_TRAIT(parent, TRAIT_RUSTY, src)
- var/atom/parent_atom = parent
- parent_atom.update_icon(UPDATE_OVERLAYS)
-
-/datum/component/rust/RegisterWithParent()
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_rust_overlay)
- RegisterSignal(parent, list(COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_WELDER), COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_RUSTSCRAPER)), .proc/secondary_tool_act)
- RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/parent_del)
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/handle_examine)
-
-/datum/component/rust/UnregisterFromParent()
- UnregisterSignal(parent,\
- list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_WELDER), COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_RUSTSCRAPER)), COMSIG_PARENT_PREQDELETED)
- REMOVE_TRAIT(parent, TRAIT_RUSTY, src)
- var/atom/parent_atom = parent
- parent_atom.update_icon(UPDATE_OVERLAYS)
-
-/datum/component/rust/proc/handle_examine(datum/source, mob/user, list/examine_text)
- SIGNAL_HANDLER
- examine_text += span_notice("[source] is very rusty, you could probably burn or scrape it off.")
-
-/datum/component/rust/proc/apply_rust_overlay(atom/parent_atom, list/overlays)
- SIGNAL_HANDLER
- overlays |= rust_overlay
-
-/datum/component/rust/proc/parent_del()
- SIGNAL_HANDLER
- qdel(src)
-
-/datum/component/rust/Destroy()
- rust_overlay = null
- return ..()
-
-/// We call this from secondary_tool_act because we sleep with do_after
-/datum/component/rust/proc/handle_tool_use(atom/source, mob/user, obj/item/item)
- switch(item.tool_behaviour)
- if(TOOL_WELDER)
- if(item.use(5))
- user.balloon_alert(user, "burning off rust...")
- if(!do_after(user, 5 SECONDS * item.toolspeed, parent))
- return
- user.balloon_alert(user, "burned off rust")
- qdel(src)
- return
- if(TOOL_RUSTSCRAPER)
- user.balloon_alert(user, "scraping off rust...")
- if(!do_after(user, 2 SECONDS * item.toolspeed, parent))
- return
- user.balloon_alert(user, "scraped off rust")
- qdel(src)
- return
-
-/// Because do_after sleeps we register the signal here and defer via an async call
-/datum/component/rust/proc/secondary_tool_act(atom/source, mob/user, obj/item/item)
- SIGNAL_HANDLER
- INVOKE_ASYNC(src, .proc/handle_tool_use, source, user, item)
- return COMPONENT_BLOCK_TOOL_ATTACK
diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm
new file mode 100644
index 00000000000..209c9f97b3d
--- /dev/null
+++ b/code/datums/elements/rust.dm
@@ -0,0 +1,63 @@
+/**
+ * Adding this element to an atom will have it automatically render an overlay.
+ * The overlay can be specified in new as the first paramter; if not set it defaults to rust_overlay's rust_default
+ */
+/datum/element/rust
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ /// The rust image itself, since the icon and icon state are only used as an argument
+ var/image/rust_overlay
+
+/datum/element/rust/Attach(atom/target, rust_icon = 'icons/effects/rust_overlay.dmi', rust_icon_state = "rust_default")
+ . = ..()
+ if(!isatom(target))
+ return COMPONENT_INCOMPATIBLE
+ if(!rust_overlay)
+ rust_overlay = image(rust_icon, rust_icon)
+ ADD_TRAIT(target, TRAIT_RUSTY, src)
+ RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_rust_overlay)
+ RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/handle_examine)
+ RegisterSignal(target, list(COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_WELDER), COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_RUSTSCRAPER)), .proc/secondary_tool_act)
+ // Unfortunately registering with parent sometimes doesn't cause an overlay update
+ target.update_icon(UPDATE_OVERLAYS)
+
+/datum/element/rust/Detach(atom/source)
+ . = ..()
+ UnregisterSignal(source, COMSIG_ATOM_UPDATE_OVERLAYS)
+ UnregisterSignal(source, COMSIG_PARENT_EXAMINE)
+ UnregisterSignal(source, list(COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_WELDER), COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_RUSTSCRAPER)))
+ REMOVE_TRAIT(source, TRAIT_RUSTY, src)
+ source.update_icon(UPDATE_OVERLAYS)
+
+/datum/element/rust/proc/handle_examine(datum/source, mob/user, list/examine_text)
+ SIGNAL_HANDLER
+ examine_text += span_notice("[source] is very rusty, you could probably burn or scrape it off.")
+
+/datum/element/rust/proc/apply_rust_overlay(atom/parent_atom, list/overlays)
+ SIGNAL_HANDLER
+ overlays |= rust_overlay
+
+/// Because do_after sleeps we register the signal here and defer via an async call
+/datum/element/rust/proc/secondary_tool_act(atom/source, mob/user, obj/item/item)
+ SIGNAL_HANDLER
+ INVOKE_ASYNC(src, .proc/handle_tool_use, source, user, item)
+ return COMPONENT_BLOCK_TOOL_ATTACK
+
+/// We call this from secondary_tool_act because we sleep with do_after
+/datum/element/rust/proc/handle_tool_use(atom/source, mob/user, obj/item/item)
+ switch(item.tool_behaviour)
+ if(TOOL_WELDER)
+ if(item.use(5))
+ user.balloon_alert(user, "burning off rust...")
+ if(!do_after(user, 5 SECONDS * item.toolspeed, source))
+ return
+ user.balloon_alert(user, "burned off rust")
+ qdel(src)
+ return
+ if(TOOL_RUSTSCRAPER)
+ user.balloon_alert(user, "scraping off rust...")
+ if(!do_after(user, 2 SECONDS * item.toolspeed, source))
+ return
+ user.balloon_alert(user, "scraped off rust")
+ qdel(src)
+ return
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 2b782e5aa06..f1326e03c30 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1936,7 +1936,7 @@
* Override this if you want custom behaviour in whatever gets hit by the rust
*/
/atom/proc/rust_heretic_act()
- AddComponent(/datum/component/rust)
+ AddElement(/datum/element/rust)
/**
* Used to set something as 'open' if it's being used as a supplypod
diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm
index f9b262d474c..667e59d5500 100644
--- a/code/game/turfs/closed/wall/misc_walls.dm
+++ b/code/game/turfs/closed/wall/misc_walls.dm
@@ -75,22 +75,30 @@
bullet_sizzle = TRUE
/turf/closed/wall/rust
- name = "rusted wall"
- desc = "A rusted metal wall."
- icon = 'icons/turf/walls/rusty_wall.dmi'
- icon_state = "rusty_wall-0"
- base_icon_state = "rusty_wall"
- smoothing_flags = SMOOTH_BITMASK
- hardness = 45
+ //SDMM supports colors, this is simply for easier mapping
+ //and should be removed on initialize
+ color = COLOR_ORANGE_BROWN
+
+/turf/closed/wall/rust/Initialize(mapload)
+ . = ..()
+ color = null
+
+/turf/closed/wall/rust/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/rust)
/turf/closed/wall/r_wall/rust
- name = "rusted reinforced wall"
- desc = "A huge chunk of rusted reinforced metal."
- icon = 'icons/turf/walls/rusty_reinforced_wall.dmi'
- icon_state = "rusty_reinforced_wall-0"
- base_icon_state = "rusty_reinforced_wall"
- smoothing_flags = SMOOTH_BITMASK
- hardness = 15
+ //SDMM supports colors, this is simply for easier mapping
+ //and should be removed on initialize
+ color = COLOR_ORANGE_BROWN
+
+/turf/closed/wall/r_wall/Initialize(mapload)
+ . = ..()
+ color = null
+
+/turf/closed/wall/r_wall/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/rust)
/turf/closed/wall/mineral/bronze
name = "clockwork wall"
diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm
index f430fe48186..a3c13d7e419 100644
--- a/code/game/turfs/open/floor/iron_floor.dm
+++ b/code/game/turfs/open/floor/iron_floor.dm
@@ -18,7 +18,7 @@
if(prob(70))
new /obj/effect/temp_visual/glowing_rune(src)
var/atom/changed_turf = ChangeTurf(/turf/open/floor/plating)
- changed_turf.AddComponent(/datum/component/rust)
+ changed_turf.AddElement(/datum/element/rust)
return ..()
diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm
index eaeb50000a4..c2661b503b7 100644
--- a/code/game/turfs/open/floor/misc_floor.dm
+++ b/code/game/turfs/open/floor/misc_floor.dm
@@ -200,17 +200,26 @@
return list("eightiesred_damaged")
/turf/open/floor/plating/rust
- name = "rusted plating"
- desc = "Corrupted steel."
- icon_state = "plating_rust"
+ //SDMM supports colors, this is simply for easier mapping
+ //and should be removed on initialize
+ color = COLOR_BROWN
+
+/turf/open/floor/plating/rust/Initialize(mapload)
+ . = ..()
+ color = null
+
+/turf/open/floor/plating/rust/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/rust)
/turf/open/floor/plating/plasma
initial_gas_mix = ATMOS_TANK_PLASMA
+
/turf/open/floor/plating/plasma/rust/Initialize(mapload)
. = ..()
// Because this is a fluff turf explicitly for KiloStation it doesn't make sense to ChangeTurf like usual
// Especially since it looks like we don't even change the default icon/iconstate???
- AddComponent(/datum/component/rust)
+ AddElement(/datum/element/rust)
/turf/open/floor/stone
name = "stone brick floor"
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index 13b77f00038..32942091860 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -264,10 +264,10 @@
floor.make_plating(TRUE)
if(T.type == /turf/closed/wall && prob(15) && !HAS_TRAIT(T, TRAIT_RUSTY))
new /obj/effect/temp_visual/revenant(T)
- T.AddComponent(/datum/component/rust)
+ T.AddElement(/datum/element/rust)
if(T.type == /turf/closed/wall/r_wall && prob(10) && !HAS_TRAIT(T, TRAIT_RUSTY))
new /obj/effect/temp_visual/revenant(T)
- T.AddComponent(/datum/component/rust)
+ T.AddElement(/datum/element/rust)
for(var/obj/effect/decal/cleanable/food/salt/salt in T)
new /obj/effect/temp_visual/revenant(T)
qdel(salt)
diff --git a/tgstation.dme b/tgstation.dme
index 0ab573aa053..b4f7a9c4b79 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -563,7 +563,6 @@
#include "code\datums\components\rename.dm"
#include "code\datums\components\rot.dm"
#include "code\datums\components\rotation.dm"
-#include "code\datums\components\rust.dm"
#include "code\datums\components\shell.dm"
#include "code\datums\components\shielded.dm"
#include "code\datums\components\shrink.dm"
@@ -737,6 +736,7 @@
#include "code\datums\elements\point_of_interest.dm"
#include "code\datums\elements\rad_insulation.dm"
#include "code\datums\elements\ridable.dm"
+#include "code\datums\elements\rust.dm"
#include "code\datums\elements\selfknockback.dm"
#include "code\datums\elements\series.dm"
#include "code\datums\elements\simple_flying.dm"