From 77e8fbcd327876e981beab5491cf1bc380b39cef Mon Sep 17 00:00:00 2001 From: itseasytosee <55666666+itseasytosee@users.noreply.github.com> Date: Sun, 16 Feb 2020 13:46:57 -0600 Subject: [PATCH 01/11] Fix remaining wand of nothing locations (#49254) Finishes #49240 which wasn't quite done. --- _maps/RandomZLevels/Academy.dmm | 2 +- _maps/map_files/Donutstation/Donutstation.dmm | 4 ++-- code/modules/projectiles/guns/magic/wand.dm | 5 ++++- code/modules/vending/autodrobe.dm | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 7fa61edd43b..7b0f7df9201 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -3139,7 +3139,7 @@ /area/awaymission/academy/academyengine) "mn" = ( /obj/structure/rack, -/obj/item/gun/magic/wand, +/obj/item/gun/magic/wand/nothing, /turf/open/floor/plating, /area/awaymission/academy/academyengine) "mo" = ( diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 38425689ec1..079cbc7b9d7 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -18035,8 +18035,8 @@ }, /area/medical/genetics) "aYg" = ( -/mob/living/carbon/monkey, /obj/effect/landmark/start/geneticist, +/mob/living/carbon/monkey, /turf/open/floor/plasteel, /area/medical/genetics) "aYh" = ( @@ -38797,7 +38797,7 @@ dir = 8 }, /obj/item/toy/figure/mime, -/obj/item/gun/magic/wand, +/obj/item/gun/magic/wand/nothing, /turf/open/floor/carpet, /area/crew_quarters/theatre) "cad" = ( diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 79c8346468b..7b8e2c79dfb 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -1,6 +1,6 @@ /obj/item/gun/magic/wand name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick!" + desc = "It's not just a stick, it's a MAGIC stick! You shouldn't have this." ammo_type = /obj/item/ammo_casing/magic icon_state = "nothingwand" item_state = "wand" @@ -233,4 +233,7 @@ ///////////////////////////////////// /obj/item/gun/magic/wand/nothing + desc = "It's not just a stick, it's a MAGIC stick?" ammo_type = /obj/item/ammo_casing/magic/nothing + + diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index e47b2d8959f..da517e4ff7f 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -125,7 +125,7 @@ /obj/item/gohei = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, - /obj/item/gun/magic/wand = 2, + /obj/item/gun/magic/wand/nothing = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) From 7d95ce2aaa4fff134a72f81a2dca779b8284dec4 Mon Sep 17 00:00:00 2001 From: Timberpoes Date: Sun, 16 Feb 2020 22:28:02 +0000 Subject: [PATCH 02/11] Fix shuttle timer not displaying leading 0 (#49366) The shuttle timer on the status displays doesn't display leading 0s in the seconds counter for numbers less than 10. --- code/modules/shuttle/shuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e9bdf785464..e532631a3af 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -704,7 +704,7 @@ if(timeleft > 1 HOURS) return "--:--" else if(timeleft > 0) - return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]" + return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" else return "00:00" From 66bb9e3ef2cc71720b90597ad7334efeccdaf3e3 Mon Sep 17 00:00:00 2001 From: Capsandi <38051413+Capsandi@users.noreply.github.com> Date: Sun, 16 Feb 2020 17:29:16 -0500 Subject: [PATCH 03/11] Add new mortar sprite (#49375) I was using a mortar in prison when I realized how *interesting* the sprite was. --- icons/obj/chemical.dmi | Bin 47831 -> 48011 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 717d8dd574e364eeebcfc2ef5549f7b99371e6b2..38ce95b8c0ef8f1cda45cffa4de8968c6839d14d 100644 GIT binary patch delta 8254 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 KQ!l+^9sFPM?D8)F delta 8108 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 E2h-q*w*UYD From 87e4255e426fd4bf363cda04122d355acf7478a0 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 16 Feb 2020 14:29:20 -0800 Subject: [PATCH 04/11] Automatic changelog generation for PR #49375 [ci skip] --- html/changelogs/AutoChangeLog-pr-49375.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-49375.yml diff --git a/html/changelogs/AutoChangeLog-pr-49375.yml b/html/changelogs/AutoChangeLog-pr-49375.yml new file mode 100644 index 00000000000..c4f41bc13dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49375.yml @@ -0,0 +1,4 @@ +author: "Capsandi" +delete-after: True +changes: + - imageadd: "added a new mortar sprite" From ef7e4ee3656d1bec7f29b60469be3804eb9f814d Mon Sep 17 00:00:00 2001 From: Dennok Date: Mon, 17 Feb 2020 01:29:07 +0200 Subject: [PATCH 05/11] Set Linkage traits in multiz debug map config (#49339) --- _maps/multiz_debug.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index a3e11abe7b6..e8a474161e7 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -2,5 +2,5 @@ "map_name": "MultiZ Debug", "map_path": "map_files/debug", "map_file": "multiz.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1, "Baseturf" : "/turf/open/openspace"}, {"Down": -1, "Baseturf" : "/turf/open/openspace"}] + "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}] } From 053898e1f9483f16abfddf6250af7878eaeca296 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 16 Feb 2020 15:29:12 -0800 Subject: [PATCH 06/11] Automatic changelog generation for PR #49339 [ci skip] --- html/changelogs/AutoChangeLog-pr-49339.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-49339.yml diff --git a/html/changelogs/AutoChangeLog-pr-49339.yml b/html/changelogs/AutoChangeLog-pr-49339.yml new file mode 100644 index 00000000000..11ffc496e98 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49339.yml @@ -0,0 +1,4 @@ +author: "Dennok" +delete-after: True +changes: + - bugfix: "Now MultiZ Debug connected to neighbor space, in strange way." From e14313b9e6ac7076a6fb03ab0b0715fc9c7232d3 Mon Sep 17 00:00:00 2001 From: yeeyeh <47342933+yeeyeh@users.noreply.github.com> Date: Sun, 16 Feb 2020 20:01:05 -0600 Subject: [PATCH 07/11] Adds spray-on insuls. (#48996) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adds spray-on insuls * gloves go bye bye if you lose an arm * whoops * merge conflicts? in MY pr? its more likely than you think now featuring Signals™ * travis you fuck also adds feedback if you cant spray them on * forgot to remove a commented out line * Removes snowflake that moment when you lose all motivation to code after getting a review so you put it off for a week and then it goes stale 5 minutes after you start working on it again * Uncurses gloves * formalities thank you arcane man * formatting fix i swear i used the tab button but i guess i am just cursed * thank you strange bee creature thank you strange bee creature Co-Authored-By: Bobbahbrown Co-authored-by: Bobbahbrown --- code/__DEFINES/components.dm | 1 + code/modules/clothing/gloves/color.dm | 47 ++++++++++++++++++++++++++ code/modules/power/power.dm | 1 + code/modules/research/bepis.dm | 3 +- icons/mob/clothing/hands.dmi | Bin 8472 -> 8736 bytes icons/obj/clothing/gloves.dmi | Bin 13922 -> 14472 bytes 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index badaaef9ce8..7d70e75208e 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -244,6 +244,7 @@ #define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) +#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" //sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () #define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) #define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 67eb8435656..e4ea0fba14d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -12,6 +12,53 @@ custom_price = 1200 custom_premium_price = 1200 +/obj/item/toy/sprayoncan + name = "spray-on insulation applicator" + desc = "What is the number one problem facing our station today?" + icon = 'icons/obj/clothing/gloves.dmi' + icon_state = "sprayoncan" + +/obj/item/toy/sprayoncan/afterattack(atom/target, mob/living/carbon/user, proximity) + if(iscarbon(target) && proximity) + var/mob/living/carbon/C = target + var/mob/living/carbon/U = user + var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE) + if(success) + if(C == user) + C.visible_message("[U] sprays their hands with glittery rubber!") + else + C.visible_message("[U] sprays glittery rubber on the hands of [C]!") + else + C.visible_message("The rubber fails to stick to [C]'s hands!") + + qdel(src) + +/obj/item/clothing/gloves/color/yellow/sprayon + desc = "How're you gonna get 'em off, nerd?" + name = "spray-on insulated gloves" + icon_state = "sprayon" + item_state = "sprayon" + permeability_coefficient = 0 + resistance_flags = ACID_PROOF + var/shocks_remaining = 10 + +/obj/item/clothing/gloves/color/yellow/sprayon/Initialize() + .=..() + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + +/obj/item/clothing/gloves/color/yellow/sprayon/equipped(mob/user, slot) + . = ..() + RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked) + +/obj/item/clothing/gloves/color/yellow/sprayon/proc/Shocked() + shocks_remaining-- + if(shocks_remaining < 0) + qdel(src) //if we run out of uses, the gloves crumble away into nothing, just like my dreams after working with .dm + +/obj/item/clothing/gloves/color/yellow/sprayon/dropped() + .=..() + qdel(src) //loose nodrop items bad + /obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." name = "budget insulated gloves" diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4552bdc9346..d9eb4ac9fb7 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -292,6 +292,7 @@ if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) + SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) return 0 //to avoid spamming with insulated glvoes on var/area/source_area diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index 6e0b22e0118..dcf9be28e91 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -36,7 +36,8 @@ var/minor_rewards = list(/obj/item/stack/circuit_stack/full, //To add a new minor reward, add it here. /obj/item/airlock_painter/decal, /obj/item/pen/survival, - /obj/item/circuitboard/machine/sleeper/party) + /obj/item/circuitboard/machine/sleeper/party, + /obj/item/toy/sprayoncan) var/static/list/item_list = list() /obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params) diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index c493483ce133209e35346cadf35c0f0211bf8e81..09966df4ec3873934ff5715b2c7064c86cd19e5e 100644 GIT binary patch literal 8736 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 literal 8472 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 C%IatU diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index a90efcdfea1c50dc851f4b953bee6cf81eacc40e..7a3d72c88418dfef4379d7d60782d8948abbd988 100644 GIT binary patch literal 14472 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 V^QJZ725uNa$xEw9RZEzJ{vQ(NS9t&c literal 13922 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 From 32e1496ac8f17bd8382f808108128ca514d6edaa Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 16 Feb 2020 18:01:09 -0800 Subject: [PATCH 08/11] Automatic changelog generation for PR #48996 [ci skip] --- html/changelogs/AutoChangeLog-pr-48996.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-48996.yml diff --git a/html/changelogs/AutoChangeLog-pr-48996.yml b/html/changelogs/AutoChangeLog-pr-48996.yml new file mode 100644 index 00000000000..5de8ede8768 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-48996.yml @@ -0,0 +1,4 @@ +author: "yeeyeh" +delete-after: True +changes: + - rscadd: "Nanotrasen's research division's recent science fair has given light to an amazing, electrically-insulated compound that can be sprayed directly onto the skin. The initial idea was for footwear, but we all know what you're really going to do with it. Research can be continued at your station's B.E.P.I.S. unit." From 163c463b274af91505d52891f68dc8c2aaa4dd88 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Sun, 16 Feb 2020 21:03:06 -0500 Subject: [PATCH 09/11] Stasis supports multiple sources (#49237) * Add grouped status effect This status effect can be applied by multiple sources Will not be removed until all sources remove themselves * Stasis is now a grouped status effect --- code/__DEFINES/status_effects.dm | 6 +- code/datums/status_effects/debuffs.dm | 61 ++++++++++----------- code/datums/status_effects/status_effect.dm | 27 ++++++++- code/game/machinery/stasis.dm | 4 +- 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index c2b75a0bf0f..59a0a4c22a7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -95,7 +95,7 @@ #define STATUS_EFFECT_GO_AWAY /datum/status_effect/go_away //makes you launch through walls in a single direction for a while -#define STATUS_EFFECT_STASIS /datum/status_effect/incapacitating/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc +#define STATUS_EFFECT_STASIS /datum/status_effect/grouped/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc #define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus @@ -125,6 +125,10 @@ #define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic #define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor +// Grouped effect sources, see also code/__DEFINES/traits.dm + +#define STASIS_MACHINE_EFFECT "stasis_machine" + // Stasis helpers #define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS)) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 51794087288..6bb0bc4b6e9 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -98,43 +98,42 @@ icon_state = "asleep" //STASIS -/datum/status_effect/incapacitating/stasis - id = "stasis" - duration = -1 - tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/stasis - var/last_dead_time +/datum/status_effect/grouped/stasis + id = "stasis" + duration = -1 + tick_interval = 10 + alert_type = /obj/screen/alert/status_effect/stasis + var/last_dead_time -/datum/status_effect/incapacitating/stasis/proc/update_time_of_death() - if(last_dead_time) - var/delta = world.time - last_dead_time - var/new_timeofdeath = owner.timeofdeath + delta - owner.timeofdeath = new_timeofdeath - owner.tod = station_time_timestamp(wtime=new_timeofdeath) - last_dead_time = null - if(owner.stat == DEAD) - last_dead_time = world.time +/datum/status_effect/grouped/stasis/proc/update_time_of_death() + if(last_dead_time) + var/delta = world.time - last_dead_time + var/new_timeofdeath = owner.timeofdeath + delta + owner.timeofdeath = new_timeofdeath + owner.tod = station_time_timestamp(wtime=new_timeofdeath) + last_dead_time = null + if(owner.stat == DEAD) + last_dead_time = world.time -/datum/status_effect/incapacitating/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) - . = ..() - update_time_of_death() - owner.reagents?.end_metabolization(owner, FALSE) +/datum/status_effect/grouped/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) + . = ..() + if(.) + update_time_of_death() + owner.reagents?.end_metabolization(owner, FALSE) + owner.update_mobility() -/datum/status_effect/incapacitating/stasis/tick() - update_time_of_death() +/datum/status_effect/grouped/stasis/tick() + update_time_of_death() -/datum/status_effect/incapacitating/stasis/on_remove() - update_time_of_death() - return ..() - -/datum/status_effect/incapacitating/stasis/be_replaced() - update_time_of_death() - return ..() +/datum/status_effect/grouped/stasis/on_remove() + owner.update_mobility() + update_time_of_death() + return ..() /obj/screen/alert/status_effect/stasis - name = "Stasis" - desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." - icon_state = "stasis" + name = "Stasis" + desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." + icon_state = "stasis" //GOLEM GANG diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 112d17c4e72..891102a291d 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -63,6 +63,9 @@ owner = null qdel(src) +/datum/status_effect/proc/before_remove() //! Called before being removed; returning FALSE will cancel removal + return TRUE + /datum/status_effect/proc/refresh() var/original_duration = initial(duration) if(original_duration == -1) @@ -107,12 +110,13 @@ S1 = new effect(arguments) . = S1 -/mob/living/proc/remove_status_effect(effect) //removes all of a given status effect from this mob, returning TRUE if at least one was removed +/mob/living/proc/remove_status_effect(effect, ...) //removes all of a given status effect from this mob, returning TRUE if at least one was removed . = FALSE + var/list/arguments = args.Copy(2) if(status_effects) var/datum/status_effect/S1 = effect for(var/datum/status_effect/S in status_effects) - if(initial(S1.id) == S.id) + if(initial(S1.id) == S.id && S.before_remove(arguments)) qdel(S) . = TRUE @@ -238,3 +242,22 @@ owner.underlays -= status_underlay QDEL_NULL(status_overlay) return ..() + +/// Status effect from multiple sources, when all sources are removed, so is the effect +/datum/status_effect/grouped + status_type = STATUS_EFFECT_MULTIPLE //! Adds itself to sources and destroys itself if one exists already, there are never multiple + var/list/sources = list() + +/datum/status_effect/grouped/on_creation(mob/living/new_owner, source) + var/datum/status_effect/grouped/existing = new_owner.has_status_effect(type) + if(existing) + existing.sources |= source + qdel(src) + return FALSE + else + sources |= source + return ..() + +/datum/status_effect/grouped/before_remove(source) + sources -= source + return !length(sources) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 5392608670e..8daab3a9e16 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -109,12 +109,12 @@ return var/freq = rand(24750, 26550) playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq) - target.apply_status_effect(STATUS_EFFECT_STASIS, null, TRUE) + target.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT) target.ExtinguishMob() use_power = ACTIVE_POWER_USE /obj/machinery/stasis/proc/thaw_them(mob/living/target) - target.remove_status_effect(STATUS_EFFECT_STASIS) + target.remove_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT) if(target == occupant) use_power = IDLE_POWER_USE From 7b8fbcbd0c769530a977098bdf1a56e4f98e72cb Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 16 Feb 2020 18:03:10 -0800 Subject: [PATCH 10/11] Automatic changelog generation for PR #49237 [ci skip] --- html/changelogs/AutoChangeLog-pr-49237.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-49237.yml diff --git a/html/changelogs/AutoChangeLog-pr-49237.yml b/html/changelogs/AutoChangeLog-pr-49237.yml new file mode 100644 index 00000000000..66a6626171a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49237.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - refactor: "Stasis now supports multiple sources." From 9e34b3d6a15df071938932f46e5276eb9529ccab Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Sun, 16 Feb 2020 23:57:53 -0500 Subject: [PATCH 11/11] Supports named arguments in AddComponent and AddElement (#49098) AddComponent/AddElement now support named arguments. This requires passing around an argument list instead of using actual proc args which a bit gross but we can blame byond for forcing this. InheritComponent uses mirrored init arguments instead of an argument list which means no more accessing it via index to get to the same arguments as in init. As a small bonus I restructured dcs defines to be a bit more manageable. Mainly just splits them into separate files and gives them their own folder. --- .github/CODEOWNERS | 7 +- code/__DEFINES/dcs/flags.dm | 41 + code/__DEFINES/dcs/helpers.dm | 15 + .../{components.dm => dcs/signals.dm} | 834 ++++++++---------- code/controllers/subsystem/dcs.dm | 51 +- code/datums/components/_component.dm | 40 +- code/datums/components/fantasy/_fantasy.dm | 15 +- code/datums/components/nanites.dm | 4 +- code/datums/components/orbiter.dm | 6 +- code/datums/components/radioactive.dm | 6 +- code/datums/components/remote_materials.dm | 21 +- code/datums/components/stationloving.dm | 8 +- code/datums/components/stationstuck.dm | 12 +- code/datums/components/thermite.dm | 4 +- code/datums/components/wet_floor.dm | 4 +- code/datums/elements/_element.dm | 14 +- code/datums/materials/_material.dm | 2 +- code/datums/materials/basemats.dm | 4 +- code/game/machinery/autolathe.dm | 35 +- code/game/objects/effects/contraband.dm | 2 +- code/game/objects/effects/decals/cleanable.dm | 2 +- .../objects/items/grenades/antigravity.dm | 2 +- code/game/objects/items/weaponry.dm | 2 +- code/game/objects/structures/flora.dm | 2 +- code/game/objects/structures/statues.dm | 2 +- .../objects/structures/windoor_assembly.dm | 9 +- .../admin/view_variables/topic_basic.dm | 4 +- code/modules/assembly/holder.dm | 5 +- code/modules/assembly/infrared.dm | 9 +- code/modules/mapping/mapping_helpers.dm | 2 +- code/modules/mining/machine_silo.dm | 22 +- .../nanites/nanite_cloud_controller.dm | 6 +- tgstation.dme | 4 +- 33 files changed, 619 insertions(+), 577 deletions(-) create mode 100644 code/__DEFINES/dcs/flags.dm create mode 100644 code/__DEFINES/dcs/helpers.dm rename code/__DEFINES/{components.dm => dcs/signals.dm} (91%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3def1e0390c..ca988698e47 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -62,7 +62,11 @@ # ninjanomnom +/code/__DEFINES/dcs/ @ninjanomnom +/code/controllers/subsystem/dcs.dm @ninjanomnom /code/controllers/subsystem/shuttle.dm @ninjanomnom +/code/datums/components/ @ninjanomnom +/code/datums/elements/ @ninjanomnom /code/modules/shuttle/ @ninjanomnom # ShizCalev @@ -83,10 +87,7 @@ # Multiple Owners -/code/__DEFINES/components.dm @Cyberboss @ninjanomnom /code/controllers/subsystem/air.dm @duncathan @MrStonedOne -/code/datums/components/ @Cyberboss @ninjanomnom - #SIC SEMPER TYRANNIS /code/modules/hydroponics/grown/citrus.dm @optimumtact diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm new file mode 100644 index 00000000000..128c9f19387 --- /dev/null +++ b/code/__DEFINES/dcs/flags.dm @@ -0,0 +1,41 @@ +/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// `parent` must not be modified if this is to be returned. +/// This will be noted in the runtime logs +#define COMPONENT_INCOMPATIBLE 1 +/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` +#define COMPONENT_NOTRANSFER 2 + +/// Return value to cancel attaching +#define ELEMENT_INCOMPATIBLE 1 + +// /datum/element flags +/// Causes the detach proc to be called when the host object is being deleted +#define ELEMENT_DETACH (1 << 0) +/** + * Only elements created with the same arguments given after `id_arg_index` share an element instance + * The arguments are the same when the text and number values are the same and all other values have the same ref + */ +#define ELEMENT_BESPOKE (1 << 1) + +// How multiple components of the exact same type are handled in the same datum +/// old component is deleted (default) +#define COMPONENT_DUPE_HIGHLANDER 0 +/// duplicates allowed +#define COMPONENT_DUPE_ALLOWED 1 +/// new component is deleted +#define COMPONENT_DUPE_UNIQUE 2 +/// old component is given the initialization args of the new +#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 +/// each component of the same type is consulted as to whether the duplicate should be allowed +#define COMPONENT_DUPE_SELECTIVE 5 + +//Redirection component init flags +#define REDIRECT_TRANSFER_WITH_TURF 1 + +//Arch +#define ARCH_PROB "probability" //Probability for each item +#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount + +//Ouch my toes! +#define CALTROP_BYPASS_SHOES 1 +#define CALTROP_IGNORE_WALKERS 2 diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm new file mode 100644 index 00000000000..144e94f1fe0 --- /dev/null +++ b/code/__DEFINES/dcs/helpers.dm @@ -0,0 +1,15 @@ +/// Used to trigger signals and call procs registered for that signal +/// The datum hosting the signal is automaticaly added as the first argument +/// Returns a bitfield gathered from all registered procs +/// Arguments given here are packaged in a list and given to _SendSignal +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) + +#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) + +/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments +#define AddElement(arguments...) _AddElement(list(##arguments)) +/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments +#define RemoveElement(arguments...) _RemoveElement(list(##arguments)) + +/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments +#define AddComponent(arguments...) _AddComponent(list(##arguments)) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/dcs/signals.dm similarity index 91% rename from code/__DEFINES/components.dm rename to code/__DEFINES/dcs/signals.dm index 7d70e75208e..99637bb28c9 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -1,443 +1,391 @@ -/// Used to trigger signals and call procs registered for that signal -/// The datum hosting the signal is automaticaly added as the first argument -/// Returns a bitfield gathered from all registered procs -/// Arguments given here are packaged in a list and given to _SendSignal -#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) - -#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) - -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. -/// `parent` must not be modified if this is to be returned. -/// This will be noted in the runtime logs -#define COMPONENT_INCOMPATIBLE 1 -/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` -#define COMPONENT_NOTRANSFER 2 - -/// Return value to cancel attaching -#define ELEMENT_INCOMPATIBLE 1 - -// /datum/element flags -/// Causes the detach proc to be called when the host object is being deleted -#define ELEMENT_DETACH (1 << 0) -/** - * Only elements created with the same arguments given after `id_arg_index` share an element instance - * The arguments are the same when the text and number values are the same and all other values have the same ref - */ -#define ELEMENT_BESPOKE (1 << 1) - -// How multiple components of the exact same type are handled in the same datum -/// old component is deleted (default) -#define COMPONENT_DUPE_HIGHLANDER 0 -/// duplicates allowed -#define COMPONENT_DUPE_ALLOWED 1 -/// new component is deleted -#define COMPONENT_DUPE_UNIQUE 2 -/// old component is given the initialization args of the new -#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 -/// each component of the same type is consulted as to whether the duplicate should be allowed -#define COMPONENT_DUPE_SELECTIVE 5 - -// All signals. Format: -// When the signal is called: (signal arguments) -// All signals send the source datum of the signal as the first argument - -// global signals -// These are signals which can be listened to by any component on any parent -// start global signals with "!", this used to be necessary but now it's just a formatting choice -/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) -#define COMSIG_GLOB_NEW_Z "!new_z" -/// called after a successful var edit somewhere in the world: (list/args) -#define COMSIG_GLOB_VAR_EDIT "!var_edit" -/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) -#define COMSIG_GLOB_EXPLOSION "!explosion" -/// mob was created somewhere : (mob) -#define COMSIG_GLOB_MOB_CREATED "!mob_created" -/// mob died somewhere : (mob , gibbed) -#define COMSIG_GLOB_MOB_DEATH "!mob_death" -/// global living say plug - use sparingly: (mob/speaker , message) -#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" -/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) -#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" - #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 -/// ingame button pressed (/obj/machinery/button/button) -#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed" - -// signals from globally accessible objects -/// from SSsun when the sun changes position : (azimuth) -#define COMSIG_SUN_MOVED "sun_moved" - -////////////////////////////////////////////////////////////////// - -// /datum signals -/// when a component is added to a datum: (/datum/component) -#define COMSIG_COMPONENT_ADDED "component_added" -/// before a component is removed from a datum because of RemoveComponent: (/datum/component) -#define COMSIG_COMPONENT_REMOVING "component_removing" -/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation -#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" -/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called -#define COMSIG_PARENT_QDELETING "parent_qdeleting" -/// generic topic handler (usr, href_list) -#define COMSIG_TOPIC "handle_topic" - -// /atom signals -#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) - #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called -#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) -#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) -#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) - //Positions for overrides list - #define EXAMINE_POSITION_ARTICLE 1 - #define EXAMINE_POSITION_BEFORE 2 - //End positions - #define COMPONENT_EXNAME_CHANGED 1 -#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () - #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 - #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 -#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) -#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) -#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) -#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) - #define COMPONENT_ATOM_BLOCK_EXIT 1 -#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) -#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) -#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) -#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) -#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) -#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/projectile, def_zone) -#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) -#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) -#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): (/mob/user) -#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity) -#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () -#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) -#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) -#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () - #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 -#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color) -#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities) -#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): () - #define COMPONENT_BLOCK_RADIATION 1 -#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength) - #define COMPONENT_BLOCK_CONTAMINATION 1 -#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) - #define COMPONENT_RAD_WAVE_HANDLED 1 -#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) - #define COMPONENT_BLOCK_REACH 1 -#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act" //from base of atom/wrench_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act" //from base of atom/multitool_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WELDER_ACT "atom_welder_act" //from base of atom/welder_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act" //from base of atom/wirecutter_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act" //from base of atom/crowbar_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act" //from base of atom/analyser_act(): (mob/living/user, obj/item/I) - #define COMPONENT_BLOCK_TOOL_ATTACK 1 -#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) - #define COMPONENT_BLOCK_TELEPORT 1 -#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers) -#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) -#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) -///////////////// -#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) -#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) -#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) - #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. -//This signal return value bitflags can be found in __DEFINES/misc.dm -#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) -#define COMSIG_ATOM_START_PULL "movable_start_pull" //called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force) -#define COMSIG_LIVING_START_PULL "living_start_pull" //called on /living when someone starts pulling it (atom/movable/puller, state, force) - -///////////////// - -#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) -#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) - -#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) -#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) - #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye. -#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) -#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) -#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) -#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) - #define COMPONENT_NO_MOUSEDROP 1 -#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) - -// /area signals -#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) -#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) - -// /turf signals -#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) -#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) -#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) - -// /atom/movable signals -#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) - #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 -#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) -#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) -#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) -#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) - #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 -#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) -#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) -#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) -#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) -#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) -#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) -#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args) - #define COMPONENT_CANCEL_THROW 1 -#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) -#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) -#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () -#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)) - #define HEARING_MESSAGE 1 - #define HEARING_SPEAKER 2 -// #define HEARING_LANGUAGE 3 - #define HEARING_RAW_MESSAGE 4 - /* #define HEARING_RADIO_FREQ 5 - #define HEARING_SPANS 6 - #define HEARING_MESSAGE_MODE 7 */ -#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) - -// /mob signals -#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) -#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) -#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) -#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A) -#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A) - #define COMSIG_MOB_CANCEL_CLICKON 1 - -#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj -#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) - #define COMPONENT_BLOCK_MAGIC 1 -#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () -#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of -#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) - #define COMPONENT_ITEM_NO_ATTACK 1 -#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) -#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) -#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) -#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) -#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) -#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) -#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () -#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () - #define COMPONENT_UPPERCASE_SPEECH 1 - // used to access COMSIG_MOB_SAY argslist - #define SPEECH_MESSAGE 1 - // #define SPEECH_BUBBLE_TYPE 2 - #define SPEECH_SPANS 3 - /* #define SPEECH_SANITIZE 4 - #define SPEECH_LANGUAGE 5 - #define SPEECH_IGNORE_SPAM 6 - #define SPEECH_FORCED 7 */ -#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) - #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 -#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () - -// /mob/living signals -#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) -#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) -#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) -#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) -#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" //sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) -#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () -#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) -#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) -#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) -#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) -#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) - -//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! -#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) - #define COMPONENT_NO_STUN 1 //For all of them -#define COMSIG_LIVING_CAN_TRACK "mob_cantrack" //from base of /mob/living/can_track(): (mob/user) - #define COMPONENT_CANT_TRACK 1 - -// /mob/living/carbon signals -#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) -#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) -#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) - -// /mob/living/simple_animal/hostile signals -#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" - #define COMPONENT_HOSTILE_NO_ATTACK 1 - -// /obj signals -#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) -#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) -#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //from base of code/game/machinery - -// /obj/machinery signals -#define COMSIG_MACHINERY_BROKEN "machinery_broken" //from /obj/machinery/obj_break(damage_flag): (damage_flag) -#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" //from base power_change() when power is lost -#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" //from base power_change() when power is restored - -// /obj/item signals -#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) -#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) - #define COMPONENT_NO_INTERACT 1 -#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) - #define COMPONENT_NO_ATTACK_OBJ 1 -#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) - #define COMPONENT_NO_ATTACK 1 -#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) -#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) -#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) -#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) -#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) -#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) -#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) - #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 -#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) -#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed) -#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) - - -// /obj/item/clothing signals -#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () - -// /obj/item/implant signals -#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () -#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) - #define COMPONENT_STOP_IMPLANTING 1 -#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) - //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both - #define COMPONENT_DELETE_NEW_IMPLANT 2 - #define COMPONENT_DELETE_OLD_IMPLANT 4 -#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) - //This uses all return values of COMSIG_IMPLANT_OTHER - -// /obj/item/pda signals -#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) - #define COMPONENT_STOP_RINGTONE_CHANGE 1 -#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" - #define COMPONENT_PDA_NO_DETONATE 1 - -// /obj/item/radio signals -#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) - -// /obj/item/pen signals -#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) - -// /obj/item/gun signals -#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override) - -// /obj/projectile signals (sent to the firer) -#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) -#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target) -#define COMSIG_PROJECTILE_FIRE "projectile_fire" // from the base of /obj/projectile/proc/fire(): () -#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles - -// /obj/mecha signals -#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to - -// /mob/living/carbon/human signals -#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) -#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) -#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set - -// /datum/species signals -#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) -#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) - -// /datum/song signals -#define COMSIG_SONG_START "song_start" //sent to the instrument when a song starts playing -#define COMSIG_SONG_END "song_end" //sent to the instrument when a song stops playing - -/*******Component Specific Signals*******/ -//Janitor -#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. -#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. -#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) - -//Creamed -#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength) - -//Food -#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) - -//Gibs -#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) - -//Mood -#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. -#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" //Mood event that only RnD members listen for -#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. - -//NTnet -#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) - -//Nanites -#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found -#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth -#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component -#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list -#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount -#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount -#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount -#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount -#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount -#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable -#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount -#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount -#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. -#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. -#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected -#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs -#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component - #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful - #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites -#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component - -// /datum/component/storage signals -#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. -#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool -#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. -#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool -#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool -#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) -#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! -#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. -#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. -#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool -#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. -#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) -#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool - -// /datum/action signals -#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) - #define COMPONENT_ACTION_BLOCK_TRIGGER 1 - -/*******Non-Signal Component Related Defines*******/ - -//Redirection component init flags -#define REDIRECT_TRANSFER_WITH_TURF 1 - -//Arch -#define ARCH_PROB "probability" //Probability for each item -#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount - -//Ouch my toes! -#define CALTROP_BYPASS_SHOES 1 -#define CALTROP_IGNORE_WALKERS 2 - -//Xenobio hotkeys -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) +// All signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +// global signals +// These are signals which can be listened to by any component on any parent +// start global signals with "!", this used to be necessary but now it's just a formatting choice +/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) +#define COMSIG_GLOB_NEW_Z "!new_z" +/// called after a successful var edit somewhere in the world: (list/args) +#define COMSIG_GLOB_VAR_EDIT "!var_edit" +/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) +#define COMSIG_GLOB_EXPLOSION "!explosion" +/// mob was created somewhere : (mob) +#define COMSIG_GLOB_MOB_CREATED "!mob_created" +/// mob died somewhere : (mob , gibbed) +#define COMSIG_GLOB_MOB_DEATH "!mob_death" +/// global living say plug - use sparingly: (mob/speaker , message) +#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" +/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) +#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" + #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 +/// ingame button pressed (/obj/machinery/button/button) +#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed" + +// signals from globally accessible objects +/// from SSsun when the sun changes position : (azimuth) +#define COMSIG_SUN_MOVED "sun_moved" + +////////////////////////////////////////////////////////////////// + +// /datum signals +/// when a component is added to a datum: (/datum/component) +#define COMSIG_COMPONENT_ADDED "component_added" +/// before a component is removed from a datum because of RemoveComponent: (/datum/component) +#define COMSIG_COMPONENT_REMOVING "component_removing" +/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation +#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" +/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called +#define COMSIG_PARENT_QDELETING "parent_qdeleting" +/// generic topic handler (usr, href_list) +#define COMSIG_TOPIC "handle_topic" + +// /atom signals +#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) + #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called +#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) +#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) + //Positions for overrides list + #define EXAMINE_POSITION_ARTICLE 1 + #define EXAMINE_POSITION_BEFORE 2 + //End positions + #define COMPONENT_EXNAME_CHANGED 1 +#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () + #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 + #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 +#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) +#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) +#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) +#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) + #define COMPONENT_ATOM_BLOCK_EXIT 1 +#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) +#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) +#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) +#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) +#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) +#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/projectile, def_zone) +#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) +#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) +#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): (/mob/user) +#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity) +#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () +#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) +#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) +#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () + #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color) +#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir) +#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted) +#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities) +#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): () + #define COMPONENT_BLOCK_RADIATION 1 +#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength) + #define COMPONENT_BLOCK_CONTAMINATION 1 +#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) + #define COMPONENT_RAD_WAVE_HANDLED 1 +#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) + #define COMPONENT_BLOCK_REACH 1 +#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act" //from base of atom/wrench_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act" //from base of atom/multitool_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WELDER_ACT "atom_welder_act" //from base of atom/welder_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act" //from base of atom/wirecutter_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act" //from base of atom/crowbar_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act" //from base of atom/analyser_act(): (mob/living/user, obj/item/I) + #define COMPONENT_BLOCK_TOOL_ATTACK 1 +#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) + #define COMPONENT_BLOCK_TELEPORT 1 +#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers) +#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) +#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) +///////////////// +#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) +#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) +#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) + #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +//This signal return value bitflags can be found in __DEFINES/misc.dm +#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) +#define COMSIG_ATOM_START_PULL "movable_start_pull" //called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force) +#define COMSIG_LIVING_START_PULL "living_start_pull" //called on /living when someone starts pulling it (atom/movable/puller, state, force) + +///////////////// + +#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) +#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) + +#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) +#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) + #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye. +#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) +#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) + #define COMPONENT_NO_MOUSEDROP 1 +#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) + +// /area signals +#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) +#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) + +// /turf signals +#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) +#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) +#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) + +// /atom/movable signals +#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) + #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 +#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) +#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) +#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) +#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) + #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 +#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) +#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) +#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) +#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) +#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) +#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) +#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args) + #define COMPONENT_CANCEL_THROW 1 +#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) +#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) +#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () +#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)) + #define HEARING_MESSAGE 1 + #define HEARING_SPEAKER 2 +// #define HEARING_LANGUAGE 3 + #define HEARING_RAW_MESSAGE 4 + /* #define HEARING_RADIO_FREQ 5 + #define HEARING_SPANS 6 + #define HEARING_MESSAGE_MODE 7 */ +#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) + +// /mob signals +#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) +#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) +#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) +#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A) +#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A) + #define COMSIG_MOB_CANCEL_CLICKON 1 + +#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj +#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) + #define COMPONENT_BLOCK_MAGIC 1 +#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () +#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of +#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) + #define COMPONENT_ITEM_NO_ATTACK 1 +#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) +#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) +#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) +#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) +#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () +#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () + #define COMPONENT_UPPERCASE_SPEECH 1 + // used to access COMSIG_MOB_SAY argslist + #define SPEECH_MESSAGE 1 + // #define SPEECH_BUBBLE_TYPE 2 + #define SPEECH_SPANS 3 + /* #define SPEECH_SANITIZE 4 + #define SPEECH_LANGUAGE 5 + #define SPEECH_IGNORE_SPAM 6 + #define SPEECH_FORCED 7 */ +#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) + #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 +#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () + +// /mob/living signals +#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) +#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) +#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) +#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) +#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" //sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) +#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) +#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) +#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) +#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) +#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) + +//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! +#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) + #define COMPONENT_NO_STUN 1 //For all of them +#define COMSIG_LIVING_CAN_TRACK "mob_cantrack" //from base of /mob/living/can_track(): (mob/user) + #define COMPONENT_CANT_TRACK 1 + +// /mob/living/carbon signals +#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) +#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) +#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) + +// /mob/living/simple_animal/hostile signals +#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" + #define COMPONENT_HOSTILE_NO_ATTACK 1 + +// /obj signals +#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) +#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) +#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //from base of code/game/machinery + +// /obj/machinery signals +#define COMSIG_MACHINERY_BROKEN "machinery_broken" //from /obj/machinery/obj_break(damage_flag): (damage_flag) +#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" //from base power_change() when power is lost +#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" //from base power_change() when power is restored + +// /obj/item signals +#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) +#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) + #define COMPONENT_NO_INTERACT 1 +#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) + #define COMPONENT_NO_ATTACK_OBJ 1 +#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) + #define COMPONENT_NO_ATTACK 1 +#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) +#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) +#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) +#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) +#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) +#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) +#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) +#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) + #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 +#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) +#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed) +#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) + + +// /obj/item/clothing signals +#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () + +// /obj/item/implant signals +#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () +#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) + #define COMPONENT_STOP_IMPLANTING 1 +#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) + //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both + #define COMPONENT_DELETE_NEW_IMPLANT 2 + #define COMPONENT_DELETE_OLD_IMPLANT 4 +#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) + //This uses all return values of COMSIG_IMPLANT_OTHER + +// /obj/item/pda signals +#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) + #define COMPONENT_STOP_RINGTONE_CHANGE 1 +#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" + #define COMPONENT_PDA_NO_DETONATE 1 + +// /obj/item/radio signals +#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) + +// /obj/item/pen signals +#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) + +// /obj/item/gun signals +#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override) + +// /obj/projectile signals (sent to the firer) +#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) +#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target) +#define COMSIG_PROJECTILE_FIRE "projectile_fire" // from the base of /obj/projectile/proc/fire(): () +#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles + +// /obj/mecha signals +#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to + +// /mob/living/carbon/human signals +#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) +#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) +#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set + +// /datum/species signals +#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) +#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) + +// /datum/song signals +#define COMSIG_SONG_START "song_start" //sent to the instrument when a song starts playing +#define COMSIG_SONG_END "song_end" //sent to the instrument when a song stops playing + +/*******Component Specific Signals*******/ +//Janitor +#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. +#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. +#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) + +//Creamed +#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength) + +//Food +#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) + +//Gibs +#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) + +//Mood +#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. +#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" //Mood event that only RnD members listen for +#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. + +//NTnet +#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) + +//Nanites +#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found +#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth +#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component +#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list +#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount +#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount +#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount +#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount +#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount +#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable +#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount +#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount +#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. +#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. +#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected +#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs +#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component + #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful + #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites +#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component + +// /datum/component/storage signals +#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. +#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool +#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. +#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool +#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool +#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) +#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! +#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. +#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. +#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool +#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. +#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) +#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool + +// /datum/action signals +#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) + #define COMPONENT_ACTION_BLOCK_TRIGGER 1 + +//Xenobio hotkeys +#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) +#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 53c4b7fa311..8b068e5d675 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -7,22 +7,47 @@ PROCESSING_SUBSYSTEM_DEF(dcs) /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(datum/element/eletype, ...) +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) + var/datum/element/eletype = arguments[1] var/element_id = eletype - + + if(!ispath(eletype, /datum/element)) + CRASH("Attempted to instantiate [eletype] as a /datum/element") + if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - var/list/fullid = list("[eletype]") - for(var/i in initial(eletype.id_arg_index) to length(args)) - var/argument = args[i] - if(istext(argument) || isnum(argument)) - fullid += "[argument]" - else - fullid += "[REF(argument)]" - element_id = fullid.Join("&") - + element_id = GetIdFromArguments(arguments) + . = elements_by_type[element_id] if(.) return - if(!ispath(eletype, /datum/element)) - CRASH("Attempted to instantiate [eletype] as a /datum/element") . = elements_by_type[element_id] = new eletype + +/**** + * Generates an id for bespoke elements when given the argument list + * Generating the id here is a bit complex because we need to support named arguments + * Named arguments can appear in any order and we need them to appear after ordered arguments + * We assume that no one will pass in a named argument with a value of null + **/ +/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) + var/datum/element/eletype = arguments[1] + var/list/fullid = list("[eletype]") + var/list/named_arguments = list() + for(var/i in initial(eletype.id_arg_index) to length(arguments)) + var/key = arguments[i] + var/value + if(istext(key)) + value = arguments[key] + if(!(istext(key) || isnum(key))) + key = REF(key) + key = "[key]" // Key is stringified so numbers dont break things + if(!isnull(value)) + if(!(istext(value) || isnum(value))) + value = REF(value) + named_arguments["[key]"] = value + else + fullid += "[key]" + + if(length(named_arguments)) + named_arguments = sortList(named_arguments) + fullid += named_arguments + return list2params(fullid) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 8a4c8f682ff..7a03d87fc4d 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -13,15 +13,15 @@ /// Defines how duplicate existing components are handled when added to a datum /// See `COMPONENT_DUPE_*` definitions for available options var/dupe_mode = COMPONENT_DUPE_HIGHLANDER - + /// The type to check for duplication /// `null` means exact match on `type` (default) /// Any other type means that and all subtypes var/dupe_type - + /// The datum this components belongs to var/datum/parent - + /// Only set to true if you are able to properly transfer this component /// At a minimum RegisterWithParent and UnregisterFromParent should be used /// Make sure you also implement PostTransfer for any post transfer handling @@ -34,14 +34,14 @@ * Arguments: * * datum/P the parent datum this component reacts to signals from */ -/datum/component/New(datum/P, ...) - parent = P - var/list/arguments = args.Copy(2) +/datum/component/New(list/raw_args) + parent = raw_args[1] + var/list/arguments = raw_args.Copy(2) if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE) qdel(src, TRUE, TRUE) - CRASH("Incompatible [type] assigned to a [P.type]! args: [json_encode(arguments)]") + CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") - _JoinParent(P) + _JoinParent(parent) /** * Called during component creation with the same arguments as in new excluding parent. @@ -361,7 +361,8 @@ * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it * Properly handles duplicate situations based on the `dupe_mode` var */ -/datum/proc/AddComponent(new_type, ...) +/datum/proc/_AddComponent(list/raw_args) + var/new_type = raw_args[1] var/datum/component/nt = new_type var/dm = initial(nt.dupe_mode) var/dt = initial(nt.dupe_type) @@ -376,7 +377,7 @@ new_comp = nt nt = new_comp.type - args[1] = src + raw_args[1] = src if(dm != COMPONENT_DUPE_ALLOWED) if(!dt) @@ -387,24 +388,25 @@ switch(dm) if(COMPONENT_DUPE_UNIQUE) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) old_comp.InheritComponent(new_comp, TRUE) QDEL_NULL(new_comp) if(COMPONENT_DUPE_HIGHLANDER) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) new_comp.InheritComponent(old_comp, FALSE) QDEL_NULL(old_comp) if(COMPONENT_DUPE_UNIQUE_PASSARGS) if(!new_comp) - var/list/arguments = args.Copy(2) - old_comp.InheritComponent(null, TRUE, arguments) + var/list/arguments = raw_args.Copy(2) + arguments.Insert(1, null, TRUE) + old_comp.InheritComponent(arglist(arguments)) else old_comp.InheritComponent(new_comp, TRUE) if(COMPONENT_DUPE_SELECTIVE) - var/list/arguments = args.Copy() + var/list/arguments = raw_args.Copy() arguments[1] = new_comp var/make_new_component = TRUE for(var/i in GetComponents(new_type)) @@ -414,11 +416,11 @@ QDEL_NULL(new_comp) break if(!new_comp && make_new_component) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) else if(!new_comp) - new_comp = new nt(arglist(args)) // There's a valid dupe mode but there's no old component, act like normal + new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal else if(!new_comp) - new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal + new_comp = new nt(raw_args) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) @@ -437,7 +439,7 @@ /datum/proc/LoadComponent(component_type, ...) . = GetComponent(component_type) if(!.) - return AddComponent(arglist(args)) + return _AddComponent(args) /** * Removes the component from parent, ends up with a null parent diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index 86e016784ad..a203264fae0 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -37,17 +37,16 @@ /datum/component/fantasy/UnregisterFromParent() unmodify() -/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments) +/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, quality, list/affixes, canFail, announce) unmodify() if(newComp) - quality += newComp.quality - canFail = newComp.canFail - announce = newComp.announce + src.quality += newComp.quality + src.canFail = newComp.canFail + src.announce = newComp.announce else - arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given - quality += arguments[1] - canFail = arguments[4] || canFail - announce = arguments[5] || announce + src.quality += quality + src.canFail = canFail || src.canFail + src.announce = announce || src.announce modify() /datum/component/fantasy/proc/randomQuality() diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index dc1e73dd264..64870dfca6d 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -101,11 +101,11 @@ host_mob = null return ..() -/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, list/arguments) +/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, amount, cloud) if(new_nanites) adjust_nanites(null, new_nanites.nanite_volume) else - adjust_nanites(null, arguments[1]) //just add to the nanite volume + adjust_nanites(null, amount) //just add to the nanite volume /datum/component/nanites/process() if(!IS_IN_STASIS(host_mob)) diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 44665479192..80e1bc59505 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -37,9 +37,9 @@ orbiters = null return ..() -/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments) - if(arguments) - begin_orbit(arglist(arguments)) +/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) + if(!newcomp) + begin_orbit(arglist(args.Copy(3))) return // The following only happens on component transfers orbiters += newcomp.orbiters diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index ed34ac90074..0b9b62eb7c6 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -18,7 +18,7 @@ hl3_release_date = _half_life can_contaminate = _can_contaminate - if(istype(parent, /atom)) + if(istype(parent, /atom)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine) if(istype(parent, /obj/item)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack) @@ -47,7 +47,7 @@ qdel(src) return PROCESS_KILL -/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, list/arguments) +/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, _strength, _source, _half_life, _can_contaminate) if(!i_am_original) return if(!hl3_release_date) // Permanently radioactive things don't get to grow stronger @@ -56,7 +56,7 @@ var/datum/component/radioactive/other = C strength = max(strength, other.strength) else - strength = max(strength, arguments[1]) + strength = max(strength, _strength) /datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing) var/atom/master = parent diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index ab5dd224733..e4faab361a6 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -54,11 +54,22 @@ handles linking back and forth. /datum/component/remote_materials/proc/_MakeLocal() silo = null - mat_container = parent.AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - local_size, - FALSE, - /obj/item/stack) + + var/static/list/allowed_mats = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + + mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, allowed_types=/obj/item/stack) /datum/component/remote_materials/proc/set_local_size(size) local_size = size diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 51d67e10e20..0282f247153 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -16,13 +16,13 @@ src.allow_death = allow_death check_in_bounds() // Just in case something is being created outside of station/centcom -/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, list/arguments) +/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, inform_admins, allow_death) if (original) - if (istype(newc)) + if (newc) inform_admins = newc.inform_admins allow_death = newc.allow_death - else if (LAZYLEN(arguments)) - inform_admins = arguments[1] + else + inform_admins = inform_admins /datum/component/stationloving/proc/relocate() var/targetturf = find_safe_turf() diff --git a/code/datums/components/stationstuck.dm b/code/datums/components/stationstuck.dm index 5fd00d30119..b9027ef8115 100644 --- a/code/datums/components/stationstuck.dm +++ b/code/datums/components/stationstuck.dm @@ -15,11 +15,13 @@ stuck_zlevel = L.z -/datum/component/stationstuck/InheritComponent(datum/component/stationstuck/newc, original, list/arguments) - if(original) - if(istype(newc)) - murder = newc.murder - message = newc.message +/datum/component/stationstuck/InheritComponent(datum/component/stationstuck/newc, original, _murder, _message) + if(newc) + murder = newc.murder + message = newc.message + else + murder = _murder + message = _message /datum/component/stationstuck/proc/punish() var/mob/living/L = parent diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index ce397f9fea5..b745e740571 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -52,13 +52,13 @@ master.cut_overlay(overlay) return ..() -/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, list/arguments) +/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, _amount) if(!i_am_original) return if(newC) amount += newC.amount else - amount += arguments[1] + amount += _amount /datum/component/thermite/proc/thermite_melt(mob/user) var/turf/master = parent diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 715c20e4219..fd2a82ce042 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -12,9 +12,9 @@ var/permanent = FALSE var/last_process = 0 -/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, argslist) +/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, strength, duration_minimum, duration_add, duration_maximum, _permanent) if(!newcomp) //We are getting passed the arguments of a would-be new component, but not a new component - add_wet(arglist(argslist)) + add_wet(arglist(args.Copy(3))) else //We are being passed in a full blown component var/datum/component/wet_floor/WF = newcomp //Lets make an assumption if(WF.gc()) //See if it's even valid, still. Also does LAZYLEN and stuff for us. diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index bf510e0f56f..f74dcd0b6e1 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -36,16 +36,16 @@ //DATUM PROCS /// Finds the singleton for the element type given and attaches it to src -/datum/proc/AddElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) - args[1] = src - if(ele.Attach(arglist(args)) == ELEMENT_INCOMPATIBLE) - CRASH("Incompatible [eletype] assigned to a [type]! args: [json_encode(args)]") +/datum/proc/_AddElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) + arguments[1] = src + if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) + CRASH("Incompatible [arguments[1]] assigned to a [type]! args: [json_encode(args)]") /** * Finds the singleton for the element type given and detaches it from src * You only need additional arguments beyond the type if you're using ELEMENT_BESPOKE */ -/datum/proc/RemoveElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) +/datum/proc/_RemoveElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) ele.Detach(src) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index b5ba7246967..5e5a2eaca34 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -41,7 +41,7 @@ Simple datum which is instanced once per type and is used for every object of sa source.name = "[name] [source.name]" if(beauty_modifier) - addtimer(CALLBACK(source, /datum.proc/AddComponent, /datum/component/beauty, beauty_modifier * amount), 0) + addtimer(CALLBACK(source, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty_modifier * amount)), 0) if(istype(source, /obj)) //objs on_applied_obj(source, amount, material_flags) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 2f86e777029..839d6857401 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -99,12 +99,12 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() if(ismovableatom(source)) - source.AddElement(/datum/element/firestacker, 1) + source.AddElement(/datum/element/firestacker, amount=1) source.AddComponent(/datum/component/explodable, 0, 0, amount / 2500, amount / 1250) /datum/material/plasma/on_removed(atom/source, material_flags) . = ..() - source.RemoveElement(/datum/element/firestacker, 1) + source.RemoveElement(/datum/element/firestacker, amount=1) qdel(source.GetComponent(/datum/component/explodable)) ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 32cf77212bf..8179e7f227c 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -48,23 +48,24 @@ ) /obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, - /datum/material/glass, - /datum/material/gold, - /datum/material/silver, - /datum/material/diamond, - /datum/material/uranium, - /datum/material/plasma, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/runite, - /datum/material/plastic, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/wood - ), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) + var/static/list/allowed_types = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/gold, + /datum/material/silver, + /datum/material/diamond, + /datum/material/uranium, + /datum/material/plasma, + /datum/material/bluespace, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/runite, + /datum/material/plastic, + /datum/material/adamantine, + /datum/material/mythril, + /datum/material/wood, + ) + AddComponent(/datum/component/material_container, allowed_types, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index bf7ff0818c0..c19561c22c5 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -68,7 +68,7 @@ name = "poster - [name]" desc = "A large piece of space-resistant printed paper. [desc]" - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 300), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 300)), 0) /obj/structure/sign/poster/proc/randomise(base_type) var/list/poster_types = subtypesof(base_type) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index c988704828b..b197c758c97 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -26,7 +26,7 @@ if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, beauty), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty)), 0) var/turf/T = get_turf(src) if(T && is_station_level(T.z)) diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm index cf7dc928ae0..a4bc207be03 100644 --- a/code/game/objects/items/grenades/antigravity.dm +++ b/code/game/objects/items/grenades/antigravity.dm @@ -12,6 +12,6 @@ for(var/turf/T in view(range,src)) T.AddElement(/datum/element/forced_gravity, forced_value) - addtimer(CALLBACK(T, /datum/.proc/RemoveElement, forced_value), duration) + addtimer(CALLBACK(T, /datum/.proc/_RemoveElement, list(forced_value)), duration) qdel(src) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 19e1eb3b1aa..aba03d32524 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -475,7 +475,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/statuebust/Initialize() . = ..() AddComponent(/datum/component/art, impressiveness) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 1000), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 1000)), 0) /obj/item/statuebust/hippocratic name = "hippocrates bust" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e6da6eaf8a0..5f18b4478b9 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -316,7 +316,7 @@ /obj/item/twohanded/required/kirbyplants/Initialize() . = ..() AddComponent(/datum/component/tactical) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 500), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 500)), 0) /obj/item/twohanded/required/kirbyplants/random icon = 'icons/obj/flora/_flora.dmi' diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 11b5b51ba0f..548831ea061 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -15,7 +15,7 @@ /obj/structure/statue/Initialize() . = ..() AddComponent(art_type, impressiveness) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, impressiveness * 75), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, impressiveness * 75)), 0) /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 08a435634e9..666ea864260 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -315,13 +315,8 @@ /obj/structure/windoor_assembly/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, - null, - CALLBACK(src, .proc/can_be_rotated), - CALLBACK(src,.proc/after_rotation) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, can_be_rotated=CALLBACK(src, .proc/can_be_rotated), after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) if(anchored) diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 2a1d4c7a6ff..79d7379b8bf 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -69,10 +69,10 @@ lst.Insert(1, result) if(result in componentsubtypes) datumname = "component" - target.AddComponent(arglist(lst)) + target._AddComponent(lst) else datumname = "element" - target.AddElement(arglist(lst)) + target._AddElement(lst) log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") if(href_list[VV_HK_CALLPROC]) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 3dddae32abc..eb31d9faf27 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -16,9 +16,8 @@ /obj/item/assembly_holder/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags) /obj/item/assembly_holder/IsAssemblyHolder() return TRUE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 9e7fc5b556e..8099d18fb93 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -23,13 +23,8 @@ /obj/item/assembly/infra/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS, - null, - null, - CALLBACK(src,.proc/after_rotation) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/item/assembly/infra/proc/after_rotation() refreshBeam() diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index cb5c534bde6..dfa98dbe7d0 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -187,7 +187,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(target_type && !istype(A,target_type)) continue var/cargs = build_args() - A.AddComponent(arglist(cargs)) + A._AddComponent(cargs) qdel(src) return diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 92aadd3ca04..0f2b8d70613 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -15,14 +15,20 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/Initialize(mapload) . = ..() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - INFINITY, - FALSE, - /obj/item/stack, - null, - null, - TRUE) + var/static/list/materials_list = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + AddComponent(/datum/component/material_container, materials_list, INFINITY, allowed_types=/obj/item/stack, _disable_attackby=TRUE) if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 1a11e1ecdfa..208f562c12a 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -48,7 +48,7 @@ return var/datum/nanite_cloud_backup/backup = new(src) - var/datum/component/nanites/cloud_copy = new(backup) + var/datum/component/nanites/cloud_copy = backup.AddComponent(/datum/component/nanites) backup.cloud_id = cloud_id backup.nanites = cloud_copy investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES) @@ -213,7 +213,7 @@ var/datum/component/nanites/nanites = backup.nanites var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] var/datum/nanite_rule/rule = rule_template.make_rule(P) - + investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) . = TRUE if("remove_rule") @@ -224,7 +224,7 @@ var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] var/datum/nanite_rule/rule = P.rules[text2num(params["rule_id"])] rule.remove() - + investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) . = TRUE diff --git a/tgstation.dme b/tgstation.dme index a08344c11ab..59e43550e11 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -34,7 +34,6 @@ #include "code\__DEFINES\cleaning.dm" #include "code\__DEFINES\colors.dm" #include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" #include "code\__DEFINES\configuration.dm" #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\contracts.dm" @@ -114,6 +113,9 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\dcs\flags.dm" +#include "code\__DEFINES\dcs\helpers.dm" +#include "code\__DEFINES\dcs\signals.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm"