diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm deleted file mode 100644 index 60317797a7..0000000000 --- a/code/datums/components/decal.dm +++ /dev/null @@ -1,77 +0,0 @@ -/datum/component/decal - dupe_mode = COMPONENT_DUPE_ALLOWED - can_transfer = TRUE - var/cleanable - var/description - var/mutable_appearance/pic - - var/first_dir // This only stores the dir arg from init - -/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255) - if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)) - return COMPONENT_INCOMPATIBLE - first_dir = _dir - description = _description - cleanable = _cleanable - - apply() - -/datum/component/decal/RegisterWithParent() - . = ..() - if(first_dir) - RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react) - if(cleanable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) - if(description) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) - -/datum/component/decal/UnregisterFromParent() - . = ..() - UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) - -/datum/component/decal/Destroy() - remove() - return ..() - -/datum/component/decal/PreTransfer() - remove() - -/datum/component/decal/PostTransfer() - remove() - apply() - -/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha) - if(!_icon || !_icon_state) - return FALSE - // It has to be made from an image or dir breaks because of a byond bug - var/temp_image = image(_icon, null, _icon_state, _layer, _dir) - pic = new(temp_image) - pic.color = _color - pic.alpha = _alpha - return TRUE - -/datum/component/decal/proc/apply(atom/thing) - var/atom/master = thing || parent - master.add_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/remove(atom/thing) - var/atom/master = thing || parent - master.cut_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir) - if(old_dir == new_dir) - return - remove() - pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir)) - apply() - -/datum/component/decal/proc/clean_react(datum/source, strength) - if(strength >= cleanable) - qdel(src) - -/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list) - examine_list += description \ No newline at end of file diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm deleted file mode 100644 index c8be6251b5..0000000000 --- a/code/datums/components/decals/blood.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/component/decal/blood - dupe_mode = COMPONENT_DUPE_UNIQUE - -/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - . = ..() - RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name) - -/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) - var/atom/A = parent - - return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm new file mode 100644 index 0000000000..4bd482915a --- /dev/null +++ b/code/datums/elements/decal.dm @@ -0,0 +1,75 @@ +/datum/element/decal + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/cleanable + var/description + var/mutable_appearance/pic + var/list/num_decals_per_atom + + var/first_dir // This stores the direction of the decal compared to the parent facing NORTH + +/datum/element/decal/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !_icon || !_icon_state || !isatom(target)) + return ELEMENT_INCOMPATIBLE + var/atom/A = target + if(!pic) + // It has to be made from an image or dir breaks because of a byond bug + var/temp_image = image(_icon, null, _icon_state, _layer, _dir) + pic = new(temp_image) + pic.color = _color + pic.alpha = _alpha + first_dir = _dir + description = _description + cleanable = _cleanable + + LAZYINITLIST(num_decals_per_atom) + + if(!num_decals_per_atom[A]) + if(first_dir) + RegisterSignal(A, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react) + if(cleanable) + RegisterSignal(A, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) + if(description) + RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/examine) + + apply(A, TRUE) + + num_decals_per_atom[A]++ + +/datum/element/decal/Detach(datum/target) + var/atom/A = target + remove(A, A.dir) + UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) + LAZYREMOVE(num_decals_per_atom, A) + return ..() + +/datum/element/decal/proc/remove(atom/target, old_dir) + pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(old_dir)) + for(var/i in 1 to num_decals_per_atom[target]) + target.cut_overlay(pic, TRUE) + if(isitem(target)) + addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) + +/datum/element/decal/proc/apply(atom/target, init = FALSE) + pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(target.dir)) + if(init) + target.add_overlay(pic, TRUE) + else + for(var/i in 1 to num_decals_per_atom[target]) + target.add_overlay(pic, TRUE) + if(isitem(target)) + addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) + +/datum/element/decal/proc/rotate_react(datum/source, old_dir, new_dir) + if(old_dir == new_dir) + return + remove(source, old_dir) + apply(source) + +/datum/element/decal/proc/clean_react(datum/source, strength) + if(strength >= cleanable) + Detach(source) + +/datum/element/decal/proc/examine(datum/source, mob/user, list/examine_list) + examine_list += description diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 5dbd18aa0c..25b262a146 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -46,4 +46,4 @@ var/turf/T = loc if(!istype(T)) //you know this will happen somehow CRASH("Turf decal initialized in an object/nullspace") - T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha) + T.AddElement(/datum/element/decal, icon, icon_state, turn(dir, -dir2angle(T.dir)), CLEAN_GOD, color, null, null, alpha) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index b6be778456..c9a31a48c2 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -157,7 +157,7 @@ to_chat(user, "You need to get closer!") return if(use_paint(user) && isturf(F)) - F.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha) + F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, turn(stored_dir, -dir2angle(F.dir)), CLEAN_STRONG, color, null, null, alpha) /obj/item/airlock_painter/decal/attack_self(mob/user) if((ink) && (ink.charges >= 1)) diff --git a/tgstation.dme b/tgstation.dme index b6bf5b4ea8..93958e5d96 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -397,7 +397,6 @@ #include "code\datums\components\chasm.dm" #include "code\datums\components\combat_mode.dm" #include "code\datums\components\construction.dm" -#include "code\datums\components\decal.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\earprotection.dm" #include "code\datums\components\edit_complainer.dm" @@ -527,6 +526,7 @@ #include "code\datums\elements\art.dm" #include "code\datums\elements\beauty.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\decal.dm" #include "code\datums\elements\dusts_on_catatonia.dm" #include "code\datums\elements\dusts_on_leaving_area.dm" #include "code\datums\elements\dwarfism.dm"