From 8c90ca5803f4e9ffd91c2346560958c7b8d6a6f0 Mon Sep 17 00:00:00 2001 From: Little-119 Date: Mon, 3 May 2021 20:14:00 -0400 Subject: [PATCH 01/81] Add phoron and nitrogen breather traits --- .../species/station/traits_vr/negative.dm | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm index fa822196b1..c64eb24d0f 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -119,10 +119,40 @@ desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin." cost = -2 var_changes = list("lightweight" = 1) - + /datum/trait/negative/neural_hypersensitivity name = "Neural Hypersensitivity" desc = "Your nerves are particularly sensitive to physical changes, leading to experiencing twice the intensity of pain and pleasure alike. Doubles traumatic shock." cost = -1 var_changes = list("trauma_mod" = 2) can_take = ORGANICS + +/datum/trait/negative/breathes + var/tank = /obj/item/weapon/tank/air + +/datum/trait/negative/breathes/apply(var/datum/species/S,var/mob/living/carbon/human/H) + . = ..() + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) + if(H.backbag == 1) + H.equip_to_slot_or_del(new tank(H), slot_back) + H.internal = H.back + else + H.equip_to_slot_or_del(new tank(H), slot_r_hand) + H.internal = H.r_hand + H.internal = locate(/obj/item/weapon/tank) in H.contents + if(istype(H.internal,/obj/item/weapon/tank) && H.internals) + H.internals.icon_state = "internal1" + +/datum/trait/negative/breathes/phoron + name = "Phoron Breather" + desc = "You breathe phoron instead of oxygen (which is poisonous to you), much like a Vox." + cost = -2 + var_changes = list("breath_type" = "phoron", "poison_type" = "oxygen") + tank = /obj/item/weapon/tank/vox + +/datum/trait/negative/breathes/nitrogen + name = "Nitrogen Breather" + desc = "You breathe nitrogen instead of oxygen (which is poisonous to you). Incidentally, phoron isn't poisonous to breathe to you." + cost = -2 + var_changes = list("breath_type" = "nitrogen", "poison_type" = "oxygen") + tank = /obj/item/weapon/tank/nitrogen From 1c45ae010e9c099ca295e9e59e63c56b4c25c47c Mon Sep 17 00:00:00 2001 From: Little-119 Date: Mon, 3 May 2021 20:17:36 -0400 Subject: [PATCH 02/81] Add water breather trait --- .../mob/living/carbon/human/species/station/blank_vr.dm | 3 +++ .../carbon/human/species/station/traits_vr/positive.dm | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 72e49694d3..87eea14d19 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -80,3 +80,6 @@ H.internals.icon_state = "internal1" */ return ..() + +/datum/species/custom/can_breathe_water() + return /datum/trait/positive/water_breather in traits diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 8e97b78748..34994f2c6f 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -156,3 +156,8 @@ H.verbs |= /mob/living/carbon/human/proc/weave_structure H.verbs |= /mob/living/carbon/human/proc/weave_item H.verbs |= /mob/living/carbon/human/proc/set_silk_color + +/datum/trait/positive/water_breather + name = "Water Breather" + desc = "You can breathe underwater." + cost = 1 From f1b94675c1c6dcc5caed2892be9d270ca3223404 Mon Sep 17 00:00:00 2001 From: Little-119 Date: Sun, 9 May 2021 00:02:50 -0400 Subject: [PATCH 03/81] Final touches/fix tank being invisible in hand --- .../carbon/human/species/station/blank_vr.dm | 38 +++++++++---------- .../species/station/traits_vr/negative.dm | 20 +--------- .../species/station/traits_vr/positive.dm | 2 +- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 87eea14d19..9d8a0f2142 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -56,7 +56,8 @@ //Called when face-down in the water or otherwise over their head. // Return: TRUE for able to breathe fine in water. /datum/species/custom/can_breathe_water() - return ..() + return /datum/trait/positive/water_breather in traits + //Called during handle_environment in Life() ticks. // Return: Not used. @@ -64,22 +65,21 @@ return ..() //Called when spawning to equip them with special things. -/datum/species/custom/equip_survival_gear(var/mob/living/carbon/human/H) - /* Example, from Vox: - H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H), slot_r_hand) - H.internal = H.back - else - H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H.back), slot_in_backpack) - H.internal = H.r_hand - H.internal = locate(/obj/item/weapon/tank) in H.contents - if(istype(H.internal,/obj/item/weapon/tank) && H.internals) - H.internals.icon_state = "internal1" - */ - return ..() +/datum/species/custom/equip_survival_gear(var/mob/living/carbon/human/H, var/extendedtank = 0, var/comprehensive = 0) + . = ..() + if(breath_type != "oxygen") + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) + var/obj/item/weapon/tank/tankpath + if(breath_type == "phoron") + tankpath = /obj/item/weapon/tank/vox + else + tankpath = text2path("/obj/item/weapon/tank/" + breath_type) -/datum/species/custom/can_breathe_water() - return /datum/trait/positive/water_breather in traits + if(tankpath) + H.equip_to_slot_or_del(new tankpath(H), slot_r_hand) + H.internal = H.r_hand + if(istype(H.internal,/obj/item/weapon/tank) && H.internals) + H.internals.icon_state = "internal1" + + for(var/datum/trait/T in traits) + T.equip_survival_gear(H) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm index c64eb24d0f..6384f9b742 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -128,31 +128,15 @@ can_take = ORGANICS /datum/trait/negative/breathes - var/tank = /obj/item/weapon/tank/air - -/datum/trait/negative/breathes/apply(var/datum/species/S,var/mob/living/carbon/human/H) - . = ..() - H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) - if(H.backbag == 1) - H.equip_to_slot_or_del(new tank(H), slot_back) - H.internal = H.back - else - H.equip_to_slot_or_del(new tank(H), slot_r_hand) - H.internal = H.r_hand - H.internal = locate(/obj/item/weapon/tank) in H.contents - if(istype(H.internal,/obj/item/weapon/tank) && H.internals) - H.internals.icon_state = "internal1" + cost = -2 + can_take = ORGANICS /datum/trait/negative/breathes/phoron name = "Phoron Breather" desc = "You breathe phoron instead of oxygen (which is poisonous to you), much like a Vox." - cost = -2 var_changes = list("breath_type" = "phoron", "poison_type" = "oxygen") - tank = /obj/item/weapon/tank/vox /datum/trait/negative/breathes/nitrogen name = "Nitrogen Breather" desc = "You breathe nitrogen instead of oxygen (which is poisonous to you). Incidentally, phoron isn't poisonous to breathe to you." - cost = -2 var_changes = list("breath_type" = "nitrogen", "poison_type" = "oxygen") - tank = /obj/item/weapon/tank/nitrogen diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 34994f2c6f..f85a6d7f14 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -159,5 +159,5 @@ /datum/trait/positive/water_breather name = "Water Breather" - desc = "You can breathe underwater." + desc = "You can breathe under water." cost = 1 From 94d23e0300ffb7730d8d0d19de8191b1521f3ec7 Mon Sep 17 00:00:00 2001 From: Little-119 Date: Mon, 17 May 2021 15:32:21 -0400 Subject: [PATCH 04/81] Make grower pods equip breathing equipment --- .../carbon/human/species/station/blank_vr.dm | 3 --- code/modules/resleeving/infocore_records.dm | 2 ++ code/modules/resleeving/machines.dm | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 9d8a0f2142..57b83fddcb 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -80,6 +80,3 @@ H.internal = H.r_hand if(istype(H.internal,/obj/item/weapon/tank) && H.internals) H.internals.icon_state = "internal1" - - for(var/datum/trait/T in traits) - T.equip_survival_gear(H) diff --git a/code/modules/resleeving/infocore_records.dm b/code/modules/resleeving/infocore_records.dm index e32c28e66b..705b8209bc 100644 --- a/code/modules/resleeving/infocore_records.dm +++ b/code/modules/resleeving/infocore_records.dm @@ -84,6 +84,7 @@ var/sizemult var/weight var/aflags + var/breath_type = "oxygen" /datum/transhuman/body_record/New(var/copyfrom, var/add_to_db = 0, var/ckeylock = 0) ..() @@ -120,6 +121,7 @@ sizemult = M.size_multiplier weight = M.weight aflags = M.appearance_flags + breath_type = M.species.breath_type //Probably should M.dna.check_integrity() diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 1ddab8b9b4..e08d4f5715 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -69,6 +69,21 @@ else if(status == 3) //Digital organ I.digitize() + //Give breathing equipment if needed + if(current_project.breath_type != "oxygen") + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) + var/obj/item/weapon/tank/tankpath + if(current_project.breath_type == "phoron") + tankpath = /obj/item/weapon/tank/vox + else + tankpath = text2path("/obj/item/weapon/tank/" + current_project.breath_type) + + if(tankpath) + H.equip_to_slot_or_del(new tankpath(H), slot_back) + H.internal = H.back + if(istype(H.internal,/obj/item/weapon/tank) && H.internals) + H.internals.icon_state = "internal1" + occupant = H //Set the name or generate one From 72bf8e7dc43e51ad4ec65c6cc626dffdc9edc3a1 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Thu, 10 Jun 2021 13:05:10 -0400 Subject: [PATCH 05/81] Port emitter sprites --- code/modules/power/singularity/emitter_vr.dm | 37 +++++++++++++++++++ icons/obj/singularity_vr.dmi | Bin 0 -> 47023 bytes vorestation.dme | 1 + 3 files changed, 38 insertions(+) create mode 100644 code/modules/power/singularity/emitter_vr.dm create mode 100644 icons/obj/singularity_vr.dmi diff --git a/code/modules/power/singularity/emitter_vr.dm b/code/modules/power/singularity/emitter_vr.dm new file mode 100644 index 0000000000..213e20ba21 --- /dev/null +++ b/code/modules/power/singularity/emitter_vr.dm @@ -0,0 +1,37 @@ +/obj/machinery/power/emitter + icon = 'icons/obj/singularity_vr.dmi' // New emitter sprite + var/previous_state = 0 + +/obj/machinery/power/emitter/Initialize() + . = ..() + previous_state = state + +/obj/machinery/power/emitter/update_icon() + cut_overlays() + icon_state = "emitter[state]" + if (state != previous_state) + flick("emitterflick-[previous_state][state]",src) + previous_state = state + + if(powered && powernet && avail(active_power_usage) && active) + var/image/emitterbeam = image(icon,"emitter-beam") + emitterbeam.plane = PLANE_LIGHTING_ABOVE + add_overlay(emitterbeam) + + if(locked) + var/image/emitterlock = image(icon,"emitter-lock") + emitterlock.plane = PLANE_LIGHTING_ABOVE + add_overlay(emitterlock) + +// The old emitter sprite +/obj/machinery/power/emitter/antique + name = "antique emitter" + desc = "An old fashioned heavy duty industrial laser." + icon_state = "emitter" + +/obj/machinery/power/emitter/antique/update_icon() + if(powered && powernet && avail(active_power_usage) && active) + icon_state = "emitter_+a" + else + icon_state = "emitter" + diff --git a/icons/obj/singularity_vr.dmi b/icons/obj/singularity_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a6fce4ab58a0f754ecaaed50720c9d1345eb91ed GIT binary patch literal 47023 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 literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index bc441864d4..dec50e0235 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3390,6 +3390,7 @@ #include "code\modules\power\singularity\collector.dm" #include "code\modules\power\singularity\containment_field.dm" #include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\emitter_vr.dm" #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\generator.dm" #include "code\modules\power\singularity\investigate.dm" From 724d36bfd908fa354655b977d490c5ee10356307 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Thu, 10 Jun 2021 15:26:31 -0400 Subject: [PATCH 06/81] Fix indents, and more update icons --- code/modules/power/singularity/emitter.dm | 3 +++ code/modules/power/singularity/emitter_vr.dm | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index ea8b5cd230..f67fb4f4c4 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -169,6 +169,7 @@ disconnect_from_network() if(2) to_chat(user, "\The [src] needs to be unwelded from the floor.") + update_icon() // VOREStation Add return if(istype(W, /obj/item/weapon/weldingtool)) @@ -205,6 +206,7 @@ disconnect_from_network() else to_chat(user, "You need more welding fuel to complete this task.") + update_icon() // VOREStation Add return if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL) @@ -233,6 +235,7 @@ if(src.allowed(user)) src.locked = !src.locked to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + update_icon() // VOREStation Add else to_chat(user, "Access denied.") return diff --git a/code/modules/power/singularity/emitter_vr.dm b/code/modules/power/singularity/emitter_vr.dm index 213e20ba21..b50769dbdf 100644 --- a/code/modules/power/singularity/emitter_vr.dm +++ b/code/modules/power/singularity/emitter_vr.dm @@ -1,10 +1,10 @@ /obj/machinery/power/emitter - icon = 'icons/obj/singularity_vr.dmi' // New emitter sprite - var/previous_state = 0 + icon = 'icons/obj/singularity_vr.dmi' // New emitter sprite + var/previous_state = 0 /obj/machinery/power/emitter/Initialize() - . = ..() - previous_state = state + . = ..() + previous_state = state /obj/machinery/power/emitter/update_icon() cut_overlays() From a208580fe19edb34c2d75040b9f24bb4f44a39cf Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Thu, 10 Jun 2021 15:38:00 -0400 Subject: [PATCH 07/81] Make machines destroyable by bullets --- code/game/machinery/computer/computer.dm | 4 +- code/game/machinery/machinery.dm | 90 ++++++++++++++++++++++- code/modules/power/smes.dm | 3 +- sound/machines/machine_die_short.ogg | Bin 0 -> 23746 bytes 4 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 sound/machines/machine_die_short.ogg diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 9b230cc3d2..b8bf02d305 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -34,11 +34,11 @@ /obj/machinery/computer/ex_act(severity) switch(severity) if(1.0) - qdel(src) + fall_apart(severity) return if(2.0) if (prob(25)) - qdel(src) + fall_apart(severity) return if (prob(50)) for(var/x in verbs) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 47d26c7ab1..a8dcc40127 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -111,6 +111,11 @@ Class Procs: var/clickvol = 40 // volume var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/obj/item/weapon/circuitboard/circuit = null + + // 0.0 - 1.0 multipler for prob() based on bullet structure damage + // So if this is 1.0 then a 100 damage bullet will always break this structure + // If this is 0.5 then a 50 damage bullet will break this structure 25% of the time + var/bullet_vulnerability = 0.25 var/speed_process = FALSE //If false, SSmachines. If true, SSfastprocess. @@ -179,15 +184,15 @@ Class Procs: /obj/machinery/ex_act(severity) switch(severity) if(1.0) - qdel(src) + fall_apart(severity) return if(2.0) if(prob(50)) - qdel(src) + fall_apart(severity) return if(3.0) if(prob(25)) - qdel(src) + fall_apart(severity) return else return @@ -474,6 +479,85 @@ Class Procs: qdel(src) return 1 +/obj/machinery/bullet_act(obj/item/projectile/P, def_zone) + . = ..() + if(prob(P.get_structure_damage() * bullet_vulnerability)) + fall_apart() + +/** + * Like an angrier dismantle, where it destroys some of the parts and doesn't give you a frame + ** severity: Same severities as ex_act (so lower is more destructive) + ** scatter: If you want the parts to slide around 1 turf in random directions + */ +/obj/machinery/proc/fall_apart(var/severity = 3, var/scatter = TRUE) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + + var/atom/droploc = drop_location() + if(!droploc || !contents.len) // not even a circuit? + playsound(src, 'sound/machines/machine_die_short.ogg') + spark_system.start() + qdel(spark_system) + qdel(src) + return + + var/list/surviving_parts = list() + // Deleting IDs is lame, unless this is like nuclear severity + if(severity != 1) + for(var/obj/item/weapon/card/id/I in contents) + surviving_parts |= I + + // May populate some items to throw around + if(!LAZYLEN(component_parts) && circuit) + circuit.apply_default_parts(src) + + var/survivability + switch(severity) + // No survivors + if(1) + survivability = 0 + + // 1 part survives + if(2) + survivability = 0 + var/atom/movable/picked_part = pick(contents) + if(istype(picked_part)) + surviving_parts |= picked_part + + // 50% of parts destroyed on average + if(3) + survivability = 50 + + // No parts destroyed, but you lose the frame + else + survivability = 100 + + for(var/atom/movable/P in contents) + if(prob(survivability)) + surviving_parts |= P + + if(circuit && severity >= 2) + var/datum/frame/frame_types/FT = circuit.board_type + if(istype(FT)) + // Some steel from the frame, but about half + surviving_parts += new /obj/item/stack/material/steel(null, max(1,round(FT.frame_size/2))) + // Two bits of cable, but not the 5 required to rebuild + surviving_parts += new /obj/item/stack/cable_coil(null, 1) + surviving_parts += new /obj/item/stack/cable_coil(null, 1) + + for(var/a in surviving_parts) + var/atom/movable/A = a + A.forceMove(droploc) + if(scatter && isturf(droploc)) + var/turf/T = droploc + A.Move(get_step(T, pick(alldirs))) + + playsound(src, 'sound/machines/machine_die_short.ogg') + spark_system.start() + qdel(spark_system) + qdel(src) + /datum/proc/apply_visual(mob/M) M.sight = 0 //Just reset their mesons and stuff so they can't use them, by default. return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 365fda6b50..ac091a9fdb 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -460,8 +460,7 @@ GLOBAL_LIST_EMPTY(smeses) ..() /obj/machinery/power/smes/bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage_type == BRUTE || Proj.damage_type == BURN) - take_damage(Proj.damage) + take_damage(Proj.get_structure_damage()) /obj/machinery/power/smes/ex_act(var/severity) // Two strong explosions will destroy a SMES. diff --git a/sound/machines/machine_die_short.ogg b/sound/machines/machine_die_short.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6aac3e93564c13d2fb091285e9768464635760fa GIT binary patch literal 23746 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 rbAAiOo5x}Ecy^ojop Date: Thu, 10 Jun 2021 16:22:09 -0400 Subject: [PATCH 08/81] Touch doors --- code/game/machinery/doors/airlock.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 97558066e9..2665a5f149 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -13,6 +13,10 @@ power_channel = ENVIRON explosion_resistance = 10 + + // Doors do their own stuff + bullet_vulnerability = 0 + var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = 0 // if 1, this door can't be hacked by the AI var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. From 7fc93097b22d3a8931824b072fc0068dd3358f0c Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 11 Jun 2021 18:01:45 +1000 Subject: [PATCH 09/81] Fixes some telecomms things --- maps/tether/tether-05-station1.dmm | 1043 +++++++++++++++------------- 1 file changed, 550 insertions(+), 493 deletions(-) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 3a943c67b1..60478d1065 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -1281,6 +1281,17 @@ /obj/machinery/door/firedoor, /turf/simulated/floor, /area/teleporter/departing) +"acu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/obj/machinery/porta_turret/stationary, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/tcommsat/chamber) "acv" = ( /obj/structure/table/rack{ dir = 8; @@ -1333,6 +1344,17 @@ "acz" = ( /turf/simulated/wall/r_wall, /area/engineering/hallway) +"acA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 9 + }, +/obj/machinery/porta_turret/stationary, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/tcommsat/chamber) "acB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1345,6 +1367,87 @@ }, /turf/simulated/floor/tiled/monotile, /area/tether/exploration) +"acC" = ( +/obj/item/device/multitool, +/obj/structure/table/standard, +/obj/structure/cable/green{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled, +/area/tcommsat/computer) +"acD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 25 + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acE" = ( +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/turretid/lethal{ + ailock = 1; + check_synth = 0; + control_area = /area/tcommsat/chamber; + desc = "A firewall prevents AIs from interacting with this device."; + name = "Telecoms lethal turret control"; + pixel_y = 29; + req_access = list(61); + req_one_access = list(12) + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acF" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/porta_turret{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acG" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "east bump"; + pixel_x = 28 + }, +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/porta_turret{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) "acH" = ( /obj/effect/floor_decal/borderfloor{ dir = 5 @@ -1363,6 +1466,28 @@ }, /turf/simulated/floor/tiled, /area/tether/exploration/hallway) +"acI" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/alarm{ + dir = 1; + pixel_y = -25 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) "acJ" = ( /turf/simulated/floor, /area/engineering/engine_room) @@ -1434,9 +1559,72 @@ /obj/machinery/camera/network/engineering, /turf/simulated/floor, /area/maintenance/substation/engineering) +"acP" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acQ" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/light/small, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acR" = ( +/obj/machinery/firealarm{ + dir = 4; + layer = 3.3; + pixel_x = 26 + }, +/obj/machinery/power/apc{ + name = "south bump"; + pixel_y = -28 + }, +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/dark, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) "acS" = ( /turf/simulated/wall/r_wall, /area/engineering/workshop) +"acT" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/wall/r_wall, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "acU" = ( /obj/effect/floor_decal/borderfloor{ dir = 4 @@ -1452,6 +1640,33 @@ }, /turf/simulated/floor/tiled, /area/tether/exploration/hallway) +"acV" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Telecomms Access"; + req_one_access = list(10,12,16,17,61) + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor/glass, +/turf/simulated/floor/tiled/techfloor, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"acW" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/wall/r_wall, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "acX" = ( /obj/structure/table/reinforced, /obj/effect/floor_decal/borderfloor{ @@ -1465,12 +1680,87 @@ }, /turf/simulated/floor/tiled, /area/engineering/engine_monitoring) +"acY" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/machinery/camera/network/telecom, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"acZ" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "ada" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, /turf/simulated/floor/tiled, /area/engineering/gravity_lobby) +"adb" = ( +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/machinery/turretid/stun{ + ailock = 1; + check_synth = 0; + control_area = /area/tcomsat; + desc = "A firewall prevents AIs from interacting with this device."; + name = "Telecoms Foyer turret control"; + pixel_y = 29; + req_access = list(); + req_one_access = list(10,12,16,17,61) + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "adc" = ( /obj/effect/floor_decal/borderfloor{ dir = 9 @@ -1487,6 +1777,19 @@ }, /turf/simulated/floor/tiled, /area/tether/exploration/pilot_office) +"add" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "ade" = ( /obj/machinery/atmospherics/portables_connector, /turf/simulated/floor/tiled, @@ -1510,6 +1813,21 @@ }, /turf/simulated/floor, /area/engineering/engine_monitoring) +"adg" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "adh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 @@ -1561,6 +1879,46 @@ }, /turf/simulated/floor, /area/storage/emergency_storage/emergency4) +"adk" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"adl" = ( +/obj/machinery/power/apc{ + cell_type = /obj/item/weapon/cell/super; + dir = 8; + name = "west bump"; + pixel_x = -24 + }, +/obj/structure/cable/green{ + icon_state = "0-4" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"adm" = ( +/obj/machinery/atmospherics/binary/passive_gate/on{ + dir = 2 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "adn" = ( /obj/structure/table/rack{ dir = 8; @@ -1625,6 +1983,22 @@ }, /turf/simulated/floor, /area/storage/emergency_storage/emergency4) +"adr" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "ads" = ( /obj/structure/cable{ d1 = 4; @@ -1704,6 +2078,50 @@ }, /turf/simulated/floor/tiled/monotile, /area/tether/exploration) +"adx" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/closet/crate/solar, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"ady" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/item/device/radio/beacon, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"adz" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "adA" = ( /obj/effect/floor_decal/borderfloor{ dir = 8 @@ -1763,6 +2181,19 @@ }, /turf/simulated/floor, /area/maintenance/substation/engineering) +"adE" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "adF" = ( /obj/machinery/power/terminal{ dir = 1 @@ -1808,6 +2239,19 @@ }, /turf/simulated/floor, /area/maintenance/substation/engineering) +"adJ" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "adK" = ( /obj/effect/landmark{ name = "morphspawn" @@ -1834,6 +2278,42 @@ /obj/structure/catwalk, /turf/simulated/floor, /area/maintenance/station/eng_lower) +"adM" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/borderfloor{ + dir = 4 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 9 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/hallway/station/atrium) +"adN" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/borderfloor{ + dir = 4 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 10 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 9 + }, +/obj/machinery/computer/guestpass{ + dir = 8; + pixel_x = 25 + }, +/turf/simulated/floor/tiled, +/area/hallway/station/atrium) "adQ" = ( /obj/machinery/computer/power_monitor{ dir = 4; @@ -9412,19 +9892,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/storage) -"ayI" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "ayK" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -9614,22 +10081,6 @@ }, /turf/simulated/floor/tiled, /area/engineering/engineering_airlock) -"azu" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "azv" = ( /obj/machinery/door/airlock/multi_tile/metal/mait, /obj/machinery/door/firedoor/glass, @@ -10097,19 +10548,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/office) -"aBk" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "aBl" = ( /obj/structure/window/reinforced{ dir = 4 @@ -11089,15 +11527,6 @@ /obj/machinery/door/firedoor/glass, /turf/simulated/floor/plating, /area/quartermaster/storage) -"aEF" = ( -/obj/machinery/camera/network/telecom, -/obj/machinery/atmospherics/binary/passive_gate/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "aEI" = ( /obj/machinery/power/solar, /obj/structure/cable/yellow{ @@ -14879,26 +15308,6 @@ }, /turf/simulated/floor/tiled/monotile, /area/tether/exploration) -"bPV" = ( -/obj/item/device/multitool, -/obj/structure/table/standard, -/obj/structure/cable/green{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/obj/machinery/turretid/lethal{ - ailock = 1; - check_synth = 1; - control_area = /area/tcommsat/chamber; - desc = "A firewall prevents AIs from interacting with this device."; - name = "Telecoms lethal turret control"; - pixel_x = 29; - req_access = list(61); - req_one_access = list(12) - }, -/turf/simulated/floor/tiled, -/area/tcommsat/computer) "bPX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 5 @@ -15008,30 +15417,10 @@ temperature = 80 }, /area/tcommsat/chamber) -"bTu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 9 - }, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/tcommsat/chamber) "bTZ" = ( /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/dark, /area/gateway/prep_room) -"bUj" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Messaging Server"; - req_one_access = list(12,16,17,61) - }, -/obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "bUz" = ( /obj/machinery/camera/network/telecom{ dir = 1 @@ -15588,14 +15977,6 @@ /obj/effect/floor_decal/corner/paleblue/border, /turf/simulated/floor/tiled, /area/tether/station/dock_two) -"cjr" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "cjQ" = ( /obj/effect/floor_decal/industrial/loading{ dir = 8 @@ -15759,19 +16140,6 @@ /obj/effect/floor_decal/rust, /turf/simulated/floor, /area/storage/tech) -"cuN" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "cvx" = ( /obj/machinery/shipsensors{ dir = 1 @@ -16696,32 +17064,6 @@ /obj/machinery/door/firedoor/glass, /turf/simulated/floor/tiled/dark, /area/bridge/secondary/teleporter) -"dkR" = ( -/obj/machinery/power/apc{ - name = "south bump"; - pixel_y = -28 - }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/obj/structure/cable/green, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "dkV" = ( /obj/structure/bed/chair/shuttle{ dir = 4 @@ -17858,18 +18200,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/storage) -"exs" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "eyT" = ( /obj/structure/grille, /obj/structure/window/reinforced/full, @@ -18607,20 +18937,6 @@ /obj/effect/floor_decal/corner/green/border, /turf/simulated/floor/tiled, /area/tether/exploration/pilot_office) -"fqw" = ( -/obj/machinery/alarm{ - dir = 1; - pixel_y = -25 - }, -/obj/machinery/firealarm{ - dir = 4; - layer = 3.3; - pixel_x = 26 - }, -/turf/simulated/floor/tiled/dark, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "fqP" = ( /obj/machinery/power/apc{ dir = 8; @@ -19255,26 +19571,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/station/atrium) -"gdZ" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/item/device/radio/beacon, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "ged" = ( /obj/structure/bed/chair/office/dark{ dir = 4 @@ -19602,20 +19898,6 @@ }, /turf/simulated/floor/tiled, /area/tcommsat/computer) -"gvM" = ( -/obj/structure/cable{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10; - icon_state = "intact" - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "gys" = ( /obj/machinery/door/blast/regular{ density = 0; @@ -20211,23 +20493,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/belterdock/gear) -"heQ" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 28 - }, -/obj/structure/cable/green{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "hfo" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 @@ -20471,28 +20736,6 @@ /area/tcomfoyer{ name = "\improper Telecomms Storage" }) -"hqq" = ( -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/machinery/light/small, -/turf/simulated/floor/tiled, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "hqA" = ( /obj/machinery/portable_atmospherics/powered/pump/filled, /obj/effect/floor_decal/industrial/outline/blue, @@ -21909,16 +22152,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/station/docks) -"iAx" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/wall/r_wall, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "iAG" = ( /obj/machinery/door/airlock/glass_external, /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -21991,20 +22224,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/belterdock/gear) -"iEU" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "iGo" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, @@ -22478,23 +22697,6 @@ /obj/structure/sign/department/eng, /turf/simulated/wall/r_wall, /area/hallway/station/docks) -"jmn" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/door/airlock/highsecurity{ - name = "Telecomms Access"; - req_one_access = list(10,12,16,17,61) - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/techfloor, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "jms" = ( /obj/structure/table/rack, /obj/item/clothing/suit/space/void/mining, @@ -22576,32 +22778,6 @@ }, /turf/space, /area/space) -"jsK" = ( -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/turretid/lethal{ - ailock = 1; - check_synth = 1; - control_area = /area/tcommsat/chamber; - desc = "A firewall prevents AIs from interacting with this device."; - name = "Telecoms lethal turret control"; - pixel_y = 29; - req_access = list(61); - req_one_access = list(12) - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "jsP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -23281,15 +23457,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/substation/tcomms) -"kcM" = ( -/obj/structure/closet/crate/solar, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 6 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "kcV" = ( /obj/structure/closet/emcloset, /obj/effect/floor_decal/industrial/outline/blue, @@ -25862,32 +26029,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/station/atrium) -"moi" = ( -/obj/machinery/turretid/stun{ - ailock = 1; - check_synth = 1; - control_area = /area/tcomsat; - desc = "A firewall prevents AIs from interacting with this device."; - name = "Telecoms Foyer turret control"; - pixel_y = 29; - req_access = list(); - req_one_access = list(10,12,16,17,61) - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "mou" = ( /obj/machinery/door/airlock/glass_external, /obj/structure/cable/green{ @@ -26722,18 +26863,6 @@ /obj/structure/catwalk, /turf/simulated/floor, /area/maintenance/cargo) -"nab" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/tank/air/full{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "nac" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/steeldecal/steel_decals7{ @@ -27150,17 +27279,6 @@ }, /turf/simulated/floor/wood, /area/quartermaster/qm) -"nwy" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "nwK" = ( /obj/effect/floor_decal/industrial/warning, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -27635,23 +27753,6 @@ }, /turf/simulated/floor/wood, /area/quartermaster/qm) -"nWq" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/turf/simulated/floor/tiled, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "nXm" = ( /obj/machinery/atmospherics/pipe/simple/hidden/aux{ dir = 8; @@ -30257,26 +30358,6 @@ }, /turf/simulated/floor, /area/maintenance/cargo) -"rjV" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/computer/id_restorer{ - dir = 8; - pixel_x = 32 - }, -/obj/effect/floor_decal/borderfloor{ - dir = 4 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 9 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/hallway/station/atrium) "rlr" = ( /obj/structure/table/standard, /obj/item/weapon/tape_roll, @@ -34128,20 +34209,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/belterdock/gear) -"vXw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/machinery/porta_turret{ - dir = 6 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "vYj" = ( /obj/structure/table/rack{ dir = 8; @@ -35117,16 +35184,6 @@ }, /turf/simulated/floor/tiled, /area/tether/station/dock_one) -"xlb" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) "xmh" = ( /obj/machinery/gateway{ dir = 9 @@ -46244,9 +46301,9 @@ tRn vYJ vYJ dPx -rjV +adM kts -vYJ +adN vYJ aba abm @@ -50468,7 +50525,7 @@ rLI amJ avZ thI -rLO +acu xTB bpd xTB @@ -50624,9 +50681,9 @@ izZ otm dkG cEE -kcM -exs -nab +adl +adz +adJ kff kff kff @@ -50757,17 +50814,17 @@ kyd bLZ gtY xEG -vXw -cjr +acD +acF vxd lsa cso -cuN -ayI -dkR -kff -aEF -gvM +acI +acT +acY +add +adm +adE uWa gbt fFq @@ -50904,11 +50961,11 @@ xzC hkR lGY nJx -iEU -azu -nWq -jmn -gdZ +acP +acV +acZ +adg +ady mpB gWD nSK @@ -51041,16 +51098,16 @@ xSF xjt awC xEG -jsK -heQ +acE +acG vxd qOh yaH -xlb -aBk -hqq -iAx -moi +acQ +acW +adb +adk +adr sRH jSj kff @@ -51188,11 +51245,11 @@ xEG xEG woq jxP -fqw +acR xEG dls dTU -nwy +adx dyt hAw kff @@ -51218,7 +51275,7 @@ aaa aaa aaa aaa -aaa +ahW fLT fLT fLT @@ -51334,7 +51391,7 @@ xEG xEG xdJ dTU -bUj +kff kff kff kff @@ -51360,7 +51417,7 @@ aaa aaa aaa aaa -aaa +ahW fvg aaa aaa @@ -51482,6 +51539,7 @@ dTU gfX asM hOw +ahW aaa aaa aaa @@ -51501,8 +51559,7 @@ aaa aaa aaa aaa -aaa -aaa +ahW aaa aaa aaa @@ -51604,9 +51661,9 @@ xTB aie axf uyX -bTu +acA xSF -bPV +acC pyE ged ayg @@ -51623,31 +51680,31 @@ gDA dTU gfX fpk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ahW +ahW +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahV +ahW +ahW +ahW iZC iTF jFv @@ -51766,7 +51823,7 @@ dTU gfX fpk aaa -aaa +ahW aaa aaa aaa @@ -51908,7 +51965,7 @@ gfX gfX rhn aaa -aaa +ahW aaa aaa aaa @@ -52050,7 +52107,7 @@ gPx gPx hOw aaa -aaa +ahW aaa aaa aaa @@ -52192,7 +52249,7 @@ aaa aaa aaa aaa -aaa +ahW aaa aaa aaa @@ -52329,12 +52386,12 @@ aaa aaa aaa ahW -aaa -aaa -aaa -aaa -aaa -aaa +ahV +ahV +ahV +ahV +ahV +ahV aaa aaa aaa From 076dd98e62ffd5a309a64787f17252c859009006 Mon Sep 17 00:00:00 2001 From: PastelPrinceDan Date: Sun, 13 Jun 2021 22:01:52 +0100 Subject: [PATCH 10/81] fluff item added woo adds evelyn's winter coat --- .../loadout/loadout_fluffitems_vr.dm | 6 ++ .../vore/fluffstuff/custom_clothes_vr.dm | 53 +++++++++++++++++- icons/vore/custom_clothes_vr.dmi | Bin 221635 -> 222425 bytes icons/vore/custom_onmob_vr.dmi | Bin 23093 -> 26022 bytes 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 2ded432e8b..08b552cd0d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -763,6 +763,12 @@ ckeywhitelist = list("pandora029") character_name = list("Evelyn Tareen") +/datum/gear/fluff/evelyn_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/ + display_name = "warden's navy winter coat" + ckeywhitelist = list("pandora029") + character_name = list("Evelyn Tareen") + /datum/gear/fluff/lily_medal path = /obj/item/clothing/accessory/medal/silver/unity display_name = "Lily's Unity Medal" diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 74dae36ba4..6c3bcc7c71 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2330,4 +2330,55 @@ Departamental Swimsuits, for general use if(!istype(usr, /mob/living)) return if(usr.stat) return - colorswap(usr) \ No newline at end of file + colorswap(usr) + +//Pandora029 : Evelyn Tareen +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn + name = "warden's navy winter coat" + desc = "A custom tailored security winter coat in navy blue colors, this one has the rank markings of a warden on it." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "evelyncoat" + + icon_override = 'icons/vore/custom_onmob_vr.dmi' + item_state = "evelyncoat_mob" + + armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0) //same as other sec coats + + var/owner = "pandora029" + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/ui_action_click() + ToggleHood_evelyn() + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/equipped(mob/user, slot) + if(slot != slot_wear_suit) + RemoveHood_evelyn() + ..() + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/proc/RemoveHood_evelyn() + icon_state = "evelyncoat" + item_state = "evelyncoat_mob" + hood_up = 0 + if(ishuman(hood.loc)) + var/mob/living/carbon/H = hood.loc + H.unEquip(hood, 1) + H.update_inv_wear_suit() + hood.loc = src + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/proc/ToggleHood_evelyn() + if(!hood_up) + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.wear_suit != src) + to_chat(H, "You must be wearing [src] to put up the hood!") + return + if(H.head) + to_chat(H, "You're already wearing something on your head!") + return + else + H.equip_to_slot_if_possible(hood,slot_head,0,0,1) + hood_up = 1 + icon_state = "evelyncoat_t" + item_state = "evelyncoat_mob_t" + H.update_inv_wear_suit() + else + RemoveHood_evelyn() \ No newline at end of file diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 0c8f06b8592a3180f3946d2daab9c2e339fbde06..647e4d3f826bd0adfbb028b1ac6c14c1c24f8b9b 100644 GIT binary patch delta 15178 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 HdEoyC2)l_{ delta 14461 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­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 egZ9e>0ni&Z#)mBI!11->xyQL**5_Hy*_ zaddZsKmtBxr?qSU6d{S;IDNojq!aT_S<`%k-3O=T@#=jy%4}gZzgcXZ;f@Ygy{~zi zscpHoA%0$NdwZ;8I(C=<2OeszPg?eVbQ!MVJeK)egC{THDw^!+$?>$j4zk`;#KV6d z^-`Us56$-S=#75>%;6;1JTJySAhCsB%5xoV&P$V+*h-8>9A-q6;RP{zvTVi7d)mq1 zlZ78tpo!k?{uX~kKU%|YW=QzZ!{CSh*vp4)T-oebzDMYx>78LsWsS!aznu)&gYufL z`oG}yI5E`F(nmSv6WVLN{p)07Rz-kK*3+hR%4_fpH&NH}HE=)KIQ|Rs_G5$^R-cM) z#)olKW*NubOT>~nJb)`eBD=A1&P59TXZRfOPVW=@@_J`X@gS#h;_n^q&xwPIlZYY1 znW<^V$4`n^zU4rlO+!;hFhg^pvU6^2pWH_yFHZ!tH7fp!QU@(ZlF_1UO*htW9NkZo zqfc4rg-2d~$;0lhfMsHF1G5|t?y--(Bh7iM@cH#KDCy%yT&H9!>H!L-&U?wredPBx z4YjXTuScJzmC~=I-hW+%m%o`x_<;Uxo(+`|ZkN!VgJ8^zJnZkEJv)DK@hj_vik)SS z5A(a%yK~LM3d4iq;!m}-NMmAR$_jN_n3PmhsL2JwR8(x9{MQj?1f_>rKq>#@Lk8gY z3-D2*+;G0qh8D&g+iPIeUS_Xe-dzWu`zi9wI5>Mz3?d7mjRL$?TnZb zVurCbR47VjL$M(T^_MOXIQ*SLps8{EiVLtqd!uU zXr`@9c;Y+tr2M_{Ve}yeKpzd`C~00u+0bnU30m?T?=bu+JN-zrkxi@Lwb?ree&yHm zO3BVn9Ec)8nfm=rVRwqQ`2tpe4cWsuHqAzX<(=11t+Svx5(K?CKJmVEvMXzoRy>0P zJlaj5WktSC)GonMl!_hWy*`KV?<`uWk=xr`W|lkp*^%dnVLXd~&KCKy28?3W@@OCRMZ2-5We`$= zJz2)-2!OlRv!`Rb^mAoC6KcfW7|xYi{tA0*ybqmR=He_}&-(*A!J`J+uKq}R;}D4Y ze{`q*_)6Sg$^&y;5Q@oiJRf-`Qs_NVl#RtmtgHq`qe^U2A0#%W|Gm+F90R!NIr1%d z`T3~;jJwW!AB%8;6zA0C$qtpBq=$UkKmT0JBfm=Ryn|WA#Bi|14|kJ8TS}M1hojOl z>)*Pg$pO}T_I{75y(o6)W@auu`-r8SGkTg7Z(qT|6_5B5weqHplRzTq>ZbD(aSA>m zGagne(;d}<;^NKuo!+Eu^pZNOYqtEG!__zfMduuGDF6P2y*5LeV%rD5jpo^9o*oli zW3aM(ws@cq{c|u>rAA_#IM|e-@jF~w6q@YCan>s#Ke%C9dwiL&o=q)OiM^e z%=@X|r=nHj;Hc)xA%HEZ3c(h6xd7^MQcuG-+!-!L@m#k+U52x};Yegu@AQv?0`cEpa?jL}`$L%krQx%-{aHjd z7UavFMZ=f9KR$1s2H_6zEBRr0Yh`Rx2If5~Y!Ick`Ed4fS_Zq}+WKj9|eYLH>kA4#8^ zgWqA8U`vttF~`j*NbM9Ee+C_bc=S#*j9szXTiGCL9Haq7A(U2zKh?pSWXmac*lua? zKsE8f><=}FdiXP*On6R$SuL}77L$I#S|(F}Ki;g#@)Z74H_?3n`?@z%G!xbRq4?W; zxqVRn^Owym;-S)1An5egX0D72bxm$vqtnf^7syw}U(cq;Jk`po7}30Z1DL@pav6ih zhOclS3vTXGEu>>QVqzY@=0c_0IYYCDFIWT{Y}}w|F3#?jJaG8(cCIr>n-=Ql9RBQM z9V9lT1SK*Ctph*fL!dxo_qn8o;b7O`&Sie#P1ze!oQa9t9`Fp?a4^o4iMO%m1*Bcn zj)Y7yl+18E6a=r`@FqzEJU32Kzp|LZ5TGO!h z=g+@*m}Y&K0r~{2choOeVMpo`?mvV!PZ0xAa8J=0t+7hi-eg(w#;xk@3Xppa^$6y1 z$}ufNFB_g^y~lh&97J5tdkE&9C*RDriAc5GFO(&6x%d(dW!n~7H_t0CyzUT}{Hfk7kqrg6EFW(`b|@9#tq< zmbl}o0lFDY2gobo;s9=;cJ?>_pnOT+?HAHV>Wgp$An;Ja4Wo$q;BjAw@ZnraqWket z;$`m%GCqo_+VhcUg#xJ*$iRfxIwhH5*EWZ@3V)=n&uSIMM!HQfH{z;hNcL8+ zq}8Uu9*}V0GBcjALVCDIY$> zirWv-D^kAiA%_fQ%MqyR>DDz?lR<_obbFZ?m>_X+l5szU^2i`=_oO{O-NmLeUxlZ7 zFLmK{BLF=;z5d6h`uf)AXZs65`!vbWh3ndQ-GM|&?{!UB0x1))GhJcmvVl3-{Fgw; zgQE_kSr=^8D2OCyMN7~B4qy;hf2PZMDHQtQ#c*jN3?0*FLo@aag_Az>^`7U!?AGimGr26e0;#;F%nJ( zTwk6jn|$1#Ev|rKUYsJm_heq#FxdoOh(lVMk?)!i?Ph`|?K7lG81wgD5mL)cs>N4` zk60^Vu(9h&& zIx2l3y3P)Ro;$ePQ#gXYL|)$BqTcI(W+w-Ivjr>8@#%GUPaP-bq?j3Nd$c&mK@O-< z4_#|--1boJo>D-xF%*|vboY=e9N&d3W;{#JtS080ySi>z!RsbIxH#Gv4Ms~J;*&nE z>GQu+-ZZr4#r68j>8YQMjZKGLP3H=VO;C_DglBxm+H&*<;}B7 zHIYsyvM^10akie$I>!mT_0_$XxA? zXw!K1?A={#L-Vy})9$vAtJhBYZ{9S1Z);l+cbedZblB&H6eh_JgW*tH`|#GRj|tnY zQ$LX?Q#XDQ2#fu4t3iIjc*r$RmU({Np$AP@qqK&x^J%LF2<>ca*f=?HSXfv*nnN63Y44Ei z&s`ZssR#0@fn}RoSR^MOQ-9viKQMwkxL-}!TX4=D7eKod;10R_6+4GeN3?nSTWKZO zr2r{Tw`F4>!00$8FgfFKLFNks1HLNl12&GQxN~?CCo(^p*J%!KaD%{hN&!VEZl`~_12AD#o6U=|O7a2le8Fb3Co!bL@D;x0j`X5|q10#90I< zSew}308{+WB4y%IvHr>PCSX~1R^QZ?#Lb7hOetH66o zT@a$G`uas;72S^3>bc6VBs@^q3B)#oo%%nu?tkju|Nrj*iC|be6VwrTJHDpEH#hFL zXWw&NIgUgyDrx-*_pmGo7P~Fb*U{M(6jHY%H>=$u#nObw9dZ-P>x+6lqhM6$^pDXG z7lw)k9hJ1#Bn(*PCUsBGuHG@AKBlJh?5`!Fno;)EPrjn5^tQ)ZA#E*H{V5dV)wTm^ z0W^l6L5s$){&Tt4+-sh<^z}7Zse~t;1GT|-6YgCJ%9z{?zz+L}V z+ddVef$m9iaS$bPcHFgCF#580s%ckps2CG-+zX~hpyQb5!L*@lfP#l&)%|>LC(aOy z>K>h!w<)^9=234}lcMn7XJuig|Xg%?J9QiNu;DnXSzwD{XdFfxRJQL>Ly{dgm2KFj%hl^f3uDg@AVw625rXTyg8|@~k z)B@%H{ks%;L?d;OkD@rJSth86EG`%@VQzRMWm{*%XrRwgyelHDzlhOSe1fEAXI6Y z#(^UrQ2EEFMyZ5YO19qtb~%@x7DS!ka+b--&5=4a@I|pcR#g2dWud|^m3nN4sVbhn zFcSUcyT`iJR960(4A?s=qI|t#^*k5;(>oU$ z*~?!F6Vizd?KW#Psw^BMh48ub+Q7_bWHQt?k|pPpIpR zGs3q=A*v;`c1j1$=x^?+^L+gQ1=u;Mw&V9*cj(tw%5=nj%R@eV_|X67&+XIiv$Em` z2Q>%9H&4XH#YZnyS-UNuj7N~#&`|>LE|lBT=gWj5zdXl?8B|@EVqSGey_yC7_ASq+ z6>G{}(MORo;a9ol?Nwxh^?(0&hITFmwKOA}{H z%i6FyK~mKUkJwDPdGk;64EeVT%6zcBX32Gp*nquK0?|-(z&v~py(5qs^d_jQECU=% zm4Qy5hPET8$F)2k4&;?M03s*!IqLVl7ro64qJPD|JZFIZ%$)WM*?8GwJNT^6W;o?3 z9)9ceiwvJ;r8mQJAbKi~(SWeWp}=L1wOZD9AWfAK!z=d05VC>cYa0)tYV2^iaecy9|e%-!N@G1 z#2KkA#?f&x{@A{t`oqinW5mR4sxF8x&MH+>EIkW8bvR@{2Kj83FpAZh$=4w^#-ZKs zitFF+JryA^ZSia+G2yU$`={TRlb8ikTl)i|++1EWGdBBn?vojH(72w&7Nh95Q>uCR z-7=tn_2pG8rBmYq>Rp{`dGe98vrR+ZP|$EbecSoVY^3OA2-Vk*Uz%und!mahKSIK~ zoZIho7#=8M`a-3zzC0)=W?7EoS7(#z^JibUoM**>?Apuu>?DXsZxCNxhKpju@5B8s zm0+)W*o-twQ2Wg!f{*bKjEL`xOjSd%Wo!ytYGF2Q`Z?l|uy)`83$h4S<`a|@tXX~b zWW0`4@VnslaHFy?9^{ka$d{Y4kU0lb%mcjm5_47+YMCUM!aWHf7B7XD$kv+l=M?;YeCe z*A1o$>=fSBCK13{A(KVN&0H>9+o#qa0`Yok@M=|qhmq0D;ky|=MB|yxyMZ-qh`Ahx zYw%wb4I+TE&Bd+v>zg;lvu!M46`T(_+KvMpOJ?i`_I}KzB9*j%@uA^b8(P2m+z~tc zCj1$lAzkyxD!m1&2LBZ`b2xIAq^!wUP_9;~#QR`%F=P0W`8BH!Q=2|0!{PWSpVJ9S8O zN0%m>f6Ry$&dQoZKxI52d#^ZO)x$?7d^D!D4^U&zQyptMMXey)mo{vI3Z#C`q%!Za zi?2NBfHupjJEWvS-Ey6XwrRrz=B=N(1NK&PzAK}FgJ0L}<{~8-smO+%@q}E+lsyoB z2fx?t{X2H$l*Y1>bTA7igDNeAhs(d8zDE45$~TaOb$=Q4NCg-@UxUokX(!Xu-^{J3AM`(X8Vov!B&%MR8PWW z(GKkrc$$))6V;^1;6XwkrU{DRjPz6B+mZc^z8nT*?nnLK-M^a}l#|F2ZEm5Aei=tW z7MmI%mOewr@v9es&JKjEayiE?Oh>F{-_~-$u)#%^S7^vd707lvY)KrBxLxBYU0H?} z4D2vI`k@6@Lb?t;IRfXT(>h*n^@EPhFha>HBj%*A-qo$26Rr@l5a>cCrDf-y#<7iB-837q-H%{JFWn*-9hO!bC{bJmt}yry{X27gG0cZ&naFbYcn|OTt!5 z@?iuhIaBSh%R%oi0i)3i|7yYc^6Z`n7ugYld-Cwsc({+XTrt&kG)ZLwU?fIdtv;!v znmBsfZ=&E^Hci61urrYC`0G1H!%v-Ya*GFh9g%r!OvgcZ<)e$$4y<6WMF=AqYtn`9 zYlRz5JUKG1eS8nlI(`8~tro#vj}{@?L9Norldh0ME-_b0X)=k9HLtBu%LdR;<47~P z){rJQy$X0QIy%GYVnaYTA2Ms~;^izk_QAC#C;0iB7MM8~8&KbWyyAK|1wB1Ju59MI zo~2#cavB62O45M^@)X`!`uR@0-uM3W3G=cS6Z5z%}Bzuy?=RLpEZX@$7jTAQNJ<$soLnxOS3s~Z&`@*2Bu_M zviqoqr*IV!`WKK`&iOE|HPD_u*z*t6I69Rx+rhzOiM9P~K4_>6o7$z8b$BNB_*$v} zg4IF1-;$i+|AQ;!CP*L*WZoDw`qe=|%cjGA$2JC?hz)rLT!i&MFpdPhd0Pw;;PICT zYqMUW{FX_>KzkXoHa`?5x0IABZ3jT-TAds?0our?R=$4a7`J<8-2s_6`K4qM$hhmr zQbX`PRrG)B=qy0V>)0UNwHye6*s3*fzNGCxpFhB?2MA4qN*SQokrASz}e zqVO{wATVIp&%G}a8p_XJ`~qgM>AxMp(r*s2C>k^a!H$f=wM9hQjvP4E$XLE93hh&H zOE4>vO!we9ZG180nbF@UYIV;rHnkEfOwDFH+P9uWtB!+88IyQK()Wc@YEmQs6 z)O_ELjybP>p1&jrJ8eg+WlT%Fb;;mQ!y1McY+it8eg12vfddA(gbV2rUT4aRZ;Ueb1&( z;-{B(1P8Eip^A1_VAkrw-VlP;2yan(NtfX;sXO83uI^BW67;O z`t>Ho@KbDBDvWJ;4UF8+3U}rN27%WxhBrX$bK`#O;`z(u^rBW45Ck(Zin<&=4qgK$ z;1VllMQPky4C`FGKWXDv-?XqrQ4Zk(I1td%wcLK9rW3E7^&uMZXcBx#`+#Q8^0l|4 zN3Mr@NL|7S(-fbUR`di_&>BgLhmg1IlKd=T2PRX`T|3GzS3cI0Zgyhj)$EWkU;*;6 zQ3RajfgBV`^C-U)?GKtWwv21ZKKyCt{l^iEjLo^o7jZAdRPztgPQ(lX6lK%;CcG;i8wZiMBVkklz}u*UA?IIhH?+aGpVgR zOw8eYGErqA9^6n~v$r}0a5Zx#ZXZ)&{X3)#pG~no)xUao_$wUe9OS2m%!*B%e6gIFncHQP7m-{KBa>L~RVw?zIm#oe@F2+%?EG9WvOsDD@1(4Bip&yulFkI`>!N$ z#LRD}XKbE45x<>f(a?cuLbW zc0ZF3MTrErpMAzN{gvcG0Lr-~gqy7UZ(jlcgw#=!Mv^_MJ-1|r5Tx?OO$GXwto*|u zl6#?!}&FNS^7^DW2RlMSYdGP`@kMH3WR8oW*8Rk+?=+y zy#~{!8#6`D@;kgBRhnJEe9!y#H@F80*e!m85G~wtqzE=A`N0L?a7sV-X25?X2Sc~; z2D*pTz&*UefNdfbetSAlP66gdq9<3DU{2RR%(`A*=CBN18o$)>@LiH9{(A}yP2LJ2 z|6L7$tj!6>>hQN5)WxeTXvKj9`mzq?%%ZwvN`;-jr;F500+~lWW_@RR^sX zx8whK@bRo1-cxByBk4>mPa&Iqn`m*=a#Dz3rqaJ%Oedi^zHVsf${p@F>~B^<3cnU% ziP&+`yO{T%1x_b#EXz^FB?!MQ67R9}2PPI9>7>|RnC8DhJaUg=BCb(PiJe&DdTzR$ zcv1i3#ZWu5@$m~nTLNZjlL_%Q<~2M&boDs{1vC>>nqbH9o9FS1#$z`u<{*&sp;c5= zFR20A#`JaP6A=}aM-J+iVeT({4|nt*uvfM))@8kpKZlC8lPI8WGuCKa85Y?Zf$n!r-aw_@TO~T8#%O^Su4v2uBT`v zo_58^+XQOL-Kg~EbHL-+t{#4yWUr;Z( z^yhY(lVWr)Gz~hSS8SYtJ&_a$Hk|PjIB!n|B>EPynoMm$KK)J`WFwEcso2G zO7nZ!p_VOkH^5d@&lHhB+e&$>#dRZU5o@&mx|SUoP-|V8vSSFxzi6vVW};z*gnEOB z1%x~{SM;!wOy9ksR0D3xwDqV_i?0ydAvO-v>blLEgs)~UGa~m2v)r~%XM*-yc_1n* zmL(-6qXn*M%Q^i5cOkkmZkbKH$?mQ1SQi50FN2-{^X!n0_v498z#SWO(5$J*MU>}E z>sj9AOkII+-xT@w!HdB1S14PQvwQ#qqU&+tL2dT_yW&k>{eoy6#A!Nc#gGR*I~i~Q zITm{Bbv@uK=Qzg2eq?ECS_&x+TE|W87CVpp~0G4J)GfFW(LUp6VacW58g#|ATxfshCroW$K zwdqwdG_wsC*fI766C8O(D!(zFXQCutB&YxO4D2EU2xHj=l!_Q( zS@o@Z-lw~N!A(`j{*E6jMU}|&2R70y4fUKj4BF96y9-Gq?HfC)deoldfR@w}c*?90 zI8kwqrJFGiPYusbXB+qEw9KXFhk2&sOuu`a)desO%jaD_Sn6)rPBhVEPWyU;6DFC#1VN`;o~Q|uu_`jZq}YCN zqa`)}g|;YHeeH5_FxTi-SzQ0@KLEyU+j0x@0ta#R!sL7 z_ec;31`15W6+J%LpxR0&&UQOE#GZ2@gDK~qU9R)UVD9uqz>S+7#YFGN;BM(ULdHks zm=5~RL-O++dz%|9A2=Q#V1JY7dAz9?T;*CXJBE`-`{<%QcsJg)xjAv$vjbB{?$^cimFa&E}@AS*Z@=41eu+6P<`Il%6=Ka)h~)Nd%WUO#4>; z*m{)IhV3dBO2mYi!H3M8_x{N9ESRTZcoJ;9I&0?EU?y~u>-VM>B}1I{_^?UmH5{ei zf8oR9bydVaYn*&|J`DQIL&=cxo5bLSAEoU`I1!*TE)}}y$@9HwUd}g>wM+qYkjtRO zpbRRm1cUmZqD$|^%aJ36ffMLqrTcR&`x`t)MFTPKka0+IbMlhUz^kud06A=#VG;?* zV_cQh8Q%lQgz1jg^c(2-M_ZRYMC#?v9W!WQixzsJ3}PlJx1Yb+9~-y1)?Z$;KIF5! z1~A}QPPQA%tiBx^8DZ;9W+eyN2#hU`_4BV^ze2(inWP>QenwX#^UjA820S-6xDNv4 zGmWk(erPeoD?^1lD-kc3Gh7MSBXn1AI-Uu)QcL2ihf$~dl@c9R)I^h1jnC2WT&CFD43XcG*Qi=`!PcGstL^T!GtB3nM+Y980KKqH4kMV<(1&TjlN&j{=#2v!yD-qKyEZ=9Qvv=spP zCbtjr;EPpuA6uVQJFMIm6*MYCiU3d->Z0Kp@hj@{}e(a!D$YY{}N&>9h}ypobT zwjYi2UTSHLBsGC}`z~I%jefuNETy0f6TviaqJSJ2Pimi&BWW58K zIeEu~>Zt5I|MS^8z-q<{^pOO>x_RGSTZ)gAl$2wZzZy`XWYtwck{bF3<(T>PSOdB| zohppCgLvP!+5em6<;vAZ&BW{_pGDOTUJyExdJBg^2rcWgRt_{84Zu&-$}Ip9fN&R` z(15MZdoAaW0ees>gTDwWm1XdgU$y03<{)qVlxbBaGX$<9j(PA2V2|J+euCP3)$akw zPP{(r5J6nAVtW0+C%3srYk>lL^f;zUBT?!?I5*#EpI!52pvWm`b!GIYJ=T|E2jbkh zWpfZPyavB$AI!AfKN-N}d#8ajS+$@Fk~F_|m0$bu8GNm;dCMlV?aT?!yGAH7^Z7+* zQD`>XB3yyjpMv2Pr~ul#c#;7LQOs07<}!A=L=@cZba1&-!4GcG*hV#+P*sQv{CK$a zZWsdTJCi8E)D9H%JP}Frxrd||7;2bna9OU~meJskHWT@Z^SiOE7sru<~{ebh=H}PFXW2dbZ|fGwG`s*y_s32^7k9p4732I1_g`wbnF#u z31b9Cii7J2E$d1pzn#nDYdqPwskJ7Gf(+CnY3=+~V#hA9Hk(d{?^<0@)Jv~;;V3W9 z@luIk6zw+JUEt9HHWRuN3m!DuIr4X0782(D0oGh{`aH!X^SWLMNH)yv?WcWS;a{}h zi;1lM&f#^XBIPjMAwXB+ZFb+8-ZSx@D~9zOi)F5SxZzF1=!9?&3sisxhrp(L_bf+a zd6a_t=>{FI9^95|y*-`*X#z#bYF;ji*MgCE*;+cec1XVnj^fGoZ()TuHWMQ$&9b-A z3ifjw^;vDkc60*y^UPyaCfZQ`l)(2x0&9FR(PE2?PS=)C zenG2plC+5X5X{3y4qV^B&lrdVd)7OVViQy08ZBAqjw?NR&|vax{|y<~DSuN|6%{pj zh~?SYqBt)*82bwA@3Qv0XMCR9YpN+b^Dx-Ob2!alTLyyPwle=xtoa z_QUx=+a1`D1g${VzSB7vb^IVbXHMOTj z@MGUka*JBovj*?mJ!_`%O={ATS+8%(e=J~Ds{t#NyhmJKrkP3R@2eV_X#pFSq{l~V zuvVcpU`R;@U|cZzpWBZzDQhWaRjgoz73w*+fA;oS^-3sqlOH9?NNZwX3d_K_^VH&& zgtJKN7hG3YS8!{AMQvSO>=rlow)O1B4ud5e;Z&H8R%w+;$4KJsUUhPv*k=sj(LNfB zpX*BV+nvFJ%$OOM2*I+KBJNO4*bWQ~_-@@bFnkeHl=}wX&40RQI4dg)b^K9cI|EqC zR}C$|j_wYRJlfbxW2k zXxnhcs(KVr0xQ(Q6%NWc8>b-NlV93M(C&|O2!42sa=^G`rS97ec7Vy3h}WvdT*wy| zP^_AyB&09-U#3l6|1&5`DXL4wBzsrl_)DXqY?K z4=};&9wIfawuue+a%2#|0A|mMV@dxdHE<68Kv+OFD(Hems*07mIlgJE_P7a#5z9SL z6cjeJQD^!lsAhHZxtH`bsCpgx4ckaQkY3Vlju13Xa^E|xEXk#j;Sl|>H5GbewnR2d z(_UFn6}rsU-hp|^-DgJ5Mq2j;XCS;9&72;+Pi9cPnx!JJEx|+0R9VAn<+ufITd{&# zOx07?t2?_JarZa44Uq&+IaBYR%Mqdb?etz3XF*ig3d*WCfdPgmFCbp(H_2DMDIZ|e z`Exs2x8;frR8Bua_qQ!1xEM{_{UyNDIDgik;KhT*SE_=&hRAO)8+j>~qxC<9G&z5= zr1|het=KpHw=P=c(nAhOh?thd>+9vjMp`=TA>X&Vu7Nd3r7tc=?ANA=iR8|>H2^#Oisl0ciO$&_ODHh9sJVq#^Xwd6Q~`Ar z4Cf4l=~o(X#`qTlfF{f;>bjf~rg%;Q@j!6nynb`Xynp8Qv^z9I`pM^sS2!NDHINp{ zB})g{2lElUq0d4v@#Af4qxBMjS>F)7;G2AD*UlFrUiL0LH%}CtgmxEh*ZU@aE+77y zDoK=bF{Tx>Oec1h`a=R=?93E!)6N4M^gR?mpJtp;H|Id{CJ}kdcBua1&xMvDYoLuL zB|!#klOz?byJLeTAyM}`f!9x2E9+1o%wDfRzpt{k#q2{A5te+sDVEhXwI+;Q8|$Ea zAMqU`V#{aeaHE}k9_|8Z$&6&s&(Vru%D1 z+_$f)mDlM*D?{3bU)B#RrOe^zlMMVZ9()Xij4x>Ap$(N>I)`PYAo=he%E>yVuWRa; zF~j>;hL919(7}m+*xmnd=|naxSAjpA>r|w_8*=F*Y8B>wW}Q#n0prp62-{K=#^rvN zP6%U$`V#yXgcHItp)4eS{`u$5QRFS~7iPdZp>%*wh4H(h>9Wq__msCte0do-IyH5_ zFe9xv*)g|*4oNgLFmM!f6h1&JWb!2_Sny)W(pc}6!zYdJ<;8bzL9?-%^5o5{ba%AG~#9+QJz2 zN{LIS$~s!)^|O=<`?^iNHpWuK7!XE69rs; zuwV3Rp0xe*=TAW3A4cCu5VZT zim^j4)q9l_uwZerXq=$4JyMwXV=)2{6ljNXSz#`Z`LWVrnU6~e&5UC^s3^Wp!k#Hh z8K!SLSxJQ9b<_eM#;ivKfp7Rz*hWMX+dg_Pkj~f@ivo6?_>jj~)L6n{p#d}7BK-V(Rb6K+~`+MG2$9Wts zO*%2Pl?MEA#t+4RyQVnyqqocH0@y)1)g@IfQ z$03V<9w$6AOK7??Eu9TU%yR8Mz!X-KNfTmfT?q!WsayFejqT5~`=7*4)1kgUN}6WF z*dS9~_2rz47?`(;0Z^XFao}bnERCFh&_QkG_$Eh)HR0>p+V5H-LQSkN`~U6wIKfbz z4{;3JmYP@#5{K_Dh$@fCG=uz~KAyYl4PvYq(vmH>N2f0_NxM!$qHX?e>Uz8PYHO`p zt}iEo6@q&Owz&24#lFC9{e9gVQ5tM1!>d_?f_>ec>CjR&<7;7>?s>0W!qc*@^RxQ<^D1A1(*8-n^_WpNKD! z)5##TkO-EkT1qErXmDRMx*3cDP2mTl*KYmcqM#$}io)vT6_xc9(L^^dv8PMyis`IhIf0KE3iG;N* z?)FTTU;*S-dc69nVFkV%R0H8?G?+YKE9vV~flYZ05R4zEdIuYLDuAnBq+J5L zdU~HaJ%hixfOL|UQ$?)Q>%S>m;+Y!mE~4GC26#q*g*6F_)_kQVx%T&#rY`M4lB&cq zGO;Lq##CEz=d;o${7Tx6=a5n?0Z5uABrfLL_o_;h8=U}!&1gfcIjrVCQ!7Ub7Q$hM zAjcfQgtVAR2o}k#B&;yLxEC0In1L1tpnn2~EC*2;Fa&|$0!lAkTTcAyZXQKo{~J-G z<8`dMtq}sD0X=6Jlk;@-zf(s2bM7TK3}HX}F(5aUFRu}9iVU!kh>%B8`aA5DFKNJTtX>EQ&}YMiB6m}KJ0>yQ1jiA9XsI7>S$`s=DmM$ zhWi`S9yB?uRGWVfD{efDgL*JimYdxzrsl(TDN zI8%(K9^1&ov|ykqb${Ogk|~QfzKWv{Su{qF?_&qhHPAo`HG4?tjWQ#!vp76<((I}3 zW5#va7ry1J!8eP)1EVJ=&Q4DM?DFo3+tttGEecI+PKdsE`SQW(@@uTQwH@@XESyS719%%=u4oq~l93Uu5Ok_?Sxv$8-!Y(|t4#@(Z61d63JKBH&v_C58yeZV0k|K;?IAS` zdbC&!GwlGhy1IHoiWgC4_JC6@LCL^?_TT$7o}XxuT47lY*PR^u1emmRm_VL|&)&;r zVfddw-N4Swm*aV$|B%W2MZ$@EI3G^y2hSe!m5mLsfOp9Sj$S}3CPc$>mbq{XJtpqF_G?m*{;yd z5p_tuaK!D;PN>5@dW3<^f54}MX5v+MC;({XITi*8GGrR>O^wRcVzhq8(jnPt7ITMg z?8{pDgK5@Z+=+2})REuDLePx`{%f2M?tFO)NXR(cNqJWrjy+aVHyezaES@&|sz1I; zUbM}X&+E!({w#>n(JP#ixrqKXGc%LO{mL`z54J4=_}xj$De6ATEj-K`GFY_BeTJD=Ac#eUG7WDNP;+n>2jrDsd7GoDbjwGTvQkp$a-xcmd zZ5yQR3Ma=v2Dw9VQz;*rpf?G^RwlnMEAsbyp2)ZjQFeOd5#yO3p`i8oIl^VLT1Q+Dy-Eu~Ejm{A;>>4HD?2-hVZQgafW)pZAK4d}XFett`; z@eUJc`*{~N%}>0gsc|3eS{J0JJ4I47CB4(ov#(}~w6H^OY?FI7Ml%I;{SlibB@lls z&{8|S>>vHlou*>Py92IkD2*8y4Axy#RD^TaBIb#Aq--G<6q5PJ4g$G0aH^OlhAhX6 za&mW#zQ8~{R;FGm3i<+^waFjsQ0J^9sF0+rnc7e$aVA2HnQ@H3h5K9+pJKr1C$F{` zt{B8uQZZuaNUVrY6UJ<;EeK?$MIYs{yW;xYgvwQRYFnYEcLSZ4pgeH#)Fk$A5 zWU4Pee2yw`wRuJL2WCDx2qSmKjH6Z15L{QVnZy4p^9&60oF5P(L8EUlqSHU*AkE4( z`UV#@89uBoP-&ziZGQwK6%o*!>FMdBE#w#rJ2EpfF)%OygTWvQ9Uw$sE|&}G>FMx# zy+}?@Mpsvt()7s6%0hQ{x5!QI7eG*1Mn(oc`|LBt`GM%J|NOE>zPw}y(o#2~yhPal zp!PM6F7I>P#G5Bt`44JeW5U16XaWHAj9dc%BqaGTeAf=(8h81@dr>bU}E(Mbeq%Ftf%Td@JUaqBA2GWw+ouoE(1Fu3hNv?gk+EokW}f#E6vmpu4*pyLRnjUKi0) z|9~Jq&Z3ie^TZYLpRT-Q2LK>g`~-23MufRSDfTZE^dcES96KQ~0 zcK=Cj01(7U8b4wei-x$Xt4oaPh{&1EW@Kh&ieqx5oIY16NFzFf!61sD*=(NGCCVZK zjMnrwtoy$Qcy0Qa5g z$PdESeFqcnA!zby@l`{CqWm?XCB2NI~ zIDa4jaD{dFrmjFyei{QMr(v&n9_}sA!Cvt^xWYPE{O*W}pxl@rS6CNh(?H4Tu&x7-l_v)7^tCAosLSCxMVe5G6pOztPcA01$Uorlk+qbb{-8xL1 zDTX~|lVDTICRooD!yc0eq^zfsa7>Ev%0U#`lquN#e!&Kv@DS?InPHvwQP1t$ihpss z^=n}C4GJPuavGJkeW*T&S&^T!t^h{gAl&*ju=w4I^SfJ15ddVnK?8$*Kx-)zeuCr^ z`{2~C5pA-Z*e7J9Zg>Kfw#%YVSb_F8GIzk)^POOW#3s}qTJSZ)$^s?H7^IOQ(GLJ| zY%CHPh$IprpzU$FT#DI1xME{tMSl?l&DmF-D`PLd(xl7O<~ za?w`*`DKl~Jth$VU>(1Q`>9)C8g&2wCfq|HV}N9AZYVYts~z8h{>@Uxk6D&BRXpKGW{FKu4v{hem9(%JAj_=W^ABr3g@1~o(D)r z9dtv?;>mk1NCk*){8`yCpMR*)VyPtPE>3AzCk^@-`Od-@(Nh06Ze8V19V-k<_s=hD za$eRM>5hmkqNcqXyph_mE(1|Z}63XA}UdFGgKEe2;n`gBg+W4fK2Ox6E*-}u} z9M&}#H4$FgAcu-fSbsonE?guKD#B@RZ|CTQ8Kpq(F(V@bot>Ss(;x`EUay!f%JN|# z8tQ-c{JNR0J=3TI6V$mRDkD&0Y68hNmE$LZOYh6^liw=^`hkGn7PnjjNyTB=4N718 z*VX57a?g{qY&mtTP!TTab?M3FmeJb?OmCrI0gMKBw<=ZtbbmLibaK0u@ak88$;ZL7b89oJoh~SfU~v_G4 zZu$WY+7CO|YEayA4co`hiN`CCRVa49eU6)GvYi$8>woIELg(&*fg6S1kN_Vy3Vq-{ zeBNPU-#ZMiTNrnxfA{jiyhRBDUH?tCvm*cY^&0qYUx9b19|ltjyhHuiY_dadNI?G& zJtF_h2lEtPnTFU@Sym~QeX0EgwrhOozx5pqrW7>UzD8X=8v$&xoyAk!8hG9P*uGwa z{b#zc)qg+Z>+0I-uJV6-ADD@)w661#=sQLO(>>$h=l)y{6n#~R*UvM)%t<)-zfAVC@Nc?7Y$V@G_v!1LdG`&~P zy;b`+0KlFX-$C$n000BWNklQH{ z>Aj^3@Z)J)Ik|>h6uY7Rpnbg|K`g7Qw=LNRq}%fGw5>scLbw2kB1mi?p!t=I#*SCF zqNVA5uCCrDmc3E)4o|rCh6KD-QOT_S>*{UX8#V9n-l2Z@yu;XT0N$zz_Vw}VR=%Yv z!hZs&f-Q)^g^KLx$nRkb;-iX*)fQY1#35nr6IjiEE0%q~b_<5@+F@O7Vb1@xCJ_h# z2~Y0E5CE(NdhXf*O&qMNbUD1 zG2;gOCm|EY`<;Ms1MaL7l2R;u0RIi>VSh1hV8%`Odt;110MM+<1l9@Vfx$i?Mh}Zo z+57`Jeknc==%HDc2_xT$&jWg<{DjX!`FIW`7-$ z1~^n=%Ak4%OJxONA+w4N4MAq+OkI zV|}Eov$HdzS((uQGO=84eji;%mPljCZ;wfwB|5|gR{S)NXbUTn1=>Ln346%Ia=MY1 zYw&XqH!xcYjc_`(##zx1v4s^s&3_}>!ir>pb`UJZp0M8rK{xUbGXfyC(9;B1%tMo| zDk6OggmizdbCu!`2dv&o5l!_^AonJQP3yODbCpMeKay{RSSUa1w?oJ+fE@`RNY|eX zwPmp;X0-FOvSCpXU?f%@StwYo{z2gPkHHTh1|LJGEtvQGF@GDz@ds!D0DqShu_5T1 zJO|zf;5`7P0O|m|0&sc&93Pggi$yfmKY^Us0dmtN*enP=m)I^R{z$wUN&A?IOG`ya z5oFPmAnwsDJtap`+u{L$ybR3Kc&dgq;M#`vCCV zvJgK&=;lk%>Sn}2VRT&T;IvvD60{4;uuIVDpw;RW6Jm0ITCEORoff(zEp$~{=(Jks zv<1SpN+{Rrv>>)Js~et!7FZVI2MGSrX$!;$1QjY&s8}c#H3kSQpH;Vk6D(J|9yKgi zKQC9iRH#s~d=a()s!*Xqg$fmq0+uunP=yK=DpaWWu|gF<6)IGyP!W|-1yF?w6)IFj aCH@bbMj4zkqmk7B0000OM?{~lN^E~_A`{Z=P%FAG}9H6bwGhH`D3s-ZOH%@ME z9323_>vLK{v(1vg%@6%2I-y7OkN)=lMeuW4{9*OS6|89g8=G&L61U@#5kMwWW<1my+y+GIN?f~MB-DM8L{$NJ0Qc$WaofW|K)wVgE%TR@sx5a|I zUNI~VS&O<6B$O~m?EL$-LR^jfymo0=#-A61XYv(tq+7d(!X_Dw1Tk?5lnEn09+Eb> zpQ?@D_+BYwaZez6L{a;Xa`=P+h2bD}Fl?kzjx=xf5tcfr#b4soWT(W_Q8NHX{J!0z zm6WpK!s1Hd+hVt+?C?xO7B;uEse+Pm%6#9KHCTZf-|DT1TjUxtKa9 zxb#W0d?ugzBJJGY?TRw&YOLp~w&m)i<>FSo5XR=DT}GB^2I*&m!J54+ji;^>`2zsA z0X4;k&%6*nV2t43pl@F9RmnuXZk)Uizkl_BV1*)2=AAaLiXD!xbT|v#>x+rRG0o4( zM+pVAOL2EzmEebFs<3@CC3qMA#FU(%mZRzL%KY%LrC4q1OmEM2jCW&UM8s>4U#GuZ z_he6{h5LKBMMOkyv$2(al0`ZIg0?c4^T9WXeOBU@D@{N8Z^eD2eG2?UTU-TQmGLy} zVxBl7A`o2L0x3Fc;O)?Y*6U)vX8E|%v&3`wa9$w7!)?QGu@WuQk zUL?48kEO~4Xi8>qXeHvW`%;Lhc3pe57gFoj4|;Dqw@jKU`cccVg{zK4BY?oh5i4x# zmr3y2YPd%Fk<5uJ_R^kh>B7LEdEO-KwUrh2{uO2%Ov4$7z87L>V|v8rBJ=vVGOITg zwo@Z8bjf06+Aqtmk#P(Nc+6nS&E#gl08-}jF30m!$AM9@8lANwJ`SC&knEM{3T_Cq%;K4^Q}&QS1m=v?W&55(G1 z9PCU`1;Boj=HC%f=sE%OnOe=pr#Yp#65QniCKK~20A{F)jz(ksO)>#E7pQ$Cb>3ZXR8$Y z8w&N7<|FuN-?MQA^I&1`pFyGAJ41Z!_!7=_p-e|)nSN}*2PVbHGVDZTsaz?8V$`2} z&ieUt7;yufkMb4-t$IIY|M1&(w%D$64(RTPW(fHhBU9M(Nu+y#N^p15762;e0%{S4 zxSXK5XIKV&Ka&k3c5gR&45Qa+9_>P*=;0ws-6KtuMO5rIX5<;>Xqf$F!CG?liDxRc z*uZr$yXnoQPS%~Xxqe(@zri}`AAa)zB?l!PROgL)&L+M)BCIhIHizKlP9=LHmR%=D zayMTsF%6%gz+yJyo!%aNWRZitVD(FHJl-u3y^w0Zibwit)@_daL5tC z)J`>dq6rCIU-hg^n*Bkh@s5=(Jdjs5M*5(0Hyj_%ppV|Njb@YpU0#2l!2Q#uRP1VQ zKGng*KbvVpy>(#<<6sMqT>855$WBC4yB~El=`!|b7iX4}Mte398Mkc7Utd@Dj`tn%Zotzz<#&y` zHP28T2+i-#5#izBEN&o=P7bl(*+K}(90}ti-mRbxsI!^-`z>TKr|q@m`%!0Q><@p1 zn^m-EbAf#K?omSML|7t~$S%jmCN#|+BVFn{Rbg*3HazS$#gy_`7y5N)ychFra&kQi zqW|s){=XFZcbTV;#afNdo31vW&~{8au^W3W;Mz@;whgDU^(6}`^rT7A_`;`0MhZKa z#mY!9#(t^mT7k$nN%Ko5hi4We23_WrGk4l^jo!^Lt-%1Yy5mGMd+_XZajG>TU}JyQ zpU}fjyr4Y;^$T4r12Q{SRx;3=OhrfcaU;M{mhwg!+ee1?&l_w(Uuq!sPN2yPx~UJD zQoB@DUw{eRrj35>!;7IugQqk^uW0}-1{fgX_(S9eiIV5^z1Y+HJ@f&zMLTDYqTsfF zv%Pla1?IccKD3|Of*rUf$$ALBHruI~6pFDTk^_H7_^QFc%P*_Pxs;3TKN6&0-3^2g z2M_4nbX3_j4JjlE|4^_2(96Q#4_V1L+XkhC3tcSj{IYsGS7GkwLl2k;CMucg`_$y` z&`nhG&tk-}oAh*+9_@jj-^Tg(e_i+;T-7ROG~3&hG=-c5lYr79Vw>{2?l#+y znU1eeD;i5vw~a&?emSg1e7bO5Z6nsw0ZE}VB0~`=2m3F})H*N}1gGM|XA*`_@Btv` z7yjmCo@!@uVGcHQv6@H8>6IR)IHp_vby)>CSAGqfo>msGLdK>fE`oU4;IWbC=nlH^ zh2zEDACFti`#yQ;opo5S3XR)hY{@Qb7Yb`At-~|7EP29~-OgeIC>oR0(9B!V zlNZ;u8wck;D)5h$YsbY3u5j-|C`l3{fsBUpR5nyAoj)-BcKqg2V)|m0+G3Fj1cg>; z729KmTF?$MPd2TSO&5i3uK`+5#BU;ke?hJ90)+5-@=uF^9zE= zj}U*d@$+jkg?(BX6`Oko&N+Sp9Q=nq6UsII@KLAB@F1KF7>i!hgt!k?_>;uG(YE8P z?12tfW*x>E5B=2y{^L(yd*)ArC;b@c_)%nH;w&WKYB(-W4{GDUalqw`Vd=)!gi{kJ z8g7&l`LQ?jn;`F_P|xS~CbFKSh5mJ!CRvWgy@R?T0{Zh)RwdA zBL_jMrUeE5AYl+E=Sgagr*EdH{p17jLzVfdIo<~%4j5Tviqjpw8xN)vq8yJ7qb}Ny zcOpKdmO5(-7Riu^k+dGWbInVD%tfE0`f+Fhua#{*ufB{9=<0wI;!o`YzhLG1_xEyx zD<)WU?0$`R$m;%{Ubc}AebRFCX19qp#w)9R>(8G;U770758H7VW~?VxN)kix5p!eL zd66UZh?ymgYP-9-YTV_KiJ|sFPxbUt2GGLnmTGEY;via@&$x~NxG6u6IzN0E5wDGu zl9astUe4E7iqEhr5K%%b2%b$09GIB6E-!?zFq=TcA!;{ndNFEUx7e;ee|dEc+W}i# zCp^l9*m|goqm7`$wf?1ebv|uOqZg8muX>q6L4}Qzlk>MjWy{v_;&ipEwWFhozCQim zzkg#>Qo?>&_0!8z#J7{3#o&*)h@104eZA%1wP!xvJ(fll1%^G&QI z!^NpMSLC8n%N(e!t=%baprd1ccDmPaxl5@jJ$O|Xq17EFYCFp7?q60`M%zHTe9_V5R_UN>O1r-+ig8cmIwn$N&dnXWkdUaz^V~_>xe%qbNNL4rj zfwimryatzJjSfIyW>1gM5<50F9&unM_xk$!^>M0_|KfNnr0l_5xwZ+ou(2(*I_vwl zQ?&E!zzXp4yu^2Jyi_Q+zIsIlTzRT>k$H^XGIvnD%;z657oXTkNTyB#E~&rdte%2N zvZ(zQAkc)@$fk=g&uQ;;DVm0azX{SOa))7*oeU2MdYR`qt2QN*y5mCQCa0$2;^JVb zy?8MlL1kqRjy8r=qGtT+eiki65m@(s_^0({jXA<1`MuvyEK_w-n%tDO~#vl)HdR=r{z{BoYchu3OZ4pl?!RSNS zDz?B`S!vC=QNeg5xz%^|u0x=ly~%6$WSBZjh1vUcr5*!-WRo&yRjiB)VI-uhC%SbF zGGDlF{2dx{Mx(qhBor5o&m{EDDHL1VP(+}YrN$#(xfi9CU!D;TxsKyrDy7nA>F zWo4z};=-ptPdf_$GW<_cBoFGG7O)^k9;kFQAz(#CE4c^}YcI!_0(auC6;JNt6d{3; zhzt%cQ||E0KCF+J)WP#Ew&b|Dw~>*=Zfie-6se)V z&0*h?JK1Ps7L&La_1-Vl!{icfc(F;hZGW;YY(`&QF3m(%g;_0_4YF^_7~hC`1%W|+ zt7LOfC^xwi4fnMGQVCR4e67X{9fxfjnc(M+lVHYJp;7AoSgr*m%QB5GCw3S zX{4Qo;~TCmJ`F8!zQ_h6{50;>J8~J|*s1qy@tw9SCa2%_{@P zcu-^7mU}2Qxq-!}?=2or;AQIW>wi%coHTjHp*%wCTQaK{t(ma>FAZ2llz>>Exr@Ni z5QES(@Xr9&*%T5ncIAOuZaiMx!<<~7ZA{z|B0JPn4C`4ZpClPXg)Zg^ z5JNu}%})T?9vRipG{Noe3cYSE^E)?i;WSpV-kB_449RY|EOe%^_R3F&3O$*|r4NQG zC90i?Zi}FCP2wikj$e9n(+p?V!=S;hI{tB6Of5-RsQeOvzQhvp8tZeZF_5=ysTOUHX_12#PV)dxf zMcI*@4)x>CAL0wBEp|<==^3h?9vHdy-2rDm^wBF5HlLJfhbi4h&;gjKfJ5-KVtV7c87wCs_q3s}Tg4uLWhL<2v8Pa;?72@r&v zD<{WNoIeOsbYLLQ{_qDO7UtBLIs$zWR&q2q$$S}fXJ)(g-MJ=x0P%j8Awvu{o|nhf zQ<&4t%{ZiutvZ$cLjKSDBK`+y{Ht_8cD)bN%#AP4IVO1rtj74MCP~PmvBEm7k=#DY z1NJoQG#P1sx3anA-?ovd)?qzS1QYV&9jLk87nJeo>|HXZ5H2zA;&zx_%M>~O`lL*+ zc?hmrtNkwHN?Csa^h%yA)5e-TVq_~wh3=GepUgR--94VV7xp#wQP{ZF#(C!u1 zbv5+;Algmdj`8uXYpoahFn7?)-Tm(h54jUga_il69}OOp1D$~NKQ|e`JN{7+l1YP` zTu6sU&(h(?l*40V<}KffNPKr{i)zMV$6`i5sF^J77VJLhlIFykxiO!UWb#5B*5dd1 zSWP*F?6$BlWp#D+^{-uAUE?4kKgX*Nu(Z6R-?(l*zNKO=8#u~;0hJP-eWLb=5q3vH z!-q91bO&3|Zd~9o2tW0zOQra@vBum{Y}RtSf^7Jz+|||f`ld8yM8SGudEn|eYozqg z+qFg?f|d^?>NO-E6=R=yzE7$|ov+V3d!Q8Yrs{nwt1e4bN<399{`!x#Gu|if2aj*I z$FLOnPNjiq_g#wYG?R~oR;|OVB@#%-JdK}(o^Vj6?r`uHGO%TKavH%=k`0|2Ly5%wAx71=uzm)|xfKR}H?UYq`!gbhHIJOxK(9m>2~6W+BA7m~4s zGyaRDKI14L7L)|QTfwE?L_x-WlEVkjA{^b3#u#LDhK-LuXEGGjgg_n?rN@%*k>N!D z6H$#%u1O0%X`MzqV9;?#cfo2}Hl70kw1#XMQ9elp16iPi&r z7r+Ut3@RdO-eNc8kdQft-HCOr-K>0E2Ar5VhK6Z}N%xSY@daQy!OwgPYTclIwV@Fn zKz84R2e_(eFGn(kFgVTZFKn78t*tC{uUa0TYLYU)_Z?Rq-w}Nv!Zcb=>6cmd?DeFb z6ESUIjVzt2x@ORfgF>Gv*QV@r)ZTMDP+1|UdtYN;Z10$gT}2YPc925r+2U2k?3rIp z=UGCstCQ>0zBTfbKnNq7{|TgSqBZi)d~D}v@K%kkz{z?5kGfgoWjZ&d@=r2$6RBja zw2ZQC8nW;vi@yrpFT-a&-n~VpbQI~nPJ@zC&b2j9uK z2QY{h>MV1&ts6N_id!5~-(ZipeYl6{I=6yt|Lm!u&O-^V{XHX5X@6nlQEc8qeRw&pKB%f2Hc2?xB~ zjvuvcxGBph@CyWJ{IS{g@=L#{0(0wU_Rc5gJf&sHuyczJ?w@)=#(z9U_s*l1WUSAm zV61y%b@JTy>Q2rP-XV+r_mvDtwh&L8*Z+DI>}Ay!Ud*Icyw<5k>2p|C+2XrvSlOqg z*<67xN^7LfC^WIt?a}qG2@ouVPTy?2$=gD}Is##xWfS{~Z{8G1f~z3B{IDNO_1638 zi_seQk?+M>f$7XKA3s|V0EOyA`$}t%8&%VbDnESKFIiISuMosEXX`_b6DB{fdl6pd zD*T-?GSQfwY-bb>lwnrJYU&EfUr&`~1J9?-3fUUqj_^*m&5KO%gqtomj*@iis%o(X9i?9?%og zFVu3GH_?JwTU*G@cusQr4V#S074)TVy}L9L9i`1OMEF^RHiGMsdK;BSZq4OZJLeYi zc$5lw$HF44ph-zD&CKs1Bf)t%Hu0&_8ym1VXkuj>Q;E)fwQ~6_s8`y`F zK49mf4BUHfS6|dd7sZhD!br?aV z)Kiau$$Re zd(9kdt8>ZMg^!y$3+&g`q;Akk{C%SusrU&btTJ1Y%-(I8>7?8CE!vp#ABYw20h69} zUylj}fk^pP_vj1p($aaTEl@BHYiRWovDqFEml%urc@^=)b2ux}>=R6Hp5?#3xLhX3D>r;C8d~*PGwI}a$8R=|cy{ z?WnC($OqYO@Jt_h|8o35U+79Q(&sf-EHaVpa~%>;9vE5yx}F1E>wlh2EZWV;OI?R5 z+6b?X${MdCj8_L&<}mrlN7Js=`?oZ5_Yx^5w_5(Bvey{$De%W+MeT`Cf8p~aV|eq( zufQDr^Ctwv@Ib5F93L=Iu~zikfJ|00mpEfz%|7+^bNtBJ zSSo+=0WRu);ftrIL@OVX zw2i=xW8&D;tgW3E_8JdoeEWWYShwuTSo+7qj;_SA09aGRUR?})+eYmIb*c+=L!CcA zZ<$AW4Gzw}6~Q2Fae>6E#fNb^rSv~Pc8^#9`vV6bu?8G%4H@Q~t6*a!EQPWj-p0%g zb`CE<%<}xh&Vr;Zf0iFms4M04;z4)@!P?uhqX!V@EE9WV?zVt4UdXglWM{W835Ei- zTHmm^AYtw__7ekmDco*Z;BL!SS!2gofqXRc(J)}1#L|5VB1@MeDaIa%+Gb1tE$omkexC8@fKQ(wzp@O41szBx-O zQOy=NQ}w!@uc!s(X_b9#({b{7xTTv6>i@(=;QtR9y*sb;K!-h@;gpeKP1JZC6RkOU zJnYwbuTQb7Q|%`5K=DofKst^C^(tJj_1?d%HtcYv(mgaw>g(gv1F~?FOFpQ!xUT{W z1ToHE=p<4AKd#puhs#U zYAfLy3d8DM@QlS@il;d-+v3cFJ$YhW3bmSPzpEnbH<1GNYc%{te0prZccK&0GETy8 z51OKDbpeKvI= z$Tl3)^K{vQgYh$Q%I+6of&Z8^5}LO6%~ffiL(t*pvVWUCnlbD=*jxt9jw?mVv4`gr zJe2R@WmRWe;#2ivCTp|CQnM$QxphD*K6gL@N_L*f@T)bpK!!esXkFT+4AaNxigT^B*Ck za;9kRhX4OWJ|A}pJN_}3&!ZYF>k6l#wcZ9go2ovMXHrZ4Eu*hHAk*+c#Kczm?OV!q zBIO$wbcRsS^0!NW*~9IMq^?B>l?>{!iy^B zw87NJ*#qx>zE-KghLk?CNX$fFr6#D+yQs+ery=R7nrCH4WW&i&vmke{dFkVbu z9Sw+?@zZ&QU-9r>ddbgE7>EYW7NV-Fwnjk#P7l)u3}uUHm|T-7tbUq|B{@7IXFBvl?G_g}>oYmf738i02&i>Z6@@--5TwV4#Zu(^GK-%cq$C z3Dw(%_rQs|U^Y0IJXd=Cc+D+%b9wOCSIbNAQYPnAhPxYt>WsF-2j=_*6{wn`Pe_6F z5r1)C8x;r}y`+tgm52U*$Tb0k`jZc3#1TAQyJ-bz`tcm=*;)shmc-}dKkn}L4N^o&DiXXHiytRtHvcVme+^a-3GqWL8$;xbJrK(#dmRFkKpt z_I@;^k>m$FPF#e-XB@Up`r~%?8Jv$jUdMAIvC}Rt9xxl#Kb?Rk&J^lk^I+kL+ZiH3(J3TevYDQ#%<{ zi}+GGc}&5dI1PKOV|+`YeMCyCeZM2!yuY`Rz4kzkNr_%(nUxf4FSXIUDqk&)ZfHqu zl8mNXJ5fUk(f5D<4vD^tu6Wl={G{y+ngRy|-(hCgwC{oFt6Zj}EEqR7lv`dVEh1?X z8Ds>Cq)avGeYs9zO5-7%@gF1hm8d{%TZt*Y-&g5fNd9kD;fcR?es7;LM%(oVAN9O{ zLm8)iONsm~=9T|X^&>ml?1~OaJR%^kW=9`|{OLJNHbdr6OC{zw$#)^eeXx1 zrEuRuS2MQLdW3=viX8Xl()-IQuezTZU;nB9-Mx@3pallF`+A)FBV8_YK?Z7rd&Otb zwP@wzwRQ!3rMVN~4`oXw(arLOCiV==mrzFJnICX=yyD?^b*$!o-t=}tw`NV9_UinX zq>^^4f{I_k>EKr*mWMk+tnbaXOsH$1Jweq|=6m(0>A+2QzwDeG<(LZXa9^Qca)8`Q zmDy$~yy2KMz-j8|<{qaz7y<*-`yXtgIb)G~_KwX7sqJR{4GNp)V=)aBQ?hw2LmSl} z+LGFekOL0^x#o{8+D>{E7iTPUJ{`kYc}9CtCTT~uFPFXs4b&2J9rKUvEdN0S_ki~H zKPk2)lv}}r1DN=N?CcKmVRWo1w^cc3=2bT6Du z8R7_a{^K^d$9D2XvWK36g2FSU*jl-K6-`U((8a+PR5%N8YuRMw)EDYKH?z#+oga~* za3@pI3V*E-a7)D`A3b&QkO_~pN0hgr?5JDEy2`<@auNSbx!H32U0rPY#!D3NWxmwz zmZ1bA$yk(5L|{4v4~A>HL$FhDeDAtvP!}D%&?YX?kIqny%Z%B+Jrb^~1VB|0JNA_3 z=k^oI+_(j|`G#oX*Wyf@rI(UIsPrNlX!Lr;z`021)M!ITH~5^(hLG-B=xoFtn?5eXkl1wxOW!sp~xxKXwNc?Ys6w1 z>s;xtwKjGKsEJ0GZJ9)Se27Bj%+-8s92*_IYq#*c*A?t(btC z;hCZAD$(=FUdch+T+xE4E`C>w|oS{6GliD0i1=#RV9mLP)=3 zAQQI}o;oWmhLr9ENj|QA^Z5d-O;OTfu<6kF!NqS2Firb(b_unt}M~*;G@@; zZ@H^CCSy%@O*>uzb2MekIkvv_RLp#6D0nvES&R7WQUD#-Y?=K)1^9&Q?H1grj4~NK zuZlY#+r=6|7uiQloU@1?q%JzObmTl~keJ>t$ut^kp3K3QxVTYv)%wQH$6N|99b%XY zYLD`G`I-Z15ohaKz2H(k3{I{Lwy*JO-T1R58@$7%!M-+R)VY&UXl*6awFHNJW^nwd z`a^nz@(@O_m82(dD=U9ZHLCAllenBJ(O%Y}`xBg{S@^5bQ1 z(cELKE`*sMHopEtQDw+yH(5ql@PWYM+L)){K%U<*283*>jj5JU?PkiI4( zzk@%?OG$}|SOB!g0f+VdK}3bZB3!7jbs^(p(-PA3>9NYVtUE6$<_AtofI*l^8PmI) z@=;^}eDxeY3~6P9A$ici~KzKo0i`+Ge; zh%Hb`AcuTUV*K)Bn`T!J)7_q~#zBx~XDi1C4W(Kw`#uvkd46gs&?#((K6rq;xf~xN zSGni21f@o<&gq$YB5(6`n^s)TWja<|7WVre6~F!ypSSc2cpB4g1e#a6_Tx$56=2c> z4xFcJj{<;(pE^4)YG#ouFB(0%O$RJXi&<&<*=lV>QWdZH<` zH==6Ix>g@0^qKS;wuW*wJK{OjouK;!wKKb?r}Y+j7p3x1qS@?UA`EVuojwIO`U6?@HNy+pI^x5CXEy64U!wT! zDekf8Vc$NxWJ&;KR4etq3@$f9`2NFAx*L_Ng{D#>&(6+<)^Nw`yoIlapmv5dcPPK_ z#!SHC1KCUT>vDlN8C;%5n{+JuRQ1HU3Q=>bF6NiRCD(kzjQuV4ojY?7W6+gGO=8;~ z=Nfm@%&mjHqi{^T>#cy{GWcfWkovqW2(cN&XrS6PstWI(z122*e*Mpfcpsx)OH4Lj zWs=GV)I33jKEOcW;bHtf@LcRu$~k@@gjQ$0zi|R{a_%I&v3&bNMC75==47oWKVSXP z)4J1H-qn$Jt{wImz^iI#hh!_qlj2^x^z`(KWiMZcfgG}5LMKxTH%_Fhx4(CQMH=tI9>~VPo<4>U;c4R$ z*NIpPy;RFalX{=FwcQ0{)RPQIQFz64d^jpDMe@?8%BnzKLOy;@=ZqVzb>X>-{^KNR z>Pp;X&J@%JeU!|H)^sPlMiWFkT?H;HGR)9A;uv`XCF*#H8KKUCd2PGRW(}usbQDvk zljN{^<{ON1|Ctrqzl7eg%S2Xbq@gAGAW3uNq_ZO{?AmIB)UwrWwKknfD^+S~^T?|w zn@JdGkQ<{1tgq5Y?HW#|ye91xpvP|3c>R&+D&Eq>JCvJr&OQjzypnv_ROzd=%O>>u z%l5;7U`=LQ@D=)J9EJqppk?mi<~DykX7W-}QgV37nc>cisjl6d1AJ(|m&Uf^Q_Pzr zl?a3>_lESSpzde)>g(YhagBXJQf>VRpTj(rswlStXwpk!xRR2R7nWM|GDFu+VkIYG zvelDrBy|V>Ve$I_VO{fgR+^ESl5#O4_Wny@UNmU6#6={rvC@jZBZB^-eQrbEVCiZ9 z4CzfA8{dchrh|$Y_QGzCy=OO+BKr_~z~_8n8Se@`DcaYBY% z&-Fxk`ric1DwDi#gOX)c< z)>w>Vexs2P7&pKOI?0|1WwlBLeF+S_g_~&PAcjaB~_x*-Gyub>q6FA9`Ma zXu2jPLrezPzPqRSerRKOr}flnSt8`64BFQ{C6Xl~@5Vf;TC@3|G^awexB$4T}`BAVlfBi_4TrQf~l&y0=#+S35qsh~XN+7F%%8-2l+^n82A z92IKyHnG=$c91X;+N+?CjArR;f=yH%;%DcyeXNCth4u(sVef@xZ!e+M5u7A$lU zr*D)DgA`gm=K70sa7*n@qVU}S0n64g8`LHTedEE5kHr+eyJax${L~DOxy{r=#akp$ zIzS}A{qLU5ng3KjH-vznMhQd0&6QD2gC@-u6XPcj)8^7(J!}!C%@#&$3K|e^L?>}8_v^~*S=MF@I=cf7O+7_M36!MK!W0OS$HUFqgL*h2-#q(#h^juGE@7`_w z9)80v|A(T#e?99Cga_aB(OJx}E+T}(Obu1`5+5!wjC~g4A5!vQk|ttMMrBG{de<_+ zLqnC(`+_z{GlMj#o6|VpeC7T4UA5;frJBtj(YfZy5;sVxg}c|)R15CjEp}bgSYBHz zNV`2>tGtld^$0Q$?UN@@k_F7LUL+)KF@s0zgSyYPzc!qFj~C|zcc*zGX$gfe`6-yZ zLfpF%8E%lw4u}Cu{9_h8?-*ZmIm9jj-PbI8Yz2iO^~1jr)4vlucBi4heX5twhe%s^ zPe?gzaj&b}edFfnvuB}J>HgFXo?~tOsi~>Rp2_mfBye!CEg%akq~)y=5%u~k>mO3B zzaG*Dp2CQ4;&hzQWGM>eFk8lyJ(q#gOf>)Pp&k(U#L=$9H@iWUQObiDu_*qC z>M&;~mR-tgm1{Yu49R~; zo`j+NTq6YZH1qn%_IF(3D5;M)q=ccq`(K{mB61~pl(z%BSFnKb9S=x0>f8?qbmXXT z+j!d2N1|8bmhV+|_`-`$1AkXyGCD=r3fjDiz26HkK|G!H8xgD|RN$cJU0rJ3jD?_< z;(^^m$Vt(0K$;jD8fe>NZ>reRe!rhi;EE!x-tDN{CI;=2s9zLzvvqU`f2li+d$UnX z9sWskF4cxM594F#lrAR`cozA%$TQ>;qEU*I_xg!T$oWBS1?}=Zf%iANpuKw}QxxNk zU?bamt?wsH?O9nLpc1C5Jt>Hr(!9d99%FY)*QMPQo4;+wXw|LVlx8NY@IRe27U7_u zYVf@eokAMtH*|Aa-r*=NkESKrWNo5yZEM-5R4nk`1bdTb~eL@p&?CwZUzSj z*EFC)Uf6%2`#AUtGlffW=8_!%+agt5SWk>0zLm{0A4255P??uzAPkw z!10qA+iN1vG4Wr4#$-gata`dZlti$c@HI?Cq`a$#+e6_=#sy>GnpT!hNAZt3!<6V7 zFzJvfz;yE2<0LW--2KA6IeS3Bo!-(0tr2tf)()skj!MzVP!DCuyci{GU9~ZB&Ko>G z#=Oue_>u3WarVNa-;aH7t@wwuW``n50chxdUfC}fJB_VF(%mc3qYMXz=AL{(y_Bp-& zN7%`6XjZ%C3cON}J-0%qfUEG4gSjO>t?FRbo#|>y0D96>qdPC#A?QTWXLsPgf|$!| zb;4@Fqjtms>b95Vj=p;^1m5G01x*W1ri1Tr5p#0I*p-eMi1>$`1hwv30sug3k7#`8 zKwf&_qQqQ0jPMgC4Z*%V*&#y6$_wG&<9|tgU-u@$Q~n<8BO*(_fZ(ZKSQ90Awg}>d zf*3fuX=6$f7~FIOrcas=`~<(_jly*ChBw``pY7OU70okRw%`Hsuv;+xzyL3*rZnwx z5$Xlmo5-790(Hg3T4Q5#KI$UZarJg8=eSN|&Zm}skvPy@?*7rA#uE{2ICirO%Nql8 zvuYG3pZ?JuKxw`rf5^uVZ7|}9E&o;=hK(Rmq<>1+EIDI%RWT{XUogUjnH(cV5#x0G zf3wGBlf*j<=O3>jFxVOsPlKXsF>()N2y{(m@;5Lqh63HdG5>_hqV@F7XQ7i(xO+u@ z&1B$hV6++Gt!Mz|C*R$7c+D?2Jvo;LE+H(eo^6}rk`^=s4Yh>F%I7ZGWIHejwcx-QrMP|k2? zpJM@VE}_QOe?8yh-LB-+LJN{$RX)3%e37-MwKWz{psaV;PqkP*m)rH)p43V2DE?f^dnbLs_oYRbDk? zLGH<>A}aw!Ldo|`Ea>0J7t1JuGA2hWhGOUfaIH(sT2)Pq42AM5C%}@^(V>Le z@(NN1h!ho}TN$!Zb#>C)Gqo@G_MtcScu5(>zaZvRWM!Zq8+iufwog^Nasj657TGnA zsau-dvpQ;YAv{R;KGCb1ad6jjbrnw6t9`M9qPcIpEq2#UoKd&T^esYPm7Zd@-WO6Q z;SmvSKPzX$vGGas5Fb=C^$qUc8`191Y>OD2o{p@mt8-xbMP7?3!&-vPaJ>cO%*@P+ z%ts*bc}_*OxrIMm7I1ux@Bi7Vr$svG_qkM71F_+b{&;)Jue}@=-#ES#vV+s&>>UVB^ zOuAQ^MKVIot|(OC@^6}#Q&+}e6nB#Q6|RmCgNY#GADb!59#>z}-9;`$cEvE=7sdtZ z3}r=xU*$f-ib{GE zk=ggk*yHU&)^mN1+(G&*AZ23^#xc8s!^hRUzu^P7?p~89E9iO+8@FBe&MR@cFpb_L z{c>fQ%&>6bK(<>wpG8Gj9YSlac`ob?mg7r>&u<+JjGjKRk1Dm?d>|rriG&Q_NaR)P`%{u!% zeP?Pt?q(JZPD?SAW@+4;OZAF zus7PScW#3m9!nBP^DEB2Rtjq0-LZbPq9XC(b<_n|kpDb9Vvjo13DGWg(7^Egxp&PP zeBJ7{>MktRtXd*uVjaH;UC`Rqh~Mw&04TnM#cTe+*%-=&A&ND5v7y{HVopPIQz&n1%4*tQethKSrC--133LZeGG{Q+{Z|a|!qU*4 z?WvE+6>IF;TwRmA+#ejflk~Ctv87;fY|}KvM;&$;9im!?>4{oVZh_-yKK4L^<-FBx zUC0IQ-5eBbdg<3Zsx+?O*uKG`h@`ag!%P96TejDy=&@tQi2577{gvn-|45G9d9z`M z7%Ko{`;K|~6cOyt^o6JGAnYmh#+G(ns+^+pZ}R`{McaSBLrc+*9VuT$)c46;srus?HChvD9|xlcQO;OEbbK;TK?a4rUO(nnkA z%n_OiW(ZvK$6y}em(nTOn{lyd@eXQ|~ zuu3V(`VsYtgPtV@pCJCtZ=-FY&4Tce-tSm}yUodK6bn3O8AJ<&gh_)~+|75og&dm$ ze#pEcn&;v^{Z;tjNgM~^_wSptmzowHZ&cFProabJN+#@X%S*Km4N)#jn*^kM!teyX zf8U))VGSSpQ);Ke*hfWtoJ@ggEtKxBl-*A5U(+obQ;q*dQ~^jLyGx0mKQ|LiH7nPz zW@e6P!?MuxFt=qL?)Xt&Ra@&SD|@p7L&!R`w0wt_$!pnt9i4EGgP>a-A8xYLyXFcs z*@2=8&z~D5auz*!B89}(FL4v0@lJPy=CNI+I0JpYpK{XH)ke8owGufKyR$t_-YKP)0X`la(qMm;^1r`>(op;-!TF<0Tyy*rAc` z?(QRDw*?rN-Axk@=cHI_4s|}+1H^dVGfdx8UHn9r)&(u5``1CsYa6e-2ZEAY18>hh z&(&RGeG6*jmzt#zxu3{4$k`W=uagCGW%&0f<)OLWKaN3A|31Y&_}bHouVA~-*Zh?@ zmpfcltfxx8a8N&@qodYalOzW1?w@Nx++g!@}=g9>QT7(Bz+nTbc|08Arnf{N-eL=wl%N0-5-wZ@K?orvNGO1W j5JG~40!RoUBuIV(Ccz$7y*gZk00000NkvXXu0mjfX}%nN From d9e3b432ddd8750470f06f0d3b353829711cf9dc Mon Sep 17 00:00:00 2001 From: PastelPrinceDan Date: Sun, 13 Jun 2021 22:01:52 +0100 Subject: [PATCH 11/81] removes lines --- .../loadout/loadout_fluffitems_vr.dm | 6 +++ .../vore/fluffstuff/custom_clothes_vr.dm | 49 +++++++++++++++++- icons/vore/custom_clothes_vr.dmi | Bin 221635 -> 222425 bytes icons/vore/custom_onmob_vr.dmi | Bin 23093 -> 26022 bytes 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 2ded432e8b..08b552cd0d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -763,6 +763,12 @@ ckeywhitelist = list("pandora029") character_name = list("Evelyn Tareen") +/datum/gear/fluff/evelyn_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/ + display_name = "warden's navy winter coat" + ckeywhitelist = list("pandora029") + character_name = list("Evelyn Tareen") + /datum/gear/fluff/lily_medal path = /obj/item/clothing/accessory/medal/silver/unity display_name = "Lily's Unity Medal" diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 74dae36ba4..5d9a93faf1 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2330,4 +2330,51 @@ Departamental Swimsuits, for general use if(!istype(usr, /mob/living)) return if(usr.stat) return - colorswap(usr) \ No newline at end of file + colorswap(usr) + +//Pandora029 : Evelyn Tareen +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn + name = "warden's navy winter coat" + desc = "A custom tailored security winter coat in navy blue colors, this one has the rank markings of a warden on it." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "evelyncoat" + + icon_override = 'icons/vore/custom_onmob_vr.dmi' + item_state = "evelyncoat_mob" + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/ui_action_click() + ToggleHood_evelyn() + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/equipped(mob/user, slot) + if(slot != slot_wear_suit) + RemoveHood_evelyn() + ..() + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/proc/RemoveHood_evelyn() + icon_state = "evelyncoat" + item_state = "evelyncoat_mob" + hood_up = 0 + if(ishuman(hood.loc)) + var/mob/living/carbon/H = hood.loc + H.unEquip(hood, 1) + H.update_inv_wear_suit() + hood.loc = src + +/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/proc/ToggleHood_evelyn() + if(!hood_up) + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.wear_suit != src) + to_chat(H, "You must be wearing [src] to put up the hood!") + return + if(H.head) + to_chat(H, "You're already wearing something on your head!") + return + else + H.equip_to_slot_if_possible(hood,slot_head,0,0,1) + hood_up = 1 + icon_state = "evelyncoat_t" + item_state = "evelyncoat_mob_t" + H.update_inv_wear_suit() + else + RemoveHood_evelyn() \ No newline at end of file diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 0c8f06b8592a3180f3946d2daab9c2e339fbde06..647e4d3f826bd0adfbb028b1ac6c14c1c24f8b9b 100644 GIT binary patch delta 15178 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 HdEoyC2)l_{ delta 14461 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­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 egZ9e>0ni&Z#)mBI!11->xyQL**5_Hy*_ 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 From d092fb4cb1959becce607004d24b7f48197abaf5 Mon Sep 17 00:00:00 2001 From: PastelPrinceDan Date: Mon, 14 Jun 2021 23:14:15 +0100 Subject: [PATCH 12/81] somehow fucked something up but i fixed it? i think? --- code/modules/vore/fluffstuff/custom_clothes_vr.dm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index c04ec8dcb5..5d9a93faf1 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2342,13 +2342,6 @@ Departamental Swimsuits, for general use icon_override = 'icons/vore/custom_onmob_vr.dmi' item_state = "evelyncoat_mob" -<<<<<<< HEAD -======= - armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0) //same as other sec coats - - var/owner = "pandora029" - ->>>>>>> pandoracoat /obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn/ui_action_click() ToggleHood_evelyn() From ce2871bc2b44146c2a168d796772e0a07169aff6 Mon Sep 17 00:00:00 2001 From: Anthony Rodriguez Date: Mon, 14 Jun 2021 17:02:56 -0700 Subject: [PATCH 13/81] Porting Over De-Husking Surgery --- .../objects/items/weapons/surgery_tools.dm | 10 ++ code/modules/surgery/external_repair.dm | 4 +- code/modules/surgery/other.dm | 154 ++++++++++++++++++ icons/obj/surgery.dmi | Bin 45013 -> 45720 bytes maps/tether/tether-03-surface3.dmm | 12 ++ 5 files changed, 178 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 15bb7cd0e5..5e1d6ceae3 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -22,6 +22,16 @@ return 0 ..() +/* + * Bio-Regenerator + */ +/obj/item/weapon/surgical/bioregen + name="bioregenerator" + desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended." + icon='icons/obj/surgery.dmi' + icon_state="bioregen" + drop_sound = 'sound/items/drop/scrap.ogg' + /* * Retractor */ diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm index 4f8707e82d..5fbb94030b 100644 --- a/code/modules/surgery/external_repair.dm +++ b/code/modules/surgery/external_repair.dm @@ -128,7 +128,7 @@ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \ "You finish taping up [target]'s [affected] with \the [tool].") affected.createwound(BRUISE, 10) - affected.heal_damage(0, 25, 0, 0) + affected.heal_damage(0, 50, 0, 0) //Up from 25 if(!(affected.burn_dam)) affected.burn_stage = 0 if(istype(tool, /obj/item/stack)) @@ -194,7 +194,7 @@ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \ "You finish taping up [target]'s [affected] with \the [tool].") affected.createwound(BRUISE, 10) - affected.heal_damage(25, 0, 0, 0) + affected.heal_damage(50, 0, 0, 0) //Up from 25 if(!(affected.brute_dam)) affected.brute_stage = 0 if(istype(tool, /obj/item/stack)) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index fe7d004dc4..9cde26f240 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -232,3 +232,157 @@ /datum/surgery_step/hardsuit/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \ "\The [tool] can't quite seem to get through the metal. It's weakening, though - try again.") + +/////////////////////////////////////////// +// De-Husking Surgery // +///////////////////////////////////////// + +/datum/surgery_status/ + var/dehusk = 0 + +/datum/surgery_step/dehusk/ + priority = 1 + can_infect = 0 + blood_level = 1 + +/datum/surgery_step/dehusk/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if (!affected || (affected.robotic >= ORGAN_ROBOT)) + return 0 + if(coverage_check(user,target,affected,tool)) + return 0 + return target_zone == BP_TORSO && (HUSK in target.mutations) + +/datum/surgery_step/dehusk/structinitial + allowed_tools = list( + /obj/item/weapon/surgical/bioregen = 100 + ) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/dehusk/structinitial/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.op_stage.dehusk == 0 + +/datum/surgery_step/dehusk/structinitial/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to create a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].", \ + "You begin to create a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].") + ..() + +/datum/surgery_step/dehusk/structinitial/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] creates a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].", \ + "You create a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].") + target.op_stage.dehusk = 1 + ..() + +/datum/surgery_step/dehusk/structinitial/fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s hand slips, and the mesh falls, with \the [tool] scraping [target]'s body.", \ + "Your hand slips, and the mesh falls, with \the [tool] scraping [target]'s body.") + affected.createwound(CUT, 15) + affected.createwound(BRUISE, 10) + ..() + +/datum/surgery_step/dehusk/relocateflesh + allowed_tools = list( + /obj/item/weapon/surgical/hemostat = 100, \ + /obj/item/stack/cable_coil = 75, \ + /obj/item/device/assembly/mousetrap = 20 + ) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/dehusk/relocateflesh/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.op_stage.dehusk == 1 + +/datum/surgery_step/dehusk/relocateflesh/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to relocate some of [target]'s flesh with \the [tool], using it to fill in gaps.", \ + "You begin to relocate some of [target]'s flesh with \the [tool], using it to fill in gaps.") + ..() + +/datum/surgery_step/dehusk/relocateflesh/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] relocates some of [target]'s flesh with \the [tool], using it to fill in gaps.", \ + "You relocate some of [target]'s flesh with \the [tool], using it to fill in gaps.") + target.op_stage.dehusk = 2 + ..() + +/datum/surgery_step/dehusk/relocateflesh/fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] accidentally rips a massive chunk out of [target]'s flesh with \the [tool], causing massive damage.", \ + "You accidentally rip a massive chunk out of [target]'s flesh with \the [tool], causing massive damage.") + affected.createwound(CUT, 25) + affected.createwound(BRUISE, 10) + ..() + +/datum/surgery_step/dehusk/structfinish + allowed_tools = list( + /obj/item/weapon/surgical/bioregen = 100, \ + /obj/item/weapon/surgical/FixOVein = 30 + ) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/dehusk/structfinish/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.op_stage.dehusk == 2 + +/datum/surgery_step/dehusk/structfinish/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(istype(tool,/obj/item/weapon/surgical/bioregen)) + user.visible_message("[user] begins to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].", \ + "You begin to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].") + else if(istype(tool,/obj/item/weapon/surgical/FixOVein)) + user.visible_message("[user] attempts to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].", \ + "You attempt to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].") + ..() + +/datum/surgery_step/dehusk/structfinish/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] finishes recreating the missing biological structures and filling in gaps in [target]'s flesh with \the [tool].", \ + "You finish recreating the missing biological structures and filling in gaps in [target]'s flesh with \the [tool].") + target.op_stage.dehusk = 0 + target.mutations.Remove(HUSK) + target.status_flags &= ~DISFIGURED + target.update_icons_body() + ..() + +/datum/surgery_step/dehusk/structfinish/fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(istype(tool,/obj/item/weapon/surgical/bioregen)) + user.visible_message("[user]'s hand slips, causing \the [tool] to scrape [target]'s body.", \ + "Your hand slips, causing \the [tool] to scrape [target]'s body.") + else if(istype(tool,/obj/item/weapon/surgical/FixOVein)) + user.visible_message("[user] fails to finish the structure over the gaps in [target]'s flesh, doing more damage than good.", \ + "You fail to finish the structure over the gaps in [target]'s flesh, doing more damage than good.") + affected.createwound(CUT, 15) + affected.createwound(BRUISE, 10) + ..() + +/datum/surgery_step/internal/detoxify + blood_level = 1 + allowed_tools = list(/obj/item/weapon/surgical/bioregen=100) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/internal/detoxify/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_TORSO && (target.toxloss > 25 || target.oxyloss > 25) + +/datum/surgery_step/internal/detoxify/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to pull toxins from, and restore oxygen to [target]'s musculature and organs with \the [tool].", \ + "You begin to pull toxins from, and restore oxygen to [target]'s musculature and organs with \the [tool].") + ..() + +/datum/surgery_step/internal/detoxify/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] finishes pulling toxins from, and restoring oxygen to [target]'s musculature and organs with \the [tool].", \ + "You finish pulling toxins from, and restoring oxygen to [target]'s musculature and organs with \the [tool].") + if(target.toxloss>25) + target.adjustToxLoss(-20) + if(target.oxyloss>25) + target.adjustOxyLoss(-20) + ..() + +/datum/surgery_step/internal/detoxify/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s hand slips, failing to finish the surgery, and damaging [target] with \the [tool].", \ + "Your hand slips, failing to finish the surgery, and damaging [target] with \the [tool].") + affected.createwound(CUT, 15) + affected.createwound(BRUISE, 10) + ..() \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 0f22fa82cd3d1da8df12ff682086a9981bfc3912..d6de460866b160dd08080cb86aa4300b5db52e0a 100644 GIT binary patch delta 7286 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 Date: Thu, 17 Jun 2021 11:52:32 -0700 Subject: [PATCH 14/81] Moved the sprite to _vr file to prevent Polaris conflict --- .../objects/items/weapons/surgery_tools.dm | 2 +- icons/obj/surgery.dmi | Bin 45720 -> 45013 bytes icons/obj/surgery_vr.dmi | Bin 6069 -> 6564 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 5e1d6ceae3..7662dcf8aa 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -28,7 +28,7 @@ /obj/item/weapon/surgical/bioregen name="bioregenerator" desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended." - icon='icons/obj/surgery.dmi' + icon='icons/obj/surgery_vr.dmi' icon_state="bioregen" drop_sound = 'sound/items/drop/scrap.ogg' diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index d6de460866b160dd08080cb86aa4300b5db52e0a..0f22fa82cd3d1da8df12ff682086a9981bfc3912 100644 GIT binary patch delta 6573 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 N9;!T6E>ki`{s$+wiq`-D literal 6069 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 Vb@+kc46Y6jD9NeGmdPLk{s)3}ew+XR From 99d776c5c0308dad0e3d6434f903cd688995bc16 Mon Sep 17 00:00:00 2001 From: Anthony Rodriguez Date: Thu, 17 Jun 2021 12:57:20 -0700 Subject: [PATCH 15/81] Reverts heal buff from 50 per use back to 25 per staff request. --- code/modules/surgery/external_repair.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm index 5fbb94030b..4f8707e82d 100644 --- a/code/modules/surgery/external_repair.dm +++ b/code/modules/surgery/external_repair.dm @@ -128,7 +128,7 @@ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \ "You finish taping up [target]'s [affected] with \the [tool].") affected.createwound(BRUISE, 10) - affected.heal_damage(0, 50, 0, 0) //Up from 25 + affected.heal_damage(0, 25, 0, 0) if(!(affected.burn_dam)) affected.burn_stage = 0 if(istype(tool, /obj/item/stack)) @@ -194,7 +194,7 @@ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \ "You finish taping up [target]'s [affected] with \the [tool].") affected.createwound(BRUISE, 10) - affected.heal_damage(50, 0, 0, 0) //Up from 25 + affected.heal_damage(25, 0, 0, 0) if(!(affected.brute_dam)) affected.brute_stage = 0 if(istype(tool, /obj/item/stack)) From c05a5c8f5e682bad459a3c608a52dd195df71ff8 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Fri, 18 Jun 2021 13:06:17 -0500 Subject: [PATCH 16/81] Removes Global Iterators --- code/datums/helper_datums/global_iterator.dm | 160 - code/game/mecha/combat/gorilla.dm | 3 +- code/game/mecha/combat/gygax.dm | 4 +- code/game/mecha/combat/marauder.dm | 6 +- code/game/mecha/equipment/mecha_equipment.dm | 38 +- .../game/mecha/equipment/tools/armor_melee.dm | 4 +- .../mecha/equipment/tools/armor_ranged.dm | 8 +- .../game/mecha/equipment/tools/cable_layer.dm | 2 +- code/game/mecha/equipment/tools/catapult.dm | 4 +- code/game/mecha/equipment/tools/clamp.dm | 8 +- code/game/mecha/equipment/tools/cloak.dm | 40 +- code/game/mecha/equipment/tools/drill.dm | 4 +- .../mecha/equipment/tools/energy_relay.dm | 86 +- .../mecha/equipment/tools/extinguisher.dm | 2 +- code/game/mecha/equipment/tools/generator.dm | 102 +- .../equipment/tools/hardpoint_actuator.dm | 2 +- .../game/mecha/equipment/tools/inflatables.dm | 2 +- code/game/mecha/equipment/tools/jetpack.dm | 11 +- .../mecha/equipment/tools/repair_droid.dm | 77 +- code/game/mecha/equipment/tools/shield.dm | 4 +- .../game/mecha/equipment/tools/shield_omni.dm | 4 +- code/game/mecha/equipment/tools/sleeper.dm | 45 +- .../game/mecha/equipment/tools/syringe_gun.dm | 48 +- code/game/mecha/equipment/tools/teleporter.dm | 2 +- code/game/mecha/equipment/tools/wormhole.dm | 2 +- code/game/mecha/equipment/weapons/weapons.dm | 4 +- code/game/mecha/mecha.dm | 267 +- code/game/vehicles/vehicle.dm | 93 +- code/modules/shieldgen/directional_shield.dm | 6 +- vorestation.dme | 3279 +++++++++++++++++ 30 files changed, 3646 insertions(+), 671 deletions(-) delete mode 100644 code/datums/helper_datums/global_iterator.dm diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm deleted file mode 100644 index a4cbc07de2..0000000000 --- a/code/datums/helper_datums/global_iterator.dm +++ /dev/null @@ -1,160 +0,0 @@ -/* - DO NOT USE THIS. THIS IS BEING DEPRECATED BY PROCESSING SUBSYSTEMS (controllers/subsystems/processing) AND TIMERS. -*/ - -/* -README: - -The global_iterator datum is supposed to provide a simple and robust way to -create some constantly "looping" processes with ability to stop and restart them at will. -Generally, the only thing you want to play with (meaning, redefine) is the process() proc. -It must contain all the things you want done. - -Control functions: - new - used to create datum. First argument (optional) - var list(to use in process() proc) as list, - second (optional) - autostart control. - If autostart == TRUE, the loop will be started immediately after datum creation. - - start(list/arguments) - starts the loop. Takes arguments(optional) as a list, which is then used - by process() proc. Returns null if datum already active, 1 if loop started succesfully and 0 if there's - an error in supplied arguments (not list or empty list). - - stop() - stops the loop. Returns null if datum is already inactive and 1 on success. - - set_delay(new_delay) - sets the delay between iterations. Pretty selfexplanatory. - Returns 0 on error(new_delay is not numerical), 1 otherwise. - - set_process_args(list/arguments) - passes the supplied arguments to the process() proc. - - active() - Returns 1 if datum is active, 0 otherwise. - - toggle() - toggles datum state. Returns new datum state (see active()). - -Misc functions: - - get_last_exec_time() - Returns the time of last iteration. - - get_last_exec_time_as_text() - Returns the time of last iteration as text - - -Control vars: - - delay - delay between iterations - - check_for_null - if equals TRUE, on each iteration the supplied arguments will be checked for nulls. - If some varible equals null (and null only), the loop is stopped. - Usefull, if some var unexpectedly becomes null - due to object deletion, for example. - Of course, you can also check the variables inside process() proc to prevent runtime errors. - -Data storage vars: - - result - stores the value returned by process() proc -*/ - -/datum/global_iterator - var/control_switch = 0 - var/delay = 10 - var/list/arg_list = new - var/last_exec = null - var/check_for_null = 1 - var/forbid_garbage = 0 - var/result - var/state = 0 - - New(list/arguments=null,autostart=1) - delay = delay>0?(delay):1 - if(forbid_garbage) //prevents garbage collection with tag != null - tag = "\ref[src]" - set_process_args(arguments) - if(autostart) - start() - return - - proc/main() - state = 1 - while(src && control_switch) - last_exec = world.timeofday - if(check_for_null && has_null_args()) - stop() - return 0 - result = process(arglist(arg_list)) - for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace. - if(!control_switch) - return 0 - sleep(1) - return 0 - - proc/start(list/arguments=null) - if(active()) - return - if(arguments) - if(!set_process_args(arguments)) - return 0 - if(!state_check()) //the main loop is sleeping, wait for it to terminate. - return - control_switch = 1 - spawn() - state = main() - return 1 - - proc/stop() - if(!active()) - return - control_switch = 0 - spawn(-1) //report termination error but don't wait for state_check(). - state_check() - return 1 - - proc/state_check() - var/lag = 0 - while(state) - sleep(1) - if(++lag>10) - CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.") - return 1 - - proc/active() - return control_switch - - proc/has_null_args() - if(null in arg_list) - return 1 - return 0 - - - proc/set_delay(new_delay) - if(isnum(new_delay)) - delay = max(1, round(new_delay)) - return 1 - else - return 0 - - proc/get_last_exec_time() - return (last_exec||0) - - proc/get_last_exec_time_as_text() - return (time2text(last_exec)||"Wasn't executed yet") - - proc/set_process_args(list/arguments) - if(arguments && istype(arguments, /list) && arguments.len) - arg_list = arguments - return 1 - else -// to_world("Invalid arguments supplied for [src.type], ref = \ref[src]") - return 0 - - proc/toggle_null_checks() - check_for_null = !check_for_null - return check_for_null - - proc/toggle() - if(!stop()) - start() - return active() - -/datum/global_iterator/Destroy() - tag = null - arg_list.Cut() - stop() - return QDEL_HINT_LETMELIVE - //Do not call ..() diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index fecb361f1a..fd62870d55 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -85,7 +85,8 @@ if(move_result) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) - src.pr_inertial_movement.start(list(src,direction)) + float_direction = direction + start_process(MECHA_PROC_MOVEMENT) can_move = 0 spawn(tmp_step_in) can_move = 1 use_power(tmp_step_energy_drain) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 1f9d4a0b6e..b2b5fe613f 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -81,9 +81,7 @@ C.forceMove(src) cell = C return - cell = new(src) - cell.charge = 30000 - cell.maxcharge = 30000 + cell = new /obj/item/weapon/cell/hyper(src) /obj/mecha/combat/gygax/serenity desc = "A lightweight exosuit made from a modified Gygax chassis combined with proprietary VeyMed medical tech. It's faster and sturdier than most medical mechs, but much of the armor plating has been stripped out, leaving it more vulnerable than a regular Gygax." diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index fd0442a294..c218493847 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -97,7 +97,7 @@ src.occupant_message("Unable to move while connected to the air system port") last_message = world.time return 0 - if(!thrusters && src.pr_inertial_movement.active()) + if(!thrusters && (current_processes & MECHA_PROC_MOVEMENT)) return 0 if(state || !has_charge(step_energy_drain)) return 0 @@ -113,9 +113,9 @@ if(move_result) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) - src.pr_inertial_movement.start(list(src,direction)) + float_direction = direction + start_process(MECHA_PROC_MOVEMENT) if(thrusters) - src.pr_inertial_movement.set_process_args(list(src,direction)) tmp_step_energy_drain = step_energy_drain*2 can_move = 0 diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index c716b1f33e..ed631e7c41 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -17,13 +17,17 @@ origin_tech = list(TECH_MATERIAL = 2) description_info = "Some equipment may gain new abilities or advantages if equipped to certain types of Exosuits." var/equip_cooldown = 0 - var/equip_ready = 1 + var/equip_ready = TRUE var/energy_drain = 0 var/obj/mecha/chassis = null var/range = MELEE //bitflags +<<<<<<< HEAD /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. var/mech_flags = NONE var/salvageable = 1 +======= + var/salvageable = TRUE +>>>>>>> f9613f2... Removes Global Iterators (#8146) var/required_type = /obj/mecha //may be either a type or a list of allowed types var/equip_type = null //mechaequip2 var/allow_duplicate = FALSE @@ -34,7 +38,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1) sleep(equip_cooldown) - set_ready_state(1) + set_ready_state(TRUE) if(ready_sound) //Kind of like the kinetic accelerator. playsound(src, ready_sound, 50, 1, -1) if(target && chassis) @@ -45,10 +49,6 @@ . = ..() . += "[src] will fill [equip_type?"a [equip_type]":"any"] slot." -/obj/item/mecha_parts/mecha_equipment/New() - ..() - return - /obj/item/mecha_parts/mecha_equipment/proc/add_equip_overlay(obj/mecha/M as obj) return @@ -227,8 +227,13 @@ src.update_chassis_page() return +/obj/item/mecha_parts/mecha_equipment/Destroy() + detach() + return ..() + /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) moveto = moveto || get_turf(chassis) +<<<<<<< HEAD if(src.Move(moveto)) chassis.equipment -= src chassis.universal_equipment -= src @@ -254,6 +259,27 @@ chassis.log_message("[src] removed from equipment.") chassis = null set_ready_state(1) +======= + forceMove(moveto) + chassis.equipment -= src + chassis.universal_equipment -= src + if(equip_type) + switch(equip_type) + if(EQUIP_HULL) + chassis.hull_equipment -= src + if(EQUIP_WEAPON) + chassis.weapon_equipment -= src + if(EQUIP_UTILITY) + chassis.utility_equipment -= src + if(EQUIP_SPECIAL) + chassis.special_equipment -= src + if(chassis.selected == src) + chassis.selected = null + update_chassis_page() + chassis.log_message("[src] removed from equipment.") + chassis = null + set_ready_state(TRUE) +>>>>>>> f9613f2... Removes Global Iterators (#8146) enable_special = FALSE return diff --git a/code/game/mecha/equipment/tools/armor_melee.dm b/code/game/mecha/equipment/tools/armor_melee.dm index ed5724ce64..7618d5093d 100644 --- a/code/game/mecha/equipment/tools/armor_melee.dm +++ b/code/game/mecha/equipment/tools/armor_melee.dm @@ -29,7 +29,7 @@ chassis.occupant_message("\The [user] hits [chassis] with [W].") user.visible_message("\The [user] hits [chassis] with [W].", "You hit [src] with [W].") inc_damage *= damage_coeff - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) spawn() do_after_cooldown() @@ -65,7 +65,7 @@ user.visible_message("\The [user] hits [chassis] with [W].", "You hit [src] with [W].") chassis.take_damage(round(W.force*damage_coeff),W.damtype) chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() return diff --git a/code/game/mecha/equipment/tools/armor_ranged.dm b/code/game/mecha/equipment/tools/armor_ranged.dm index e1a06bef2d..4cc6287019 100644 --- a/code/game/mecha/equipment/tools/armor_ranged.dm +++ b/code/game/mecha/equipment/tools/armor_ranged.dm @@ -25,7 +25,7 @@ inc_damage = 0 else inc_damage *= src.damage_coeff - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) spawn() do_after_cooldown() @@ -41,7 +41,7 @@ inc_damage = 0 else if(istype(A, /obj)) inc_damage *= damage_coeff - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) spawn() do_after_cooldown() @@ -83,7 +83,7 @@ chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour) chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) Proj.on_hit(chassis) - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() return @@ -103,7 +103,7 @@ if(O.throwforce) chassis.take_damage(round(O.throwforce*damage_coeff)) chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() return diff --git a/code/game/mecha/equipment/tools/cable_layer.dm b/code/game/mecha/equipment/tools/cable_layer.dm index 5fbb7b70db..a431ecdcbf 100644 --- a/code/game/mecha/equipment/tools/cable_layer.dm +++ b/code/game/mecha/equipment/tools/cable_layer.dm @@ -73,7 +73,7 @@ /obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount) if(!cable || cable.amount<1) - set_ready_state(1) + set_ready_state(TRUE) occupant_message("Cable depleted, [src] deactivated.") log_message("Cable depleted, [src] deactivated.") return diff --git a/code/game/mecha/equipment/tools/catapult.dm b/code/game/mecha/equipment/tools/catapult.dm index 7d9162823d..f734a52c79 100644 --- a/code/game/mecha/equipment/tools/catapult.dm +++ b/code/game/mecha/equipment/tools/catapult.dm @@ -39,7 +39,7 @@ locked.throw_at(target, 14, 1.5, chassis) locked = null send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() else @@ -60,7 +60,7 @@ for(var/i=0 to iter) step_away(A,target) sleep(2) - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() return diff --git a/code/game/mecha/equipment/tools/clamp.dm b/code/game/mecha/equipment/tools/clamp.dm index 0580134f33..70f46ee35f 100644 --- a/code/game/mecha/equipment/tools/clamp.dm +++ b/code/game/mecha/equipment/tools/clamp.dm @@ -76,7 +76,7 @@ occupant_message("You lift [target] and start to load it into cargo compartment.") chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) O.anchored = 1 var/T = chassis.loc @@ -115,7 +115,7 @@ step_away(M,chassis) occupant_message("You push [target] out of the way.") chassis.visible_message("[chassis] pushes [target] out of the way.") - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() return 1 @@ -137,7 +137,7 @@ if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) chassis.occupant_message("You lift [target] and start to load it into cargo compartment.") chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) O.anchored = 1 var/T = chassis.loc @@ -169,7 +169,7 @@ step_away(M,chassis) chassis.occupant_message("You smash into [target], sending them flying.") chassis.visible_message("[chassis] tosses [target] like a piece of paper.") - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_after_cooldown() return 1 \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/cloak.dm b/code/game/mecha/equipment/tools/cloak.dm index e78a4f7395..3bcb6bf62d 100644 --- a/code/game/mecha/equipment/tools/cloak.dm +++ b/code/game/mecha/equipment/tools/cloak.dm @@ -3,25 +3,18 @@ desc = "Integrated cloaking system. High power usage, but does render you invisible to the naked eye. Doesn't prevent noise, however." icon_state = "tesla" origin_tech = list(TECH_MAGNET = 5, TECH_DATA = 5) - equip_cooldown = 2 SECONDS energy_drain = 300 range = 0 - equip_type = EQUIP_SPECIAL - var/datum/global_iterator/mecha_cloak/cloak_iterator - -/obj/item/mecha_parts/mecha_equipment/cloak/Initialize() - . = ..() - cloak_iterator = new /datum/global_iterator/mecha_cloak(list(src),0) - cloak_iterator.set_delay(equip_cooldown) - -/obj/item/mecha_parts/mecha_equipment/cloak/Destroy() - qdel_null(cloak_iterator) - return ..() +/obj/item/mecha_parts/mecha_equipment/cloak/process() + ..() + //Removed from chassis or ran out of power + if(!chassis || !chassis.use_power(energy_drain)) + stop_cloak() + return /obj/item/mecha_parts/mecha_equipment/cloak/detach() - qdel_null(cloak_iterator) if(!equip_ready) //We were running stop_cloak() return ..() @@ -44,27 +37,14 @@ if(chassis) chassis.cloak() log_message("Activated.") - cloak_iterator.start() - set_ready_state(0) + START_PROCESSING(SSobj, src) + set_ready_state(FALSE) playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) /obj/item/mecha_parts/mecha_equipment/cloak/proc/stop_cloak() if(chassis) chassis.uncloak() log_message("Deactivated.") - cloak_iterator.stop() - set_ready_state(1) + STOP_PROCESSING(SSobj, src) + set_ready_state(TRUE) playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) - -// These things are so silly -/datum/global_iterator/mecha_cloak/process(var/obj/item/mecha_parts/mecha_equipment/cloak/cloak) - //Removed from chassis - if(!cloak.chassis) - stop() - cloak.stop_cloak() - return - //Ran out of power - if(!cloak.chassis.use_power(cloak.energy_drain)) - stop() - cloak.stop_cloak() - return diff --git a/code/game/mecha/equipment/tools/drill.dm b/code/game/mecha/equipment/tools/drill.dm index 7a3587e454..2b64f93616 100644 --- a/code/game/mecha/equipment/tools/drill.dm +++ b/code/game/mecha/equipment/tools/drill.dm @@ -13,7 +13,7 @@ if(isobj(target)) var/obj/target_obj = target if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") occupant_message("You start to drill [target]") @@ -100,7 +100,7 @@ if(isobj(target)) var/obj/target_obj = target if(target_obj.unacidable) return - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) chassis.visible_message("[chassis] starts to bore into \the [target]", "You hear the bore.") occupant_message("You start to bore into \the [target]") diff --git a/code/game/mecha/equipment/tools/energy_relay.dm b/code/game/mecha/equipment/tools/energy_relay.dm index 0e02f927e4..32943104f0 100644 --- a/code/game/mecha/equipment/tools/energy_relay.dm +++ b/code/game/mecha/equipment/tools/energy_relay.dm @@ -6,25 +6,39 @@ equip_cooldown = 10 energy_drain = 0 range = 0 - var/datum/global_iterator/pr_energy_relay var/coeff = 100 var/list/use_channels = list(EQUIP,ENVIRON,LIGHT) - equip_type = EQUIP_UTILITY -/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/New() +/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() + STOP_PROCESSING(SSfastprocess, src) ..() - pr_energy_relay = new /datum/global_iterator/mecha_energy_relay(list(src),0) - pr_energy_relay.set_delay(equip_cooldown) + +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process() + if(!chassis || chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) + set_ready_state(TRUE) + return PROCESS_KILL + var/cur_charge = chassis.get_charge() + if(isnull(cur_charge) || !chassis.cell) + set_ready_state(TRUE) + occupant_message("No powercell detected.") + return PROCESS_KILL + if(cur_charge* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate" - -/* proc/dynusepower(amount) - if(!equip_ready) //enabled - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - if(pow_chan) - A.master.use_power(amount*coeff, pow_chan) - return 1 - return chassis.dynusepower(amount)*/ - -/datum/global_iterator/mecha_energy_relay - -/datum/global_iterator/mecha_energy_relay/process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER) - if(!ER.chassis || ER.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - stop() - ER.set_ready_state(1) - return - var/cur_charge = ER.chassis.get_charge() - if(isnull(cur_charge) || !ER.chassis.cell) - stop() - ER.set_ready_state(1) - ER.occupant_message("No powercell detected.") - return - if(cur_charge* [src.name] - [(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate" \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/extinguisher.dm b/code/game/mecha/equipment/tools/extinguisher.dm index 4579c46919..ede02bb5b2 100644 --- a/code/game/mecha/equipment/tools/extinguisher.dm +++ b/code/game/mecha/equipment/tools/extinguisher.dm @@ -20,7 +20,7 @@ /obj/item/mecha_parts/mecha_equipment/tool/extinguisher/action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch. if(!action_checks(target) || get_dist(chassis, target)>3) return if(get_dist(chassis, target)>2) return - set_ready_state(0) + set_ready_state(FALSE) if(do_after_cooldown(target)) if( istype(target, /obj/structure/reagent_dispensers) && get_dist(chassis,target) <= 1) //VOREStation Edit var/obj/o = target diff --git a/code/game/mecha/equipment/tools/generator.dm b/code/game/mecha/equipment/tools/generator.dm index 396215131d..78a74bc0f8 100644 --- a/code/game/mecha/equipment/tools/generator.dm +++ b/code/game/mecha/equipment/tools/generator.dm @@ -6,9 +6,9 @@ equip_cooldown = 10 energy_drain = 0 range = MELEE - var/datum/global_iterator/pr_mech_generator var/coeff = 100 var/obj/item/stack/material/fuel + var/fuel_type = /obj/item/stack/material/phoron var/max_fuel = 150000 var/fuel_per_cycle_idle = 100 var/fuel_per_cycle_active = 500 @@ -16,25 +16,38 @@ equip_type = EQUIP_UTILITY -/obj/item/mecha_parts/mecha_equipment/generator/New() - ..() - init() - return +/obj/item/mecha_parts/mecha_equipment/generator/Initialize() + . = ..() + fuel = new fuel_type(src) + fuel.amount = 0 /obj/item/mecha_parts/mecha_equipment/generator/Destroy() - qdel(pr_mech_generator) - pr_mech_generator = null - ..() + qdel(fuel) + return ..() -/obj/item/mecha_parts/mecha_equipment/generator/proc/init() - fuel = new /obj/item/stack/material/phoron(src) - fuel.amount = 0 - pr_mech_generator = new /datum/global_iterator/mecha_generator(list(src),0) - pr_mech_generator.set_delay(equip_cooldown) - return +/obj/item/mecha_parts/mecha_equipment/generator/process() + if(!chassis) + set_ready_state(TRUE) + return PROCESS_KILL + if(fuel.amount<=0) + log_message("Deactivated - no fuel.") + set_ready_state(TRUE) + return PROCESS_KILL + var/cur_charge = chassis.get_charge() + if(isnull(cur_charge)) + set_ready_state(TRUE) + occupant_message("No powercell detected.") + log_message("Deactivated.") + return PROCESS_KILL + var/use_fuel = fuel_per_cycle_idle + if(cur_charge3\] - [pr_mech_generator.active()?"Dea":"A"]ctivate" + return "[output] \[[fuel]: [round(fuel.amount*fuel.perunit,0.1)] cm3\] - [(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate" return /obj/item/mecha_parts/mecha_equipment/generator/action(target) @@ -109,33 +124,6 @@ T.assume_air(GM) return -/datum/global_iterator/mecha_generator - -/datum/global_iterator/mecha_generator/process(var/obj/item/mecha_parts/mecha_equipment/generator/EG) - if(!EG.chassis) - stop() - EG.set_ready_state(1) - return 0 - if(EG.fuel.amount<=0) - stop() - EG.log_message("Deactivated - no fuel.") - EG.set_ready_state(1) - return 0 - var/cur_charge = EG.chassis.get_charge() - if(isnull(cur_charge)) - EG.set_ready_state(1) - EG.occupant_message("No powercell detected.") - EG.log_message("Deactivated.") - stop() - return 0 - var/use_fuel = EG.fuel_per_cycle_idle - if(cur_charge* [src.name] - [pr_repair_droid.active()?"Dea":"A"]ctivate" + return "* [src.name] - [(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate" /obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list) ..() if(href_list["toggle_repairs"]) chassis.cut_overlay(droid_overlay) - if(pr_repair_droid.toggle()) + if(datum_flags & DF_ISPROCESSING) + droid_overlay = new(src.icon, icon_state = "repair_droid") + STOP_PROCESSING(SSobj, src) + log_message("Deactivated.") + set_ready_state(TRUE) + else droid_overlay = new(src.icon, icon_state = "repair_droid_a") log_message("Activated.") - else - droid_overlay = new(src.icon, icon_state = "repair_droid") - log_message("Deactivated.") - set_ready_state(1) + START_PROCESSING(SSobj, src) chassis.add_overlay(droid_overlay) send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) return - -/datum/global_iterator/mecha_repair_droid - -/datum/global_iterator/mecha_repair_droid/process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj) - if(!RD.chassis) - stop() - RD.set_ready_state(1) - return - var/health_boost = RD.health_boost +/obj/item/mecha_parts/mecha_equipment/repair_droid/process() + if(!chassis) + set_ready_state(TRUE) + return PROCESS_KILL var/repaired = 0 - if(RD.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - health_boost *= -2 - else if(RD.chassis.hasInternalDamage() && prob(15)) - for(var/int_dam_flag in RD.repairable_damage) - if(RD.chassis.hasInternalDamage(int_dam_flag)) - RD.chassis.clearInternalDamage(int_dam_flag) + var/effective_boost = health_boost + if(chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) + effective_boost *= -2 + else if(chassis.hasInternalDamage() && prob(15)) + for(var/int_dam_flag in repairable_damage) + if(chassis.hasInternalDamage(int_dam_flag)) + chassis.clearInternalDamage(int_dam_flag) repaired = 1 break - var/obj/item/mecha_parts/component/AC = RD.chassis.internal_components[MECH_ARMOR] - var/obj/item/mecha_parts/component/HC = RD.chassis.internal_components[MECH_HULL] + var/obj/item/mecha_parts/component/AC = chassis.internal_components[MECH_ARMOR] + var/obj/item/mecha_parts/component/HC = chassis.internal_components[MECH_HULL] var/damaged_armor = AC.integrity < AC.max_integrity var/damaged_hull = HC.integrity < HC.max_integrity - if(health_boost<0 || RD.chassis.health < initial(RD.chassis.health) || damaged_armor || damaged_hull) - RD.chassis.health += min(health_boost, initial(RD.chassis.health)-RD.chassis.health) + if(effective_boost<0 || chassis.health < initial(chassis.health) || damaged_armor || damaged_hull) + chassis.health += min(effective_boost, initial(chassis.health)-chassis.health) if(AC) - AC.adjust_integrity(round(health_boost * 0.5, 0.5)) + AC.adjust_integrity(round(effective_boost * 0.5, 0.5)) if(HC) - HC.adjust_integrity(round(health_boost * 0.5, 0.5)) + HC.adjust_integrity(round(effective_boost * 0.5, 0.5)) repaired = 1 if(repaired) - if(RD.chassis.use_power(RD.energy_drain)) - RD.set_ready_state(0) + if(chassis.use_power(energy_drain)) + set_ready_state(FALSE) else - stop() - RD.set_ready_state(1) - return + set_ready_state(TRUE) + return PROCESS_KILL else - RD.set_ready_state(1) + set_ready_state(TRUE) return \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/shield.dm b/code/game/mecha/equipment/tools/shield.dm index 8ee94b162e..494b5eded8 100644 --- a/code/game/mecha/equipment/tools/shield.dm +++ b/code/game/mecha/equipment/tools/shield.dm @@ -70,11 +70,11 @@ if(chassis) my_shield.attack_self(chassis.occupant) if(my_shield.active) - set_ready_state(0) + set_ready_state(FALSE) step_delay = 4 log_message("Activated.") else - set_ready_state(1) + set_ready_state(TRUE) step_delay = 1 log_message("Deactivated.") diff --git a/code/game/mecha/equipment/tools/shield_omni.dm b/code/game/mecha/equipment/tools/shield_omni.dm index 595c860d57..8ee24a7755 100644 --- a/code/game/mecha/equipment/tools/shield_omni.dm +++ b/code/game/mecha/equipment/tools/shield_omni.dm @@ -42,11 +42,11 @@ if(shields) shields.set_on(!shields.active) if(shields.active) - set_ready_state(0) + set_ready_state(FALSE) step_delay = 4 log_message("Activated.") else - set_ready_state(1) + set_ready_state(TRUE) step_delay = initial(step_delay) log_message("Deactivated.") diff --git a/code/game/mecha/equipment/tools/sleeper.dm b/code/game/mecha/equipment/tools/sleeper.dm index bdac763a5b..9163ecec2b 100644 --- a/code/game/mecha/equipment/tools/sleeper.dm +++ b/code/game/mecha/equipment/tools/sleeper.dm @@ -9,20 +9,12 @@ equip_cooldown = 30 mech_flags = EXOSUIT_MODULE_MEDICAL var/mob/living/carbon/human/occupant = null - var/datum/global_iterator/pr_mech_sleeper var/inject_amount = 5 required_type = list(/obj/mecha/medical) salvageable = 0 allow_duplicate = TRUE -/obj/item/mecha_parts/mecha_equipment/tool/sleeper/New() - ..() - pr_mech_sleeper = new /datum/global_iterator/mech_sleeper(list(src),0) - pr_mech_sleeper.set_delay(equip_cooldown) - return - /obj/item/mecha_parts/mecha_equipment/tool/sleeper/Destroy() - qdel(pr_mech_sleeper) for(var/atom/movable/AM in src) AM.forceMove(get_turf(src)) return ..() @@ -63,8 +55,8 @@ target.client.perspective = EYE_PERSPECTIVE target.client.eye = chassis */ - set_ready_state(0) - pr_mech_sleeper.start() + set_ready_state(FALSE) + START_PROCESSING(SSprocessing, src) occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") chassis.visible_message("[chassis] loads [target] into [src].") log_message("[target] loaded. Life support functions engaged.") @@ -84,15 +76,15 @@ */ occupant.Stasis(0) occupant = null - pr_mech_sleeper.stop() - set_ready_state(1) + STOP_PROCESSING(SSprocessing, src) + set_ready_state(TRUE) return /obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach() if(occupant) occupant_message("Unable to detach [src] - equipment occupied.") return - pr_mech_sleeper.stop() + STOP_PROCESSING(SSprocessing, src) return ..() /obj/item/mecha_parts/mecha_equipment/tool/sleeper/get_equip_info() @@ -218,18 +210,17 @@ return go_out()//and release him from the eternal prison. -/datum/global_iterator/mech_sleeper - -/datum/global_iterator/mech_sleeper/process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S) - if(!S.chassis) - S.set_ready_state(1) - return stop() - if(!S.chassis.has_charge(S.energy_drain)) - S.set_ready_state(1) - S.log_message("Deactivated.") - S.occupant_message("[src] deactivated - no power.") - return stop() - var/mob/living/carbon/M = S.occupant +/obj/item/mecha_parts/mecha_equipment/tool/sleeper/process() + ..() + if(!chassis) + set_ready_state(TRUE) + return PROCESS_KILL + if(!chassis.has_charge(energy_drain)) + set_ready_state(TRUE) + log_message("Deactivated.") + occupant_message("[src] deactivated - no power.") + return PROCESS_KILL + var/mob/living/carbon/M = occupant if(!M) return if(M.health > 0) @@ -243,6 +234,6 @@ M.Stun(2) if(M.reagents.get_reagent_amount("inaprovaline") < 5) M.reagents.add_reagent("inaprovaline", 5) - S.chassis.use_power(S.energy_drain) - S.update_equip_info() + chassis.use_power(energy_drain) + update_equip_info() return \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/syringe_gun.dm b/code/game/mecha/equipment/tools/syringe_gun.dm index e12345844b..9825a3037a 100644 --- a/code/game/mecha/equipment/tools/syringe_gun.dm +++ b/code/game/mecha/equipment/tools/syringe_gun.dm @@ -18,17 +18,16 @@ origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) required_type = list(/obj/mecha/medical) -/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/New() - ..() +/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/Initialize() + . = ..() flags |= NOREACT syringes = new known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Dylovene") processed_reagents = new create_reagents(max_volume) - synth = new (list(src),0) /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/detach() - synth.stop() + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/critfail() @@ -59,7 +58,7 @@ if(reagents.total_volume<=0) occupant_message("No available reagents to load syringe with.") return - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) var/turf/trg = get_turf(target) var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] @@ -123,7 +122,7 @@ m++ if(processed_reagents.len) message += " added to production" - synth.start() + START_PROCESSING(SSfastprocess, src) occupant_message(message) occupant_message("Reagent processing started.") log_message("Reagent processing started.") @@ -243,7 +242,7 @@ return 1 /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/proc/add_known_reagent(r_id,r_name) - set_ready_state(0) + set_ready_state(FALSE) do_after_cooldown() if(!(r_id in known_reagents)) known_reagents += r_id @@ -264,22 +263,17 @@ update_equip_info() return -/datum/global_iterator/mech_synth - delay = 100 - -/datum/global_iterator/mech_synth/process(var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/S) - if(!S.chassis) - return stop() - var/energy_drain = S.energy_drain*10 - if(!S.processed_reagents.len || S.reagents.total_volume >= S.reagents.maximum_volume || !S.chassis.has_charge(energy_drain)) - S.occupant_message("Reagent processing stopped.") - S.log_message("Reagent processing stopped.") - return stop() - var/amount = S.synth_speed / S.processed_reagents.len - for(var/reagent in S.processed_reagents) - S.reagents.add_reagent(reagent,amount) - S.chassis.use_power(energy_drain) - return 1 +/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/process() + if(!chassis) + return PROCESS_KILL + if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) + occupant_message("Reagent processing stopped.") + log_message("Reagent processing stopped.") + return PROCESS_KILL + var/amount = synth_speed / processed_reagents.len + for(var/reagent in processed_reagents) + reagents.add_reagent(reagent,amount) + chassis.use_power(energy_drain) /obj/item/mecha_parts/mecha_equipment/crisis_drone name = "crisis dronebay" @@ -321,10 +315,6 @@ . = ..() drone_overlay = new(src.icon, icon_state = droid_state) -/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy() - STOP_PROCESSING(SSobj, src) - ..() - /obj/item/mecha_parts/mecha_equipment/crisis_drone/attach(obj/mecha/M as obj) . = ..(M) if(chassis) @@ -464,10 +454,10 @@ if(chassis) enabled = !enabled if(enabled) - set_ready_state(0) + set_ready_state(FALSE) log_message("Activated.") else - set_ready_state(1) + set_ready_state(TRUE) log_message("Deactivated.") /obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj) diff --git a/code/game/mecha/equipment/tools/teleporter.dm b/code/game/mecha/equipment/tools/teleporter.dm index b77b1c3fdc..7ff3e6a036 100644 --- a/code/game/mecha/equipment/tools/teleporter.dm +++ b/code/game/mecha/equipment/tools/teleporter.dm @@ -13,7 +13,7 @@ if(!action_checks(target) || src.loc.z == 2) return var/turf/T = get_turf(target) if(T) - set_ready_state(0) + set_ready_state(FALSE) chassis.use_power(energy_drain) do_teleport(chassis, T, 4) do_after_cooldown() diff --git a/code/game/mecha/equipment/tools/wormhole.dm b/code/game/mecha/equipment/tools/wormhole.dm index eef3c6a52a..232193b98a 100644 --- a/code/game/mecha/equipment/tools/wormhole.dm +++ b/code/game/mecha/equipment/tools/wormhole.dm @@ -35,7 +35,7 @@ if(!target_turf) return chassis.use_power(energy_drain) - set_ready_state(0) + set_ready_state(FALSE) var/obj/effect/portal/P = new /obj/effect/portal(get_turf(target)) P.target = target_turf P.creator = null diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index ecb971dff1..89a38383dd 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -57,12 +57,12 @@ var/P = new projectile(projectile_turf) Fire(P, target, params) if(i == 1) - set_ready_state(0) + set_ready_state(FALSE) if(fire_cooldown) sleep(fire_cooldown) if(auto_rearm) projectiles = projectiles_per_shot -// set_ready_state(0) +// set_ready_state(FALSE) do_after_cooldown() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 080891672e..bd0015b523 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -4,6 +4,10 @@ #define MECHA_INT_TANK_BREACH 8 #define MECHA_INT_CONTROL_LOST 16 +#define MECHA_PROC_MOVEMENT 1 +#define MECHA_PROC_DAMAGE 2 +#define MECHA_PROC_INT_TEMP 4 + #define MELEE 1 #define RANGED 2 @@ -92,18 +96,18 @@ var/list/operation_req_access = list() //Required access level for mecha operation var/list/internals_req_access = list(access_engine,access_robotics) //Required access level to open cell compartment - var/datum/global_iterator/pr_int_temp_processor //Normalizes internal air mixture temperature - var/datum/global_iterator/pr_inertial_movement //Controls intertial movement in spesss - var/datum/global_iterator/pr_give_air //Moves air from tank to cabin - var/datum/global_iterator/pr_internal_damage //Processes internal damage - - var/wreckage var/list/equipment = new //This lists holds what stuff you bolted onto your baby ride var/obj/item/mecha_parts/mecha_equipment/selected var/max_equip = 2 - var/datum/events/events + + // What direction to float in, if inertial movement is active. + var/float_direction = 0 + // Process() iterator count. + var/process_ticks = 0 + // These control what toggleable processes are executed within process(). + var/current_processes = MECHA_PROC_INT_TEMP //mechaequipt2 stuffs var/list/hull_equipment = new @@ -222,8 +226,6 @@ /obj/mecha/New() ..() - events = new - icon_state += "-open" add_radio() add_cabin() @@ -239,7 +241,6 @@ src.smoke_system.attach(src) add_cell() - add_iterators() removeVerb(/obj/mecha/verb/disconnect_from_port) log_message("[src.name] created.") loc.Entered(src) @@ -282,7 +283,7 @@ if(E.salvageable && prob(30)) WR.crowbar_salvage += E E.forceMove(WR) - E.equip_ready = 1 + E.equip_ready = TRUE else E.forceMove(loc) E.destroy() @@ -324,16 +325,122 @@ GLOB.mech_destroyed_roundstat++ - QDEL_NULL(pr_int_temp_processor) - QDEL_NULL(pr_inertial_movement) - QDEL_NULL(pr_give_air) - QDEL_NULL(pr_internal_damage) QDEL_NULL(spark_system) QDEL_NULL(minihud) mechas_list -= src //global mech list . = ..() +// The main process loop to replace the ancient global iterators. +// It's a bit hardcoded but I don't see anyone else adding stuff to +// mechas, and it's easy enough to modify. +/obj/mecha/process() + var/static/max_ticks = 16 + + if (current_processes & MECHA_PROC_MOVEMENT) + process_inertial_movement() + + if ((current_processes & MECHA_PROC_DAMAGE) && !(process_ticks % 2)) + process_internal_damage() + + if ((current_processes & MECHA_PROC_INT_TEMP) && !(process_ticks % 4)) + process_preserve_temp() + + if (!(process_ticks % 3)) + process_tank_give_air() + + // Max value is 16. So we let it run between [0, 16] with this. + process_ticks = (process_ticks + 1) % 17 + +// Normalizing cabin air temperature to 20 degrees celsius. +// Called every fourth process() tick (20 deciseconds). +/obj/mecha/proc/process_preserve_temp() + if (cabin_air && cabin_air.volume > 0) + var/delta = cabin_air.temperature - T20C + cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) + +// Handles internal air tank action. +// Called every third process() tick (15 deciseconds). +/obj/mecha/proc/process_tank_give_air() + if(internal_tank) + var/datum/gas_mixture/tank_air = internal_tank.return_air() + + var/release_pressure = internal_tank_valve + var/cabin_pressure = cabin_air.return_pressure() + var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) + var/transfer_moles = 0 + + if(pressure_delta > 0) //cabin pressure lower than release pressure + if(tank_air.temperature > 0) + transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) + cabin_air.merge(removed) + + else if(pressure_delta < 0) //cabin pressure higher than release pressure + var/datum/gas_mixture/t_air = get_turf_air() + pressure_delta = cabin_pressure - release_pressure + + if(t_air) + pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) + if(pressure_delta > 0) //if location pressure is lower than cabin pressure + transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) + if(t_air) + t_air.merge(removed) + else //just delete the cabin gas, we're in space or some shit + qdel(removed) + +// Inertial movement in space. +// Called every process() tick (5 deciseconds). +/obj/mecha/proc/process_inertial_movement() + if(float_direction) + if(!step(src, float_direction) || check_for_support()) + stop_process(MECHA_PROC_MOVEMENT) + else + stop_process(MECHA_PROC_MOVEMENT) + return + +// Processes internal damage. +// Called every other process() tick (10 deciseconds). +/obj/mecha/proc/process_internal_damage() + if(!hasInternalDamage()) + stop_process(MECHA_PROC_DAMAGE) + return + + if(hasInternalDamage(MECHA_INT_FIRE)) + if(!hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) + clearInternalDamage(MECHA_INT_FIRE) + if(internal_tank) + if(internal_tank.return_pressure()>internal_tank.maximum_pressure && !(hasInternalDamage(MECHA_INT_TANK_BREACH))) + setInternalDamage(MECHA_INT_TANK_BREACH) + var/datum/gas_mixture/int_tank_air = internal_tank.return_air() + if(int_tank_air && int_tank_air.volume>0) //heat the air_contents + int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) + if(cabin_air && cabin_air.volume>0) + cabin_air.temperature = min(6000+T0C, cabin_air.temperature+rand(10,15)) + if(cabin_air.temperature>max_temperature/2) + take_damage(4/round(max_temperature/cabin_air.temperature,0.1),"fire") + + if(hasInternalDamage(MECHA_INT_TEMP_CONTROL)) + stop_process(MECHA_PROC_INT_TEMP) + + if(hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank + if(internal_tank) + var/datum/gas_mixture/int_tank_air = internal_tank.return_air() + var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) + if(istype(loc, /turf/simulated)) + loc.assume_air(leaked_gas) + else + qdel(leaked_gas) + + if(hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) + if(get_charge()) + spark_system.start() + cell.charge -= min(20,cell.charge) + cell.maxcharge -= min(20,cell.maxcharge) + return + //////////////////////// ////// Helpers ///////// //////////////////////// @@ -372,12 +479,6 @@ radio.icon_state = icon_state radio.subspace_transmission = 1 -/obj/mecha/proc/add_iterators() - pr_int_temp_processor = new /datum/global_iterator/mecha_preserve_temp(list(src)) - pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0) - pr_give_air = new /datum/global_iterator/mecha_tank_give_air(list(src)) - pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0) - /obj/mecha/proc/do_after(delay as num) sleep(delay) if(src) @@ -692,7 +793,7 @@ /obj/mecha/proc/dyndomove(direction) if(!can_move) return 0 - if(src.pr_inertial_movement.active()) + if(current_processes & MECHA_PROC_MOVEMENT) return 0 if(!has_charge(step_energy_drain)) return 0 @@ -711,16 +812,7 @@ last_message = world.time return 0 - -/* -//A first draft of a check to stop mechs from moving fully. TBD when all thrusters modules are unified. - if(!thrusters && !src.pr_inertial_movement.active() && isspace(src.loc))//No thrsters, not drifting, in space - src.occupant_message("Error 543")//debug - return 0 -*/ - - - if(!thrusters && src.pr_inertial_movement.active()) //I think this mean 'if you try to move in space without thruster, u no move' + if(!thrusters && (current_processes & MECHA_PROC_MOVEMENT)) //I think this mean 'if you try to move in space without thruster, u no move' return 0 if(overload)//Check if you have leg overload @@ -780,7 +872,8 @@ use_power(step_energy_drain) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) - src.pr_inertial_movement.start(list(src,direction)) + float_direction = direction + start_process(MECHA_PROC_MOVEMENT) src.log_message("Movement control lost. Inertial movement started.") if(do_after(get_step_delay())) can_move = 1 @@ -882,10 +975,8 @@ /obj/mecha/proc/setInternalDamage(int_dam_flag) - if(!pr_internal_damage) return - internal_damage |= int_dam_flag - pr_internal_damage.start() + start_process(MECHA_PROC_DAMAGE) log_append_to_last("Internal damage of type [int_dam_flag].",1) occupant << sound('sound/mecha/internaldmgalarm.ogg',volume=50) //Better sounding. return @@ -895,7 +986,7 @@ switch(int_dam_flag) if(MECHA_INT_TEMP_CONTROL) occupant_message("Life support system reactivated.") - pr_int_temp_processor.start() + start_process(MECHA_PROC_INT_TEMP) if(MECHA_INT_FIRE) occupant_message("Internal fire extinquished.") if(MECHA_INT_TANK_BREACH) @@ -2725,99 +2816,21 @@ return 1 -////////////////////////////////////////// -//////// Mecha global iterators //////// -////////////////////////////////////////// +///////////////////////////////////////// +//////// Mecha process() helpers //////// +///////////////////////////////////////// +/obj/mecha/proc/stop_process(process) + current_processes &= ~process +/obj/mecha/proc/start_process(process) + current_processes |= process -/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsium - delay = 20 +///////////////////////////////////////////////// +//////// Mecha process() subcomponents //////// +///////////////////////////////////////////////// - process(var/obj/mecha/mecha) - if(mecha.cabin_air && mecha.cabin_air.volume > 0) - var/delta = mecha.cabin_air.temperature - T20C - mecha.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) - return - -/datum/global_iterator/mecha_tank_give_air - delay = 15 - -/datum/global_iterator/mecha_tank_give_air/process(var/obj/mecha/mecha) - if(mecha.internal_tank) - var/datum/gas_mixture/tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/cabin_air = mecha.cabin_air - - var/release_pressure = mecha.internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.temperature > 0) - transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = mecha.get_turf_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - qdel(removed) - else - return stop() - return - -/datum/global_iterator/mecha_intertial_movement //inertial movement in space - delay = 7 - -/datum/global_iterator/mecha_intertial_movement/process(var/obj/mecha/mecha as obj,direction) - if(direction) - if(!step(mecha, direction)||mecha.check_for_support()) - src.stop() - mecha.handle_equipment_movement() - else - src.stop() - return - -/datum/global_iterator/mecha_internal_damage // processing internal damage - -/datum/global_iterator/mecha_internal_damage/process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.volume>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.volume>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.temperature+rand(10,15)) - if(mecha.cabin_air.temperature>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.temperature,0.1),"fire") //The take_damage() proc handles armor values - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - qdel(leaked_gas) - if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) - return +// Handles the internal alarms for a mech. +// Called every 16 iterations (80 deciseconds). ///////////// diff --git a/code/game/vehicles/vehicle.dm b/code/game/vehicles/vehicle.dm index 4088528b35..1250c7d961 100644 --- a/code/game/vehicles/vehicle.dm +++ b/code/game/vehicles/vehicle.dm @@ -44,40 +44,25 @@ var/list/operation_req_access = list()//required access level for mecha operation var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - - //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri - - var/datum/global_iterator/pr_internal_damage //processes internal damage - - var/wreckage var/list/equipment = new var/obj/selected //var/max_equip = 3 - var/datum/events/events -/obj/vehicle/New() - ..() - events = new +/obj/vehicle/Initialize() + . = ..() icon_state += "-unmanned" add_radio() - //add_cabin() //No cabin for non-airtights spark_system.set_up(2, 0, src) spark_system.attach(src) add_cell() - add_iterators() - removeVerb(/obj/mecha/verb/disconnect_from_port) removeVerb(/atom/movable/verb/pull) log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") - loc.Entered(src) - return //################ Helpers ########################################################### @@ -89,26 +74,12 @@ /obj/vehicle/proc/addVerb(verb_path) verbs += verb_path -/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank*/ - /obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null) if(C) C.forceMove(src) cell = C return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 - -/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air*/ + cell = new /obj/item/weapon/cell/mech(src) /obj/vehicle/proc/add_radio() radio = new(src) @@ -117,12 +88,6 @@ radio.icon_state = icon_state radio.subspace_transmission = 1 -/obj/vehicle/proc/add_iterators() - pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) - //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) - //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri - //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri - /obj/vehicle/proc/check_for_support() if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) return 1 @@ -136,55 +101,3 @@ log.len++ log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") return log.len - - - -//################ Global Iterator Datums ###################################### - - -/datum/global_iterator/vehicle_intertial_movement //inertial movement in space - delay = 7 - - process(var/obj/vehicle/V as obj, direction) - if(direction) - if(!step(V, direction)||V.check_for_support()) - src.stop() - else - src.stop() - return - - -/datum/global_iterator/mecha_internal_damage // processing internal damage - - process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) - if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - qdel(leaked_gas) - if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) - return \ No newline at end of file diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 828db3f6cb..2677a56536 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -363,15 +363,15 @@ if((my_tool && loc != my_tool) && (my_mecha && loc != my_mecha)) forceMove(my_tool) if(active) - my_tool.set_ready_state(0) + my_tool.set_ready_state(FALSE) if(my_mecha.has_charge(my_tool.energy_drain * 50)) //Stops at around 1000 charge. my_mecha.use_power(my_tool.energy_drain) else destroy_shields() - my_tool.set_ready_state(1) + my_tool.set_ready_state(TRUE) my_tool.log_message("Power lost.") else - my_tool.set_ready_state(1) + my_tool.set_ready_state(TRUE) /obj/item/shield_projector/line/exosuit/attack_self(var/mob/living/user) if(active) diff --git a/vorestation.dme b/vorestation.dme index 0941e83774..7f6ed911c9 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1,3 +1,4 @@ +<<<<<<< HEAD:vorestation.dme // DM Environment file for baystation12.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. @@ -4044,3 +4045,3281 @@ #include "maps\tether\tether.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE +======= +// DM Environment file for baystation12.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. + // New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES +// BEGIN_INCLUDE +#include "code\_macros.dm" +#include "code\_map_tests.dm" +#include "code\_unit_tests.dm" +#include "code\global.dm" +#include "code\global_init.dm" +#include "code\hub.dm" +#include "code\names.dm" +#include "code\stylesheet.dm" +#include "code\world.dm" +#include "code\__datastructures\globals.dm" +#include "code\__defines\__513_compatibility.dm" +#include "code\__defines\_compile_options.dm" +#include "code\__defines\_lists.dm" +#include "code\__defines\_planes+layers.dm" +#include "code\__defines\_protect.dm" +#include "code\__defines\_tick.dm" +#include "code\__defines\admin.dm" +#include "code\__defines\appearance.dm" +#include "code\__defines\atmos.dm" +#include "code\__defines\callbacks.dm" +#include "code\__defines\chemistry.dm" +#include "code\__defines\color.dm" +#include "code\__defines\construction.dm" +#include "code\__defines\crafting.dm" +#include "code\__defines\damage_organs.dm" +#include "code\__defines\dna.dm" +#include "code\__defines\flags.dm" +#include "code\__defines\gamemode.dm" +#include "code\__defines\holomap.dm" +#include "code\__defines\hoses.dm" +#include "code\__defines\integrated_circuits.dm" +#include "code\__defines\inventory_sizes.dm" +#include "code\__defines\is_helpers.dm" +#include "code\__defines\items_clothing.dm" +#include "code\__defines\lighting.dm" +#include "code\__defines\machinery.dm" +#include "code\__defines\map.dm" +#include "code\__defines\materials.dm" +#include "code\__defines\math.dm" +#include "code\__defines\math_physics.dm" +#include "code\__defines\MC.dm" +#include "code\__defines\misc.dm" +#include "code\__defines\mobs.dm" +#include "code\__defines\objects.dm" +#include "code\__defines\overmap.dm" +#include "code\__defines\pda.dm" +#include "code\__defines\planets.dm" +#include "code\__defines\preferences.dm" +#include "code\__defines\process_scheduler.dm" +#include "code\__defines\qdel.dm" +#include "code\__defines\research.dm" +#include "code\__defines\rust_g.dm" +#include "code\__defines\shuttle.dm" +#include "code\__defines\sound.dm" +#include "code\__defines\spaceman_dmm.dm" +#include "code\__defines\species_languages.dm" +#include "code\__defines\sqlite_defines.dm" +#include "code\__defines\stat_tracking.dm" +#include "code\__defines\subsystems.dm" +#include "code\__defines\supply.dm" +#include "code\__defines\targeting.dm" +#include "code\__defines\tgui.dm" +#include "code\__defines\tools.dm" +#include "code\__defines\turfs.dm" +#include "code\__defines\typeids.dm" +#include "code\__defines\unit_tests.dm" +#include "code\__defines\vote.dm" +#include "code\__defines\vv.dm" +#include "code\__defines\webhooks.dm" +#include "code\__defines\wires.dm" +#include "code\__defines\xenoarcheaology.dm" +#include "code\__defines\ZAS.dm" +#include "code\__defines\dcs\flags.dm" +#include "code\__defines\dcs\helpers.dm" +#include "code\__defines\dcs\signals.dm" +#include "code\_compatibility\509\_JSON.dm" +#include "code\_compatibility\509\JSON Reader.dm" +#include "code\_compatibility\509\JSON Writer.dm" +#include "code\_compatibility\509\text.dm" +#include "code\_compatibility\509\type2type.dm" +#include "code\_global_vars\bitfields.dm" +#include "code\_global_vars\misc.dm" +#include "code\_global_vars\mobs.dm" +#include "code\_global_vars\sensitive.dm" +#include "code\_global_vars\lists\mapping.dm" +#include "code\_global_vars\lists\misc.dm" +#include "code\_global_vars\lists\species.dm" +#include "code\_helpers\_global_objects.dm" +#include "code\_helpers\_lists.dm" +#include "code\_helpers\atmospherics.dm" +#include "code\_helpers\atom_movables.dm" +#include "code\_helpers\events.dm" +#include "code\_helpers\files.dm" +#include "code\_helpers\game.dm" +#include "code\_helpers\global_lists.dm" +#include "code\_helpers\icons.dm" +#include "code\_helpers\logging.dm" +#include "code\_helpers\matrices.dm" +#include "code\_helpers\mobs.dm" +#include "code\_helpers\names.dm" +#include "code\_helpers\sanitize_values.dm" +#include "code\_helpers\storage.dm" +#include "code\_helpers\string_lists.dm" +#include "code\_helpers\text.dm" +#include "code\_helpers\time.dm" +#include "code\_helpers\turfs.dm" +#include "code\_helpers\type2type.dm" +#include "code\_helpers\unsorted.dm" +#include "code\_helpers\view.dm" +#include "code\_helpers\visual_filters.dm" +#include "code\_helpers\sorts\__main.dm" +#include "code\_helpers\sorts\comparators.dm" +#include "code\_helpers\sorts\TimSort.dm" +#include "code\_onclick\_defines.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\rig.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\ability_screen_objects.dm" +#include "code\_onclick\hud\action.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\gun_mode.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\map_popups.dm" +#include "code\_onclick\hud\minihud.dm" +#include "code\_onclick\hud\minihud_mapper.dm" +#include "code\_onclick\hud\minihud_rigmech.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\skybox.dm" +#include "code\_onclick\hud\spell_screen_objects.dm" +#include "code\ATMOSPHERICS\_atmos_setup.dm" +#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" +#include "code\ATMOSPHERICS\atmospherics.dm" +#include "code\ATMOSPHERICS\datum_pipe_network.dm" +#include "code\ATMOSPHERICS\datum_pipeline.dm" +#include "code\ATMOSPHERICS\mainspipe.dm" +#include "code\ATMOSPHERICS\components\portables_connector.dm" +#include "code\ATMOSPHERICS\components\shutoff.dm" +#include "code\ATMOSPHERICS\components\tvalve.dm" +#include "code\ATMOSPHERICS\components\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" +#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" +#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" +#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" +#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" +#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" +#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" +#include "code\ATMOSPHERICS\components\unary\generator_input.dm" +#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" +#include "code\ATMOSPHERICS\components\unary\heat_source.dm" +#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" +#include "code\ATMOSPHERICS\components\unary\oxygen_generator.dm" +#include "code\ATMOSPHERICS\components\unary\unary_base.dm" +#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" +#include "code\ATMOSPHERICS\pipes\cap.dm" +#include "code\ATMOSPHERICS\pipes\he_pipes.dm" +#include "code\ATMOSPHERICS\pipes\manifold.dm" +#include "code\ATMOSPHERICS\pipes\manifold4w.dm" +#include "code\ATMOSPHERICS\pipes\pipe_base.dm" +#include "code\ATMOSPHERICS\pipes\simple.dm" +#include "code\ATMOSPHERICS\pipes\tank.dm" +#include "code\ATMOSPHERICS\pipes\universal.dm" +#include "code\ATMOSPHERICS\pipes\vent.dm" +#include "code\controllers\autotransfer.dm" +#include "code\controllers\communications.dm" +#include "code\controllers\configuration.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\emergency_shuttle_controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks-defs.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\master_controller.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\verbs.dm" +#include "code\controllers\observer_listener\atom\observer.dm" +#include "code\controllers\subsystems\ai.dm" +#include "code\controllers\subsystems\aifast.dm" +#include "code\controllers\subsystems\air.dm" +#include "code\controllers\subsystems\airflow.dm" +#include "code\controllers\subsystems\alarm.dm" +#include "code\controllers\subsystems\assets.dm" +#include "code\controllers\subsystems\atoms.dm" +#include "code\controllers\subsystems\character_setup.dm" +#include "code\controllers\subsystems\chat.dm" +#include "code\controllers\subsystems\chemistry.dm" +#include "code\controllers\subsystems\circuits.dm" +#include "code\controllers\subsystems\dcs.dm" +#include "code\controllers\subsystems\events.dm" +#include "code\controllers\subsystems\events2.dm" +#include "code\controllers\subsystems\game_master.dm" +#include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\holomaps.dm" +#include "code\controllers\subsystems\inactivity.dm" +#include "code\controllers\subsystems\job.dm" +#include "code\controllers\subsystems\lighting.dm" +#include "code\controllers\subsystems\machines.dm" +#include "code\controllers\subsystems\mapping.dm" +#include "code\controllers\subsystems\mobs.dm" +#include "code\controllers\subsystems\nanoui.dm" +#include "code\controllers\subsystems\nightshift.dm" +#include "code\controllers\subsystems\open_space.dm" +#include "code\controllers\subsystems\orbits.dm" +#include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\persistence.dm" +#include "code\controllers\subsystems\planets.dm" +#include "code\controllers\subsystems\radiation.dm" +#include "code\controllers\subsystems\shuttles.dm" +#include "code\controllers\subsystems\skybox.dm" +#include "code\controllers\subsystems\sqlite.dm" +#include "code\controllers\subsystems\sun.dm" +#include "code\controllers\subsystems\supply.dm" +#include "code\controllers\subsystems\tgui.dm" +#include "code\controllers\subsystems\ticker.dm" +#include "code\controllers\subsystems\time_track.dm" +#include "code\controllers\subsystems\timer.dm" +#include "code\controllers\subsystems\vote.dm" +#include "code\controllers\subsystems\webhooks.dm" +#include "code\controllers\subsystems\xenoarch.dm" +#include "code\controllers\subsystems\processing\fastprocess.dm" +#include "code\controllers\subsystems\processing\obj.dm" +#include "code\controllers\subsystems\processing\processing.dm" +#include "code\controllers\subsystems\processing\projectiles.dm" +#include "code\controllers\subsystems\processing\turfs.dm" +#include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\category.dm" +#include "code\datums\chat_message.dm" +#include "code\datums\computerfiles.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\EPv2.dm" +#include "code\datums\ghost_query.dm" +#include "code\datums\hierarchy.dm" +#include "code\datums\mind.dm" +#include "code\datums\mixed.dm" +#include "code\datums\modules.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\orbit.dm" +#include "code\datums\organs.dm" +#include "code\datums\position_point_vector.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\riding.dm" +#include "code\datums\soul_link.dm" +#include "code\datums\sun.dm" +#include "code\datums\weakref.dm" +#include "code\datums\autolathe\arms.dm" +#include "code\datums\autolathe\autolathe.dm" +#include "code\datums\autolathe\devices.dm" +#include "code\datums\autolathe\engineering.dm" +#include "code\datums\autolathe\general.dm" +#include "code\datums\autolathe\materials.dm" +#include "code\datums\autolathe\medical.dm" +#include "code\datums\autolathe\tools.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\crafting\crafting.dm" +#include "code\datums\components\crafting\crafting_external.dm" +#include "code\datums\components\crafting\recipes.dm" +#include "code\datums\components\crafting\tool_quality.dm" +#include "code\datums\elements\_element.dm" +#include "code\datums\game_masters\_common.dm" +#include "code\datums\game_masters\default.dm" +#include "code\datums\game_masters\other_game_masters.dm" +#include "code\datums\helper_datums\construction_datum.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\getrev.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\locations\locations.dm" +#include "code\datums\locations\nyx.dm" +#include "code\datums\locations\qerrvallis.dm" +#include "code\datums\locations\s_randarr.dm" +#include "code\datums\locations\sol.dm" +#include "code\datums\locations\tau_ceti.dm" +#include "code\datums\locations\uueoa_esa.dm" +#include "code\datums\locations\vir.dm" +#include "code\datums\looping_sounds\_looping_sound.dm" +#include "code\datums\looping_sounds\item_sounds.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\sequence.dm" +#include "code\datums\looping_sounds\weather_sounds.dm" +#include "code\datums\managed_browsers\_managed_browser.dm" +#include "code\datums\managed_browsers\feedback_form.dm" +#include "code\datums\managed_browsers\feedback_viewer.dm" +#include "code\datums\observation\_debug.dm" +#include "code\datums\observation\_defines.dm" +#include "code\datums\observation\destroyed.dm" +#include "code\datums\observation\dir_set.dm" +#include "code\datums\observation\equipped.dm" +#include "code\datums\observation\helpers.dm" +#include "code\datums\observation\logged_in.dm" +#include "code\datums\observation\moved.dm" +#include "code\datums\observation\observation.dm" +#include "code\datums\observation\power_change.dm" +#include "code\datums\observation\shuttle_added.dm" +#include "code\datums\observation\shuttle_moved.dm" +#include "code\datums\observation\stat_set.dm" +#include "code\datums\observation\turf_changed.dm" +#include "code\datums\observation\turf_enterexit.dm" +#include "code\datums\observation\unequipped.dm" +#include "code\datums\observation\z_moved.dm" +#include "code\datums\observation\~cleanup.dm" +#include "code\datums\outfits\_defines.dm" +#include "code\datums\outfits\horror_killers.dm" +#include "code\datums\outfits\misc.dm" +#include "code\datums\outfits\nanotrasen.dm" +#include "code\datums\outfits\outfit.dm" +#include "code\datums\outfits\pirates.dm" +#include "code\datums\outfits\spec_op.dm" +#include "code\datums\outfits\tournament.dm" +#include "code\datums\outfits\wizardry.dm" +#include "code\datums\outfits\costumes\costume.dm" +#include "code\datums\outfits\costumes\halloween.dm" +#include "code\datums\outfits\jobs\cargo.dm" +#include "code\datums\outfits\jobs\civilian.dm" +#include "code\datums\outfits\jobs\command.dm" +#include "code\datums\outfits\jobs\engineering.dm" +#include "code\datums\outfits\jobs\job.dm" +#include "code\datums\outfits\jobs\medical.dm" +#include "code\datums\outfits\jobs\misc.dm" +#include "code\datums\outfits\jobs\science.dm" +#include "code\datums\outfits\jobs\security.dm" +#include "code\datums\outfits\military\fleet.dm" +#include "code\datums\outfits\military\marines.dm" +#include "code\datums\outfits\military\military.dm" +#include "code\datums\outfits\military\sifguard.dm" +#include "code\datums\repositories\ammomaterial.dm" +#include "code\datums\repositories\cameras.dm" +#include "code\datums\repositories\crew.dm" +#include "code\datums\repositories\decls.dm" +#include "code\datums\repositories\repository.dm" +#include "code\datums\repositories\unique.dm" +#include "code\datums\roundstats\_defines_local.dm" +#include "code\datums\roundstats\departmentgoal.dm" +#include "code\datums\roundstats\roundstats.dm" +#include "code\datums\supplypacks\atmospherics.dm" +#include "code\datums\supplypacks\contraband.dm" +#include "code\datums\supplypacks\costumes.dm" +#include "code\datums\supplypacks\engineering.dm" +#include "code\datums\supplypacks\hospitality.dm" +#include "code\datums\supplypacks\hydroponics.dm" +#include "code\datums\supplypacks\materials.dm" +#include "code\datums\supplypacks\medical.dm" +#include "code\datums\supplypacks\misc.dm" +#include "code\datums\supplypacks\munitions.dm" +#include "code\datums\supplypacks\recreation.dm" +#include "code\datums\supplypacks\robotics.dm" +#include "code\datums\supplypacks\science.dm" +#include "code\datums\supplypacks\security.dm" +#include "code\datums\supplypacks\supply.dm" +#include "code\datums\supplypacks\supplypacks.dm" +#include "code\datums\supplypacks\voidsuits.dm" +#include "code\datums\underwear\bottom.dm" +#include "code\datums\underwear\socks.dm" +#include "code\datums\underwear\top.dm" +#include "code\datums\underwear\undershirts.dm" +#include "code\datums\underwear\underwear.dm" +#include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\announcements.dm" +#include "code\datums\uplink\armor.dm" +#include "code\datums\uplink\backup.dm" +#include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\grenades.dm" +#include "code\datums\uplink\hardsuit_modules.dm" +#include "code\datums\uplink\implants.dm" +#include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\resources.dm" +#include "code\datums\uplink\stealth_items.dm" +#include "code\datums\uplink\stealthy_weapons.dm" +#include "code\datums\uplink\telecrystals.dm" +#include "code\datums\uplink\tools.dm" +#include "code\datums\uplink\uplink_categories.dm" +#include "code\datums\uplink\uplink_items.dm" +#include "code\datums\uplink\visible_weapons.dm" +#include "code\datums\vending\stored_item.dm" +#include "code\datums\vending\vending.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\grid_checker.dm" +#include "code\datums\wires\jukebox.dm" +#include "code\datums\wires\mines.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\seedstorage.dm" +#include "code\datums\wires\smartfridge.dm" +#include "code\datums\wires\smes.dm" +#include "code\datums\wires\suit_storage_unit.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\datums\wires\wires.dm" +#include "code\defines\gases.dm" +#include "code\defines\obj.dm" +#include "code\defines\obj\weapon.dm" +#include "code\defines\procs\announce.dm" +#include "code\defines\procs\AStar.dm" +#include "code\defines\procs\dbcore.dm" +#include "code\defines\procs\radio.dm" +#include "code\defines\procs\sd_Alert.dm" +#include "code\defines\procs\statistics.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\base_turf.dm" +#include "code\game\periodic_news.dm" +#include "code\game\response_team.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\skincmd.dm" +#include "code\game\sound.dm" +#include "code\game\trader_visit.dm" +#include "code\game\world.dm" +#include "code\game\antagonist\_antagonist_setup.dm" +#include "code\game\antagonist\antagonist.dm" +#include "code\game\antagonist\antagonist_add.dm" +#include "code\game\antagonist\antagonist_create.dm" +#include "code\game\antagonist\antagonist_equip.dm" +#include "code\game\antagonist\antagonist_factions.dm" +#include "code\game\antagonist\antagonist_helpers.dm" +#include "code\game\antagonist\antagonist_objectives.dm" +#include "code\game\antagonist\antagonist_panel.dm" +#include "code\game\antagonist\antagonist_place.dm" +#include "code\game\antagonist\antagonist_print.dm" +#include "code\game\antagonist\antagonist_update.dm" +#include "code\game\antagonist\alien\borer.dm" +#include "code\game\antagonist\alien\xenomorph.dm" +#include "code\game\antagonist\outsider\commando.dm" +#include "code\game\antagonist\outsider\deathsquad.dm" +#include "code\game\antagonist\outsider\ert.dm" +#include "code\game\antagonist\outsider\mercenary.dm" +#include "code\game\antagonist\outsider\ninja.dm" +#include "code\game\antagonist\outsider\raider.dm" +#include "code\game\antagonist\outsider\technomancer.dm" +#include "code\game\antagonist\outsider\trader.dm" +#include "code\game\antagonist\outsider\wizard.dm" +#include "code\game\antagonist\station\changeling.dm" +#include "code\game\antagonist\station\cultist.dm" +#include "code\game\antagonist\station\highlander.dm" +#include "code\game\antagonist\station\infiltrator.dm" +#include "code\game\antagonist\station\loyalist.dm" +#include "code\game\antagonist\station\renegade.dm" +#include "code\game\antagonist\station\revolutionary.dm" +#include "code\game\antagonist\station\rogue_ai.dm" +#include "code\game\antagonist\station\stowaway.dm" +#include "code\game\antagonist\station\thug.dm" +#include "code\game\antagonist\station\traitor.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\asteroid_areas.dm" +#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\ss13_deprecated_areas.dm" +#include "code\game\dna\dna2.dm" +#include "code\game\dna\dna2_domutcheck.dm" +#include "code\game\dna\dna2_helpers.dm" +#include "code\game\dna\dna_modifier.dm" +#include "code\game\dna\genes\disabilities.dm" +#include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\powers.dm" +#include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\game_mode_latespawn.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\calamity\calamity.dm" +#include "code\game\gamemodes\changeling\absorbed_dna.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_powers.dm" +#include "code\game\gamemodes\changeling\generic_equip_procs.dm" +#include "code\game\gamemodes\changeling\modularchangling.dm" +#include "code\game\gamemodes\changeling\powers\absorb.dm" +#include "code\game\gamemodes\changeling\powers\armblade.dm" +#include "code\game\gamemodes\changeling\powers\armor.dm" +#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" +#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" +#include "code\game\gamemodes\changeling\powers\blind_sting.dm" +#include "code\game\gamemodes\changeling\powers\boost_range.dm" +#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" +#include "code\game\gamemodes\changeling\powers\darkvision.dm" +#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" +#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" +#include "code\game\gamemodes\changeling\powers\digital_camo.dm" +#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" +#include "code\game\gamemodes\changeling\powers\endoarmor.dm" +#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" +#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" +#include "code\game\gamemodes\changeling\powers\enrage.dm" +#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" +#include "code\game\gamemodes\changeling\powers\escape_restraints.dm" +#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" +#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" +#include "code\game\gamemodes\changeling\powers\fake_death.dm" +#include "code\game\gamemodes\changeling\powers\fleshmend.dm" +#include "code\game\gamemodes\changeling\powers\hivemind.dm" +#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" +#include "code\game\gamemodes\changeling\powers\panacea.dm" +#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" +#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" +#include "code\game\gamemodes\changeling\powers\respec.dm" +#include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\self_respiration.dm" +#include "code\game\gamemodes\changeling\powers\shriek.dm" +#include "code\game\gamemodes\changeling\powers\silence_sting.dm" +#include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" +#include "code\game\gamemodes\cult\construct_spells.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_items.dm" +#include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\hell_universe.dm" +#include "code\game\gamemodes\cult\narsie.dm" +#include "code\game\gamemodes\cult\ritual.dm" +#include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\cult\soulstone.dm" +#include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\cult\cultify\mob.dm" +#include "code\game\gamemodes\cult\cultify\obj.dm" +#include "code\game\gamemodes\cult\cultify\turf.dm" +#include "code\game\gamemodes\endgame\endgame.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" +#include "code\game\gamemodes\events\black_hole.dm" +#include "code\game\gamemodes\events\clang.dm" +#include "code\game\gamemodes\events\dust.dm" +#include "code\game\gamemodes\events\power_failure.dm" +#include "code\game\gamemodes\events\wormholes.dm" +#include "code\game\gamemodes\events\holidays\Christmas.dm" +#include "code\game\gamemodes\events\holidays\Holidays.dm" +#include "code\game\gamemodes\events\holidays\Other.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\heist\heist.dm" +#include "code\game\gamemodes\infiltrator\infiltrator.dm" +#include "code\game\gamemodes\malfunction\malf_hardware.dm" +#include "code\game\gamemodes\malfunction\malf_research.dm" +#include "code\game\gamemodes\malfunction\malf_research_ability.dm" +#include "code\game\gamemodes\malfunction\malfunction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\mixed\conflux.dm" +#include "code\game\gamemodes\mixed\infestation.dm" +#include "code\game\gamemodes\mixed\intrigue.dm" +#include "code\game\gamemodes\mixed\lizard.dm" +#include "code\game\gamemodes\mixed\mercrenegade.dm" +#include "code\game\gamemodes\mixed\mercwiz.dm" +#include "code\game\gamemodes\mixed\paranoia.dm" +#include "code\game\gamemodes\mixed\traitorling.dm" +#include "code\game\gamemodes\mixed\traitorrenegade.dm" +#include "code\game\gamemodes\mixed\uprising.dm" +#include "code\game\gamemodes\mixed\visitors.dm" +#include "code\game\gamemodes\ninja\ninja.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\pinpointer.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\technomancer\catalog.dm" +#include "code\game\gamemodes\technomancer\clothing.dm" +#include "code\game\gamemodes\technomancer\core_obj.dm" +#include "code\game\gamemodes\technomancer\equipment.dm" +#include "code\game\gamemodes\technomancer\instability.dm" +#include "code\game\gamemodes\technomancer\spell_objs.dm" +#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" +#include "code\game\gamemodes\technomancer\technomancer.dm" +#include "code\game\gamemodes\technomancer\assistance\assistance.dm" +#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" +#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" +#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" +#include "code\game\gamemodes\technomancer\devices\hypos.dm" +#include "code\game\gamemodes\technomancer\devices\implants.dm" +#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" +#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" +#include "code\game\gamemodes\technomancer\spells\abjuration.dm" +#include "code\game\gamemodes\technomancer\spells\apportation.dm" +#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" +#include "code\game\gamemodes\technomancer\spells\blink.dm" +#include "code\game\gamemodes\technomancer\spells\chroma.dm" +#include "code\game\gamemodes\technomancer\spells\condensation.dm" +#include "code\game\gamemodes\technomancer\spells\control.dm" +#include "code\game\gamemodes\technomancer\spells\dispel.dm" +#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" +#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" +#include "code\game\gamemodes\technomancer\spells\gambit.dm" +#include "code\game\gamemodes\technomancer\spells\illusion.dm" +#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" +#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" +#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" +#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" +#include "code\game\gamemodes\technomancer\spells\passwall.dm" +#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" +#include "code\game\gamemodes\technomancer\spells\radiance.dm" +#include "code\game\gamemodes\technomancer\spells\reflect.dm" +#include "code\game\gamemodes\technomancer\spells\resurrect.dm" +#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" +#include "code\game\gamemodes\technomancer\spells\shield.dm" +#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" +#include "code\game\gamemodes\technomancer\spells\track.dm" +#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" +#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_all.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\purify.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lesser_chain_lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_ward.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\jobs\_access_defs.dm" +#include "code\game\jobs\access.dm" +#include "code\game\jobs\access_datum.dm" +#include "code\game\jobs\job_controller.dm" +#include "code\game\jobs\jobs.dm" +#include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\job\_alt_title.dm" +#include "code\game\jobs\job\assistant.dm" +#include "code\game\jobs\job\captain.dm" +#include "code\game\jobs\job\civilian.dm" +#include "code\game\jobs\job\civilian_chaplain.dm" +#include "code\game\jobs\job\department.dm" +#include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\silicon.dm" +#include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\air_alarm.dm" +#include "code\game\machinery\atmo_control.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\biogenerator.dm" +#include "code\game\machinery\bioprinter.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\CableLayer.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\exonet_node.dm" +#include "code\game\machinery\fire_alarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\floor_light.dm" +#include "code\game\machinery\floorlayer.dm" +#include "code\game\machinery\frame.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holosign.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\jukebox.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\machinery.dm" +#include "code\game\machinery\machinery_power.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\neonsign.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\nuclear_bomb.dm" +#include "code\game\machinery\OpTable.dm" +#include "code\game\machinery\overview.dm" +#include "code\game\machinery\oxygen_pump.dm" +#include "code\game\machinery\pda_multicaster.dm" +#include "code\game\machinery\pointdefense.dm" +#include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\robot_fabricator.dm" +#include "code\game\machinery\seed_extractor.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\status_display_ai.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\supplybeacon.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transportpod.dm" +#include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\wall_frames.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\canister.dm" +#include "code\game\machinery\atmoalter\clamp.dm" +#include "code\game\machinery\atmoalter\meter.dm" +#include "code\game\machinery\atmoalter\portable_atmospherics.dm" +#include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\scrubber.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\ai_core.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\computer.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\guestpass.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\message.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\prisoner.dm" +#include "code\game\machinery\computer\prisonshuttle.dm" +#include "code\game\machinery\computer\RCON_Console.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\shutoff_monitor.dm" +#include "code\game\machinery\computer\shuttle.dm" +#include "code\game\machinery\computer\skills.dm" +#include "code\game\machinery\computer\specops_shuttle.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\supply.dm" +#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_control.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\blast_door.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\firedoor_assembly.dm" +#include "code\game\machinery\doors\multi_tile.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\airlock_controllers.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" +#include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\docking_program.dm" +#include "code\game\machinery\embedded_controller\docking_program_multi.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\embedded_program_base.dm" +#include "code\game\machinery\embedded_controller\mapping_helpers.dm" +#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\pipe\pipe_recipes.dm" +#include "code\game\machinery\pipe\pipelayer.dm" +#include "code\game\machinery\reagents\pump.dm" +#include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\telemonitor.dm" +#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\machinery\virtual_reality\ar_console.dm" +#include "code\game\machinery\virtual_reality\vr_console.dm" +#include "code\game\magic\Uristrunes.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mech_prosthetics.dm" +#include "code\game\mecha\mech_sensor.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_appearance.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_helpers.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\fighter.dm" +#include "code\game\mecha\combat\gorilla.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\components\_component.dm" +#include "code\game\mecha\components\actuators.dm" +#include "code\game\mecha\components\armor.dm" +#include "code\game\mecha\components\electrical.dm" +#include "code\game\mecha\components\hull.dm" +#include "code\game\mecha\components\lifesupport.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm" +#include "code\game\mecha\equipment\tools\armor_melee.dm" +#include "code\game\mecha\equipment\tools\armor_ranged.dm" +#include "code\game\mecha\equipment\tools\cable_layer.dm" +#include "code\game\mecha\equipment\tools\catapult.dm" +#include "code\game\mecha\equipment\tools\clamp.dm" +#include "code\game\mecha\equipment\tools\cloak.dm" +#include "code\game\mecha\equipment\tools\drill.dm" +#include "code\game\mecha\equipment\tools\energy_relay.dm" +#include "code\game\mecha\equipment\tools\extinguisher.dm" +#include "code\game\mecha\equipment\tools\generator.dm" +#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" +#include "code\game\mecha\equipment\tools\inflatables.dm" +#include "code\game\mecha\equipment\tools\jetpack.dm" +#include "code\game\mecha\equipment\tools\orescanner.dm" +#include "code\game\mecha\equipment\tools\passenger.dm" +#include "code\game\mecha\equipment\tools\powertool.dm" +#include "code\game\mecha\equipment\tools\rcd.dm" +#include "code\game\mecha\equipment\tools\repair_droid.dm" +#include "code\game\mecha\equipment\tools\running_board.dm" +#include "code\game\mecha\equipment\tools\shield.dm" +#include "code\game\mecha\equipment\tools\shield_omni.dm" +#include "code\game\mecha\equipment\tools\sleeper.dm" +#include "code\game\mecha\equipment\tools\speedboost.dm" +#include "code\game\mecha\equipment\tools\syringe_gun.dm" +#include "code\game\mecha\equipment\tools\teleporter.dm" +#include "code\game\mecha\equipment\tools\tools.dm" +#include "code\game\mecha\equipment\tools\weldinglaser.dm" +#include "code\game\mecha\equipment\tools\wormhole.dm" +#include "code\game\mecha\equipment\weapons\honk.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm" +#include "code\game\mecha\equipment\weapons\ballistic\ballistic.dm" +#include "code\game\mecha\equipment\weapons\ballistic\mortar.dm" +#include "code\game\mecha\equipment\weapons\ballistic\shotgun.dm" +#include "code\game\mecha\equipment\weapons\defense\shocker.dm" +#include "code\game\mecha\equipment\weapons\energy\energy.dm" +#include "code\game\mecha\equipment\weapons\energy\ion.dm" +#include "code\game\mecha\equipment\weapons\energy\laser.dm" +#include "code\game\mecha\equipment\weapons\energy\phased.dm" +#include "code\game\mecha\equipment\weapons\energy\pulse.dm" +#include "code\game\mecha\equipment\weapons\energy\stun.dm" +#include "code\game\mecha\equipment\weapons\explosive\grenade.dm" +#include "code\game\mecha\equipment\weapons\explosive\missile.dm" +#include "code\game\mecha\equipment\weapons\fire\flamethrower.dm" +#include "code\game\mecha\equipment\weapons\fire\incendiary.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\space\hoverpod.dm" +#include "code\game\mecha\space\shuttle.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\banners.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\explosion.dm" +#include "code\game\objects\explosion_recursive.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\weapons.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\effect_system.dm" +#include "code\game\objects\effects\explosion_particles.dm" +#include "code\game\objects\effects\gibs.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\item_pickup_ghost.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\manifest.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\zone_divider.dm" +#include "code\game\objects\effects\alien\aliens.dm" +#include "code\game\objects\effects\chem\chemsmoke.dm" +#include "code\game\objects\effects\chem\coating.dm" +#include "code\game\objects\effects\chem\foam.dm" +#include "code\game\objects\effects\chem\water.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\contraband.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\warning_stripes.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\fuel.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" +#include "code\game\objects\effects\decals\posters\bs12.dm" +#include "code\game\objects\effects\decals\posters\polarisposters.dm" +#include "code\game\objects\effects\map_effects\beam_point.dm" +#include "code\game\objects\effects\map_effects\effect_emitter.dm" +#include "code\game\objects\effects\map_effects\map_effects.dm" +#include "code\game\objects\effects\map_effects\perma_light.dm" +#include "code\game\objects\effects\map_effects\portal.dm" +#include "code\game\objects\effects\map_effects\radiation_emitter.dm" +#include "code\game\objects\effects\map_effects\screen_shaker.dm" +#include "code\game\objects\effects\map_effects\sound_emitter.dm" +#include "code\game\objects\effects\prop\columnblast.dm" +#include "code\game\objects\effects\prop\snake.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\graffiti.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "code\game\objects\items\antag_spawners.dm" +#include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\bells.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\glassjar.dm" +#include "code\game\objects\items\gunbox.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\paintkit.dm" +#include "code\game\objects\items\poi_items.dm" +#include "code\game\objects\items\robobag.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\tailoring.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\trash_material.dm" +#include "code\game\objects\items\uav.dm" +#include "code\game\objects\items\devices\ai_detector.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\binoculars.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\debugger.dm" +#include "code\game\objects\items\devices\defib.dm" +#include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\geiger.dm" +#include "code\game\objects\items\devices\gps.dm" +#include "code\game\objects\items\devices\hacktool.dm" +#include "code\game\objects\items\devices\holowarrant.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\modkit.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\spy_bug.dm" +#include "code\game\objects\items\devices\suit_cooling.dm" +#include "code\game\objects\items\devices\t_scanner.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\text_to_speech.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\translator.dm" +#include "code\game\objects\items\devices\tvcamera.dm" +#include "code\game\objects\items\devices\uplink.dm" +#include "code\game\objects\items\devices\uplink_random_lists.dm" +#include "code\game\objects\items\devices\violin.dm" +#include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\communicator\communicator.dm" +#include "code\game\objects\items\devices\communicator\helper.dm" +#include "code\game\objects\items\devices\communicator\integrated.dm" +#include "code\game\objects\items\devices\communicator\messaging.dm" +#include "code\game\objects\items\devices\communicator\phone.dm" +#include "code\game\objects\items\devices\communicator\UI.dm" +#include "code\game\objects\items\devices\radio\beacon.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\jammer.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\devices\radio\radiopack.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\marker_beacons.dm" +#include "code\game\objects\items\stacks\matter_synth.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\sandbags.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\tickets.dm" +#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\toys\godfigures.dm" +#include "code\game\objects\items\toys\mech_toys.dm" +#include "code\game\objects\items\toys\toys.dm" +#include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\augment_items.dm" +#include "code\game\objects\items\weapons\autopsy.dm" +#include "code\game\objects\items\weapons\bones.dm" +#include "code\game\objects\items\weapons\candle.dm" +#include "code\game\objects\items\weapons\canes.dm" +#include "code\game\objects\items\weapons\chewables.dm" +#include "code\game\objects\items\weapons\cigs_lighters.dm" +#include "code\game\objects\items\weapons\clown_items.dm" +#include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\dna_injector.dm" +#include "code\game\objects\items\weapons\ecigs.dm" +#include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\flamethrower.dm" +#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\improvised_components.dm" +#include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\mop_deploy.dm" +#include "code\game\objects\items\weapons\paint.dm" +#include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\policetape.dm" +#include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RPD.dm" +#include "code\game\objects\items\weapons\RSF.dm" +#include "code\game\objects\items\weapons\scrolls.dm" +#include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\stunbaton.dm" +#include "code\game\objects\items\weapons\surgery_tools.dm" +#include "code\game\objects\items\weapons\swords_axes_etc.dm" +#include "code\game\objects\items\weapons\syndie.dm" +#include "code\game\objects\items\weapons\tape.dm" +#include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\towels.dm" +#include "code\game\objects\items\weapons\traps.dm" +#include "code\game\objects\items\weapons\trays.dm" +#include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\weldbackpack.dm" +#include "code\game\objects\items\weapons\circuitboards\broken.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\frame.dm" +#include "code\game\objects\items\weapons\circuitboards\mecha.dm" +#include "code\game\objects\items\weapons\circuitboards\other.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\fluidpump.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" +#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" +#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\concussion.dm" +#include "code\game\objects\items\weapons\grenades\emgrenade.dm" +#include "code\game\objects\items\weapons\grenades\explosive.dm" +#include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\projectile.dm" +#include "code\game\objects\items\weapons\grenades\smokebomb.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\grenades\supermatter.dm" +#include "code\game\objects\items\weapons\id cards\cards.dm" +#include "code\game\objects\items\weapons\id cards\id_stacks.dm" +#include "code\game\objects\items\weapons\id cards\station_ids.dm" +#include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" +#include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implantaugment.dm" +#include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantchair.dm" +#include "code\game\objects\items\weapons\implants\implantcircuits.dm" +#include "code\game\objects\items\weapons\implants\implantdud.dm" +#include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implantfreedom.dm" +#include "code\game\objects\items\weapons\implants\implantlanguage.dm" +#include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" +#include "code\game\objects\items\weapons\implants\neuralbasic.dm" +#include "code\game\objects\items\weapons\material\ashtray.dm" +#include "code\game\objects\items\weapons\material\bats.dm" +#include "code\game\objects\items\weapons\material\chainsaw.dm" +#include "code\game\objects\items\weapons\material\foam.dm" +#include "code\game\objects\items\weapons\material\gravemarker.dm" +#include "code\game\objects\items\weapons\material\kitchen.dm" +#include "code\game\objects\items\weapons\material\knives.dm" +#include "code\game\objects\items\weapons\material\material_armor.dm" +#include "code\game\objects\items\weapons\material\material_weapons.dm" +#include "code\game\objects\items\weapons\material\misc.dm" +#include "code\game\objects\items\weapons\material\shards.dm" +#include "code\game\objects\items\weapons\material\swords.dm" +#include "code\game\objects\items\weapons\material\thrown.dm" +#include "code\game\objects\items\weapons\material\twohanded.dm" +#include "code\game\objects\items\weapons\material\whetstone.dm" +#include "code\game\objects\items\weapons\melee\deflect.dm" +#include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\bible.dm" +#include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\fancy.dm" +#include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\laundry_basket.dm" +#include "code\game\objects\items\weapons\storage\lockbox.dm" +#include "code\game\objects\items\weapons\storage\misc.dm" +#include "code\game\objects\items\weapons\storage\mre.dm" +#include "code\game\objects\items\weapons\storage\quickdraw.dm" +#include "code\game\objects\items\weapons\storage\secure.dm" +#include "code\game\objects\items\weapons\storage\storage.dm" +#include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\uplink_kits.dm" +#include "code\game\objects\items\weapons\storage\wallets.dm" +#include "code\game\objects\items\weapons\tanks\jetpack.dm" +#include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\items\weapons\tools\crowbar.dm" +#include "code\game\objects\items\weapons\tools\screwdriver.dm" +#include "code\game\objects\items\weapons\tools\weldingtool.dm" +#include "code\game\objects\items\weapons\tools\wirecutters.dm" +#include "code\game\objects\items\weapons\tools\wrench.dm" +#include "code\game\objects\random\_random.dm" +#include "code\game\objects\random\guns_and_ammo.dm" +#include "code\game\objects\random\maintenance.dm" +#include "code\game\objects\random\mapping.dm" +#include "code\game\objects\random\mechs.dm" +#include "code\game\objects\random\misc.dm" +#include "code\game\objects\random\mob.dm" +#include "code\game\objects\random\spacesuits.dm" +#include "code\game\objects\random\unidentified\medicine.dm" +#include "code\game\objects\structures\barricades.dm" +#include "code\game\objects\structures\barsign.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\bonfire.dm" +#include "code\game\objects\structures\catwalk.dm" +#include "code\game\objects\structures\cliff.dm" +#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\dogbed.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fence.dm" +#include "code\game\objects\structures\fireaxe.dm" +#include "code\game\objects\structures\fitness.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\gravemarker.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\handrail.dm" +#include "code\game\objects\structures\holoplant.dm" +#include "code\game\objects\structures\inflatable.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\ledges.dm" +#include "code\game\objects\structures\lightpost.dm" +#include "code\game\objects\structures\loot_piles.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\railing.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\salvageable.dm" +#include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\simple_doors.dm" +#include "code\game\objects\structures\snowman.dm" +#include "code\game\objects\structures\stasis_cage.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\transit_tubes.dm" +#include "code\game\objects\structures\under_wardrobe.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\crates_lockers\__closets.dm" +#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\vehiclecage.dm" +#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" +#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\flora\flora.dm" +#include "code\game\objects\structures\flora\grass.dm" +#include "code\game\objects\structures\flora\trees.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" +#include "code\game\objects\structures\ghost_pods\human.dm" +#include "code\game\objects\structures\ghost_pods\mysterious.dm" +#include "code\game\objects\structures\ghost_pods\silicon.dm" +#include "code\game\objects\structures\props\alien_props.dm" +#include "code\game\objects\structures\props\beam_prism.dm" +#include "code\game\objects\structures\props\blackbox.dm" +#include "code\game\objects\structures\props\fake_ai.dm" +#include "code\game\objects\structures\props\nest.dm" +#include "code\game\objects\structures\props\projectile_lock.dm" +#include "code\game\objects\structures\props\prop.dm" +#include "code\game\objects\structures\props\puzzledoor.dm" +#include "code\game\objects\structures\props\rocks.dm" +#include "code\game\objects\structures\props\swarm.dm" +#include "code\game\objects\structures\props\transmitter.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" +#include "code\game\turfs\simulated.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\turf_changing.dm" +#include "code\game\turfs\turf_flick_animations.dm" +#include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\flooring\flooring.dm" +#include "code\game\turfs\flooring\flooring_decals.dm" +#include "code\game\turfs\flooring\flooring_premade.dm" +#include "code\game\turfs\initialization\init.dm" +#include "code\game\turfs\initialization\maintenance.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\floor_acts.dm" +#include "code\game\turfs\simulated\floor_attackby.dm" +#include "code\game\turfs\simulated\floor_damage.dm" +#include "code\game\turfs\simulated\floor_icon.dm" +#include "code\game\turfs\simulated\floor_static.dm" +#include "code\game\turfs\simulated\floor_types.dm" +#include "code\game\turfs\simulated\floor_types_eris.dm" +#include "code\game\turfs\simulated\lava.dm" +#include "code\game\turfs\simulated\wall_attacks.dm" +#include "code\game\turfs\simulated\wall_icon.dm" +#include "code\game\turfs\simulated\wall_types.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\dungeon\floor.dm" +#include "code\game\turfs\simulated\dungeon\wall.dm" +#include "code\game\turfs\simulated\outdoors\dirt.dm" +#include "code\game\turfs\simulated\outdoors\grass.dm" +#include "code\game\turfs\simulated\outdoors\outdoors.dm" +#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" +#include "code\game\turfs\simulated\outdoors\sky.dm" +#include "code\game\turfs\simulated\outdoors\snow.dm" +#include "code\game\turfs\snow\snow.dm" +#include "code\game\turfs\space\cracked_asteroid.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\floor.dm" +#include "code\game\turfs\unsimulated\planetary.dm" +#include "code\game\turfs\unsimulated\shuttle.dm" +#include "code\game\turfs\unsimulated\walls.dm" +#include "code\game\verbs\suicide.dm" +#include "code\js\byjax.dm" +#include "code\js\menus.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_attack_log.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_memo.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_secrets.dm" +#include "code\modules\admin\admin_tools.dm" +#include "code\modules\admin\admin_verb_lists.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\map_capture.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\news.dm" +#include "code\modules\admin\persistence.dm" +#include "code\modules\admin\player_notes.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\callproc\callproc.dm" +#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" +#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" +#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" +#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" +#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" +#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" +#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" +#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" +#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" +#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" +#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" +#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" +#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" +#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" +#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" +#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\only_one.dm" +#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" +#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm" +#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" +#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" +#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" +#include "code\modules\admin\secrets\random_events\gravity.dm" +#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" +#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\antag-ooc.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\buildmode.dm" +#include "code\modules\admin\verbs\change_appearance.dm" +#include "code\modules\admin\verbs\check_customitem_activity.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\custom_event.dm" +#include "code\modules\admin\verbs\dbcon_fix.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\fps.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\grief_fixers.dm" +#include "code\modules\admin\verbs\lightning_strike.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\panicbunker.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\smite.dm" +#include "code\modules\admin\verbs\striketeam.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\admin\view_variables\admin_delete.dm" +#include "code\modules\admin\view_variables\debug_variables.dm" +#include "code\modules\admin\view_variables\get_variables.dm" +#include "code\modules\admin\view_variables\helpers.dm" +#include "code\modules\admin\view_variables\mass_edit_variables.dm" +#include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\topic_list.dm" +#include "code\modules\admin\view_variables\view_variables.dm" +#include "code\modules\admin\view_variables\view_variables_global.dm" +#include "code\modules\ai\_defines.dm" +#include "code\modules\ai\ai_holder.dm" +#include "code\modules\ai\ai_holder_combat.dm" +#include "code\modules\ai\ai_holder_combat_unseen.dm" +#include "code\modules\ai\ai_holder_communication.dm" +#include "code\modules\ai\ai_holder_cooperation.dm" +#include "code\modules\ai\ai_holder_debug.dm" +#include "code\modules\ai\ai_holder_disabled.dm" +#include "code\modules\ai\ai_holder_fleeing.dm" +#include "code\modules\ai\ai_holder_follow.dm" +#include "code\modules\ai\ai_holder_movement.dm" +#include "code\modules\ai\ai_holder_pathfinding.dm" +#include "code\modules\ai\ai_holder_targeting.dm" +#include "code\modules\ai\interfaces.dm" +#include "code\modules\ai\say_list.dm" +#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai.dm" +#include "code\modules\ai\aI_holder_subtypes\slime_xenobio_ai.dm" +#include "code\modules\alarm\alarm.dm" +#include "code\modules\alarm\alarm_handler.dm" +#include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\camera_alarm.dm" +#include "code\modules\alarm\fire_alarm.dm" +#include "code\modules\alarm\motion_alarm.dm" +#include "code\modules\alarm\power_alarm.dm" +#include "code\modules\artifice\cursedform.dm" +#include "code\modules\artifice\deadringer.dm" +#include "code\modules\artifice\telecube.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\asset_cache\asset_cache.dm" +#include "code\modules\asset_cache\asset_cache_client.dm" +#include "code\modules\asset_cache\asset_cache_item.dm" +#include "code\modules\asset_cache\asset_list.dm" +#include "code\modules\asset_cache\asset_list_items.dm" +#include "code\modules\awaymissions\bluespaceartillery.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\trigger.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\blob2\_defines.dm" +#include "code\modules\blob2\core_chunk.dm" +#include "code\modules\blob2\blobs\base_blob.dm" +#include "code\modules\blob2\blobs\core.dm" +#include "code\modules\blob2\blobs\factory.dm" +#include "code\modules\blob2\blobs\node.dm" +#include "code\modules\blob2\blobs\normal.dm" +#include "code\modules\blob2\blobs\resource.dm" +#include "code\modules\blob2\blobs\shield.dm" +#include "code\modules\blob2\overmind\overmind.dm" +#include "code\modules\blob2\overmind\powers.dm" +#include "code\modules\blob2\overmind\types.dm" +#include "code\modules\blob2\overmind\types\blazing_oil.dm" +#include "code\modules\blob2\overmind\types\classic.dm" +#include "code\modules\blob2\overmind\types\cryogenic_goo.dm" +#include "code\modules\blob2\overmind\types\ectoplasmic_horror.dm" +#include "code\modules\blob2\overmind\types\electromagnetic_web.dm" +#include "code\modules\blob2\overmind\types\energized_jelly.dm" +#include "code\modules\blob2\overmind\types\explosive_lattice.dm" +#include "code\modules\blob2\overmind\types\fabrication_swarm.dm" +#include "code\modules\blob2\overmind\types\fulminant_organism.dm" +#include "code\modules\blob2\overmind\types\fungal_bloom.dm" +#include "code\modules\blob2\overmind\types\grey_goo.dm" +#include "code\modules\blob2\overmind\types\pressurized_slime.dm" +#include "code\modules\blob2\overmind\types\radioactive_ooze.dm" +#include "code\modules\blob2\overmind\types\ravenous_macrophage.dm" +#include "code\modules\blob2\overmind\types\reactive_spines.dm" +#include "code\modules\blob2\overmind\types\roiling_mold.dm" +#include "code\modules\blob2\overmind\types\shifting_fragments.dm" +#include "code\modules\blob2\overmind\types\synchronous_mesh.dm" +#include "code\modules\blob2\overmind\types\volatile_alluvium.dm" +#include "code\modules\busy_space\air_traffic.dm" +#include "code\modules\busy_space\loremaster.dm" +#include "code\modules\busy_space\organizations.dm" +#include "code\modules\catalogue\atoms.dm" +#include "code\modules\catalogue\catalogue_data.dm" +#include "code\modules\catalogue\cataloguer.dm" +#include "code\modules\catalogue\cataloguer_visuals.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" +#include "code\modules\client\movement.dm" +#include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_factions.dm" +#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_spawnpoints.dm" +#include "code\modules\client\preferences_toggle_procs.dm" +#include "code\modules\client\spam_prevention.dm" +#include "code\modules\client\ui_style.dm" +#include "code\modules\client\preference_setup\_defines.dm" +#include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\antagonism\01_basic.dm" +#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" +#include "code\modules\client\preference_setup\general\01_basic.dm" +#include "code\modules\client\preference_setup\general\02_language.dm" +#include "code\modules\client\preference_setup\general\03_body.dm" +#include "code\modules\client\preference_setup\general\04_equipment.dm" +#include "code\modules\client\preference_setup\general\05_background.dm" +#include "code\modules\client\preference_setup\general\06_flavor.dm" +#include "code\modules\client\preference_setup\global\01_ui.dm" +#include "code\modules\client\preference_setup\global\02_settings.dm" +#include "code\modules\client\preference_setup\global\03_pai.dm" +#include "code\modules\client\preference_setup\global\setting_datums.dm" +#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" +#include "code\modules\client\preference_setup\loadout\loadout.dm" +#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" +#include "code\modules\client\preference_setup\loadout\loadout_ears.dm" +#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general.dm" +#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" +#include "code\modules\client\preference_setup\loadout\loadout_head.dm" +#include "code\modules\client\preference_setup\loadout\loadout_mask.dm" +#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" +#include "code\modules\client\preference_setup\loadout\loadout_suit.dm" +#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" +#include "code\modules\client\preference_setup\loadout\loadout_utility.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" +#include "code\modules\client\preference_setup\occupation\occupation.dm" +#include "code\modules\client\preference_setup\skills\skills.dm" +#include "code\modules\client\preference_setup\traits\trait_defines.dm" +#include "code\modules\client\preference_setup\traits\traits.dm" +#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" +#include "code\modules\client\verbs\advanced_who.dm" +#include "code\modules\client\verbs\ignore.dm" +#include "code\modules\client\verbs\ooc.dm" +#include "code\modules\client\verbs\ping.dm" +#include "code\modules\client\verbs\who.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\clothing_accessories.dm" +#include "code\modules\clothing\clothing_icons.dm" +#include "code\modules\clothing\ears\earrings.dm" +#include "code\modules\clothing\ears\ears.dm" +#include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\gloves\antagonist.dm" +#include "code\modules\clothing\gloves\arm_guards.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\gauntlets.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\flowercrowns.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\hood.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\pilot_helmet.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\solgov.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\hailer.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\voice.dm" +#include "code\modules\clothing\rings\material.dm" +#include "code\modules\clothing\rings\rings.dm" +#include "code\modules\clothing\shoes\boots.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\leg_guards.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\alien.dm" +#include "code\modules\clothing\spacesuits\breaches.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\spacesuits.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\rig\rig.dm" +#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" +#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" +#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" +#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" +#include "code\modules\clothing\spacesuits\rig\suits\light.dm" +#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\spacesuits\void\event.dm" +#include "code\modules\clothing\spacesuits\void\merc.dm" +#include "code\modules\clothing\spacesuits\void\station.dm" +#include "code\modules\clothing\spacesuits\void\void.dm" +#include "code\modules\clothing\spacesuits\void\wizard.dm" +#include "code\modules\clothing\spacesuits\void\zaddat.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\hooded.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\solgov.dm" +#include "code\modules\clothing\suits\storage.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\suits\aliens\tajara.dm" +#include "code\modules\clothing\suits\aliens\teshari.dm" +#include "code\modules\clothing\suits\aliens\unathi.dm" +#include "code\modules\clothing\suits\aliens\vox.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\solgov.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\armor.dm" +#include "code\modules\clothing\under\accessories\badges.dm" +#include "code\modules\clothing\under\accessories\clothing.dm" +#include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\lockets.dm" +#include "code\modules\clothing\under\accessories\permits.dm" +#include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\accessories\torch.dm" +#include "code\modules\clothing\under\accessories\temperature\poncho.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\xenos\teshari.dm" +#include "code\modules\clothing\under\xenos\vox.dm" +#include "code\modules\compass\^compass.dm" +#include "code\modules\compass\_compass.dm" +#include "code\modules\compass\compass_holder.dm" +#include "code\modules\compass\compass_waypoint.dm" +#include "code\modules\customitems\item_spawning.dm" +#include "code\modules\detectivework\footprints.dm" +#include "code\modules\detectivework\forensics.dm" +#include "code\modules\detectivework\microscope\dnascanner.dm" +#include "code\modules\detectivework\microscope\microscope.dm" +#include "code\modules\detectivework\tools\crimekit.dm" +#include "code\modules\detectivework\tools\evidencebag.dm" +#include "code\modules\detectivework\tools\luminol.dm" +#include "code\modules\detectivework\tools\rag.dm" +#include "code\modules\detectivework\tools\sample_kits.dm" +#include "code\modules\detectivework\tools\scanner.dm" +#include "code\modules\detectivework\tools\storage.dm" +#include "code\modules\detectivework\tools\swabs.dm" +#include "code\modules\detectivework\tools\uvlight.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\cash.dm" +#include "code\modules\economy\cash_register.dm" +#include "code\modules\economy\coins.dm" +#include "code\modules\economy\economy_misc.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Events.dm" +#include "code\modules\economy\Events_Mundane.dm" +#include "code\modules\economy\lorenews.dm" +#include "code\modules\economy\mint.dm" +#include "code\modules\economy\money_bag.dm" +#include "code\modules\economy\price_list.dm" +#include "code\modules\economy\retail_scanner.dm" +#include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\economy\vending.dm" +#include "code\modules\economy\vending_machines.dm" +#include "code\modules\emotes\emote_define.dm" +#include "code\modules\emotes\emote_mob.dm" +#include "code\modules\emotes\definitions\_mob.dm" +#include "code\modules\emotes\definitions\_species.dm" +#include "code\modules\emotes\definitions\audible.dm" +#include "code\modules\emotes\definitions\audible_cough.dm" +#include "code\modules\emotes\definitions\audible_scream.dm" +#include "code\modules\emotes\definitions\audible_slap.dm" +#include "code\modules\emotes\definitions\audible_snap.dm" +#include "code\modules\emotes\definitions\audible_sneeze.dm" +#include "code\modules\emotes\definitions\audible_whistle.dm" +#include "code\modules\emotes\definitions\exertion.dm" +#include "code\modules\emotes\definitions\human.dm" +#include "code\modules\emotes\definitions\slimes.dm" +#include "code\modules\emotes\definitions\synthetics.dm" +#include "code\modules\emotes\definitions\visible.dm" +#include "code\modules\emotes\definitions\visible_animated.dm" +#include "code\modules\emotes\definitions\visible_vomit.dm" +#include "code\modules\error_handler\_defines.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\error_handler\~defines.dm" +#include "code\modules\events\apc_damage.dm" +#include "code\modules\events\atmos_leak.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\camera_damage.dm" +#include "code\modules\events\canister_leak.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\comms_blackout.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\event.dm" +#include "code\modules\events\event_container.dm" +#include "code\modules\events\event_dynamic.dm" +#include "code\modules\events\event_manager.dm" +#include "code\modules\events\gravity.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\infestation.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\money_hacker.dm" +#include "code\modules\events\money_lotto.dm" +#include "code\modules\events\money_spam.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\random_antagonist.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\shipping_error.dm" +#include "code\modules\events\solar_storm.dm" +#include "code\modules\events\space_ninja.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\wallrot.dm" +#include "code\modules\examine\examine.dm" +#include "code\modules\examine\stat_icons.dm" +#include "code\modules\examine\descriptions\armor.dm" +#include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\containers.dm" +#include "code\modules\examine\descriptions\devices.dm" +#include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\machines.dm" +#include "code\modules\examine\descriptions\medical.dm" +#include "code\modules\examine\descriptions\mobs.dm" +#include "code\modules\examine\descriptions\paperwork.dm" +#include "code\modules\examine\descriptions\stacks.dm" +#include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\telecomms.dm" +#include "code\modules\examine\descriptions\turfs.dm" +#include "code\modules\examine\descriptions\weapons.dm" +#include "code\modules\ext_scripts\irc.dm" +#include "code\modules\ext_scripts\python.dm" +#include "code\modules\fishing\fishing.dm" +#include "code\modules\fishing\fishing_net.dm" +#include "code\modules\fishing\fishing_rod.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\flufftext\look_up.dm" +#include "code\modules\flufftext\TextFilters.dm" +#include "code\modules\food\food.dm" +#include "code\modules\food\recipe.dm" +#include "code\modules\food\recipe_dump.dm" +#include "code\modules\food\recipes_fryer.dm" +#include "code\modules\food\recipes_grill.dm" +#include "code\modules\food\recipes_microwave.dm" +#include "code\modules\food\recipes_oven.dm" +#include "code\modules\food\drinkingglass\drinkingglass.dm" +#include "code\modules\food\drinkingglass\extras.dm" +#include "code\modules\food\drinkingglass\glass_boxes.dm" +#include "code\modules\food\drinkingglass\glass_types.dm" +#include "code\modules\food\drinkingglass\metaglass.dm" +#include "code\modules\food\drinkingglass\shaker.dm" +#include "code\modules\food\food\cans.dm" +#include "code\modules\food\food\condiment.dm" +#include "code\modules\food\food\drinks.dm" +#include "code\modules\food\food\lunch.dm" +#include "code\modules\food\food\sandwich.dm" +#include "code\modules\food\food\snacks.dm" +#include "code\modules\food\food\thecake.dm" +#include "code\modules\food\food\drinks\bottle.dm" +#include "code\modules\food\food\drinks\cup.dm" +#include "code\modules\food\food\drinks\drinkingglass.dm" +#include "code\modules\food\food\drinks\jar.dm" +#include "code\modules\food\food\drinks\bottle\robot.dm" +#include "code\modules\food\food\snacks\meat.dm" +#include "code\modules\food\glass\bottle.dm" +#include "code\modules\food\glass\bottle\robot.dm" +#include "code\modules\food\kitchen\gibber.dm" +#include "code\modules\food\kitchen\icecream.dm" +#include "code\modules\food\kitchen\microwave.dm" +#include "code\modules\food\kitchen\cooking_machines\_appliance.dm" +#include "code\modules\food\kitchen\cooking_machines\_cooker.dm" +#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm" +#include "code\modules\food\kitchen\cooking_machines\_mixer.dm" +#include "code\modules\food\kitchen\cooking_machines\candy.dm" +#include "code\modules\food\kitchen\cooking_machines\cereal.dm" +#include "code\modules\food\kitchen\cooking_machines\container.dm" +#include "code\modules\food\kitchen\cooking_machines\fryer.dm" +#include "code\modules\food\kitchen\cooking_machines\grill.dm" +#include "code\modules\food\kitchen\cooking_machines\oven.dm" +#include "code\modules\food\kitchen\smartfridge\drying_rack.dm" +#include "code\modules\food\kitchen\smartfridge\engineering.dm" +#include "code\modules\food\kitchen\smartfridge\hydroponics.dm" +#include "code\modules\food\kitchen\smartfridge\medical.dm" +#include "code\modules\food\kitchen\smartfridge\smartfridge.dm" +#include "code\modules\gamemaster\defines.dm" +#include "code\modules\gamemaster\event2\event.dm" +#include "code\modules\gamemaster\event2\meta.dm" +#include "code\modules\gamemaster\event2\events\ghost_pod_spawner.dm" +#include "code\modules\gamemaster\event2\events\mob_spawning.dm" +#include "code\modules\gamemaster\event2\events\cargo\shipping_error.dm" +#include "code\modules\gamemaster\event2\events\command\manifest_malfunction.dm" +#include "code\modules\gamemaster\event2\events\command\money_hacker.dm" +#include "code\modules\gamemaster\event2\events\command\raise_funds.dm" +#include "code\modules\gamemaster\event2\events\engineering\airlock_failure.dm" +#include "code\modules\gamemaster\event2\events\engineering\blob.dm" +#include "code\modules\gamemaster\event2\events\engineering\brand_intelligence.dm" +#include "code\modules\gamemaster\event2\events\engineering\camera_damage.dm" +#include "code\modules\gamemaster\event2\events\engineering\canister_leak.dm" +#include "code\modules\gamemaster\event2\events\engineering\dust.dm" +#include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" +#include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" +#include "code\modules\gamemaster\event2\events\engineering\meteor_defense.dm" +#include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" +#include "code\modules\gamemaster\event2\events\engineering\wallrot.dm" +#include "code\modules\gamemaster\event2\events\engineering\window_break.dm" +#include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" +#include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" +#include "code\modules\gamemaster\event2\events\everyone\gravity.dm" +#include "code\modules\gamemaster\event2\events\everyone\infestation.dm" +#include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" +#include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" +#include "code\modules\gamemaster\event2\events\everyone\random_antag.dm" +#include "code\modules\gamemaster\event2\events\everyone\solar_storm.dm" +#include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" +#include "code\modules\gamemaster\event2\events\legacy\legacy.dm" +#include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" +#include "code\modules\gamemaster\event2\events\medical\virus.dm" +#include "code\modules\gamemaster\event2\events\security\carp_migration.dm" +#include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" +#include "code\modules\gamemaster\event2\events\security\prison_break.dm" +#include "code\modules\gamemaster\event2\events\security\rogue_drones.dm" +#include "code\modules\gamemaster\event2\events\security\security_advisement.dm" +#include "code\modules\gamemaster\event2\events\security\spider_infestation.dm" +#include "code\modules\gamemaster\event2\events\security\stowaway.dm" +#include "code\modules\gamemaster\event2\events\security\surprise_carp.dm" +#include "code\modules\gamemaster\event2\events\security\swarm_boarder.dm" +#include "code\modules\gamemaster\event2\events\synthetic\ion_storm.dm" +#include "code\modules\games\cah.dm" +#include "code\modules\games\cah_black_cards.dm" +#include "code\modules\games\cah_white_cards.dm" +#include "code\modules\games\cardemon.dm" +#include "code\modules\games\cards.dm" +#include "code\modules\games\dice.dm" +#include "code\modules\games\spaceball_cards.dm" +#include "code\modules\games\tarot.dm" +#include "code\modules\genetics\side_effects.dm" +#include "code\modules\ghosttrap\trap.dm" +#include "code\modules\holodeck\HolodeckControl.dm" +#include "code\modules\holodeck\HolodeckObjects.dm" +#include "code\modules\holodeck\HolodeckPrograms.dm" +#include "code\modules\holomap\generate_holomap.dm" +#include "code\modules\holomap\holomap_area.dm" +#include "code\modules\holomap\holomap_datum.dm" +#include "code\modules\holomap\mapper.dm" +#include "code\modules\holomap\station_holomap.dm" +#include "code\modules\hydroponics\_hydro_setup.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\grown_inedible.dm" +#include "code\modules\hydroponics\grown_predefined.dm" +#include "code\modules\hydroponics\seed.dm" +#include "code\modules\hydroponics\seed_controller.dm" +#include "code\modules\hydroponics\seed_gene_mut.dm" +#include "code\modules\hydroponics\seed_machines.dm" +#include "code\modules\hydroponics\seed_mobs.dm" +#include "code\modules\hydroponics\seed_packets.dm" +#include "code\modules\hydroponics\seed_storage.dm" +#include "code\modules\hydroponics\beekeeping\beehive.dm" +#include "code\modules\hydroponics\seedtypes\amauri.dm" +#include "code\modules\hydroponics\seedtypes\ambrosia.dm" +#include "code\modules\hydroponics\seedtypes\apples.dm" +#include "code\modules\hydroponics\seedtypes\banana.dm" +#include "code\modules\hydroponics\seedtypes\berries.dm" +#include "code\modules\hydroponics\seedtypes\cabbage.dm" +#include "code\modules\hydroponics\seedtypes\carrots.dm" +#include "code\modules\hydroponics\seedtypes\celery.dm" +#include "code\modules\hydroponics\seedtypes\cherries.dm" +#include "code\modules\hydroponics\seedtypes\chili.dm" +#include "code\modules\hydroponics\seedtypes\citrus.dm" +#include "code\modules\hydroponics\seedtypes\cocoa.dm" +#include "code\modules\hydroponics\seedtypes\corn.dm" +#include "code\modules\hydroponics\seedtypes\diona.dm" +#include "code\modules\hydroponics\seedtypes\durian.dm" +#include "code\modules\hydroponics\seedtypes\eggplant.dm" +#include "code\modules\hydroponics\seedtypes\flowers.dm" +#include "code\modules\hydroponics\seedtypes\gelthi.dm" +#include "code\modules\hydroponics\seedtypes\gnomes.dm" +#include "code\modules\hydroponics\seedtypes\grapes.dm" +#include "code\modules\hydroponics\seedtypes\grass.dm" +#include "code\modules\hydroponics\seedtypes\jurlmah.dm" +#include "code\modules\hydroponics\seedtypes\kudzu.dm" +#include "code\modules\hydroponics\seedtypes\lettuce.dm" +#include "code\modules\hydroponics\seedtypes\malanitear.dm" +#include "code\modules\hydroponics\seedtypes\mushrooms.dm" +#include "code\modules\hydroponics\seedtypes\nettles.dm" +#include "code\modules\hydroponics\seedtypes\onion.dm" +#include "code\modules\hydroponics\seedtypes\peanuts.dm" +#include "code\modules\hydroponics\seedtypes\pineapple.dm" +#include "code\modules\hydroponics\seedtypes\potato.dm" +#include "code\modules\hydroponics\seedtypes\pumpkin.dm" +#include "code\modules\hydroponics\seedtypes\rhubarb.dm" +#include "code\modules\hydroponics\seedtypes\rice.dm" +#include "code\modules\hydroponics\seedtypes\selemhand.dm" +#include "code\modules\hydroponics\seedtypes\soybean.dm" +#include "code\modules\hydroponics\seedtypes\sugarcane.dm" +#include "code\modules\hydroponics\seedtypes\surik.dm" +#include "code\modules\hydroponics\seedtypes\telriis.dm" +#include "code\modules\hydroponics\seedtypes\thaadra.dm" +#include "code\modules\hydroponics\seedtypes\tobacco.dm" +#include "code\modules\hydroponics\seedtypes\tomatoes.dm" +#include "code\modules\hydroponics\seedtypes\vale.dm" +#include "code\modules\hydroponics\seedtypes\vanilla.dm" +#include "code\modules\hydroponics\seedtypes\wabback.dm" +#include "code\modules\hydroponics\seedtypes\watermelon.dm" +#include "code\modules\hydroponics\seedtypes\weeds.dm" +#include "code\modules\hydroponics\seedtypes\wheat.dm" +#include "code\modules\hydroponics\seedtypes\whitebeets.dm" +#include "code\modules\hydroponics\seedtypes\wurmwoad.dm" +#include "code\modules\hydroponics\seedtypes\xeno.dm" +#include "code\modules\hydroponics\spreading\spreading.dm" +#include "code\modules\hydroponics\spreading\spreading_growth.dm" +#include "code\modules\hydroponics\spreading\spreading_response.dm" +#include "code\modules\hydroponics\trays\tray.dm" +#include "code\modules\hydroponics\trays\tray_process.dm" +#include "code\modules\hydroponics\trays\tray_reagents.dm" +#include "code\modules\hydroponics\trays\tray_soil.dm" +#include "code\modules\hydroponics\trays\tray_tools.dm" +#include "code\modules\hydroponics\trays\tray_update_icons.dm" +#include "code\modules\identification\identification.dm" +#include "code\modules\identification\item_procs.dm" +#include "code\modules\integrated_electronics\_defines.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\detailer.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\printer.dm" +#include "code\modules\integrated_electronics\core\tools.dm" +#include "code\modules\integrated_electronics\core\assemblies\clothing.dm" +#include "code\modules\integrated_electronics\core\assemblies\device.dm" +#include "code\modules\integrated_electronics\core\assemblies\generic.dm" +#include "code\modules\integrated_electronics\core\assemblies\implant.dm" +#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\built_in.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input.dm" +#include "code\modules\integrated_electronics\subtypes\lists.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\output.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\lib_readme.dm" +#include "code\modules\library\hardcode_library\_library.dm" +#include "code\modules\library\hardcode_library\fiction\APsychonaut.dm" +#include "code\modules\library\hardcode_library\fiction\battlefieldcommander.dm" +#include "code\modules\library\hardcode_library\fiction\PortedBooks.dm" +#include "code\modules\library\hardcode_library\fiction\schnayy.dm" +#include "code\modules\library\hardcode_library\non-fiction\PortedBooks.dm" +#include "code\modules\library\hardcode_library\reference\PortedBooks.dm" +#include "code\modules\library\hardcode_library\reference\Schnayy.dm" +#include "code\modules\library\hardcode_library\religious\PortedBooks.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_overlay.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\looking_glass\lg_area.dm" +#include "code\modules\looking_glass\lg_console.dm" +#include "code\modules\looking_glass\lg_imageholder.dm" +#include "code\modules\looking_glass\lg_turfs.dm" +#include "code\modules\lore_codex\codex.dm" +#include "code\modules\lore_codex\codex_tree.dm" +#include "code\modules\lore_codex\pages.dm" +#include "code\modules\lore_codex\legal_code_data\corporate_regulations.dm" +#include "code\modules\lore_codex\legal_code_data\main.dm" +#include "code\modules\lore_codex\legal_code_data\sif_law.dm" +#include "code\modules\lore_codex\legal_code_data\sop.dm" +#include "code\modules\lore_codex\lore_data\important_locations.dm" +#include "code\modules\lore_codex\lore_data\main.dm" +#include "code\modules\lore_codex\lore_data\orgs.dm" +#include "code\modules\lore_codex\lore_data\political_parties.dm" +#include "code\modules\lore_codex\lore_data\species.dm" +#include "code\modules\lore_codex\news_data\main.dm" +#include "code\modules\lore_codex\robutt_data\bybrand.dm" +#include "code\modules\lore_codex\robutt_data\main_robutts.dm" +#include "code\modules\lore_codex\robutt_data\more.dm" +#include "code\modules\maps\tg\dmm_suite.dm" +#include "code\modules\maps\tg\map_template.dm" +#include "code\modules\maps\tg\reader.dm" +#include "code\modules\materials\fifty_spawner.dm" +#include "code\modules\materials\fifty_spawner_mats.dm" +#include "code\modules\materials\material_synth.dm" +#include "code\modules\materials\materials\_materials.dm" +#include "code\modules\materials\materials\alien_alloy.dm" +#include "code\modules\materials\materials\cult.dm" +#include "code\modules\materials\materials\gems.dm" +#include "code\modules\materials\materials\glass.dm" +#include "code\modules\materials\materials\holographic.dm" +#include "code\modules\materials\materials\plastic.dm" +#include "code\modules\materials\materials\snow.dm" +#include "code\modules\materials\materials\stone.dm" +#include "code\modules\materials\materials\supermatter.dm" +#include "code\modules\materials\materials\metals\hull.dm" +#include "code\modules\materials\materials\metals\metals.dm" +#include "code\modules\materials\materials\metals\plasteel.dm" +#include "code\modules\materials\materials\metals\steel.dm" +#include "code\modules\materials\materials\organic\animal_products.dm" +#include "code\modules\materials\materials\organic\cloth.dm" +#include "code\modules\materials\materials\organic\leather.dm" +#include "code\modules\materials\materials\organic\resin.dm" +#include "code\modules\materials\materials\organic\wood.dm" +#include "code\modules\materials\sheets\_sheets.dm" +#include "code\modules\materials\sheets\gems.dm" +#include "code\modules\materials\sheets\glass.dm" +#include "code\modules\materials\sheets\plastic.dm" +#include "code\modules\materials\sheets\snow.dm" +#include "code\modules\materials\sheets\stone.dm" +#include "code\modules\materials\sheets\supermatter.dm" +#include "code\modules\materials\sheets\metals\hull.dm" +#include "code\modules\materials\sheets\metals\metal.dm" +#include "code\modules\materials\sheets\metals\rods.dm" +#include "code\modules\materials\sheets\organic\animal_products.dm" +#include "code\modules\materials\sheets\organic\resin.dm" +#include "code\modules\materials\sheets\organic\textiles.dm" +#include "code\modules\materials\sheets\organic\wood.dm" +#include "code\modules\materials\sheets\organic\tanning\hide.dm" +#include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" +#include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" +#include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" +#include "code\modules\metric\activity.dm" +#include "code\modules\metric\count.dm" +#include "code\modules\metric\department.dm" +#include "code\modules\metric\metric.dm" +#include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\alloys.dm" +#include "code\modules\mining\fulton.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\mine_outcrops.dm" +#include "code\modules\mining\mine_turfs.dm" +#include "code\modules\mining\mineral_effect.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\ore_box.dm" +#include "code\modules\mining\ore_datum.dm" +#include "code\modules\mining\drilling\drill.dm" +#include "code\modules\mining\drilling\scanner.dm" +#include "code\modules\mining\machinery\machine_input_output_plates.dm" +#include "code\modules\mining\machinery\machine_processing.dm" +#include "code\modules\mining\machinery\machine_stacking.dm" +#include "code\modules\mining\machinery\machine_unloading.dm" +#include "code\modules\mining\ore_redemption_machine\construction.dm" +#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm" +#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm" +#include "code\modules\mining\ore_redemption_machine\survey_vendor.dm" +#include "code\modules\mob\animations.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\gender.dm" +#include "code\modules\mob\hear_say.dm" +#include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_grab.dm" +#include "code\modules\mob\mob_grab_specials.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_planes.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\skillset.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\_modifiers\aura.dm" +#include "code\modules\mob\_modifiers\changeling.dm" +#include "code\modules\mob\_modifiers\cloning.dm" +#include "code\modules\mob\_modifiers\feysight.dm" +#include "code\modules\mob\_modifiers\fire.dm" +#include "code\modules\mob\_modifiers\medical.dm" +#include "code\modules\mob\_modifiers\modifiers.dm" +#include "code\modules\mob\_modifiers\modifiers_misc.dm" +#include "code\modules\mob\_modifiers\traits.dm" +#include "code\modules\mob\_modifiers\traits_phobias.dm" +#include "code\modules\mob\_modifiers\unholy.dm" +#include "code\modules\mob\dead\corpse.dm" +#include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\freelook\chunk.dm" +#include "code\modules\mob\freelook\eye.dm" +#include "code\modules\mob\freelook\life.dm" +#include "code\modules\mob\freelook\update_triggers.dm" +#include "code\modules\mob\freelook\visualnet.dm" +#include "code\modules\mob\freelook\ai\cameranet.dm" +#include "code\modules\mob\freelook\ai\chunk.dm" +#include "code\modules\mob\freelook\ai\eye.dm" +#include "code\modules\mob\freelook\ai\update_triggers.dm" +#include "code\modules\mob\freelook\mask\chunk.dm" +#include "code\modules\mob\freelook\mask\cultnet.dm" +#include "code\modules\mob\freelook\mask\eye.dm" +#include "code\modules\mob\freelook\mask\update_triggers.dm" +#include "code\modules\mob\language\generic.dm" +#include "code\modules\mob\language\language.dm" +#include "code\modules\mob\language\monkey.dm" +#include "code\modules\mob\language\outsider.dm" +#include "code\modules\mob\language\station.dm" +#include "code\modules\mob\language\synthetic.dm" +#include "code\modules\mob\living\autohiss.dm" +#include "code\modules\mob\living\butchering.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\default_language.dm" +#include "code\modules\mob\living\inventory.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_powers.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\organs.dm" +#include "code\modules\mob\living\riding.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\status_indicators.dm" +#include "code\modules\mob\living\bot\bot.dm" +#include "code\modules\mob\living\bot\cleanbot.dm" +#include "code\modules\mob\living\bot\ed209bot.dm" +#include "code\modules\mob\living\bot\edCLNbot.dm" +#include "code\modules\mob\living\bot\farmbot.dm" +#include "code\modules\mob\living\bot\floorbot.dm" +#include "code\modules\mob\living\bot\medbot.dm" +#include "code\modules\mob\living\bot\mulebot.dm" +#include "code\modules\mob\living\bot\secbot.dm" +#include "code\modules\mob\living\bot\SLed209bot.dm" +#include "code\modules\mob\living\carbon\breathe.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_powers.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\resist.dm" +#include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\taste.dm" +#include "code\modules\mob\living\carbon\viruses.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" +#include "code\modules\mob\living\carbon\alien\alien_damage.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\progression.dm" +#include "code\modules\mob\living\carbon\alien\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" +#include "code\modules\mob\living\carbon\alien\diona\life.dm" +#include "code\modules\mob\living\carbon\alien\diona\progression.dm" +#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" +#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\progression.dm" +#include "code\modules\mob\living\carbon\brain\brain.dm" +#include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" +#include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" +#include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\gradient.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_attackhand.dm" +#include "code\modules\mob\living\carbon\human\human_damage.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_helpers.dm" +#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_organs.dm" +#include "code\modules\mob\living\carbon\human\human_powers.dm" +#include "code\modules\mob\living\carbon\human\human_resist.dm" +#include "code\modules\mob\living\carbon\human\human_species.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\stripping.dm" +#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm" +#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" +#include "code\modules\mob\living\carbon\human\species\species.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack.dm" +#include "code\modules\mob\living\carbon\human\species\species_getters.dm" +#include "code\modules\mob\living\carbon\human\species\species_helpers.dm" +#include "code\modules\mob\living\carbon\human\species\species_hud.dm" +#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\event.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\station\golem.dm" +#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" +#include "code\modules\mob\living\carbon\human\species\station\station.dm" +#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" +#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" +#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\emote.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\subystems.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_movement.dm" +#include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\icons.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\malf.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\decoy\death.dm" +#include "code\modules\mob\living\silicon\decoy\decoy.dm" +#include "code\modules\mob\living\silicon\decoy\life.dm" +#include "code\modules\mob\living\silicon\pai\admin.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\examine.dm" +#include "code\modules\mob\living\silicon\pai\life.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\recruit.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\robot\analyzer.dm" +#include "code\modules\mob\living\silicon\robot\component.dm" +#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\photos.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" +#include "code\modules\mob\living\simple_mob\appearance.dm" +#include "code\modules\mob\living\simple_mob\butchering.dm" +#include "code\modules\mob\living\simple_mob\combat.dm" +#include "code\modules\mob\living\simple_mob\defense.dm" +#include "code\modules\mob\living\simple_mob\hands.dm" +#include "code\modules\mob\living\simple_mob\harvesting.dm" +#include "code\modules\mob\living\simple_mob\life.dm" +#include "code\modules\mob\living\simple_mob\on_click.dm" +#include "code\modules\mob\living\simple_mob\simple_hud.dm" +#include "code\modules\mob\living\simple_mob\simple_mob.dm" +#include "code\modules\mob\living\simple_mob\taming.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_powers.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\chicken.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\pepper.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\phorogenic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\thermic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" +#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" +#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\hoverpod.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\marauder.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\mecha.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\odysseus.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\phazon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\ripley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\monitor_ward.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\ward.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" +#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" +#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" +#include "code\modules\mob\living\voice\voice.dm" +#include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\logout.dm" +#include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\news.dm" +#include "code\modules\mob\new_player\poll.dm" +#include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\skill.dm" +#include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories_ear.dm" +#include "code\modules\mob\new_player\sprite_accessories_extra.dm" +#include "code\modules\mob\new_player\sprite_accessories_tail.dm" +#include "code\modules\mob\new_player\sprite_accessories_taur.dm" +#include "code\modules\mob\new_player\sprite_accessories_wing.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\modular_computer\core.dm" +#include "code\modules\modular_computers\computers\modular_computer\damage.dm" +#include "code\modules\modular_computers\computers\modular_computer\hardware.dm" +#include "code\modules\modular_computers\computers\modular_computer\interaction.dm" +#include "code\modules\modular_computers\computers\modular_computer\power.dm" +#include "code\modules\modular_computers\computers\modular_computer\ui.dm" +#include "code\modules\modular_computers\computers\modular_computer\variables.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_console.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_console.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\news_article.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\file_system\programs\command\card.dm" +#include "code\modules\modular_computers\file_system\programs\command\comm.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\alarm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\atmos_control.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\shutoff_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\generic\camera.dm" +#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\game.dm" +#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" +#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" +#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" +#include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" +#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm" +#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\nano_printer.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" +#include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\emails\email_account.dm" +#include "code\modules\modular_computers\NTNet\emails\email_message.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\multi-tile\multi-tile.dm" +#include "code\modules\multiz\_stubs.dm" +#include "code\modules\multiz\basic.dm" +#include "code\modules\multiz\hoist.dm" +#include "code\modules\multiz\ladders.dm" +#include "code\modules\multiz\movement.dm" +#include "code\modules\multiz\pipes.dm" +#include "code\modules\multiz\stairs.dm" +#include "code\modules\multiz\turf.dm" +#include "code\modules\multiz\zshadow.dm" +#include "code\modules\nano\nanoexternal.dm" +#include "code\modules\nano\nanomanager.dm" +#include "code\modules\nano\nanomapgen.dm" +#include "code\modules\nano\nanoui.dm" +#include "code\modules\nano\interaction\admin.dm" +#include "code\modules\nano\interaction\base.dm" +#include "code\modules\nano\interaction\conscious.dm" +#include "code\modules\nano\interaction\contained.dm" +#include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\interactive.dm" +#include "code\modules\nano\interaction\inventory.dm" +#include "code\modules\nano\interaction\inventory_deep.dm" +#include "code\modules\nano\interaction\outside.dm" +#include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\remote.dm" +#include "code\modules\nano\interaction\self.dm" +#include "code\modules\nano\interaction\zlevel.dm" +#include "code\modules\nano\modules\nano_module.dm" +#include "code\modules\news\news_init.dm" +#include "code\modules\news\newspaper.dm" +#include "code\modules\news\newspaper_layout.dm" +#include "code\modules\organs\blood.dm" +#include "code\modules\organs\misc.dm" +#include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_external.dm" +#include "code\modules\organs\organ_icon.dm" +#include "code\modules\organs\organ_stump.dm" +#include "code\modules\organs\pain.dm" +#include "code\modules\organs\robolimbs.dm" +#include "code\modules\organs\robolimbs_custom.dm" +#include "code\modules\organs\wound.dm" +#include "code\modules\organs\internal\appendix.dm" +#include "code\modules\organs\internal\augment.dm" +#include "code\modules\organs\internal\brain.dm" +#include "code\modules\organs\internal\eyes.dm" +#include "code\modules\organs\internal\heart.dm" +#include "code\modules\organs\internal\intestine.dm" +#include "code\modules\organs\internal\kidneys.dm" +#include "code\modules\organs\internal\liver.dm" +#include "code\modules\organs\internal\lungs.dm" +#include "code\modules\organs\internal\organ_internal.dm" +#include "code\modules\organs\internal\spleen.dm" +#include "code\modules\organs\internal\stomach.dm" +#include "code\modules\organs\internal\voicebox.dm" +#include "code\modules\organs\internal\augment\armmounted.dm" +#include "code\modules\organs\internal\augment\bio.dm" +#include "code\modules\organs\internal\robotic\diagnostic.dm" +#include "code\modules\organs\internal\robotic\heatsink.dm" +#include "code\modules\organs\internal\robotic\robotic.dm" +#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\subtypes\indestructible.dm" +#include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\replicant.dm" +#include "code\modules\organs\subtypes\slime.dm" +#include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\teshari.dm" +#include "code\modules\organs\subtypes\unathi.dm" +#include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\unseverable.dm" +#include "code\modules\organs\subtypes\vox.dm" +#include "code\modules\organs\subtypes\xenos.dm" +#include "code\modules\overmap\helpers.dm" +#include "code\modules\overmap\overmap_object.dm" +#include "code\modules\overmap\overmap_planet.dm" +#include "code\modules\overmap\overmap_shuttle.dm" +#include "code\modules\overmap\sectors.dm" +#include "code\modules\overmap\spacetravel.dm" +#include "code\modules\overmap\turfs.dm" +#include "code\modules\overmap\events\event_handler.dm" +#include "code\modules\overmap\events\generation.dm" +#include "code\modules\overmap\events\overmap_event.dm" +#include "code\modules\overmap\ships\landable.dm" +#include "code\modules\overmap\ships\ship.dm" +#include "code\modules\overmap\ships\computers\computer_shims.dm" +#include "code\modules\overmap\ships\computers\engine_control.dm" +#include "code\modules\overmap\ships\computers\helm.dm" +#include "code\modules\overmap\ships\computers\sensors.dm" +#include "code\modules\overmap\ships\computers\ship.dm" +#include "code\modules\overmap\ships\computers\shuttle.dm" +#include "code\modules\overmap\ships\engines\engine.dm" +#include "code\modules\overmap\ships\engines\gas_thruster.dm" +#include "code\modules\overmap\ships\engines\ion_thruster.dm" +#include "code\modules\paperwork\adminpaper.dm" +#include "code\modules\paperwork\carbonpaper.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_bundle.dm" +#include "code\modules\paperwork\paper_sticky.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\papershredder.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\photography.dm" +#include "code\modules\paperwork\silicon_photography.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\pda\ai.dm" +#include "code\modules\pda\app.dm" +#include "code\modules\pda\cart.dm" +#include "code\modules\pda\cart_apps.dm" +#include "code\modules\pda\core_apps.dm" +#include "code\modules\pda\messenger.dm" +#include "code\modules\pda\messenger_plugins.dm" +#include "code\modules\pda\pda.dm" +#include "code\modules\pda\pda_subtypes.dm" +#include "code\modules\pda\pda_tgui.dm" +#include "code\modules\pda\radio.dm" +#include "code\modules\pda\utilities.dm" +#include "code\modules\persistence\filth.dm" +#include "code\modules\persistence\graffiti.dm" +#include "code\modules\persistence\noticeboard.dm" +#include "code\modules\persistence\datum\persistence_datum.dm" +#include "code\modules\persistence\effects\filth.dm" +#include "code\modules\persistence\effects\graffiti.dm" +#include "code\modules\persistence\effects\paper.dm" +#include "code\modules\persistence\effects\paper_sticky.dm" +#include "code\modules\persistence\effects\trash.dm" +#include "code\modules\persistence\storage\smartfridge.dm" +#include "code\modules\persistence\storage\storage.dm" +#include "code\modules\planet\planet.dm" +#include "code\modules\planet\sif.dm" +#include "code\modules\planet\time.dm" +#include "code\modules\planet\weather.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\batteryrack.dm" +#include "code\modules\power\breaker_box.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cable_ender.dm" +#include "code\modules\power\cable_heavyduty.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\debug_items.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\generator_type2.dm" +#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\grid_checker.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\smes_construction.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\antimatter\containment_jar.dm" +#include "code\modules\power\antimatter\control.dm" +#include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\cells\device_cells.dm" +#include "code\modules\power\cells\esoteric_cells.dm" +#include "code\modules\power\cells\power_cells.dm" +#include "code\modules\power\fusion\_setup.dm" +#include "code\modules\power\fusion\fusion_circuits.dm" +#include "code\modules\power\fusion\fusion_particle_catcher.dm" +#include "code\modules\power\fusion\fusion_reactions.dm" +#include "code\modules\power\fusion\magpower.dm" +#include "code\modules\power\fusion\core\_core.dm" +#include "code\modules\power\fusion\core\core_control.dm" +#include "code\modules\power\fusion\core\core_field.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_assembly.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_compressor.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_control.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_injector.dm" +#include "code\modules\power\fusion\gyrotron\gyrotron.dm" +#include "code\modules\power\fusion\gyrotron\gyrotron_control.dm" +#include "code\modules\power\sensors\powernet_sensor.dm" +#include "code\modules\power\sensors\sensor_monitoring.dm" +#include "code\modules\power\singularity\act.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm" +#include "code\modules\power\supermatter\setup_supermatter.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\power\tesla\telsa_construction.dm" +#include "code\modules\power\tesla\tesla_act.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\broken.dm" +#include "code\modules\projectiles\dnalocking.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\magnetic.dm" +#include "code\modules\projectiles\ammunition\rounds.dm" +#include "code\modules\projectiles\ammunition\smartmag.dm" +#include "code\modules\projectiles\brokenguns\energy.dm" +#include "code\modules\projectiles\brokenguns\launcher.dm" +#include "code\modules\projectiles\brokenguns\magnetic.dm" +#include "code\modules\projectiles\brokenguns\projectile.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\launcher.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\modular_guns.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\vox.dm" +#include "code\modules\projectiles\guns\energy\hooklauncher.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\phase.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\temperature.dm" +#include "code\modules\projectiles\guns\launcher\crossbow.dm" +#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" +#include "code\modules\projectiles\guns\launcher\pneumatic.dm" +#include "code\modules\projectiles\guns\launcher\rocket.dm" +#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\magic\fireball.dm" +#include "code\modules\projectiles\guns\magnetic\bore.dm" +#include "code\modules\projectiles\guns\magnetic\gasthrower.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" +#include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\boltaction.dm" +#include "code\modules\projectiles\guns\projectile\caseless.dm" +#include "code\modules\projectiles\guns\projectile\contender.dm" +#include "code\modules\projectiles\guns\projectile\dartgun.dm" +#include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\semiauto.dm" +#include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" +#include "code\modules\projectiles\projectile\arc.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\blob.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\change.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\explosive.dm" +#include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\hook.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\magnetic.dm" +#include "code\modules\projectiles\projectile\pellets.dm" +#include "code\modules\projectiles\projectile\scatter.dm" +#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\projectiles\projectile\trace.dm" +#include "code\modules\projectiles\targeting\targeting_client.dm" +#include "code\modules\projectiles\targeting\targeting_gun.dm" +#include "code\modules\projectiles\targeting\targeting_mob.dm" +#include "code\modules\projectiles\targeting\targeting_overlay.dm" +#include "code\modules\projectiles\targeting\targeting_triggers.dm" +#include "code\modules\radiation\radiation.dm" +#include "code\modules\random_map\_random_map_setup.dm" +#include "code\modules\random_map\random_map.dm" +#include "code\modules\random_map\random_map_verbs.dm" +#include "code\modules\random_map\automata\automata.dm" +#include "code\modules\random_map\automata\caves.dm" +#include "code\modules\random_map\building\building.dm" +#include "code\modules\random_map\drop\drop_types.dm" +#include "code\modules\random_map\drop\droppod.dm" +#include "code\modules\random_map\drop\droppod_doors.dm" +#include "code\modules\random_map\drop\supply.dm" +#include "code\modules\random_map\mazes\maze.dm" +#include "code\modules\random_map\mazes\maze_cell.dm" +#include "code\modules\random_map\noise\desert.dm" +#include "code\modules\random_map\noise\noise.dm" +#include "code\modules\random_map\noise\ore.dm" +#include "code\modules\random_map\noise\tundra.dm" +#include "code\modules\reagents\Chemistry-Colours.dm" +#include "code\modules\reagents\Chemistry-Logging.dm" +#include "code\modules\reagents\Chemistry-Metabolism.dm" +#include "code\modules\reagents\holder\distilling.dm" +#include "code\modules\reagents\holder\holder.dm" +#include "code\modules\reagents\hoses\connector.dm" +#include "code\modules\reagents\hoses\hose.dm" +#include "code\modules\reagents\hoses\hose_connector.dm" +#include "code\modules\reagents\machinery\chem_master.dm" +#include "code\modules\reagents\machinery\chemalyzer.dm" +#include "code\modules\reagents\machinery\distillery.dm" +#include "code\modules\reagents\machinery\grinder.dm" +#include "code\modules\reagents\machinery\dispenser\_defines.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser2.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" +#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" +#include "code\modules\reagents\machinery\dispenser\supply.dm" +#include "code\modules\reagents\reactions\_reactions.dm" +#include "code\modules\reagents\reactions\distilling\distilling.dm" +#include "code\modules\reagents\reactions\fusion\fusion.dm" +#include "code\modules\reagents\reactions\instant\drinks.dm" +#include "code\modules\reagents\reactions\instant\food.dm" +#include "code\modules\reagents\reactions\instant\instant.dm" +#include "code\modules\reagents\reagent_containers\_reagent_containers.dm" +#include "code\modules\reagents\reagent_containers\blood_pack.dm" +#include "code\modules\reagents\reagent_containers\borghypo.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" +#include "code\modules\reagents\reagents\_helpers.dm" +#include "code\modules\reagents\reagents\_reagents.dm" +#include "code\modules\reagents\reagents\core.dm" +#include "code\modules\reagents\reagents\dispenser.dm" +#include "code\modules\reagents\reagents\food_drinks.dm" +#include "code\modules\reagents\reagents\medicine.dm" +#include "code\modules\reagents\reagents\modifiers.dm" +#include "code\modules\reagents\reagents\other.dm" +#include "code\modules\reagents\reagents\toxins.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\disposal-construction.dm" +#include "code\modules\recycling\disposal.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\research\circuitprinter.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\mechfab_designs.dm" +#include "code\modules\research\message_server.dm" +#include "code\modules\research\prosfab_designs.dm" +#include "code\modules\research\protolathe.dm" +#include "code\modules\research\rd-readme.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\designs\ai_holders.dm" +#include "code\modules\research\designs\bag_of_holding.dm" +#include "code\modules\research\designs\beakers.dm" +#include "code\modules\research\designs\bio_devices.dm" +#include "code\modules\research\designs\circuit_assembly.dm" +#include "code\modules\research\designs\engineering.dm" +#include "code\modules\research\designs\HUDs.dm" +#include "code\modules\research\designs\implants.dm" +#include "code\modules\research\designs\locator_devices.dm" +#include "code\modules\research\designs\medical.dm" +#include "code\modules\research\designs\mining_toys.dm" +#include "code\modules\research\designs\misc.dm" +#include "code\modules\research\designs\modular_computer.dm" +#include "code\modules\research\designs\pdas.dm" +#include "code\modules\research\designs\power_cells.dm" +#include "code\modules\research\designs\precursor.dm" +#include "code\modules\research\designs\stock_parts.dm" +#include "code\modules\research\designs\subspace_parts.dm" +#include "code\modules\research\designs\tech_disks.dm" +#include "code\modules\research\designs\weapons.dm" +#include "code\modules\research\designs\xenoarch_toys.dm" +#include "code\modules\research\designs\xenobio_toys.dm" +#include "code\modules\research\designs\circuits\ai_modules.dm" +#include "code\modules\research\designs\circuits\circuits.dm" +#include "code\modules\research\designs\circuits\disks.dm" +#include "code\modules\scripting\Errors.dm" +#include "code\modules\scripting\IDE.dm" +#include "code\modules\scripting\Options.dm" +#include "code\modules\scripting\stack.dm" +#include "code\modules\scripting\AST\AST Nodes.dm" +#include "code\modules\scripting\AST\Blocks.dm" +#include "code\modules\scripting\AST\Statements.dm" +#include "code\modules\scripting\AST\Operators\Binary Operators.dm" +#include "code\modules\scripting\AST\Operators\Unary Operators.dm" +#include "code\modules\scripting\Implementations\_Logic.dm" +#include "code\modules\scripting\Implementations\Telecomms.dm" +#include "code\modules\scripting\Interpreter\Evaluation.dm" +#include "code\modules\scripting\Interpreter\Interaction.dm" +#include "code\modules\scripting\Interpreter\Interpreter.dm" +#include "code\modules\scripting\Interpreter\Scope.dm" +#include "code\modules\scripting\Parser\Expressions.dm" +#include "code\modules\scripting\Parser\Keywords.dm" +#include "code\modules\scripting\Parser\Parser.dm" +#include "code\modules\scripting\Scanner\Scanner.dm" +#include "code\modules\scripting\Scanner\Tokens.dm" +#include "code\modules\security levels\keycard authentication.dm" +#include "code\modules\security levels\security levels.dm" +#include "code\modules\shieldgen\directional_shield.dm" +#include "code\modules\shieldgen\emergency_shield.dm" +#include "code\modules\shieldgen\energy_field.dm" +#include "code\modules\shieldgen\handheld_defuser.dm" +#include "code\modules\shieldgen\sheldwallgen.dm" +#include "code\modules\shieldgen\shield_capacitor.dm" +#include "code\modules\shieldgen\shield_diffuser.dm" +#include "code\modules\shieldgen\shield_gen.dm" +#include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shuttles\antagonist.dm" +#include "code\modules\shuttles\departmental.dm" +#include "code\modules\shuttles\escape_pods.dm" +#include "code\modules\shuttles\landmarks.dm" +#include "code\modules\shuttles\shuttle.dm" +#include "code\modules\shuttles\shuttle_arrivals.dm" +#include "code\modules\shuttles\shuttle_autodock.dm" +#include "code\modules\shuttles\shuttle_console.dm" +#include "code\modules\shuttles\shuttle_console_multi.dm" +#include "code\modules\shuttles\shuttle_emergency.dm" +#include "code\modules\shuttles\shuttle_ferry.dm" +#include "code\modules\shuttles\shuttle_specops.dm" +#include "code\modules\shuttles\shuttle_supply.dm" +#include "code\modules\shuttles\shuttles_multi.dm" +#include "code\modules\shuttles\shuttles_web.dm" +#include "code\modules\shuttles\web_datums.dm" +#include "code\modules\spells\artifacts.dm" +#include "code\modules\spells\construct_spells.dm" +#include "code\modules\spells\no_clothes.dm" +#include "code\modules\spells\spell_code.dm" +#include "code\modules\spells\spell_projectile.dm" +#include "code\modules\spells\spellbook.dm" +#include "code\modules\spells\spells.dm" +#include "code\modules\spells\aoe_turf\aoe_turf.dm" +#include "code\modules\spells\aoe_turf\blink.dm" +#include "code\modules\spells\aoe_turf\charge.dm" +#include "code\modules\spells\aoe_turf\disable_tech.dm" +#include "code\modules\spells\aoe_turf\knock.dm" +#include "code\modules\spells\aoe_turf\smoke.dm" +#include "code\modules\spells\aoe_turf\summons.dm" +#include "code\modules\spells\aoe_turf\conjure\conjure.dm" +#include "code\modules\spells\aoe_turf\conjure\construct.dm" +#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" +#include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\rune_write.dm" +#include "code\modules\spells\targeted\ethereal_jaunt.dm" +#include "code\modules\spells\targeted\genetic.dm" +#include "code\modules\spells\targeted\harvest.dm" +#include "code\modules\spells\targeted\mind_transfer.dm" +#include "code\modules\spells\targeted\shift.dm" +#include "code\modules\spells\targeted\subjugate.dm" +#include "code\modules\spells\targeted\targeted.dm" +#include "code\modules\spells\targeted\equip\equip.dm" +#include "code\modules\spells\targeted\equip\horsemask.dm" +#include "code\modules\spells\targeted\projectile\dumbfire.dm" +#include "code\modules\spells\targeted\projectile\fireball.dm" +#include "code\modules\spells\targeted\projectile\magic_missile.dm" +#include "code\modules\spells\targeted\projectile\projectile.dm" +#include "code\modules\surgery\_defines.dm" +#include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\encased.dm" +#include "code\modules\surgery\external_repair.dm" +#include "code\modules\surgery\face.dm" +#include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\neck.dm" +#include "code\modules\surgery\organs_internal.dm" +#include "code\modules\surgery\other.dm" +#include "code\modules\surgery\robotics.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\~defines.dm" +#include "code\modules\tables\bench.dm" +#include "code\modules\tables\flipping.dm" +#include "code\modules\tables\interactions.dm" +#include "code\modules\tables\presets.dm" +#include "code\modules\tables\rack.dm" +#include "code\modules\tables\tables.dm" +#include "code\modules\tables\update_triggers.dm" +#include "code\modules\tension\tension.dm" +#include "code\modules\tgui\external.dm" +#include "code\modules\tgui\modal.dm" +#include "code\modules\tgui\states.dm" +#include "code\modules\tgui\tgui.dm" +#include "code\modules\tgui\tgui_window.dm" +#include "code\modules\tgui\modules\_base.dm" +#include "code\modules\tgui\modules\alarm.dm" +#include "code\modules\tgui\modules\appearance_changer.dm" +#include "code\modules\tgui\modules\atmos_control.dm" +#include "code\modules\tgui\modules\camera.dm" +#include "code\modules\tgui\modules\communications.dm" +#include "code\modules\tgui\modules\crew_monitor.dm" +#include "code\modules\tgui\modules\gyrotron_control.dm" +#include "code\modules\tgui\modules\law_manager.dm" +#include "code\modules\tgui\modules\overmap.dm" +#include "code\modules\tgui\modules\power_monitor.dm" +#include "code\modules\tgui\modules\rcon.dm" +#include "code\modules\tgui\modules\rustcore_monitor.dm" +#include "code\modules\tgui\modules\rustfuel_control.dm" +#include "code\modules\tgui\modules\shutoff_monitor.dm" +#include "code\modules\tgui\modules\supermatter_monitor.dm" +#include "code\modules\tgui\modules\ntos-only\cardmod.dm" +#include "code\modules\tgui\modules\ntos-only\configurator.dm" +#include "code\modules\tgui\modules\ntos-only\email.dm" +#include "code\modules\tgui\modules\ntos-only\uav.dm" +#include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\conscious.dm" +#include "code\modules\tgui\states\contained.dm" +#include "code\modules\tgui\states\deep_inventory.dm" +#include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\human_adjacent.dm" +#include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\not_incapacitated.dm" +#include "code\modules\tgui\states\notcontained.dm" +#include "code\modules\tgui\states\ntos.dm" +#include "code\modules\tgui\states\observer.dm" +#include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\zlevel.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\turbolift\_turbolift.dm" +#include "code\modules\turbolift\turbolift.dm" +#include "code\modules\turbolift\turbolift_areas.dm" +#include "code\modules\turbolift\turbolift_console.dm" +#include "code\modules\turbolift\turbolift_door.dm" +#include "code\modules\turbolift\turbolift_floor.dm" +#include "code\modules\turbolift\turbolift_map.dm" +#include "code\modules\turbolift\turbolift_turfs.dm" +#include "code\modules\vchat\vchat_client.dm" +#include "code\modules\vchat\vchat_db.dm" +#include "code\modules\vehicles\bike.dm" +#include "code\modules\vehicles\boat.dm" +#include "code\modules\vehicles\cargo_train.dm" +#include "code\modules\vehicles\construction.dm" +#include "code\modules\vehicles\quad.dm" +#include "code\modules\vehicles\train.dm" +#include "code\modules\vehicles\vehicle.dm" +#include "code\modules\ventcrawl\ventcrawl.dm" +#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" +#include "code\modules\ventcrawl\ventcrawl_multiz.dm" +#include "code\modules\ventcrawl\ventcrawl_verb.dm" +#include "code\modules\virus2\admin.dm" +#include "code\modules\virus2\analyser.dm" +#include "code\modules\virus2\antibodies.dm" +#include "code\modules\virus2\centrifuge.dm" +#include "code\modules\virus2\curer.dm" +#include "code\modules\virus2\disease2.dm" +#include "code\modules\virus2\diseasesplicer.dm" +#include "code\modules\virus2\dishincubator.dm" +#include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\helpers.dm" +#include "code\modules\virus2\isolator.dm" +#include "code\modules\virus2\items_devices.dm" +#include "code\modules\webhooks\_webhook.dm" +#include "code\modules\webhooks\webhook_ahelp2discord.dm" +#include "code\modules\webhooks\webhook_custom_event.dm" +#include "code\modules\webhooks\webhook_fax2discord.dm" +#include "code\modules\webhooks\webhook_roundend.dm" +#include "code\modules\webhooks\webhook_roundprep.dm" +#include "code\modules\webhooks\webhook_roundstart.dm" +#include "code\modules\xenoarcheaology\anomaly_container.dm" +#include "code\modules\xenoarcheaology\boulder.dm" +#include "code\modules\xenoarcheaology\effect.dm" +#include "code\modules\xenoarcheaology\manuals.dm" +#include "code\modules\xenoarcheaology\misc.dm" +#include "code\modules\xenoarcheaology\sampling.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" +#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" +#include "code\modules\xenoarcheaology\artifacts\crystal.dm" +#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" +#include "code\modules\xenoarcheaology\artifacts\replicator.dm" +#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm" +#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm" +#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm" +#include "code\modules\xenoarcheaology\effects\badfeeling.dm" +#include "code\modules\xenoarcheaology\effects\berserk.dm" +#include "code\modules\xenoarcheaology\effects\cannibal.dm" +#include "code\modules\xenoarcheaology\effects\cellcharge.dm" +#include "code\modules\xenoarcheaology\effects\celldrain.dm" +#include "code\modules\xenoarcheaology\effects\cold.dm" +#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" +#include "code\modules\xenoarcheaology\effects\electric_field.dm" +#include "code\modules\xenoarcheaology\effects\emp.dm" +#include "code\modules\xenoarcheaology\effects\feysight.dm" +#include "code\modules\xenoarcheaology\effects\forcefield.dm" +#include "code\modules\xenoarcheaology\effects\gaia.dm" +#include "code\modules\xenoarcheaology\effects\gasco2.dm" +#include "code\modules\xenoarcheaology\effects\gasnitro.dm" +#include "code\modules\xenoarcheaology\effects\gasoxy.dm" +#include "code\modules\xenoarcheaology\effects\gasphoron.dm" +#include "code\modules\xenoarcheaology\effects\gassleeping.dm" +#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" +#include "code\modules\xenoarcheaology\effects\gravitational_waves.dm" +#include "code\modules\xenoarcheaology\effects\heal.dm" +#include "code\modules\xenoarcheaology\effects\heat.dm" +#include "code\modules\xenoarcheaology\effects\hurt.dm" +#include "code\modules\xenoarcheaology\effects\poltergeist.dm" +#include "code\modules\xenoarcheaology\effects\radiate.dm" +#include "code\modules\xenoarcheaology\effects\resurrect.dm" +#include "code\modules\xenoarcheaology\effects\roboheal.dm" +#include "code\modules\xenoarcheaology\effects\robohurt.dm" +#include "code\modules\xenoarcheaology\effects\sleepy.dm" +#include "code\modules\xenoarcheaology\effects\stun.dm" +#include "code\modules\xenoarcheaology\effects\teleport.dm" +#include "code\modules\xenoarcheaology\effects\vampire.dm" +#include "code\modules\xenoarcheaology\finds\eguns.dm" +#include "code\modules\xenoarcheaology\finds\find_spawning.dm" +#include "code\modules\xenoarcheaology\finds\finds.dm" +#include "code\modules\xenoarcheaology\finds\finds_defines.dm" +#include "code\modules\xenoarcheaology\finds\fossils.dm" +#include "code\modules\xenoarcheaology\finds\misc.dm" +#include "code\modules\xenoarcheaology\finds\special.dm" +#include "code\modules\xenoarcheaology\finds\talking.dm" +#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" +#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" +#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" +#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" +#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" +#include "code\modules\xenoarcheaology\tools\equipment.dm" +#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" +#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" +#include "code\modules\xenoarcheaology\tools\tools.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" +#include "code\modules\xenobio\items\extracts.dm" +#include "code\modules\xenobio\items\slime_objects.dm" +#include "code\modules\xenobio\items\slimepotions.dm" +#include "code\modules\xenobio\items\weapons.dm" +#include "code\modules\xenobio\machinery\processor.dm" +#include "code\modules\xgm\xgm_gas_data.dm" +#include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\unit_tests\decl_tests.dm" +#include "code\unit_tests\language_tests.dm" +#include "code\unit_tests\loadout_tests.dm" +#include "code\unit_tests\map_tests.dm" +#include "code\unit_tests\mob_tests.dm" +#include "code\unit_tests\recipe_tests.dm" +#include "code\unit_tests\research_tests.dm" +#include "code\unit_tests\sqlite_tests.dm" +#include "code\unit_tests\subsystem_tests.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\zas_tests.dm" +#include "code\unit_tests\integrated_circuits\arithmetic.dm" +#include "code\unit_tests\integrated_circuits\circuits.dm" +#include "code\unit_tests\integrated_circuits\converter.dm" +#include "code\unit_tests\integrated_circuits\logic.dm" +#include "code\unit_tests\integrated_circuits\trig.dm" +#include "code\ZAS\Airflow.dm" +#include "code\ZAS\Atom.dm" +#include "code\ZAS\Connection.dm" +#include "code\ZAS\ConnectionGroup.dm" +#include "code\ZAS\ConnectionManager.dm" +#include "code\ZAS\Controller.dm" +#include "code\ZAS\Debug.dm" +#include "code\ZAS\Diagnostic.dm" +#include "code\ZAS\Fire.dm" +#include "code\ZAS\Phoron.dm" +#include "code\ZAS\Turf.dm" +#include "code\ZAS\Variable Settings.dm" +#include "code\ZAS\Zone.dm" +#include "interface\interface.dm" +#include "interface\skin.dmf" +#include "maps\southern_cross\southern_cross.dm" +#include "maps\submaps\_helpers.dm" +#include "maps\submaps\engine_submaps\engine.dm" +#include "maps\submaps\engine_submaps\engine_areas.dm" +#include "maps\submaps\engine_submaps\southern_cross\_engine_submaps.dm" +#include "maps\submaps\space_submaps\space.dm" +#include "maps\submaps\surface_submaps\mountains\mountains.dm" +#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" +#include "maps\submaps\surface_submaps\plains\plains.dm" +#include "maps\submaps\surface_submaps\plains\plains_areas.dm" +#include "maps\submaps\surface_submaps\wilderness\wilderness.dm" +#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" +#include "maps\~map_system\maps.dm" +// END_INCLUDE +>>>>>>> f9613f2... Removes Global Iterators (#8146):polaris.dme From 9c155dda19e79c7383bee4fcbd21c1b5e5397fd2 Mon Sep 17 00:00:00 2001 From: Heroman Date: Sat, 19 Jun 2021 04:48:39 +1000 Subject: [PATCH 17/81] Actually brings over the changes --- maps/tether/tether-05-station1.dmm | 341 +++++++++++++---------------- 1 file changed, 157 insertions(+), 184 deletions(-) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index a1dd817c18..e6514e0fec 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -1368,6 +1368,18 @@ /turf/simulated/floor/tiled/monotile, /area/tether/exploration) "acC" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10; + icon_state = "intact" + }, +/turf/simulated/floor/tiled, +/area/tcommsat/computer) +"acD" = ( /obj/item/device/multitool, /obj/structure/table/standard, /obj/structure/cable/green{ @@ -1377,7 +1389,17 @@ }, /turf/simulated/floor/tiled, /area/tcommsat/computer) -"acD" = ( +"acE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10; + icon_state = "intact" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/tcommsat/computer) +"acF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 8 }, @@ -1391,7 +1413,7 @@ /area/tcomsat{ name = "\improper Telecomms Lobby" }) -"acE" = ( +"acG" = ( /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -1414,37 +1436,6 @@ dir = 8 }, /turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) -"acF" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/porta_turret{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) -"acG" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 28 - }, -/obj/structure/cable/green{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/machinery/porta_turret{ - dir = 6 - }, -/turf/simulated/floor/tiled, /area/tcomsat{ name = "\improper Telecomms Lobby" }) @@ -1467,22 +1458,11 @@ /turf/simulated/floor/tiled, /area/tether/exploration/hallway) "acI" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/alarm{ - dir = 1; - pixel_y = -25 - }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" +/obj/machinery/porta_turret{ + dir = 6 }, /turf/simulated/floor/tiled, /area/tcomsat{ @@ -1560,6 +1540,48 @@ /turf/simulated/floor, /area/maintenance/substation/engineering) "acP" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "east bump"; + pixel_x = 28 + }, +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/porta_turret{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acQ" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/alarm{ + dir = 1; + pixel_y = -25 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled, +/area/tcomsat{ + name = "\improper Telecomms Lobby" + }) +"acR" = ( /obj/structure/cable{ d1 = 1; d2 = 2; @@ -1578,7 +1600,10 @@ /area/tcomsat{ name = "\improper Telecomms Lobby" }) -"acQ" = ( +"acS" = ( +/turf/simulated/wall/r_wall, +/area/engineering/workshop) +"acT" = ( /obj/structure/cable/yellow{ d1 = 1; d2 = 2; @@ -1594,37 +1619,6 @@ /area/tcomsat{ name = "\improper Telecomms Lobby" }) -"acR" = ( -/obj/machinery/firealarm{ - dir = 4; - layer = 3.3; - pixel_x = 26 - }, -/obj/machinery/power/apc{ - name = "south bump"; - pixel_y = -28 - }, -/obj/structure/cable/green{ - d2 = 8; - icon_state = "0-8" - }, -/turf/simulated/floor/tiled/dark, -/area/tcomsat{ - name = "\improper Telecomms Lobby" - }) -"acS" = ( -/turf/simulated/wall/r_wall, -/area/engineering/workshop) -"acT" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/wall/r_wall, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "acU" = ( /obj/effect/floor_decal/borderfloor{ dir = 4 @@ -1641,24 +1635,25 @@ /turf/simulated/floor/tiled, /area/tether/exploration/hallway) "acV" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/firealarm{ + dir = 4; + layer = 3.3; + pixel_x = 26 }, -/obj/machinery/door/airlock/highsecurity{ - name = "Telecomms Access"; - req_one_access = list(10,12,16,17,61) +/obj/machinery/power/apc{ + name = "south bump"; + pixel_y = -28 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/techfloor, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/dark, +/area/tcomsat{ + name = "\improper Telecomms Lobby" }) "acW" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable/green{ d1 = 1; d2 = 2; icon_state = "1-2" @@ -1984,17 +1979,19 @@ /turf/simulated/floor, /area/storage/emergency_storage/emergency4) "adr" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 +/obj/item/device/radio/beacon, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 + dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled/dark, /area/tcommsat/entrance{ name = "\improper Telecomms Entrance" @@ -2079,6 +2076,22 @@ /turf/simulated/floor/tiled/monotile, /area/tether/exploration) "adx" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled/dark, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) +"ady" = ( /obj/machinery/light/small{ dir = 1 }, @@ -2087,24 +2100,6 @@ }, /obj/structure/closet/crate/solar, /turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) -"ady" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/item/device/radio/beacon, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/tiled/dark, /area/tcommsat/entrance{ name = "\improper Telecomms Entrance" }) @@ -2292,22 +2287,6 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, -/turf/simulated/floor/tiled, -/area/hallway/station/atrium) -"adN" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/floor_decal/borderfloor{ - dir = 4 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 10 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 9 - }, /obj/machinery/computer/guestpass{ dir = 8; pixel_x = 25 @@ -15146,17 +15125,6 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/office) -"bLM" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 - }, -/turf/simulated/floor/tiled, -/area/tcommsat/computer) "bLO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -15568,15 +15536,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"bYk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tcommsat/computer) "bYr" = ( /turf/simulated/wall, /area/maintenance/station/cargo) @@ -19906,19 +19865,6 @@ }, /turf/simulated/floor/tiled, /area/tcommsat/computer) -"gvM" = ( -/obj/structure/cable{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 10 - }, -/turf/simulated/floor/tiled/dark, -/area/tcommsat/entrance{ - name = "\improper Telecomms Entrance" - }) "gys" = ( /obj/machinery/door/blast/regular{ density = 0; @@ -22174,6 +22120,16 @@ }, /turf/simulated/floor/tiled, /area/hallway/station/docks) +"iAx" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/wall/r_wall, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "iAG" = ( /obj/machinery/door/airlock/glass_external, /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -22719,6 +22675,23 @@ /obj/structure/sign/department/eng, /turf/simulated/wall/r_wall, /area/hallway/station/docks) +"jmn" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Telecomms Access"; + req_one_access = list(10,12,16,17,61) + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor/glass, +/turf/simulated/floor/tiled/techfloor, +/area/tcommsat/entrance{ + name = "\improper Telecomms Entrance" + }) "jms" = ( /obj/structure/table/rack, /obj/item/clothing/suit/space/void/mining, @@ -46295,7 +46268,7 @@ vYJ dPx adM kts -adN +vYJ vYJ aba abm @@ -50661,7 +50634,7 @@ apU thI rLO xSF -bLM +acC dJJ xEG awQ @@ -50806,13 +50779,13 @@ kyd bLZ gtY xEG -acD acF +acI vxd lsa cso -acI -acT +acQ +acW acY add adm @@ -50953,11 +50926,11 @@ xzC hkR lGY nJx -acP -acV +acR +jmn acZ adg -ady +adr mpB gWD nSK @@ -51090,16 +51063,16 @@ xSF xjt awC xEG -acE acG +acP vxd qOh yaH -acQ -acW +acT +iAx adb adk -adr +adx sRH jSj kff @@ -51237,11 +51210,11 @@ xEG xEG woq jxP -acR +acV xEG dls dTU -adx +ady dyt hAw kff @@ -51372,7 +51345,7 @@ thI rLO xSF xjt -bYk +acE fyF iYB hic @@ -51655,7 +51628,7 @@ axf uyX acA xSF -acC +acD pyE ged ayg @@ -51694,9 +51667,9 @@ ahV ahV ahV ahV -ahW -ahW -ahW +aaa +aaa +aaa iZC iTF jFv From 0d638a4b92b355bd9fcac4554569468b60483d4c Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Fri, 18 Jun 2021 14:55:08 -0400 Subject: [PATCH 18/81] Update code/game/mecha/equipment/mecha_equipment.dm Co-authored-by: MarinaGryphon --- code/game/mecha/equipment/mecha_equipment.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index ed631e7c41..c36285c5e2 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -273,6 +273,12 @@ chassis.utility_equipment -= src if(EQUIP_SPECIAL) chassis.special_equipment -= src + //VOREStation Addition begin: MICROMECHS + if(EQUIP_MICRO_UTILITY) + chassis.micro_utility_equipment -= src + if(EQUIP_MICRO_WEAPON) + chassis.micro_weapon_equipment -= src + //VOREStation Addition end: MICROMECHS if(chassis.selected == src) chassis.selected = null update_chassis_page() From dacb059441fd48a8391b7dd33b92f471fad1ec63 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Fri, 18 Jun 2021 14:55:13 -0400 Subject: [PATCH 19/81] Update code/game/mecha/equipment/mecha_equipment.dm Co-authored-by: MarinaGryphon --- code/game/mecha/equipment/mecha_equipment.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index c36285c5e2..57fe74b9ef 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -26,6 +26,8 @@ var/mech_flags = NONE var/salvageable = 1 ======= + /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. + var/mech_flags = NONE var/salvageable = TRUE >>>>>>> f9613f2... Removes Global Iterators (#8146) var/required_type = /obj/mecha //may be either a type or a list of allowed types From 125e1ae4c205a522a0f9ebe7316df09f20fb0123 Mon Sep 17 00:00:00 2001 From: Anthony Rodriguez Date: Fri, 18 Jun 2021 13:38:15 -0700 Subject: [PATCH 20/81] Staff Feedback requests --- code/datums/supplypacks/medical.dm | 3 ++- code/game/objects/items/weapons/storage/firstaid.dm | 6 ++++-- code/game/objects/items/weapons/surgery_tools.dm | 1 + maps/tether/tether-03-surface3.dmm | 10 ---------- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 69f198bbd4..28ed9f07bf 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -66,7 +66,8 @@ /obj/item/weapon/surgical/bonegel, /obj/item/weapon/surgical/retractor, /obj/item/weapon/surgical/bonesetter, - /obj/item/weapon/surgical/circular_saw + /obj/item/weapon/surgical/circular_saw, + /obj/item/weapon/surgical/bioregen ) cost = 25 containertype = /obj/structure/closet/crate/secure/veymed diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 9b87ee51d3..71d348e4b6 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -137,7 +137,8 @@ /obj/item/stack/medical/advanced/bruise_pack, /obj/item/stack/nanopaste, /obj/item/device/healthanalyzer/advanced, - /obj/item/weapon/autopsy_scanner + /obj/item/weapon/autopsy_scanner, + /obj/item/weapon/surgical/bioregen ) starts_with = list( @@ -152,7 +153,8 @@ /obj/item/weapon/surgical/FixOVein, /obj/item/stack/medical/advanced/bruise_pack, /obj/item/device/healthanalyzer/advanced, - /obj/item/weapon/autopsy_scanner + /obj/item/weapon/autopsy_scanner, + /obj/item/weapon/surgical/bioregen ) /obj/item/weapon/storage/firstaid/clotting diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 7662dcf8aa..22cac7c7f1 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -6,6 +6,7 @@ * Surgical Drill * Scalpel * Circular Saw + * Bio-Regenerator */ /obj/item/weapon/surgical diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 41acbb058d..866aa97624 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -26814,11 +26814,6 @@ d2 = 2; icon_state = "0-2" }, -/obj/item/weapon/surgical/bioregen, -/obj/item/weapon/paper{ - info = "To the medical staff of the facility - This device will help in what is known as De-Husking on a patient. All you need to do is use this new device here to start the process, then use a hemostat to pull stuff in place. Finally, use the device once more to finish mending the veins and final wounds and you should be good for a defib on the patient. This machine ALSO works on removing poisons and toxins from someone that normally would be a final nail in their coffin! It works similar to your current external surgery methods, but with this device instead. Handy!"; - name = "Bio-Regenrator Notice" - }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/surgery2) "aTM" = ( @@ -36620,11 +36615,6 @@ /obj/item/device/defib_kit/loaded, /obj/item/stack/nanopaste, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/item/weapon/surgical/bioregen, -/obj/item/weapon/paper{ - info = "To the medical staff of the facility - This device will help in what is known as De-Husking on a patient. All you need to do is use this new device here to start the process, then use a hemostat to pull stuff in place. Finally, use the device once more to finish mending the veins and final wounds and you should be good for a defib on the patient. This machine ALSO works on removing poisons and toxins from someone that normally would be a final nail in their coffin! It works similar to your current external surgery methods, but with this device instead. Handy!"; - name = "Bio-Regenrator Notice" - }, /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/surgery1) "blK" = ( From 68a49b60c6cc2a2f010ed377e52213c444001a3e Mon Sep 17 00:00:00 2001 From: Anthony Rodriguez Date: Fri, 18 Jun 2021 13:55:01 -0700 Subject: [PATCH 21/81] Funny HEAD/MASTER conflict resolved --- maps/tether/tether-03-surface3.dmm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 59a2e18431..b2d0e604d7 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -36805,11 +36805,7 @@ cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; -<<<<<<< HEAD - nightshift_setting = 0; -======= nightshift_setting = 2; ->>>>>>> origin/master pixel_x = -30 }, /obj/structure/cable/green{ From 3b3df27daccc41fd499af7145e7484f0e0920b4a Mon Sep 17 00:00:00 2001 From: TheFurryFeline <38586851+TheFurryFeline@users.noreply.github.com> Date: Fri, 18 Jun 2021 17:00:11 -0400 Subject: [PATCH 22/81] Fix metaglass stuff The conversion to Pink Russian PR overlooked this metaglass portion. Fixy. ~Also sneaking in map file name fixes because OCD, kek. 5-8-9 = no. 5-6-7 = yes.~ --- .../food/drinkingglass/metaglass_vr.dm | 4 ++-- icons/obj/drinks_vr.dmi | Bin 37986 -> 37985 bytes ...her-08-mining.dmm => tether-06-mining.dmm} | 0 ...her-09-solars.dmm => tether-07-solars.dmm} | 0 maps/tether/tether.dm | 4 ++-- 5 files changed, 4 insertions(+), 4 deletions(-) rename maps/tether/{tether-08-mining.dmm => tether-06-mining.dmm} (100%) rename maps/tether/{tether-09-solars.dmm => tether-07-solars.dmm} (100%) diff --git a/code/modules/food/drinkingglass/metaglass_vr.dm b/code/modules/food/drinkingglass/metaglass_vr.dm index a718acf86d..06abdba8c1 100644 --- a/code/modules/food/drinkingglass/metaglass_vr.dm +++ b/code/modules/food/drinkingglass/metaglass_vr.dm @@ -118,8 +118,8 @@ glass_center_of_mass = list("x"=16, "y"=8) glass_icon_file = 'icons/obj/drinks_vr.dmi' -/datum/reagent/ethanol/pink_moo - glass_icon_state = "pinkmooglass" +/datum/reagent/ethanol/pink_russian + glass_icon_state = "pinkrussianglass" glass_center_of_mass = list("x"=16, "y"=9) glass_icon_file = 'icons/obj/drinks_vr.dmi' diff --git a/icons/obj/drinks_vr.dmi b/icons/obj/drinks_vr.dmi index f1a34845330abbf4e3f0a878ba9e5604295d7949..57178d2a828a69e9d693ddacd57fe0885c3eb2e6 100644 GIT binary patch delta 147 zcmV;E0Brx_r~=`r0+1vDY_TN*1Am9M#OQ>%{n?Y5+z{`N-szrWp@stZIQa+Tk4*pC zA|v-o^##lW%SnHr?QQgAm1}dRU>guh$^mG&t`QB)_eq9?q5&)HNbzEUP@%|tCq)Ns zMxhNzg#{7KNnxWzZS3G-j@FX_REFdadUZi001BWNkl(DpWZvdWb?Q?LyPCFSrlT-S&O=6fVVLeYQ~cBFW*K&Vh;zKf!R zw(^QWTJ@Jp-Cr&rfuD=7-(QQ@Z*R;00A>_~B$q@mOaK5N07*naRCt{1owKC_ypZku BNdy1@ diff --git a/maps/tether/tether-08-mining.dmm b/maps/tether/tether-06-mining.dmm similarity index 100% rename from maps/tether/tether-08-mining.dmm rename to maps/tether/tether-06-mining.dmm diff --git a/maps/tether/tether-09-solars.dmm b/maps/tether/tether-07-solars.dmm similarity index 100% rename from maps/tether/tether-09-solars.dmm rename to maps/tether/tether-07-solars.dmm diff --git a/maps/tether/tether.dm b/maps/tether/tether.dm index 1dee1fc042..94137cb8ee 100644 --- a/maps/tether/tether.dm +++ b/maps/tether/tether.dm @@ -16,8 +16,8 @@ #include "tether-03-surface3.dmm" #include "tether-04-transit.dmm" #include "tether-05-station1.dmm" - #include "tether-08-mining.dmm" - #include "tether-09-solars.dmm" + #include "tether-06-mining.dmm" + #include "tether-07-solars.dmm" #endif #include "submaps/_tether_submaps.dm" From 2c2506a65d333273ff697a5ac2592bedd19acf3a Mon Sep 17 00:00:00 2001 From: Atermonera Date: Fri, 18 Jun 2021 15:33:29 -0700 Subject: [PATCH 23/81] Merge pull request #8137 from Darlantanis/lefthandholderfix Adds blank icon state to lefthand_holder.dmi --- icons/mob/items/lefthand_holder.dmi | Bin 14737 -> 14590 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi index dcbe69902aebb55e587bd19b2527c48226660631..3003e5b5a6cb02f661e1c835f3bf2947b1b9ee68 100644 GIT binary patch literal 14590 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

;MYM3|kFz!93rl)!}S^X^%!BQPjp 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 qBGy) Date: Fri, 18 Jun 2021 15:37:29 -0700 Subject: [PATCH 25/81] Merge pull request #8138 from Verkister/patch-72 fixes coughs screaming in the chat --- code/modules/emotes/definitions/audible_scream.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/emotes/definitions/audible_scream.dm b/code/modules/emotes/definitions/audible_scream.dm index 00ed9c29fc..71cf73cd45 100644 --- a/code/modules/emotes/definitions/audible_scream.dm +++ b/code/modules/emotes/definitions/audible_scream.dm @@ -9,7 +9,7 @@ return "You [H.species.scream_verb_1p]!" . = ..() -/decl/emote/audible/cough/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) +/decl/emote/audible/scream/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) if(ishuman(user)) var/mob/living/carbon/human/H = user return "[H.species.scream_verb_3p]!" From 7ee772f6e7eb89a87c65779d68194ef0d8eb57bc Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Fri, 18 Jun 2021 18:01:35 -0500 Subject: [PATCH 27/81] Refactors utensils to use weakrefs --- .../objects/items/weapons/material/kitchen.dm | 44 ++++++++++++++----- code/modules/food/food/snacks.dm | 31 +++++++------ html/changelogs/MDP-utensilsrefactor.yml | 37 ++++++++++++++++ 3 files changed, 88 insertions(+), 24 deletions(-) create mode 100644 html/changelogs/MDP-utensilsrefactor.yml diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 909b3f0618..071f581e4b 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -11,12 +11,11 @@ thrown_force_divisor = 1 origin_tech = list(TECH_MATERIAL = 1) attack_verb = list("attacked", "stabbed", "poked") - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) thrown_force_divisor = 0.25 // 5 when thrown with weight 20 (steel) - var/loaded //Descriptive string for currently loaded food object. - var/scoop_food = 1 + var/weakref/loaded //Weakref for currently loaded food object. /obj/item/weapon/material/kitchen/utensil/New() ..() @@ -25,6 +24,15 @@ create_reagents(5) return +/obj/item/weapon/material/kitchen/utensil/update_icon() + . = ..() + cut_overlays() + var/obj/item/weapon/reagent_containers/food/snacks/eaten = loaded?.resolve() + if(eaten) + var/image/I = new(icon, "loadedfood") + I.color = eaten.filling_color + add_overlay(I) + /obj/item/weapon/material/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return ..() @@ -37,8 +45,10 @@ else return ..() - if (reagents.total_volume > 0) + if (loaded && reagents.total_volume > 0) + var/atom/movable/eaten = loaded?.resolve() reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) +<<<<<<< HEAD if(M == user) if(!M.can_eat(loaded)) return @@ -50,17 +60,31 @@ M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].") playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1) cut_overlays() +======= + if(eaten) + if(M == user) + if(!M.can_eat(eaten)) + return + M.visible_message(SPAN_NOTICE("\The [user] eats some of \the [eaten] with \the [src].")) + else + user.visible_message(SPAN_WARNING("\The [user] begins to feed \the [M]!")) + if(!(M.can_force_feed(user, eaten) && do_mob(user, M, 5 SECONDS))) + return + M.visible_message(SPAN_NOTICE("\The [user] feeds some of \the [eaten] to \the [M] with \the [src].")) + playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1) + update_icon() +>>>>>>> 1672a51... Refactors utensils to use weakrefs (#8140) return else - to_chat(user, "You don't have anything on \the [src].") //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK + to_chat(user, SPAN_WARNING("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK return /obj/item/weapon/material/kitchen/utensil/fork name = "fork" desc = "It's a fork. Sure is pointy." icon_state = "fork" - sharp = 1 - edge = 0 + sharp = TRUE + edge = FALSE /obj/item/weapon/material/kitchen/utensil/fork/plastic default_material = "plastic" @@ -70,8 +94,8 @@ desc = "It's a spoon. You can see your own upside-down face in it." icon_state = "spoon" attack_verb = list("attacked", "poked") - edge = 0 - sharp = 0 + edge = FALSE + sharp = FALSE force_divisor = 0.1 //2 when wielded with weight 20 (steel) /obj/item/weapon/material/kitchen/utensil/spoon/plastic diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 2f70dd9bee..eea1309af6 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -175,31 +175,34 @@ // Eating with forks if(istype(W,/obj/item/weapon/material/kitchen/utensil)) var/obj/item/weapon/material/kitchen/utensil/U = W - if(U.scoop_food) - if(!U.reagents) - U.create_reagents(5) + if(!U.reagents) + U.create_reagents(5) - if (U.reagents.total_volume > 0) - to_chat(user, "You already have something on your [U].") - return + if (U.reagents.total_volume > 0) + to_chat(user, "You already have something on your [U].") + return - user.visible_message( \ - "[user] scoops up some [src] with \the [U]!", \ - "You scoop up some [src] with \the [U]!" \ - ) + user.visible_message( \ + "[user] scoops up some [src] with \the [U]!", \ + "You scoop up some [src] with \the [U]!" \ + ) +<<<<<<< HEAD src.bitecount++ U.cut_overlays() U.loaded = "[src]" var/image/I = new(U.icon, "loadedfood") I.color = src.filling_color U.add_overlay(I) +======= + bitecount++ +>>>>>>> 1672a51... Refactors utensils to use weakrefs (#8140) - reagents.trans_to_obj(U, min(reagents.total_volume,5)) + reagents.trans_to_obj(U, min(reagents.total_volume,5)) - if (reagents.total_volume <= 0) - qdel(src) - return + if (reagents.total_volume <= 0) + qdel(src) + return if (is_sliceable()) //these are used to allow hiding edge items in food that is not on a table/tray diff --git a/html/changelogs/MDP-utensilsrefactor.yml b/html/changelogs/MDP-utensilsrefactor.yml new file mode 100644 index 0000000000..af083047ef --- /dev/null +++ b/html/changelogs/MDP-utensilsrefactor.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: MoondancerPony + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Foods will no longer have improper grammar and capitalisation when eaten with utensils." + - tweak: "Refactors utensils to use weakrefs rather than stored strings; also does a bunch of code cleanup." From 005c75fa4e38d5a083a34a8cd675c1104b45c928 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Fri, 18 Jun 2021 18:06:27 -0500 Subject: [PATCH 28/81] Improves select_recipe. (#8141) * select_recipe improvement Removes the call to Timsort and the recipe comparator proc; uses a handrolled implementation of `argmax(items + reagents + fruit)` instead. This reduces the memory footprint of `select_recipe` as well as the amount of processing needed to select the optimal recipe. * angelogchay --- code/_helpers/sorts/comparators.dm | 6 ----- code/modules/food/recipe.dm | 17 ++++++------- html/changelogs/MDP-recipecleanup.yml | 36 +++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 html/changelogs/MDP-recipecleanup.yml diff --git a/code/_helpers/sorts/comparators.dm b/code/_helpers/sorts/comparators.dm index b1980d6da1..dc2419b0b0 100644 --- a/code/_helpers/sorts/comparators.dm +++ b/code/_helpers/sorts/comparators.dm @@ -57,12 +57,6 @@ if (!.) . = B[STAT_ENTRY_COUNT] - A[STAT_ENTRY_COUNT] -// Compares complexity of recipes for use in cooking, etc. This is for telling which recipe to make, not for showing things to the player. -/proc/cmp_recipe_complexity_dsc(datum/recipe/A, datum/recipe/B) - var/a_score = LAZYLEN(A.items) + LAZYLEN(A.reagents) + LAZYLEN(A.fruit) - var/b_score = LAZYLEN(B.items) + LAZYLEN(B.reagents) + LAZYLEN(B.fruit) - return b_score - a_score - /proc/cmp_typepaths_asc(A, B) return sorttext("[B]","[A]") diff --git a/code/modules/food/recipe.dm b/code/modules/food/recipe.dm index 9680444dab..8b13f8b55c 100644 --- a/code/modules/food/recipe.dm +++ b/code/modules/food/recipe.dm @@ -314,20 +314,19 @@ // When exact is false, extraneous ingredients are ignored // When exact is true, extraneous ingredients will fail the recipe -// In both cases, the full complement of required inredients is still needed +// In both cases, the full set of required ingredients is still needed /proc/select_recipe(var/list/datum/recipe/available_recipes, var/obj/obj as obj, var/exact) var/list/datum/recipe/possible_recipes = list() + var/highest_count = 0 + var/count = 0 for (var/datum/recipe/recipe in available_recipes) if(!recipe.check_reagents(obj.reagents, exact) || !recipe.check_items(obj, exact) || !recipe.check_fruit(obj, exact)) continue - possible_recipes |= recipe - if (!possible_recipes.len) - return null - else if (possible_recipes.len == 1) - return possible_recipes[1] - else //okay, let's select the most complicated recipe - sortTim(possible_recipes, /proc/cmp_recipe_complexity_dsc) - return possible_recipes[1] + // Taken from cmp_recipe_complexity_dsc, but is way faster. + count = LAZYLEN(recipe.items) + LAZYLEN(recipe.reagents) + LAZYLEN(recipe.fruit) + if(count >= highest_count) + highest_count = count + . = recipe // Both of these are just placeholders to allow special behavior for mob holders, but you can do other things in here later if you feel like it. /datum/recipe/proc/before_cook(obj/container) // Called Before the Microwave starts delays and cooking stuff diff --git a/html/changelogs/MDP-recipecleanup.yml b/html/changelogs/MDP-recipecleanup.yml new file mode 100644 index 0000000000..8b9baa99fb --- /dev/null +++ b/html/changelogs/MDP-recipecleanup.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: MoondancerPony + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - experiment: "Hopefully made cooking recipe selection/calculation much faster on the backend." From 9edc46bc4bad18bd820d2f2c0ba3e08fd7c5ada7 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Fri, 18 Jun 2021 20:27:05 -0400 Subject: [PATCH 30/81] Tweaks the denecrotizer Now it should make things with home turfs not go back to them if you revive them --- code/game/objects/items/devices/denecrotizer_vr.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm index ee48820850..ab6234b591 100644 --- a/code/game/objects/items/devices/denecrotizer_vr.dm +++ b/code/game/objects/items/devices/denecrotizer_vr.dm @@ -116,6 +116,7 @@ if(do_after(user, revive_time, exclusive = 1, target = target)) target.faction = user.faction target.revivedby = user.name + target.ai_holder.returns_home = 0 target.revive() target.sight = initial(target.sight) target.see_in_dark = initial(target.see_in_dark) From 48e7b246ac1b2c0db76c7ae676ac842adf1254ff Mon Sep 17 00:00:00 2001 From: VerySoft Date: Fri, 18 Jun 2021 20:45:02 -0400 Subject: [PATCH 31/81] make it false instead --- code/game/objects/items/devices/denecrotizer_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm index ab6234b591..12bfffbacb 100644 --- a/code/game/objects/items/devices/denecrotizer_vr.dm +++ b/code/game/objects/items/devices/denecrotizer_vr.dm @@ -116,7 +116,7 @@ if(do_after(user, revive_time, exclusive = 1, target = target)) target.faction = user.faction target.revivedby = user.name - target.ai_holder.returns_home = 0 + target.ai_holder.returns_home = FALSE target.revive() target.sight = initial(target.sight) target.see_in_dark = initial(target.see_in_dark) From 26b4e8bd4c751444ba955fc8676a81678046f81b Mon Sep 17 00:00:00 2001 From: Atermonera Date: Fri, 18 Jun 2021 19:12:35 -0700 Subject: [PATCH 32/81] Fixes unlocked air alarm uis --- code/game/machinery/air_alarm.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index f330d839f6..741ce1d354 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -568,13 +568,18 @@ var/list/info = alarm_area.air_scrub_info[id_tag] if(!info) continue +<<<<<<< HEAD var/list/list/filters = list() scrubbers.Add(list(list( +======= + scrubbers += list(list( +>>>>>>> a132767... Fixes unlocked air alarm uis (#8149) "id_tag" = id_tag, "long_name" = sanitize(long_name), "power" = info["power"], "scrubbing" = info["scrubbing"], "panic" = info["panic"], +<<<<<<< HEAD "filters" = filters ))) filters.Add(list(list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"]))) @@ -583,6 +588,18 @@ filters.Add(list(list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]))) filters.Add(list(list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]))) filters.Add(list(list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"]))) +======= + "filters" = list( + list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"]), + list("name" = "Nitrogen", "command" = "n2_scrub", "val" = info["filter_n2"]), + list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]), + list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]), + list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]), + list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"]) + ) + )) + data["scrubbers"] = scrubbers +>>>>>>> a132767... Fixes unlocked air alarm uis (#8149) data["mode"] = mode From d1fdc8acf6791d6ecf45ba04e9266afcd062eaa8 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Sat, 19 Jun 2021 13:51:29 +1000 Subject: [PATCH 33/81] Fixes access on turrets Maint access has nothing to do with it, and the rest is just ?! why is it there!? --- maps/tether/tether-05-station1.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index e6514e0fec..af265d452b 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -1427,7 +1427,7 @@ name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61); - req_one_access = list(12) + req_one_access = list() }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -1749,8 +1749,8 @@ desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_y = 29; - req_access = list(); - req_one_access = list(10,12,16,17,61) + req_access = list(61); + req_one_access = list() }, /turf/simulated/floor/tiled/dark, /area/tcommsat/entrance{ From acca3ba61429a7bc3795c7e9eb69aaef6b246a62 Mon Sep 17 00:00:00 2001 From: Verkister Date: Sat, 19 Jun 2021 16:13:45 +0300 Subject: [PATCH 34/81] Fixes observers being able to open vore eggs Being a nosy ghost is even worse when the egg gets noisily smashed open from ghost interaction. --- code/game/objects/items/weapons/storage/egg_vr.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm index f7849040db..3bb085fc6d 100644 --- a/code/game/objects/items/weapons/storage/egg_vr.dm +++ b/code/game/objects/items/weapons/storage/egg_vr.dm @@ -17,6 +17,8 @@ use_sound = 'sound/items/drop/flesh.ogg' /obj/item/weapon/storage/vore_egg/open(mob/user as mob) + if(isobserver(usr)) + return icon = open_egg_icon ..() From 5f60ad40d405d9b2208491a3924059d6bb658513 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:19:04 -0400 Subject: [PATCH 35/81] Update mecha_equipment.dm --- code/game/mecha/equipment/mecha_equipment.dm | 44 +++----------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 57fe74b9ef..976bb17ad1 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -21,15 +21,9 @@ var/energy_drain = 0 var/obj/mecha/chassis = null var/range = MELEE //bitflags -<<<<<<< HEAD - /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. - var/mech_flags = NONE - var/salvageable = 1 -======= /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. var/mech_flags = NONE var/salvageable = TRUE ->>>>>>> f9613f2... Removes Global Iterators (#8146) var/required_type = /obj/mecha //may be either a type or a list of allowed types var/equip_type = null //mechaequip2 var/allow_duplicate = FALSE @@ -235,33 +229,6 @@ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) moveto = moveto || get_turf(chassis) -<<<<<<< HEAD - if(src.Move(moveto)) - chassis.equipment -= src - chassis.universal_equipment -= src - if(equip_type) - switch(equip_type) - if(EQUIP_HULL) - chassis.hull_equipment -= src - if(EQUIP_WEAPON) - chassis.weapon_equipment -= src - if(EQUIP_UTILITY) - chassis.utility_equipment -= src - if(EQUIP_SPECIAL) - chassis.special_equipment -= src - //VOREStation Addition begin: MICROMECHS - if(EQUIP_MICRO_UTILITY) - chassis.micro_utility_equipment -= src - if(EQUIP_MICRO_WEAPON) - chassis.micro_weapon_equipment -= src - //VOREStation Addition end: MICROMECHS - if(chassis.selected == src) - chassis.selected = null - update_chassis_page() - chassis.log_message("[src] removed from equipment.") - chassis = null - set_ready_state(1) -======= forceMove(moveto) chassis.equipment -= src chassis.universal_equipment -= src @@ -275,11 +242,11 @@ chassis.utility_equipment -= src if(EQUIP_SPECIAL) chassis.special_equipment -= src - //VOREStation Addition begin: MICROMECHS - if(EQUIP_MICRO_UTILITY) - chassis.micro_utility_equipment -= src - if(EQUIP_MICRO_WEAPON) - chassis.micro_weapon_equipment -= src + //VOREStation Addition begin: MICROMECHS + if(EQUIP_MICRO_UTILITY) + chassis.micro_utility_equipment -= src + if(EQUIP_MICRO_WEAPON) + chassis.micro_weapon_equipment -= src //VOREStation Addition end: MICROMECHS if(chassis.selected == src) chassis.selected = null @@ -287,7 +254,6 @@ chassis.log_message("[src] removed from equipment.") chassis = null set_ready_state(TRUE) ->>>>>>> f9613f2... Removes Global Iterators (#8146) enable_special = FALSE return From 0cd6824688d1a2f2e5a0460e8e4b8f0a07bc4b07 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:21:13 -0400 Subject: [PATCH 36/81] Update vorestation.dme --- vorestation.dme | 4930 ++++++++--------------------------------------- 1 file changed, 825 insertions(+), 4105 deletions(-) diff --git a/vorestation.dme b/vorestation.dme index 7f6ed911c9..3cf368173a 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1,4051 +1,3 @@ -<<<<<<< HEAD:vorestation.dme -// DM Environment file for baystation12.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. - // New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES -// BEGIN_INCLUDE -#include "code\_away_mission_tests.dm" -#include "code\_macros.dm" -#include "code\_macros_vr.dm" -#include "code\_map_tests.dm" -#include "code\_unit_tests.dm" -#include "code\global.dm" -#include "code\global_init.dm" -#include "code\global_vr.dm" -#include "code\hub.dm" -#include "code\names.dm" -#include "code\stylesheet.dm" -#include "code\world.dm" -#include "code\__datastructures\globals.dm" -#include "code\__defines\__513_compatibility.dm" -#include "code\__defines\_compile_options.dm" -#include "code\__defines\_lists.dm" -#include "code\__defines\_planes+layers.dm" -#include "code\__defines\_planes+layers_vr.dm" -#include "code\__defines\_protect.dm" -#include "code\__defines\_tick.dm" -#include "code\__defines\admin.dm" -#include "code\__defines\admin_vr.dm" -#include "code\__defines\appearance.dm" -#include "code\__defines\atmos.dm" -#include "code\__defines\belly_modes_vr.dm" -#include "code\__defines\callbacks.dm" -#include "code\__defines\chemistry.dm" -#include "code\__defines\chemistry_vr.dm" -#include "code\__defines\color.dm" -#include "code\__defines\construction.dm" -#include "code\__defines\crafting.dm" -#include "code\__defines\damage_organs.dm" -#include "code\__defines\dna.dm" -#include "code\__defines\exosuit_fab.dm" -#include "code\__defines\flags.dm" -#include "code\__defines\gamemode.dm" -#include "code\__defines\holomap.dm" -#include "code\__defines\hoses.dm" -#include "code\__defines\instruments.dm" -#include "code\__defines\integrated_circuits.dm" -#include "code\__defines\inventory_sizes.dm" -#include "code\__defines\is_helpers.dm" -#include "code\__defines\items_clothing.dm" -#include "code\__defines\lighting.dm" -#include "code\__defines\lighting_vr.dm" -#include "code\__defines\machinery.dm" -#include "code\__defines\map.dm" -#include "code\__defines\materials.dm" -#include "code\__defines\math.dm" -#include "code\__defines\math_physics.dm" -#include "code\__defines\MC.dm" -#include "code\__defines\misc.dm" -#include "code\__defines\misc_vr.dm" -#include "code\__defines\mobs.dm" -#include "code\__defines\mobs_vr.dm" -#include "code\__defines\nifsoft.dm" -#include "code\__defines\objects.dm" -#include "code\__defines\overmap.dm" -#include "code\__defines\pda.dm" -#include "code\__defines\planets.dm" -#include "code\__defines\planets_vr.dm" -#include "code\__defines\plants.dm" -#include "code\__defines\preferences.dm" -#include "code\__defines\process_scheduler.dm" -#include "code\__defines\qdel.dm" -#include "code\__defines\research.dm" -#include "code\__defines\roguemining_vr.dm" -#include "code\__defines\rust_g.dm" -#include "code\__defines\shields.dm" -#include "code\__defines\shuttle.dm" -#include "code\__defines\sound.dm" -#include "code\__defines\spaceman_dmm.dm" -#include "code\__defines\species_languages.dm" -#include "code\__defines\species_languages_vr.dm" -#include "code\__defines\sqlite_defines.dm" -#include "code\__defines\stat_tracking.dm" -#include "code\__defines\subsystems.dm" -#include "code\__defines\subsystems_vr.dm" -#include "code\__defines\supply.dm" -#include "code\__defines\targeting.dm" -#include "code\__defines\tgs.config.dm" -#include "code\__defines\tgs.dm" -#include "code\__defines\tgui.dm" -#include "code\__defines\tools.dm" -#include "code\__defines\turfs.dm" -#include "code\__defines\typeids.dm" -#include "code\__defines\unit_tests.dm" -#include "code\__defines\vote.dm" -#include "code\__defines\vv.dm" -#include "code\__defines\webhooks.dm" -#include "code\__defines\wires.dm" -#include "code\__defines\xenoarcheaology.dm" -#include "code\__defines\ZAS.dm" -#include "code\__defines\dcs\flags.dm" -#include "code\__defines\dcs\helpers.dm" -#include "code\__defines\dcs\signals.dm" -#include "code\_compatibility\509\_JSON.dm" -#include "code\_compatibility\509\JSON Reader.dm" -#include "code\_compatibility\509\JSON Writer.dm" -#include "code\_compatibility\509\text.dm" -#include "code\_compatibility\509\type2type.dm" -#include "code\_global_vars\bitfields.dm" -#include "code\_global_vars\misc.dm" -#include "code\_global_vars\mobs.dm" -#include "code\_global_vars\religion.dm" -#include "code\_global_vars\sensitive.dm" -#include "code\_global_vars\typecache.dm" -#include "code\_global_vars\lists\mapping.dm" -#include "code\_global_vars\lists\misc.dm" -#include "code\_global_vars\lists\species.dm" -#include "code\_helpers\_global_objects.dm" -#include "code\_helpers\_global_objects_vr.dm" -#include "code\_helpers\_lists.dm" -#include "code\_helpers\atmospherics.dm" -#include "code\_helpers\atom_movables.dm" -#include "code\_helpers\events.dm" -#include "code\_helpers\files.dm" -#include "code\_helpers\game.dm" -#include "code\_helpers\global_lists.dm" -#include "code\_helpers\global_lists_vr.dm" -#include "code\_helpers\icons.dm" -#include "code\_helpers\icons_vr.dm" -#include "code\_helpers\lighting.dm" -#include "code\_helpers\logging.dm" -#include "code\_helpers\logging_vr.dm" -#include "code\_helpers\matrices.dm" -#include "code\_helpers\mobs.dm" -#include "code\_helpers\names.dm" -#include "code\_helpers\sanitize_values.dm" -#include "code\_helpers\storage.dm" -#include "code\_helpers\string_lists.dm" -#include "code\_helpers\text.dm" -#include "code\_helpers\time.dm" -#include "code\_helpers\turfs.dm" -#include "code\_helpers\type2type.dm" -#include "code\_helpers\unsorted.dm" -#include "code\_helpers\unsorted_vr.dm" -#include "code\_helpers\view.dm" -#include "code\_helpers\visual_filters.dm" -#include "code\_helpers\sorts\__main.dm" -#include "code\_helpers\sorts\comparators.dm" -#include "code\_helpers\sorts\TimSort.dm" -#include "code\_onclick\_defines.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\rig.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\_defines_vr.dm" -#include "code\_onclick\hud\ability_screen_objects.dm" -#include "code\_onclick\hud\action.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alert_vr.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\gun_mode.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\map_popups.dm" -#include "code\_onclick\hud\minihud.dm" -#include "code\_onclick\hud\minihud_mapper.dm" -#include "code\_onclick\hud\minihud_rigmech.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\other_mobs.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\radial_persistent.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\robot_vr.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\screen_objects_vr.dm" -#include "code\_onclick\hud\skybox.dm" -#include "code\_onclick\hud\soulcatcher_guest.dm" -#include "code\_onclick\hud\spell_screen_objects.dm" -#include "code\ATMOSPHERICS\_atmos_setup.dm" -#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" -#include "code\ATMOSPHERICS\atmospherics.dm" -#include "code\ATMOSPHERICS\datum_pipe_network.dm" -#include "code\ATMOSPHERICS\datum_pipeline.dm" -#include "code\ATMOSPHERICS\mainspipe.dm" -#include "code\ATMOSPHERICS\components\portables_connector.dm" -#include "code\ATMOSPHERICS\components\shutoff.dm" -#include "code\ATMOSPHERICS\components\tvalve.dm" -#include "code\ATMOSPHERICS\components\valve.dm" -#include "code\ATMOSPHERICS\components\binary_devices\algae_generator_vr.dm" -#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" -#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" -#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" -#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" -#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" -#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" -#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" -#include "code\ATMOSPHERICS\components\unary\generator_input.dm" -#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" -#include "code\ATMOSPHERICS\components\unary\heat_source.dm" -#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" -#include "code\ATMOSPHERICS\components\unary\oxygen_generator.dm" -#include "code\ATMOSPHERICS\components\unary\unary_base.dm" -#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber_vr.dm" -#include "code\ATMOSPHERICS\pipes\cap.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes_vr.dm" -#include "code\ATMOSPHERICS\pipes\manifold.dm" -#include "code\ATMOSPHERICS\pipes\manifold4w.dm" -#include "code\ATMOSPHERICS\pipes\pipe_base.dm" -#include "code\ATMOSPHERICS\pipes\pipe_base_vr.dm" -#include "code\ATMOSPHERICS\pipes\simple.dm" -#include "code\ATMOSPHERICS\pipes\tank.dm" -#include "code\ATMOSPHERICS\pipes\tank_vr.dm" -#include "code\ATMOSPHERICS\pipes\universal.dm" -#include "code\ATMOSPHERICS\pipes\vent.dm" -#include "code\controllers\autotransfer.dm" -#include "code\controllers\communications.dm" -#include "code\controllers\configuration.dm" -#include "code\controllers\configuration_vr.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\emergency_shuttle_controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\master_controller.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\verbs.dm" -#include "code\controllers\observer_listener\atom\observer.dm" -#include "code\controllers\subsystems\ai.dm" -#include "code\controllers\subsystems\aifast.dm" -#include "code\controllers\subsystems\air.dm" -#include "code\controllers\subsystems\airflow.dm" -#include "code\controllers\subsystems\alarm.dm" -#include "code\controllers\subsystems\assets.dm" -#include "code\controllers\subsystems\atoms.dm" -#include "code\controllers\subsystems\character_setup.dm" -#include "code\controllers\subsystems\chat.dm" -#include "code\controllers\subsystems\chemistry.dm" -#include "code\controllers\subsystems\circuits.dm" -#include "code\controllers\subsystems\dcs.dm" -#include "code\controllers\subsystems\events.dm" -#include "code\controllers\subsystems\garbage.dm" -#include "code\controllers\subsystems\holomaps.dm" -#include "code\controllers\subsystems\inactivity.dm" -#include "code\controllers\subsystems\job.dm" -#include "code\controllers\subsystems\lighting.dm" -#include "code\controllers\subsystems\machines.dm" -#include "code\controllers\subsystems\mapping.dm" -#include "code\controllers\subsystems\media_tracks.dm" -#include "code\controllers\subsystems\mobs.dm" -#include "code\controllers\subsystems\nightshift.dm" -#include "code\controllers\subsystems\open_space.dm" -#include "code\controllers\subsystems\orbits.dm" -#include "code\controllers\subsystems\overlays.dm" -#include "code\controllers\subsystems\persist_vr.dm" -#include "code\controllers\subsystems\persistence.dm" -#include "code\controllers\subsystems\planets.dm" -#include "code\controllers\subsystems\plants.dm" -#include "code\controllers\subsystems\radiation.dm" -#include "code\controllers\subsystems\shuttles.dm" -#include "code\controllers\subsystems\skybox.dm" -#include "code\controllers\subsystems\sounds.dm" -#include "code\controllers\subsystems\sqlite.dm" -#include "code\controllers\subsystems\sun.dm" -#include "code\controllers\subsystems\supply.dm" -#include "code\controllers\subsystems\tgui.dm" -#include "code\controllers\subsystems\ticker.dm" -#include "code\controllers\subsystems\time_track.dm" -#include "code\controllers\subsystems\timer.dm" -#include "code\controllers\subsystems\transcore_vr.dm" -#include "code\controllers\subsystems\vis_overlays.dm" -#include "code\controllers\subsystems\vote.dm" -#include "code\controllers\subsystems\webhooks.dm" -#include "code\controllers\subsystems\xenoarch.dm" -#include "code\controllers\subsystems\processing\bellies_vr.dm" -#include "code\controllers\subsystems\processing\fastprocess.dm" -#include "code\controllers\subsystems\processing\instruments.dm" -#include "code\controllers\subsystems\processing\obj.dm" -#include "code\controllers\subsystems\processing\processing.dm" -#include "code\controllers\subsystems\processing\projectiles.dm" -#include "code\controllers\subsystems\processing\turfs.dm" -#include "code\datums\ai_law_sets.dm" -#include "code\datums\ai_law_sets_vr.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\category.dm" -#include "code\datums\chat_message.dm" -#include "code\datums\computerfiles.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\EPv2.dm" -#include "code\datums\ghost_query.dm" -#include "code\datums\ghost_query_vr.dm" -#include "code\datums\hierarchy.dm" -#include "code\datums\mind.dm" -#include "code\datums\mind_vr.dm" -#include "code\datums\mixed.dm" -#include "code\datums\modules.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\orbit.dm" -#include "code\datums\organs.dm" -#include "code\datums\position_point_vector.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\riding.dm" -#include "code\datums\soul_link.dm" -#include "code\datums\sun.dm" -#include "code\datums\weakref.dm" -#include "code\datums\autolathe\arms.dm" -#include "code\datums\autolathe\arms_vr.dm" -#include "code\datums\autolathe\autolathe.dm" -#include "code\datums\autolathe\devices.dm" -#include "code\datums\autolathe\devices_vr.dm" -#include "code\datums\autolathe\engineering.dm" -#include "code\datums\autolathe\engineering_vr.dm" -#include "code\datums\autolathe\general.dm" -#include "code\datums\autolathe\general_vr.dm" -#include "code\datums\autolathe\materials.dm" -#include "code\datums\autolathe\medical.dm" -#include "code\datums\autolathe\medical_vr.dm" -#include "code\datums\autolathe\tools.dm" -#include "code\datums\autolathe\tools_vr.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\overlay_lighting.dm" -#include "code\datums\components\resize_guard.dm" -#include "code\datums\components\crafting\crafting.dm" -#include "code\datums\components\crafting\crafting_external.dm" -#include "code\datums\components\crafting\recipes.dm" -#include "code\datums\components\crafting\tool_quality.dm" -#include "code\datums\elements\_element.dm" -#include "code\datums\elements\light_blocking.dm" -#include "code\datums\game_masters\_common.dm" -#include "code\datums\helper_datums\construction_datum.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\getrev.dm" -#include "code\datums\helper_datums\global_iterator.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\teleport_vr.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\locations\locations.dm" -#include "code\datums\locations\nyx.dm" -#include "code\datums\locations\qerrvallis.dm" -#include "code\datums\locations\s_randarr.dm" -#include "code\datums\locations\sol.dm" -#include "code\datums\locations\tau_ceti.dm" -#include "code\datums\locations\uueoa_esa.dm" -#include "code\datums\locations\vir.dm" -#include "code\datums\looping_sounds\_looping_sound.dm" -#include "code\datums\looping_sounds\item_sounds.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\sequence.dm" -#include "code\datums\looping_sounds\weather_sounds.dm" -#include "code\datums\managed_browsers\_managed_browser.dm" -#include "code\datums\managed_browsers\feedback_form.dm" -#include "code\datums\managed_browsers\feedback_viewer.dm" -#include "code\datums\observation\_debug.dm" -#include "code\datums\observation\_defines.dm" -#include "code\datums\observation\destroyed.dm" -#include "code\datums\observation\dir_set.dm" -#include "code\datums\observation\equipped.dm" -#include "code\datums\observation\helpers.dm" -#include "code\datums\observation\logged_in.dm" -#include "code\datums\observation\moved.dm" -#include "code\datums\observation\observation.dm" -#include "code\datums\observation\power_change.dm" -#include "code\datums\observation\shuttle_added.dm" -#include "code\datums\observation\shuttle_moved.dm" -#include "code\datums\observation\stat_set.dm" -#include "code\datums\observation\turf_changed.dm" -#include "code\datums\observation\turf_enterexit.dm" -#include "code\datums\observation\unequipped.dm" -#include "code\datums\observation\z_moved.dm" -#include "code\datums\observation\~cleanup.dm" -#include "code\datums\outfits\_defines.dm" -#include "code\datums\outfits\horror_killers.dm" -#include "code\datums\outfits\misc.dm" -#include "code\datums\outfits\nanotrasen.dm" -#include "code\datums\outfits\outfit.dm" -#include "code\datums\outfits\outfit_vr.dm" -#include "code\datums\outfits\pirates.dm" -#include "code\datums\outfits\spec_op.dm" -#include "code\datums\outfits\tournament.dm" -#include "code\datums\outfits\wizardry.dm" -#include "code\datums\outfits\costumes\costume.dm" -#include "code\datums\outfits\costumes\halloween.dm" -#include "code\datums\outfits\jobs\cargo.dm" -#include "code\datums\outfits\jobs\civilian.dm" -#include "code\datums\outfits\jobs\civilian_vr.dm" -#include "code\datums\outfits\jobs\command.dm" -#include "code\datums\outfits\jobs\command_vr.dm" -#include "code\datums\outfits\jobs\engineering.dm" -#include "code\datums\outfits\jobs\job.dm" -#include "code\datums\outfits\jobs\medical.dm" -#include "code\datums\outfits\jobs\medical_vr.dm" -#include "code\datums\outfits\jobs\misc.dm" -#include "code\datums\outfits\jobs\science.dm" -#include "code\datums\outfits\jobs\science_vr.dm" -#include "code\datums\outfits\jobs\security.dm" -#include "code\datums\outfits\jobs\special_vr.dm" -#include "code\datums\outfits\military\fleet.dm" -#include "code\datums\outfits\military\marines.dm" -#include "code\datums\outfits\military\military.dm" -#include "code\datums\outfits\military\sifguard.dm" -#include "code\datums\repositories\ammomaterial.dm" -#include "code\datums\repositories\cameras.dm" -#include "code\datums\repositories\crew.dm" -#include "code\datums\repositories\decls.dm" -#include "code\datums\repositories\repository.dm" -#include "code\datums\repositories\unique.dm" -#include "code\datums\roundstats\_defines_local.dm" -#include "code\datums\roundstats\departmentgoal.dm" -#include "code\datums\roundstats\roundstats.dm" -#include "code\datums\supplypacks\atmospherics.dm" -#include "code\datums\supplypacks\contraband.dm" -#include "code\datums\supplypacks\contraband_vr.dm" -#include "code\datums\supplypacks\costumes.dm" -#include "code\datums\supplypacks\costumes_vr.dm" -#include "code\datums\supplypacks\engineering.dm" -#include "code\datums\supplypacks\engineering_vr.dm" -#include "code\datums\supplypacks\hospitality.dm" -#include "code\datums\supplypacks\hospitality_vr.dm" -#include "code\datums\supplypacks\hydroponics.dm" -#include "code\datums\supplypacks\hydroponics_vr.dm" -#include "code\datums\supplypacks\materials.dm" -#include "code\datums\supplypacks\medical.dm" -#include "code\datums\supplypacks\medical_vr.dm" -#include "code\datums\supplypacks\misc.dm" -#include "code\datums\supplypacks\misc_vr.dm" -#include "code\datums\supplypacks\munitions.dm" -#include "code\datums\supplypacks\munitions_vr.dm" -#include "code\datums\supplypacks\musical.dm" -#include "code\datums\supplypacks\recreation.dm" -#include "code\datums\supplypacks\recreation_vr.dm" -#include "code\datums\supplypacks\robotics.dm" -#include "code\datums\supplypacks\robotics_vr.dm" -#include "code\datums\supplypacks\science.dm" -#include "code\datums\supplypacks\science_vr.dm" -#include "code\datums\supplypacks\security.dm" -#include "code\datums\supplypacks\security_vr.dm" -#include "code\datums\supplypacks\supply.dm" -#include "code\datums\supplypacks\supply_vr.dm" -#include "code\datums\supplypacks\supplypacks.dm" -#include "code\datums\supplypacks\voidsuits.dm" -#include "code\datums\supplypacks\voidsuits_vr.dm" -#include "code\datums\underwear\bottom.dm" -#include "code\datums\underwear\socks.dm" -#include "code\datums\underwear\top.dm" -#include "code\datums\underwear\undershirts.dm" -#include "code\datums\underwear\underwear.dm" -#include "code\datums\uplink\ammunition.dm" -#include "code\datums\uplink\ammunition_vr.dm" -#include "code\datums\uplink\announcements.dm" -#include "code\datums\uplink\armor.dm" -#include "code\datums\uplink\backup.dm" -#include "code\datums\uplink\badassery.dm" -#include "code\datums\uplink\grenades.dm" -#include "code\datums\uplink\hardsuit_modules.dm" -#include "code\datums\uplink\implants.dm" -#include "code\datums\uplink\medical.dm" -#include "code\datums\uplink\medical_vr.dm" -#include "code\datums\uplink\resources.dm" -#include "code\datums\uplink\stealth_items.dm" -#include "code\datums\uplink\stealthy_weapons.dm" -#include "code\datums\uplink\telecrystals.dm" -#include "code\datums\uplink\tools.dm" -#include "code\datums\uplink\tools_vr.dm" -#include "code\datums\uplink\uplink_categories.dm" -#include "code\datums\uplink\uplink_items.dm" -#include "code\datums\uplink\visible_weapons.dm" -#include "code\datums\uplink\visible_weapons_vr.dm" -#include "code\datums\vending\stored_item.dm" -#include "code\datums\vending\vending.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\grid_checker.dm" -#include "code\datums\wires\jukebox.dm" -#include "code\datums\wires\mines.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\seedstorage.dm" -#include "code\datums\wires\shield_generator.dm" -#include "code\datums\wires\smartfridge.dm" -#include "code\datums\wires\smes.dm" -#include "code\datums\wires\suit_storage_unit.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\datums\wires\wires.dm" -#include "code\defines\gases.dm" -#include "code\defines\obj.dm" -#include "code\defines\obj\weapon.dm" -#include "code\defines\procs\announce.dm" -#include "code\defines\procs\AStar.dm" -#include "code\defines\procs\dbcore.dm" -#include "code\defines\procs\radio.dm" -#include "code\defines\procs\sd_Alert.dm" -#include "code\defines\procs\statistics.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\atoms_movable_vr.dm" -#include "code\game\base_turf.dm" -#include "code\game\periodic_news.dm" -#include "code\game\response_team.dm" -#include "code\game\response_team_vr.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\skincmd.dm" -#include "code\game\sound.dm" -#include "code\game\trader_visit.dm" -#include "code\game\trader_visit_vr.dm" -#include "code\game\world.dm" -#include "code\game\antagonist\_antagonist_setup.dm" -#include "code\game\antagonist\antagonist.dm" -#include "code\game\antagonist\antagonist_add.dm" -#include "code\game\antagonist\antagonist_create.dm" -#include "code\game\antagonist\antagonist_equip.dm" -#include "code\game\antagonist\antagonist_factions.dm" -#include "code\game\antagonist\antagonist_helpers.dm" -#include "code\game\antagonist\antagonist_objectives.dm" -#include "code\game\antagonist\antagonist_panel.dm" -#include "code\game\antagonist\antagonist_place.dm" -#include "code\game\antagonist\antagonist_print.dm" -#include "code\game\antagonist\antagonist_update.dm" -#include "code\game\antagonist\alien\borer.dm" -#include "code\game\antagonist\alien\xenomorph.dm" -#include "code\game\antagonist\outsider\commando.dm" -#include "code\game\antagonist\outsider\deathsquad.dm" -#include "code\game\antagonist\outsider\ert.dm" -#include "code\game\antagonist\outsider\ert_vr.dm" -#include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\ninja.dm" -#include "code\game\antagonist\outsider\raider.dm" -#include "code\game\antagonist\outsider\technomancer.dm" -#include "code\game\antagonist\outsider\trader.dm" -#include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\changeling.dm" -#include "code\game\antagonist\station\cultist.dm" -#include "code\game\antagonist\station\highlander.dm" -#include "code\game\antagonist\station\infiltrator.dm" -#include "code\game\antagonist\station\loyalist.dm" -#include "code\game\antagonist\station\renegade.dm" -#include "code\game\antagonist\station\revolutionary.dm" -#include "code\game\antagonist\station\rogue_ai.dm" -#include "code\game\antagonist\station\stowaway.dm" -#include "code\game\antagonist\station\thug.dm" -#include "code\game\antagonist\station\traitor.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\areas_vr.dm" -#include "code\game\area\asteroid_areas.dm" -#include "code\game\area\Away Mission areas.dm" -#include "code\game\area\Space Station 13 areas.dm" -#include "code\game\area\Space Station 13 areas_vr.dm" -#include "code\game\area\ss13_deprecated_areas.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\dna_modifier.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\powers.dm" -#include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\game_mode_latespawn.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\calamity\calamity.dm" -#include "code\game\gamemodes\changeling\absorbed_dna.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\changeling_powers.dm" -#include "code\game\gamemodes\changeling\generic_equip_procs.dm" -#include "code\game\gamemodes\changeling\modularchangling.dm" -#include "code\game\gamemodes\changeling\powers\absorb.dm" -#include "code\game\gamemodes\changeling\powers\armblade.dm" -#include "code\game\gamemodes\changeling\powers\armor.dm" -#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" -#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" -#include "code\game\gamemodes\changeling\powers\blind_sting.dm" -#include "code\game\gamemodes\changeling\powers\boost_range.dm" -#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" -#include "code\game\gamemodes\changeling\powers\darkvision.dm" -#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" -#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" -#include "code\game\gamemodes\changeling\powers\digital_camo.dm" -#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" -#include "code\game\gamemodes\changeling\powers\endoarmor.dm" -#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" -#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" -#include "code\game\gamemodes\changeling\powers\enrage.dm" -#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" -#include "code\game\gamemodes\changeling\powers\escape_restraints.dm" -#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" -#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" -#include "code\game\gamemodes\changeling\powers\fake_death.dm" -#include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" -#include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" -#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" -#include "code\game\gamemodes\changeling\powers\respec.dm" -#include "code\game\gamemodes\changeling\powers\revive.dm" -#include "code\game\gamemodes\changeling\powers\self_respiration.dm" -#include "code\game\gamemodes\changeling\powers\shriek.dm" -#include "code\game\gamemodes\changeling\powers\silence_sting.dm" -#include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" -#include "code\game\gamemodes\cult\construct_spells.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\hell_universe.dm" -#include "code\game\gamemodes\cult\narsie.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\soulstone.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\cult\cultify\mob.dm" -#include "code\game\gamemodes\cult\cultify\obj.dm" -#include "code\game\gamemodes\cult\cultify\turf.dm" -#include "code\game\gamemodes\endgame\endgame.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" -#include "code\game\gamemodes\events\black_hole.dm" -#include "code\game\gamemodes\events\clang.dm" -#include "code\game\gamemodes\events\dust.dm" -#include "code\game\gamemodes\events\power_failure.dm" -#include "code\game\gamemodes\events\wormholes.dm" -#include "code\game\gamemodes\events\holidays\Christmas.dm" -#include "code\game\gamemodes\events\holidays\Holidays.dm" -#include "code\game\gamemodes\events\holidays\Other.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\infiltrator\infiltrator.dm" -#include "code\game\gamemodes\malfunction\malf_hardware.dm" -#include "code\game\gamemodes\malfunction\malf_research.dm" -#include "code\game\gamemodes\malfunction\malf_research_ability.dm" -#include "code\game\gamemodes\malfunction\malfunction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\meteor\meteors_vr.dm" -#include "code\game\gamemodes\mixed\conflux.dm" -#include "code\game\gamemodes\mixed\infestation.dm" -#include "code\game\gamemodes\mixed\intrigue.dm" -#include "code\game\gamemodes\mixed\lizard.dm" -#include "code\game\gamemodes\mixed\mercrenegade.dm" -#include "code\game\gamemodes\mixed\mercwiz.dm" -#include "code\game\gamemodes\mixed\paranoia.dm" -#include "code\game\gamemodes\mixed\traitorling.dm" -#include "code\game\gamemodes\mixed\traitorrenegade.dm" -#include "code\game\gamemodes\mixed\uprising.dm" -#include "code\game\gamemodes\mixed\visitors.dm" -#include "code\game\gamemodes\ninja\ninja.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\nuclear\pinpointer.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\technomancer\catalog.dm" -#include "code\game\gamemodes\technomancer\clothing.dm" -#include "code\game\gamemodes\technomancer\core_obj.dm" -#include "code\game\gamemodes\technomancer\equipment.dm" -#include "code\game\gamemodes\technomancer\instability.dm" -#include "code\game\gamemodes\technomancer\spell_objs.dm" -#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" -#include "code\game\gamemodes\technomancer\technomancer.dm" -#include "code\game\gamemodes\technomancer\assistance\assistance.dm" -#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" -#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" -#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" -#include "code\game\gamemodes\technomancer\devices\hypos.dm" -#include "code\game\gamemodes\technomancer\devices\implants.dm" -#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" -#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" -#include "code\game\gamemodes\technomancer\spells\abjuration.dm" -#include "code\game\gamemodes\technomancer\spells\apportation.dm" -#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" -#include "code\game\gamemodes\technomancer\spells\blink.dm" -#include "code\game\gamemodes\technomancer\spells\chroma.dm" -#include "code\game\gamemodes\technomancer\spells\condensation.dm" -#include "code\game\gamemodes\technomancer\spells\control.dm" -#include "code\game\gamemodes\technomancer\spells\dispel.dm" -#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" -#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" -#include "code\game\gamemodes\technomancer\spells\gambit.dm" -#include "code\game\gamemodes\technomancer\spells\illusion.dm" -#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" -#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" -#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" -#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" -#include "code\game\gamemodes\technomancer\spells\passwall.dm" -#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" -#include "code\game\gamemodes\technomancer\spells\radiance.dm" -#include "code\game\gamemodes\technomancer\spells\reflect.dm" -#include "code\game\gamemodes\technomancer\spells\resurrect.dm" -#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" -#include "code\game\gamemodes\technomancer\spells\shield.dm" -#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" -#include "code\game\gamemodes\technomancer\spells\track.dm" -#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" -#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_all.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\purify.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\lesser_chain_lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon_ward.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\jobs\_access_defs.dm" -#include "code\game\jobs\access.dm" -#include "code\game\jobs\access_datum.dm" -#include "code\game\jobs\access_datum_vr.dm" -#include "code\game\jobs\job_controller.dm" -#include "code\game\jobs\jobs.dm" -#include "code\game\jobs\whitelist.dm" -#include "code\game\jobs\whitelist_vr.dm" -#include "code\game\jobs\job\_alt_title.dm" -#include "code\game\jobs\job\assistant.dm" -#include "code\game\jobs\job\assistant_vr.dm" -#include "code\game\jobs\job\captain.dm" -#include "code\game\jobs\job\captain_vr.dm" -#include "code\game\jobs\job\civilian.dm" -#include "code\game\jobs\job\civilian_chaplain.dm" -#include "code\game\jobs\job\civilian_vr.dm" -#include "code\game\jobs\job\department.dm" -#include "code\game\jobs\job\department_vr.dm" -#include "code\game\jobs\job\engineering.dm" -#include "code\game\jobs\job\engineering_vr.dm" -#include "code\game\jobs\job\exploration_vr.dm" -#include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\job_vr.dm" -#include "code\game\jobs\job\medical.dm" -#include "code\game\jobs\job\medical_vr.dm" -#include "code\game\jobs\job\offduty_vr.dm" -#include "code\game\jobs\job\science.dm" -#include "code\game\jobs\job\science_vr.dm" -#include "code\game\jobs\job\security.dm" -#include "code\game\jobs\job\security_vr.dm" -#include "code\game\jobs\job\silicon.dm" -#include "code\game\jobs\job\silicon_vr.dm" -#include "code\game\jobs\job\special_vr.dm" -#include "code\game\machinery\adv_med.dm" -#include "code\game\machinery\adv_med_vr.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\air_alarm.dm" -#include "code\game\machinery\airconditioner_vr.dm" -#include "code\game\machinery\atmo_control.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\biogenerator.dm" -#include "code\game\machinery\bioprinter.dm" -#include "code\game\machinery\bomb_tester_vr.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\buttons_vr.dm" -#include "code\game\machinery\CableLayer.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\cryo.dm" -#include "code\game\machinery\cryopod.dm" -#include "code\game\machinery\cryopod_vr.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\deployable_vr.dm" -#include "code\game\machinery\door_control.dm" -#include "code\game\machinery\doorbell_vr.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\exonet_node.dm" -#include "code\game\machinery\fire_alarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\floodlight.dm" -#include "code\game\machinery\floor_light.dm" -#include "code\game\machinery\floorlayer.dm" -#include "code\game\machinery\frame.dm" -#include "code\game\machinery\gear_dispenser.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\holoposter.dm" -#include "code\game\machinery\holosign.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\jukebox.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\machinery.dm" -#include "code\game\machinery\machinery_power.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\neonsign.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\nuclear_bomb.dm" -#include "code\game\machinery\OpTable.dm" -#include "code\game\machinery\overview.dm" -#include "code\game\machinery\oxygen_pump.dm" -#include "code\game\machinery\painter_vr.dm" -#include "code\game\machinery\partslathe_vr.dm" -#include "code\game\machinery\pda_multicaster.dm" -#include "code\game\machinery\pointdefense.dm" -#include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\portable_turret_vr.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\requests_console_vr.dm" -#include "code\game\machinery\robot_fabricator.dm" -#include "code\game\machinery\seed_extractor.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\status_display_ai.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\suit_storage_unit_vr.dm" -#include "code\game\machinery\supply_display.dm" -#include "code\game\machinery\supplybeacon.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebeacon_vr.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transportpod.dm" -#include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\vending_machines_vr.dm" -#include "code\game\machinery\vitals_monitor.dm" -#include "code\game\machinery\wall_frames.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer_vr.dm" -#include "code\game\machinery\atmoalter\canister.dm" -#include "code\game\machinery\atmoalter\clamp.dm" -#include "code\game\machinery\atmoalter\meter.dm" -#include "code\game\machinery\atmoalter\portable_atmospherics.dm" -#include "code\game\machinery\atmoalter\pump.dm" -#include "code\game\machinery\atmoalter\pump_vr.dm" -#include "code\game\machinery\atmoalter\scrubber.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\camera_vr.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\ai_core.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\arcade_vr.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_vr.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\guestpass.dm" -#include "code\game\machinery\computer\id_restorer_vr.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\message.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\prisoner.dm" -#include "code\game\machinery\computer\prisonshuttle.dm" -#include "code\game\machinery\computer\RCON_Console.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\shutoff_monitor.dm" -#include "code\game\machinery\computer\shuttle.dm" -#include "code\game\machinery\computer\skills.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\supply.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer\timeclock_vr.dm" -#include "code\game\machinery\computer\~computer_vr.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_control.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_vr.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\blast_door.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\door_vr.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\firedoor_assembly.dm" -#include "code\game\machinery\doors\firedoor_vr.dm" -#include "code\game\machinery\doors\multi_tile.dm" -#include "code\game\machinery\doors\multi_tile_vr.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" -#include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\docking_program.dm" -#include "code\game\machinery\embedded_controller\docking_program_multi.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\embedded_controller\mapping_helpers.dm" -#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" -#include "code\game\machinery\event\stage_vr.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\pipe\pipe_recipes.dm" -#include "code\game\machinery\pipe\pipelayer.dm" -#include "code\game\machinery\reagents\pump.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\broadcaster_vr.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\presets.dm" -#include "code\game\machinery\telecomms\presets_vr.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" -#include "code\game\machinery\virtual_reality\ar_console.dm" -#include "code\game\machinery\virtual_reality\vr_console.dm" -#include "code\game\magic\Uristrunes.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mech_prosthetics.dm" -#include "code\game\mecha\mech_sensor.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_appearance.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_helpers.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_vr.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\fighter.dm" -#include "code\game\mecha\combat\gorilla.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\components\_component.dm" -#include "code\game\mecha\components\actuators.dm" -#include "code\game\mecha\components\armor.dm" -#include "code\game\mecha\components\electrical.dm" -#include "code\game\mecha\components\hull.dm" -#include "code\game\mecha\components\lifesupport.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm" -#include "code\game\mecha\equipment\tools\armor_melee.dm" -#include "code\game\mecha\equipment\tools\armor_ranged.dm" -#include "code\game\mecha\equipment\tools\cable_layer.dm" -#include "code\game\mecha\equipment\tools\catapult.dm" -#include "code\game\mecha\equipment\tools\clamp.dm" -#include "code\game\mecha\equipment\tools\cloak.dm" -#include "code\game\mecha\equipment\tools\drill.dm" -#include "code\game\mecha\equipment\tools\energy_relay.dm" -#include "code\game\mecha\equipment\tools\extinguisher.dm" -#include "code\game\mecha\equipment\tools\generator.dm" -#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" -#include "code\game\mecha\equipment\tools\inflatables.dm" -#include "code\game\mecha\equipment\tools\jetpack.dm" -#include "code\game\mecha\equipment\tools\medigun_vr.dm" -#include "code\game\mecha\equipment\tools\orescanner.dm" -#include "code\game\mecha\equipment\tools\passenger.dm" -#include "code\game\mecha\equipment\tools\powertool.dm" -#include "code\game\mecha\equipment\tools\rcd.dm" -#include "code\game\mecha\equipment\tools\repair_droid.dm" -#include "code\game\mecha\equipment\tools\running_board.dm" -#include "code\game\mecha\equipment\tools\shield.dm" -#include "code\game\mecha\equipment\tools\shield_omni.dm" -#include "code\game\mecha\equipment\tools\sleeper.dm" -#include "code\game\mecha\equipment\tools\speedboost.dm" -#include "code\game\mecha\equipment\tools\syringe_gun.dm" -#include "code\game\mecha\equipment\tools\teleporter.dm" -#include "code\game\mecha\equipment\tools\tools.dm" -#include "code\game\mecha\equipment\tools\weldinglaser.dm" -#include "code\game\mecha\equipment\tools\wormhole.dm" -#include "code\game\mecha\equipment\weapons\honk.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm" -#include "code\game\mecha\equipment\weapons\ballistic\ballistic.dm" -#include "code\game\mecha\equipment\weapons\ballistic\mortar.dm" -#include "code\game\mecha\equipment\weapons\ballistic\shotgun.dm" -#include "code\game\mecha\equipment\weapons\defense\shocker.dm" -#include "code\game\mecha\equipment\weapons\energy\energy.dm" -#include "code\game\mecha\equipment\weapons\energy\ion.dm" -#include "code\game\mecha\equipment\weapons\energy\laser.dm" -#include "code\game\mecha\equipment\weapons\energy\phased.dm" -#include "code\game\mecha\equipment\weapons\energy\pulse.dm" -#include "code\game\mecha\equipment\weapons\energy\stun.dm" -#include "code\game\mecha\equipment\weapons\explosive\grenade.dm" -#include "code\game\mecha\equipment\weapons\explosive\missile.dm" -#include "code\game\mecha\equipment\weapons\fire\flamethrower.dm" -#include "code\game\mecha\equipment\weapons\fire\incendiary.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\medical\odysseus_vr.dm" -#include "code\game\mecha\micro\mecha_construction_paths_vr.dm" -#include "code\game\mecha\micro\mecha_parts_vr.dm" -#include "code\game\mecha\micro\mecha_vr.dm" -#include "code\game\mecha\micro\mechfab_designs_vr.dm" -#include "code\game\mecha\micro\micro.dm" -#include "code\game\mecha\micro\micro_equipment.dm" -#include "code\game\mecha\micro\security.dm" -#include "code\game\mecha\micro\utility.dm" -#include "code\game\mecha\space\hoverpod.dm" -#include "code\game\mecha\space\shuttle.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\ripley_vr.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\banners.dm" -#include "code\game\objects\banners_vr.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\explosion.dm" -#include "code\game\objects\explosion_recursive.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\mob_spawner_vr.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\stumble_into_vr.dm" -#include "code\game\objects\weapons.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\confetti_vr.dm" -#include "code\game\objects\effects\effect_system.dm" -#include "code\game\objects\effects\explosion_particles.dm" -#include "code\game\objects\effects\gibs.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\item_pickup_ghost.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\landmarks_vr.dm" -#include "code\game\objects\effects\manifest.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\semirandom_mobs_vr.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\spiders_vr.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\zone_divider.dm" -#include "code\game\objects\effects\alien\aliens.dm" -#include "code\game\objects\effects\chem\chemsmoke.dm" -#include "code\game\objects\effects\chem\coating.dm" -#include "code\game\objects\effects\chem\foam.dm" -#include "code\game\objects\effects\chem\foam_vr.dm" -#include "code\game\objects\effects\chem\water.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\contraband.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\warning_stripes.dm" -#include "code\game\objects\effects\decals\Cleanable\aliens.dm" -#include "code\game\objects\effects\decals\Cleanable\fuel.dm" -#include "code\game\objects\effects\decals\Cleanable\humans.dm" -#include "code\game\objects\effects\decals\Cleanable\misc.dm" -#include "code\game\objects\effects\decals\Cleanable\robots.dm" -#include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\posters\bs12.dm" -#include "code\game\objects\effects\decals\posters\polarisposters.dm" -#include "code\game\objects\effects\decals\posters\polarisposters_vr.dm" -#include "code\game\objects\effects\decals\posters\tgposters.dm" -#include "code\game\objects\effects\decals\posters\voreposters_vr.dm" -#include "code\game\objects\effects\map_effects\beam_point.dm" -#include "code\game\objects\effects\map_effects\effect_emitter.dm" -#include "code\game\objects\effects\map_effects\map_effects.dm" -#include "code\game\objects\effects\map_effects\perma_light.dm" -#include "code\game\objects\effects\map_effects\portal.dm" -#include "code\game\objects\effects\map_effects\radiation_emitter.dm" -#include "code\game\objects\effects\map_effects\screen_shaker.dm" -#include "code\game\objects\effects\map_effects\sound_emitter.dm" -#include "code\game\objects\effects\prop\columnblast.dm" -#include "code\game\objects\effects\prop\snake.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\graffiti.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "code\game\objects\items\antag_spawners.dm" -#include "code\game\objects\items\apc_frame.dm" -#include "code\game\objects\items\bells.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\contraband_vr.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\falling_object_vr.dm" -#include "code\game\objects\items\glassjar.dm" -#include "code\game\objects\items\gunbox.dm" -#include "code\game\objects\items\gunbox_vr.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\paintkit.dm" -#include "code\game\objects\items\pizza_voucher_vr.dm" -#include "code\game\objects\items\poi_items.dm" -#include "code\game\objects\items\robobag.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\tailoring.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\trash_material.dm" -#include "code\game\objects\items\trash_vr.dm" -#include "code\game\objects\items\uav.dm" -#include "code\game\objects\items\devices\advnifrepair.dm" -#include "code\game\objects\items\devices\ai_detector.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\binoculars.dm" -#include "code\game\objects\items\devices\body_snatcher_vr.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\debugger.dm" -#include "code\game\objects\items\devices\defib.dm" -#include "code\game\objects\items\devices\denecrotizer_vr.dm" -#include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flash_vr.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\flashlight_vr.dm" -#include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\geiger.dm" -#include "code\game\objects\items\devices\gps.dm" -#include "code\game\objects\items\devices\hacktool.dm" -#include "code\game\objects\items\devices\holowarrant.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\modkit.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\scanners_vr.dm" -#include "code\game\objects\items\devices\spy_bug.dm" -#include "code\game\objects\items\devices\suit_cooling.dm" -#include "code\game\objects\items\devices\t_scanner.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\text_to_speech.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\translator.dm" -#include "code\game\objects\items\devices\translocator_vr.dm" -#include "code\game\objects\items\devices\tvcamera.dm" -#include "code\game\objects\items\devices\uplink.dm" -#include "code\game\objects\items\devices\uplink_random_lists.dm" -#include "code\game\objects\items\devices\whistle.dm" -#include "code\game\objects\items\devices\communicator\communicator.dm" -#include "code\game\objects\items\devices\communicator\helper.dm" -#include "code\game\objects\items\devices\communicator\integrated.dm" -#include "code\game\objects\items\devices\communicator\messaging.dm" -#include "code\game\objects\items\devices\communicator\phone.dm" -#include "code\game\objects\items\devices\communicator\UI_tgui.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\headset_vr.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\jammer.dm" -#include "code\game\objects\items\devices\radio\jammer_vr.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\devices\radio\radio_vr.dm" -#include "code\game\objects\items\devices\radio\radiopack.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\robot\robot_upgrades_vr.dm" -#include "code\game\objects\items\stacks\marker_beacons.dm" -#include "code\game\objects\items\stacks\matter_synth.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\medical_vr.dm" -#include "code\game\objects\items\stacks\nanopaste.dm" -#include "code\game\objects\items\stacks\nanopaste_vr.dm" -#include "code\game\objects\items\stacks\sandbags.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\tickets.dm" -#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\toys\balls_vr.dm" -#include "code\game\objects\items\toys\godfigures.dm" -#include "code\game\objects\items\toys\mech_toys.dm" -#include "code\game\objects\items\toys\toys.dm" -#include "code\game\objects\items\toys\toys_vr.dm" -#include "code\game\objects\items\weapons\AI_modules.dm" -#include "code\game\objects\items\weapons\AI_modules_vr.dm" -#include "code\game\objects\items\weapons\augment_items.dm" -#include "code\game\objects\items\weapons\autopsy.dm" -#include "code\game\objects\items\weapons\bones.dm" -#include "code\game\objects\items\weapons\candle.dm" -#include "code\game\objects\items\weapons\canes.dm" -#include "code\game\objects\items\weapons\cards_ids_vr.dm" -#include "code\game\objects\items\weapons\chewables.dm" -#include "code\game\objects\items\weapons\cigs_lighters.dm" -#include "code\game\objects\items\weapons\clown_items.dm" -#include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\dna_injector.dm" -#include "code\game\objects\items\weapons\ecigs.dm" -#include "code\game\objects\items\weapons\explosives.dm" -#include "code\game\objects\items\weapons\explosives_vr.dm" -#include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" -#include "code\game\objects\items\weapons\handcuffs.dm" -#include "code\game\objects\items\weapons\handcuffs_vr.dm" -#include "code\game\objects\items\weapons\improvised_components.dm" -#include "code\game\objects\items\weapons\inducer_vr.dm" -#include "code\game\objects\items\weapons\manuals.dm" -#include "code\game\objects\items\weapons\manuals_vr.dm" -#include "code\game\objects\items\weapons\mop.dm" -#include "code\game\objects\items\weapons\mop_deploy.dm" -#include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\paiwire.dm" -#include "code\game\objects\items\weapons\policetape.dm" -#include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RCD_vr.dm" -#include "code\game\objects\items\weapons\RMS_vr.dm" -#include "code\game\objects\items\weapons\RPD_vr.dm" -#include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shields.dm" -#include "code\game\objects\items\weapons\shields_vr.dm" -#include "code\game\objects\items\weapons\stunbaton.dm" -#include "code\game\objects\items\weapons\surgery_tools.dm" -#include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\syndie.dm" -#include "code\game\objects\items\weapons\tape.dm" -#include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\towels.dm" -#include "code\game\objects\items\weapons\traps.dm" -#include "code\game\objects\items\weapons\traps_vr.dm" -#include "code\game\objects\items\weapons\trays.dm" -#include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\weldbackpack.dm" -#include "code\game\objects\items\weapons\circuitboards\broken.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" -#include "code\game\objects\items\weapons\circuitboards\frame.dm" -#include "code\game\objects\items\weapons\circuitboards\mecha.dm" -#include "code\game\objects\items\weapons\circuitboards\other.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\fluidpump.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" -#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" -#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" -#include "code\game\objects\items\weapons\grenades\concussion.dm" -#include "code\game\objects\items\weapons\grenades\emgrenade.dm" -#include "code\game\objects\items\weapons\grenades\explosive.dm" -#include "code\game\objects\items\weapons\grenades\flashbang.dm" -#include "code\game\objects\items\weapons\grenades\grenade.dm" -#include "code\game\objects\items\weapons\grenades\projectile.dm" -#include "code\game\objects\items\weapons\grenades\smokebomb.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade_vr.dm" -#include "code\game\objects\items\weapons\grenades\supermatter.dm" -#include "code\game\objects\items\weapons\id cards\cards.dm" -#include "code\game\objects\items\weapons\id cards\cards_vr.dm" -#include "code\game\objects\items\weapons\id cards\id_stacks.dm" -#include "code\game\objects\items\weapons\id cards\id_stacks_vr.dm" -#include "code\game\objects\items\weapons\id cards\station_ids.dm" -#include "code\game\objects\items\weapons\id cards\station_ids_vr.dm" -#include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implant_vr.dm" -#include "code\game\objects\items\weapons\implants\implantaugment.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantcase_vr.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implantcircuits.dm" -#include "code\game\objects\items\weapons\implants\implantdud.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implanter_vr.dm" -#include "code\game\objects\items\weapons\implants\implantfreedom.dm" -#include "code\game\objects\items\weapons\implants\implantlanguage.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" -#include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" -#include "code\game\objects\items\weapons\implants\implantuplink.dm" -#include "code\game\objects\items\weapons\implants\neuralbasic.dm" -#include "code\game\objects\items\weapons\material\ashtray.dm" -#include "code\game\objects\items\weapons\material\bats.dm" -#include "code\game\objects\items\weapons\material\chainsaw.dm" -#include "code\game\objects\items\weapons\material\foam.dm" -#include "code\game\objects\items\weapons\material\gravemarker.dm" -#include "code\game\objects\items\weapons\material\kitchen.dm" -#include "code\game\objects\items\weapons\material\knives.dm" -#include "code\game\objects\items\weapons\material\knives_vr.dm" -#include "code\game\objects\items\weapons\material\material_armor.dm" -#include "code\game\objects\items\weapons\material\material_weapons.dm" -#include "code\game\objects\items\weapons\material\misc.dm" -#include "code\game\objects\items\weapons\material\shards.dm" -#include "code\game\objects\items\weapons\material\shards_vr.dm" -#include "code\game\objects\items\weapons\material\swords.dm" -#include "code\game\objects\items\weapons\material\thrown.dm" -#include "code\game\objects\items\weapons\material\twohanded.dm" -#include "code\game\objects\items\weapons\material\twohanded_vr.dm" -#include "code\game\objects\items\weapons\material\whetstone.dm" -#include "code\game\objects\items\weapons\melee\deflect.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\energy_vr.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" -#include "code\game\objects\items\weapons\melee\misc_vr.dm" -#include "code\game\objects\items\weapons\storage\backpack.dm" -#include "code\game\objects\items\weapons\storage\backpack_vr.dm" -#include "code\game\objects\items\weapons\storage\bags.dm" -#include "code\game\objects\items\weapons\storage\bags_vr.dm" -#include "code\game\objects\items\weapons\storage\belt.dm" -#include "code\game\objects\items\weapons\storage\belt_vr.dm" -#include "code\game\objects\items\weapons\storage\bible.dm" -#include "code\game\objects\items\weapons\storage\boxes.dm" -#include "code\game\objects\items\weapons\storage\boxes_vr.dm" -#include "code\game\objects\items\weapons\storage\briefcase.dm" -#include "code\game\objects\items\weapons\storage\egg_vr.dm" -#include "code\game\objects\items\weapons\storage\fancy.dm" -#include "code\game\objects\items\weapons\storage\firstaid.dm" -#include "code\game\objects\items\weapons\storage\firstaid_vr.dm" -#include "code\game\objects\items\weapons\storage\internal.dm" -#include "code\game\objects\items\weapons\storage\laundry_basket.dm" -#include "code\game\objects\items\weapons\storage\lockbox.dm" -#include "code\game\objects\items\weapons\storage\misc.dm" -#include "code\game\objects\items\weapons\storage\mre.dm" -#include "code\game\objects\items\weapons\storage\quickdraw.dm" -#include "code\game\objects\items\weapons\storage\secure.dm" -#include "code\game\objects\items\weapons\storage\storage.dm" -#include "code\game\objects\items\weapons\storage\toolbox.dm" -#include "code\game\objects\items\weapons\storage\toolbox_vr.dm" -#include "code\game\objects\items\weapons\storage\uplink_kits.dm" -#include "code\game\objects\items\weapons\storage\wallets.dm" -#include "code\game\objects\items\weapons\tanks\jetpack.dm" -#include "code\game\objects\items\weapons\tanks\tank_types.dm" -#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" -#include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\items\weapons\tools\crowbar.dm" -#include "code\game\objects\items\weapons\tools\crowbar_vr.dm" -#include "code\game\objects\items\weapons\tools\screwdriver.dm" -#include "code\game\objects\items\weapons\tools\weldingtool.dm" -#include "code\game\objects\items\weapons\tools\wirecutters.dm" -#include "code\game\objects\items\weapons\tools\wrench.dm" -#include "code\game\objects\random\_random.dm" -#include "code\game\objects\random\guns_and_ammo.dm" -#include "code\game\objects\random\maintenance.dm" -#include "code\game\objects\random\mapping.dm" -#include "code\game\objects\random\mapping_vr.dm" -#include "code\game\objects\random\mechs.dm" -#include "code\game\objects\random\misc.dm" -#include "code\game\objects\random\misc_vr.dm" -#include "code\game\objects\random\mob.dm" -#include "code\game\objects\random\mob_vr.dm" -#include "code\game\objects\random\spacesuits.dm" -#include "code\game\objects\random\unidentified\medicine.dm" -#include "code\game\objects\structures\barricades.dm" -#include "code\game\objects\structures\barsign.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\bedsheet_bin_vr.dm" -#include "code\game\objects\structures\bonfire.dm" -#include "code\game\objects\structures\catwalk.dm" -#include "code\game\objects\structures\cliff.dm" -#include "code\game\objects\structures\coathanger.dm" -#include "code\game\objects\structures\curtains.dm" -#include "code\game\objects\structures\dancepole_vr.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\dogbed.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\fence.dm" -#include "code\game\objects\structures\fireaxe.dm" -#include "code\game\objects\structures\fitness.dm" -#include "code\game\objects\structures\fitness_vr.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\gravemarker.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\handrail.dm" -#include "code\game\objects\structures\holoplant.dm" -#include "code\game\objects\structures\inflatable.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_foodcart_vr.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\ledges.dm" -#include "code\game\objects\structures\lightpost.dm" -#include "code\game\objects\structures\loot_piles.dm" -#include "code\game\objects\structures\map_blocker_vr.dm" -#include "code\game\objects\structures\medical_stand_vr.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\morgue_vr.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\railing.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\salvageable.dm" -#include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\signs_vr.dm" -#include "code\game\objects\structures\simple_doors.dm" -#include "code\game\objects\structures\simple_doors_vr.dm" -#include "code\game\objects\structures\snowman.dm" -#include "code\game\objects\structures\stasis_cage.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\transit_tubes.dm" -#include "code\game\objects\structures\trash_pile_vr.dm" -#include "code\game\objects\structures\under_wardrobe.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\watercloset_vr.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\window_spawner.dm" -#include "code\game\objects\structures\window_vr.dm" -#include "code\game\objects\structures\crates_lockers\__closets.dm" -#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" -#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\crates_vr.dm" -#include "code\game\objects\structures\crates_lockers\largecrate.dm" -#include "code\game\objects\structures\crates_lockers\largecrate_vr.dm" -#include "code\game\objects\structures\crates_lockers\vehiclecage.dm" -#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" -#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\egg_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" -#include "code\game\objects\structures\crates_lockers\closets\misc_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\statue.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" -#include "code\game\objects\structures\flora\flora.dm" -#include "code\game\objects\structures\flora\flora_vr.dm" -#include "code\game\objects\structures\flora\grass.dm" -#include "code\game\objects\structures\flora\moretrees_vr.dm" -#include "code\game\objects\structures\flora\trees.dm" -#include "code\game\objects\structures\ghost_pods\event_vr.dm" -#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" -#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" -#include "code\game\objects\structures\ghost_pods\human.dm" -#include "code\game\objects\structures\ghost_pods\mysterious.dm" -#include "code\game\objects\structures\ghost_pods\silicon.dm" -#include "code\game\objects\structures\ghost_pods\silicon_vr.dm" -#include "code\game\objects\structures\props\alien_props.dm" -#include "code\game\objects\structures\props\alien_props_vr.dm" -#include "code\game\objects\structures\props\beam_prism.dm" -#include "code\game\objects\structures\props\blackbox.dm" -#include "code\game\objects\structures\props\fake_ai.dm" -#include "code\game\objects\structures\props\nest.dm" -#include "code\game\objects\structures\props\projectile_lock.dm" -#include "code\game\objects\structures\props\prop.dm" -#include "code\game\objects\structures\props\puzzledoor.dm" -#include "code\game\objects\structures\props\rocks.dm" -#include "code\game\objects\structures\props\swarm.dm" -#include "code\game\objects\structures\props\transmitter.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs_vr.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" -#include "code\game\turfs\simulated.dm" -#include "code\game\turfs\simulated_vr.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\turf_changing.dm" -#include "code\game\turfs\turf_flick_animations.dm" -#include "code\game\turfs\unsimulated.dm" -#include "code\game\turfs\flooring\flooring.dm" -#include "code\game\turfs\flooring\flooring_decals.dm" -#include "code\game\turfs\flooring\flooring_decals_vr.dm" -#include "code\game\turfs\flooring\flooring_premade.dm" -#include "code\game\turfs\flooring\flooring_vr.dm" -#include "code\game\turfs\flooring\shuttle_vr.dm" -#include "code\game\turfs\initialization\init.dm" -#include "code\game\turfs\initialization\maintenance.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\floor_acts.dm" -#include "code\game\turfs\simulated\floor_attackby.dm" -#include "code\game\turfs\simulated\floor_damage.dm" -#include "code\game\turfs\simulated\floor_icon.dm" -#include "code\game\turfs\simulated\floor_static.dm" -#include "code\game\turfs\simulated\floor_types.dm" -#include "code\game\turfs\simulated\floor_types_eris.dm" -#include "code\game\turfs\simulated\floor_types_vr.dm" -#include "code\game\turfs\simulated\lava.dm" -#include "code\game\turfs\simulated\wall_attacks.dm" -#include "code\game\turfs\simulated\wall_icon.dm" -#include "code\game\turfs\simulated\wall_types.dm" -#include "code\game\turfs\simulated\wall_types_vr.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\water.dm" -#include "code\game\turfs\simulated\water_vr.dm" -#include "code\game\turfs\simulated\dungeon\floor.dm" -#include "code\game\turfs\simulated\dungeon\wall.dm" -#include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" -#include "code\game\turfs\simulated\outdoors\dirt.dm" -#include "code\game\turfs\simulated\outdoors\grass.dm" -#include "code\game\turfs\simulated\outdoors\outdoors.dm" -#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" -#include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" -#include "code\game\turfs\simulated\outdoors\sky.dm" -#include "code\game\turfs\simulated\outdoors\snow.dm" -#include "code\game\turfs\snow\snow.dm" -#include "code\game\turfs\space\cracked_asteroid.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\game\turfs\unsimulated\beach.dm" -#include "code\game\turfs\unsimulated\beach_vr.dm" -#include "code\game\turfs\unsimulated\floor.dm" -#include "code\game\turfs\unsimulated\planetary.dm" -#include "code\game\turfs\unsimulated\planetary_vr.dm" -#include "code\game\turfs\unsimulated\shuttle.dm" -#include "code\game\turfs\unsimulated\sky_vr.dm" -#include "code\game\turfs\unsimulated\walls.dm" -#include "code\js\byjax.dm" -#include "code\js\menus.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_attack_log.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_secrets.dm" -#include "code\modules\admin\admin_tools.dm" -#include "code\modules\admin\admin_verb_lists_vr.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\admin_vr.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\ckey_vr.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\map_capture.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\news.dm" -#include "code\modules\admin\persistence.dm" -#include "code\modules\admin\player_notes.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" -#include "code\modules\admin\callproc\callproc.dm" -#include "code\modules\admin\DB ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" -#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" -#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" -#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" -#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" -#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" -#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" -#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" -#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" -#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" -#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" -#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" -#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" -#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" -#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" -#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\only_one.dm" -#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" -#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm" -#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" -#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" -#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" -#include "code\modules\admin\secrets\random_events\gravity_vr.dm" -#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" -#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminhelp_vr.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\antag-ooc.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\buildmode.dm" -#include "code\modules\admin\verbs\change_appearance.dm" -#include "code\modules\admin\verbs\check_customitem_activity.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\custom_event.dm" -#include "code\modules\admin\verbs\dbcon_fix.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\debug_vr.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\fps.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\grief_fixers.dm" -#include "code\modules\admin\verbs\lightning_strike.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\panicbunker.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\randomverbs_vr.dm" -#include "code\modules\admin\verbs\resize.dm" -#include "code\modules\admin\verbs\smite.dm" -#include "code\modules\admin\verbs\smite_vr.dm" -#include "code\modules\admin\verbs\striketeam.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" -#include "code\modules\admin\view_variables\admin_delete.dm" -#include "code\modules\admin\view_variables\debug_variables.dm" -#include "code\modules\admin\view_variables\get_variables.dm" -#include "code\modules\admin\view_variables\helpers.dm" -#include "code\modules\admin\view_variables\mass_edit_variables.dm" -#include "code\modules\admin\view_variables\modify_variables.dm" -#include "code\modules\admin\view_variables\topic.dm" -#include "code\modules\admin\view_variables\topic_list.dm" -#include "code\modules\admin\view_variables\view_variables.dm" -#include "code\modules\admin\view_variables\view_variables_global.dm" -#include "code\modules\ai\_defines.dm" -#include "code\modules\ai\ai_holder.dm" -#include "code\modules\ai\ai_holder_combat.dm" -#include "code\modules\ai\ai_holder_combat_unseen.dm" -#include "code\modules\ai\ai_holder_communication.dm" -#include "code\modules\ai\ai_holder_cooperation.dm" -#include "code\modules\ai\ai_holder_debug.dm" -#include "code\modules\ai\ai_holder_disabled.dm" -#include "code\modules\ai\ai_holder_fleeing.dm" -#include "code\modules\ai\ai_holder_follow.dm" -#include "code\modules\ai\ai_holder_movement.dm" -#include "code\modules\ai\ai_holder_pathfinding.dm" -#include "code\modules\ai\ai_holder_targeting.dm" -#include "code\modules\ai\ai_holder_targeting_vr.dm" -#include "code\modules\ai\interfaces.dm" -#include "code\modules\ai\say_list.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" -#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" -#include "code\modules\alarm\alarm.dm" -#include "code\modules\alarm\alarm_handler.dm" -#include "code\modules\alarm\atmosphere_alarm.dm" -#include "code\modules\alarm\camera_alarm.dm" -#include "code\modules\alarm\fire_alarm.dm" -#include "code\modules\alarm\motion_alarm.dm" -#include "code\modules\alarm\power_alarm.dm" -#include "code\modules\artifice\cursedform.dm" -#include "code\modules\artifice\deadringer.dm" -#include "code\modules\artifice\telecube.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\asset_cache\asset_cache.dm" -#include "code\modules\asset_cache\asset_cache_client.dm" -#include "code\modules\asset_cache\asset_cache_item.dm" -#include "code\modules\asset_cache\asset_list.dm" -#include "code\modules\asset_cache\asset_list_items.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\gateway_vr.dm" -#include "code\modules\awaymissions\loot.dm" -#include "code\modules\awaymissions\loot_vr.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\trigger.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\blob\blob.dm" -#include "code\modules\blob2\_defines.dm" -#include "code\modules\blob2\core_chunk.dm" -#include "code\modules\blob2\blobs\base_blob.dm" -#include "code\modules\blob2\blobs\core.dm" -#include "code\modules\blob2\blobs\factory.dm" -#include "code\modules\blob2\blobs\node.dm" -#include "code\modules\blob2\blobs\normal.dm" -#include "code\modules\blob2\blobs\resource.dm" -#include "code\modules\blob2\blobs\shield.dm" -#include "code\modules\blob2\overmind\overmind.dm" -#include "code\modules\blob2\overmind\powers.dm" -#include "code\modules\blob2\overmind\types.dm" -#include "code\modules\blob2\overmind\types\blazing_oil.dm" -#include "code\modules\blob2\overmind\types\classic.dm" -#include "code\modules\blob2\overmind\types\cryogenic_goo.dm" -#include "code\modules\blob2\overmind\types\ectoplasmic_horror.dm" -#include "code\modules\blob2\overmind\types\electromagnetic_web.dm" -#include "code\modules\blob2\overmind\types\energized_jelly.dm" -#include "code\modules\blob2\overmind\types\explosive_lattice.dm" -#include "code\modules\blob2\overmind\types\fabrication_swarm.dm" -#include "code\modules\blob2\overmind\types\fulminant_organism.dm" -#include "code\modules\blob2\overmind\types\fungal_bloom.dm" -#include "code\modules\blob2\overmind\types\grey_goo.dm" -#include "code\modules\blob2\overmind\types\pressurized_slime.dm" -#include "code\modules\blob2\overmind\types\radioactive_ooze.dm" -#include "code\modules\blob2\overmind\types\ravenous_macrophage.dm" -#include "code\modules\blob2\overmind\types\reactive_spines.dm" -#include "code\modules\blob2\overmind\types\roiling_mold.dm" -#include "code\modules\blob2\overmind\types\shifting_fragments.dm" -#include "code\modules\blob2\overmind\types\synchronous_mesh.dm" -#include "code\modules\blob2\overmind\types\volatile_alluvium.dm" -#include "code\modules\busy_space_vr\air_traffic.dm" -#include "code\modules\busy_space_vr\loremaster.dm" -#include "code\modules\busy_space_vr\organizations.dm" -#include "code\modules\catalogue\atoms.dm" -#include "code\modules\catalogue\catalogue_data.dm" -#include "code\modules\catalogue\catalogue_data_vr.dm" -#include "code\modules\catalogue\cataloguer.dm" -#include "code\modules\catalogue\cataloguer_visuals.dm" -#include "code\modules\catalogue\cataloguer_vr.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" -#include "code\modules\client\client procs_vr.dm" -#include "code\modules\client\movement.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_factions.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_toggle_procs.dm" -#include "code\modules\client\preferences_vr.dm" -#include "code\modules\client\spam_prevention.dm" -#include "code\modules\client\ui_style.dm" -#include "code\modules\client\preference_setup\_defines.dm" -#include "code\modules\client\preference_setup\preference_setup.dm" -#include "code\modules\client\preference_setup\preference_setup_vr.dm" -#include "code\modules\client\preference_setup\antagonism\01_basic.dm" -#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" -#include "code\modules\client\preference_setup\general\01_basic.dm" -#include "code\modules\client\preference_setup\general\02_language.dm" -#include "code\modules\client\preference_setup\general\03_body.dm" -#include "code\modules\client\preference_setup\general\04_equipment.dm" -#include "code\modules\client\preference_setup\general\05_background.dm" -#include "code\modules\client\preference_setup\general\06_flavor.dm" -#include "code\modules\client\preference_setup\global\01_ui.dm" -#include "code\modules\client\preference_setup\global\02_settings.dm" -#include "code\modules\client\preference_setup\global\03_pai.dm" -#include "code\modules\client\preference_setup\global\04_ooc.dm" -#include "code\modules\client\preference_setup\global\setting_datums.dm" -#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" -#include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout.dm" -#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" -#include "code\modules\client\preference_setup\loadout\loadout_accessories_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" -#include "code\modules\client\preference_setup\loadout\loadout_ears.dm" -#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" -#include "code\modules\client\preference_setup\loadout\loadout_eyes_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_general.dm" -#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" -#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_head.dm" -#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_mask.dm" -#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" -#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" -#include "code\modules\client\preference_setup\loadout\loadout_suit.dm" -#include "code\modules\client\preference_setup\loadout\loadout_suit_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" -#include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_utility.dm" -#include "code\modules\client\preference_setup\loadout\loadout_utility_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" -#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" -#include "code\modules\client\preference_setup\occupation\occupation.dm" -#include "code\modules\client\preference_setup\skills\skills.dm" -#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" -#include "code\modules\client\preference_setup\volume_sliders\02_media.dm" -#include "code\modules\client\preference_setup\vore\01_ears.dm" -#include "code\modules\client\preference_setup\vore\02_size.dm" -#include "code\modules\client\preference_setup\vore\03_egg.dm" -#include "code\modules\client\preference_setup\vore\04_resleeving.dm" -#include "code\modules\client\preference_setup\vore\05_persistence.dm" -#include "code\modules\client\preference_setup\vore\06_vantag.dm" -#include "code\modules\client\preference_setup\vore\07_traits.dm" -#include "code\modules\client\preference_setup\vore\08_nif.dm" -#include "code\modules\client\preference_setup\vore\09_misc.dm" -#include "code\modules\client\verbs\advanced_who.dm" -#include "code\modules\client\verbs\character_directory.dm" -#include "code\modules\client\verbs\ignore.dm" -#include "code\modules\client\verbs\ooc.dm" -#include "code\modules\client\verbs\ping.dm" -#include "code\modules\client\verbs\suicide.dm" -#include "code\modules\client\verbs\who.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\clothing_accessories.dm" -#include "code\modules\clothing\clothing_icons.dm" -#include "code\modules\clothing\clothing_vr.dm" -#include "code\modules\clothing\ears\earrings.dm" -#include "code\modules\clothing\ears\ears.dm" -#include "code\modules\clothing\glasses\glasses.dm" -#include "code\modules\clothing\glasses\glasses_vr.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\glasses\hud_vr.dm" -#include "code\modules\clothing\gloves\antagonist.dm" -#include "code\modules\clothing\gloves\arm_guards.dm" -#include "code\modules\clothing\gloves\arm_guards_vr.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\gauntlets.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\miscellaneous_vr.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\flowercrowns.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\helmet_vr.dm" -#include "code\modules\clothing\head\hood.dm" -#include "code\modules\clothing\head\hood_vr.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\jobs_vr.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\misc_vr.dm" -#include "code\modules\clothing\head\pilot_helmet.dm" -#include "code\modules\clothing\head\pilot_helmet_vr.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\head\solgov.dm" -#include "code\modules\clothing\head\solgov_vr.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\breath_vr.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\gasmask_vr.dm" -#include "code\modules\clothing\masks\hailer.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\shiny_vr.dm" -#include "code\modules\clothing\masks\voice.dm" -#include "code\modules\clothing\rings\material.dm" -#include "code\modules\clothing\rings\rings.dm" -#include "code\modules\clothing\rings\rings_vr.dm" -#include "code\modules\clothing\shoes\boots.dm" -#include "code\modules\clothing\shoes\boots_vr.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\leg_guards.dm" -#include "code\modules\clothing\shoes\leg_guards_vr.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\shoes\miscellaneous_vr.dm" -#include "code\modules\clothing\spacesuits\alien.dm" -#include "code\modules\clothing\spacesuits\breaches.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\spacesuits.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\rig\rig.dm" -#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" -#include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" -#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" -#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" -#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" -#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" -#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm" -#include "code\modules\clothing\spacesuits\rig\suits\light.dm" -#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" -#include "code\modules\clothing\spacesuits\void\ert_vr.dm" -#include "code\modules\clothing\spacesuits\void\event.dm" -#include "code\modules\clothing\spacesuits\void\event_vr.dm" -#include "code\modules\clothing\spacesuits\void\merc.dm" -#include "code\modules\clothing\spacesuits\void\military_vr.dm" -#include "code\modules\clothing\spacesuits\void\station.dm" -#include "code\modules\clothing\spacesuits\void\station_vr.dm" -#include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\void_vr.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" -#include "code\modules\clothing\spacesuits\void\zaddat.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\armor_vr.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\bio_vr.dm" -#include "code\modules\clothing\suits\hooded.dm" -#include "code\modules\clothing\suits\hooded_vr.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\miscellaneous_vr.dm" -#include "code\modules\clothing\suits\solgov.dm" -#include "code\modules\clothing\suits\solgov_vr.dm" -#include "code\modules\clothing\suits\storage.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\utility_vr.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\suits\aliens\tajara.dm" -#include "code\modules\clothing\suits\aliens\teshari.dm" -#include "code\modules\clothing\suits\aliens\unathi.dm" -#include "code\modules\clothing\suits\aliens\vox.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\imperial_vr.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\miscellaneous_vr.dm" -#include "code\modules\clothing\under\nanotrasen_vr.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shiny_vr.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\solgov.dm" -#include "code\modules\clothing\under\solgov_vr.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\accessory_vr.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\armor.dm" -#include "code\modules\clothing\under\accessories\badges.dm" -#include "code\modules\clothing\under\accessories\clothing.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\holster_vr.dm" -#include "code\modules\clothing\under\accessories\lockets.dm" -#include "code\modules\clothing\under\accessories\permits.dm" -#include "code\modules\clothing\under\accessories\permits_vr.dm" -#include "code\modules\clothing\under\accessories\shiny_vr.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\accessories\storage_vr.dm" -#include "code\modules\clothing\under\accessories\torch.dm" -#include "code\modules\clothing\under\accessories\torch_vr.dm" -#include "code\modules\clothing\under\accessories\temperature\poncho.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\clothing\under\xenos\teshari.dm" -#include "code\modules\clothing\under\xenos\vox.dm" -#include "code\modules\compass\^compass.dm" -#include "code\modules\compass\_compass.dm" -#include "code\modules\compass\compass_holder.dm" -#include "code\modules\compass\compass_waypoint.dm" -#include "code\modules\customitems\item_spawning.dm" -#include "code\modules\detectivework\footprints.dm" -#include "code\modules\detectivework\forensics.dm" -#include "code\modules\detectivework\microscope\dnascanner.dm" -#include "code\modules\detectivework\microscope\microscope.dm" -#include "code\modules\detectivework\tools\crimekit.dm" -#include "code\modules\detectivework\tools\evidencebag.dm" -#include "code\modules\detectivework\tools\luminol.dm" -#include "code\modules\detectivework\tools\rag.dm" -#include "code\modules\detectivework\tools\sample_kits.dm" -#include "code\modules\detectivework\tools\scanner.dm" -#include "code\modules\detectivework\tools\storage.dm" -#include "code\modules\detectivework\tools\swabs.dm" -#include "code\modules\detectivework\tools\uvlight.dm" -#include "code\modules\economy\Accounts.dm" -#include "code\modules\economy\Accounts_DB.dm" -#include "code\modules\economy\ATM.dm" -#include "code\modules\economy\cash.dm" -#include "code\modules\economy\cash_register.dm" -#include "code\modules\economy\coins.dm" -#include "code\modules\economy\coins_vr.dm" -#include "code\modules\economy\economy_misc.dm" -#include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\Events.dm" -#include "code\modules\economy\Events_Mundane.dm" -#include "code\modules\economy\lorenews.dm" -#include "code\modules\economy\mint.dm" -#include "code\modules\economy\money_bag.dm" -#include "code\modules\economy\price_list.dm" -#include "code\modules\economy\retail_scanner.dm" -#include "code\modules\economy\TradeDestinations.dm" -#include "code\modules\economy\vending.dm" -#include "code\modules\economy\vending_machines.dm" -#include "code\modules\emotes\emote_define.dm" -#include "code\modules\emotes\emote_mob.dm" -#include "code\modules\emotes\definitions\_mob.dm" -#include "code\modules\emotes\definitions\_species.dm" -#include "code\modules\emotes\definitions\audible.dm" -#include "code\modules\emotes\definitions\audible_cough.dm" -#include "code\modules\emotes\definitions\audible_furry_vr.dm" -#include "code\modules\emotes\definitions\audible_scream.dm" -#include "code\modules\emotes\definitions\audible_scream_vr.dm" -#include "code\modules\emotes\definitions\audible_slap.dm" -#include "code\modules\emotes\definitions\audible_snap.dm" -#include "code\modules\emotes\definitions\audible_sneeze.dm" -#include "code\modules\emotes\definitions\audible_whistle.dm" -#include "code\modules\emotes\definitions\exertion.dm" -#include "code\modules\emotes\definitions\helpers_vr.dm" -#include "code\modules\emotes\definitions\human.dm" -#include "code\modules\emotes\definitions\slimes.dm" -#include "code\modules\emotes\definitions\synthetics.dm" -#include "code\modules\emotes\definitions\visible.dm" -#include "code\modules\emotes\definitions\visible_animated.dm" -#include "code\modules\emotes\definitions\visible_vomit.dm" -#include "code\modules\emotes\definitions\visible_vr.dm" -#include "code\modules\entopics_vr\alternate_appearance.dm" -#include "code\modules\entopics_vr\entopics.dm" -#include "code\modules\error_handler\_defines.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\error_handler\~defines.dm" -#include "code\modules\events\apc_damage.dm" -#include "code\modules\events\atmos_leak.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\camera_damage.dm" -#include "code\modules\events\canister_leak.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\comms_blackout.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\drone_pod_vr.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\event.dm" -#include "code\modules\events\event_container.dm" -#include "code\modules\events\event_container_vr.dm" -#include "code\modules\events\event_dynamic.dm" -#include "code\modules\events\event_manager.dm" -#include "code\modules\events\gravity_vr.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\grubinfestation_vr.dm" -#include "code\modules\events\ian_storm_vr.dm" -#include "code\modules\events\infestation.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\maintenance_predator_vr.dm" -#include "code\modules\events\meteor_strike_vr.dm" -#include "code\modules\events\meteors.dm" -#include "code\modules\events\money_hacker.dm" -#include "code\modules\events\money_lotto.dm" -#include "code\modules\events\money_spam.dm" -#include "code\modules\events\morph_spawn_vr.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\random_antagonist.dm" -#include "code\modules\events\rogue_drones.dm" -#include "code\modules\events\shipping_error.dm" -#include "code\modules\events\solar_storm.dm" -#include "code\modules\events\space_ninja.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\spontaneous_appendicitis_vr.dm" -#include "code\modules\events\supply_demand_vr.dm" -#include "code\modules\events\wallrot.dm" -#include "code\modules\examine\examine.dm" -#include "code\modules\examine\stat_icons.dm" -#include "code\modules\examine\descriptions\armor.dm" -#include "code\modules\examine\descriptions\atmospherics.dm" -#include "code\modules\examine\descriptions\containers.dm" -#include "code\modules\examine\descriptions\devices.dm" -#include "code\modules\examine\descriptions\engineering.dm" -#include "code\modules\examine\descriptions\machines.dm" -#include "code\modules\examine\descriptions\medical.dm" -#include "code\modules\examine\descriptions\mobs.dm" -#include "code\modules\examine\descriptions\paperwork.dm" -#include "code\modules\examine\descriptions\stacks.dm" -#include "code\modules\examine\descriptions\structures.dm" -#include "code\modules\examine\descriptions\telecomms.dm" -#include "code\modules\examine\descriptions\turfs.dm" -#include "code\modules\examine\descriptions\weapons.dm" -#include "code\modules\ext_scripts\irc.dm" -#include "code\modules\ext_scripts\python.dm" -#include "code\modules\fishing\fishing.dm" -#include "code\modules\fishing\fishing_net.dm" -#include "code\modules\fishing\fishing_rod.dm" -#include "code\modules\fishing\fishing_rod_vr.dm" -#include "code\modules\fishing\fishing_vr.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\look_up.dm" -#include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food\food.dm" -#include "code\modules\food\recipe.dm" -#include "code\modules\food\recipe_dump.dm" -#include "code\modules\food\recipes_fryer.dm" -#include "code\modules\food\recipes_fryer_vr.dm" -#include "code\modules\food\recipes_grill.dm" -#include "code\modules\food\recipes_microwave.dm" -#include "code\modules\food\recipes_microwave_vr.dm" -#include "code\modules\food\recipes_oven.dm" -#include "code\modules\food\recipes_oven_vr.dm" -#include "code\modules\food\drinkingglass\drinkingglass.dm" -#include "code\modules\food\drinkingglass\extras.dm" -#include "code\modules\food\drinkingglass\glass_boxes.dm" -#include "code\modules\food\drinkingglass\glass_types.dm" -#include "code\modules\food\drinkingglass\metaglass.dm" -#include "code\modules\food\drinkingglass\metaglass_vr.dm" -#include "code\modules\food\drinkingglass\serving_glasses.dm" -#include "code\modules\food\drinkingglass\shaker.dm" -#include "code\modules\food\drinkingglass\shaker_vr.dm" -#include "code\modules\food\food\cans.dm" -#include "code\modules\food\food\cans_vr.dm" -#include "code\modules\food\food\condiment.dm" -#include "code\modules\food\food\drinks.dm" -#include "code\modules\food\food\lunch.dm" -#include "code\modules\food\food\sandwich.dm" -#include "code\modules\food\food\snacks.dm" -#include "code\modules\food\food\snacks_vr.dm" -#include "code\modules\food\food\thecake.dm" -#include "code\modules\food\food\z_custom_food_vr.dm" -#include "code\modules\food\food\drinks\bottle.dm" -#include "code\modules\food\food\drinks\cup.dm" -#include "code\modules\food\food\drinks\drinkingglass.dm" -#include "code\modules\food\food\drinks\jar.dm" -#include "code\modules\food\food\drinks\bottle\robot.dm" -#include "code\modules\food\food\snacks\meat.dm" -#include "code\modules\food\glass\bottle.dm" -#include "code\modules\food\glass\bottle_vr.dm" -#include "code\modules\food\glass\bottle\robot.dm" -#include "code\modules\food\kitchen\gibber.dm" -#include "code\modules\food\kitchen\icecream.dm" -#include "code\modules\food\kitchen\microwave.dm" -#include "code\modules\food\kitchen\cooking_machines\_appliance.dm" -#include "code\modules\food\kitchen\cooking_machines\_cooker.dm" -#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm" -#include "code\modules\food\kitchen\cooking_machines\_mixer.dm" -#include "code\modules\food\kitchen\cooking_machines\candy.dm" -#include "code\modules\food\kitchen\cooking_machines\cereal.dm" -#include "code\modules\food\kitchen\cooking_machines\container.dm" -#include "code\modules\food\kitchen\cooking_machines\fryer.dm" -#include "code\modules\food\kitchen\cooking_machines\grill.dm" -#include "code\modules\food\kitchen\cooking_machines\oven.dm" -#include "code\modules\food\kitchen\smartfridge\drying_rack.dm" -#include "code\modules\food\kitchen\smartfridge\engineering.dm" -#include "code\modules\food\kitchen\smartfridge\hydroponics.dm" -#include "code\modules\food\kitchen\smartfridge\medical.dm" -#include "code\modules\food\kitchen\smartfridge\smartfridge.dm" -#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm" -#include "code\modules\gamemaster\defines.dm" -#include "code\modules\gamemaster\event2\event.dm" -#include "code\modules\gamemaster\event2\meta.dm" -#include "code\modules\gamemaster\event2\events\ghost_pod_spawner.dm" -#include "code\modules\gamemaster\event2\events\mob_spawning.dm" -#include "code\modules\gamemaster\event2\events\cargo\shipping_error.dm" -#include "code\modules\gamemaster\event2\events\command\manifest_malfunction.dm" -#include "code\modules\gamemaster\event2\events\command\money_hacker.dm" -#include "code\modules\gamemaster\event2\events\command\raise_funds.dm" -#include "code\modules\gamemaster\event2\events\engineering\airlock_failure.dm" -#include "code\modules\gamemaster\event2\events\engineering\blob.dm" -#include "code\modules\gamemaster\event2\events\engineering\brand_intelligence.dm" -#include "code\modules\gamemaster\event2\events\engineering\camera_damage.dm" -#include "code\modules\gamemaster\event2\events\engineering\canister_leak.dm" -#include "code\modules\gamemaster\event2\events\engineering\dust.dm" -#include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" -#include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" -#include "code\modules\gamemaster\event2\events\engineering\meteor_defense.dm" -#include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" -#include "code\modules\gamemaster\event2\events\engineering\wallrot.dm" -#include "code\modules\gamemaster\event2\events\engineering\window_break.dm" -#include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" -#include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" -#include "code\modules\gamemaster\event2\events\everyone\gravity_vr.dm" -#include "code\modules\gamemaster\event2\events\everyone\infestation.dm" -#include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" -#include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" -#include "code\modules\gamemaster\event2\events\everyone\random_antag.dm" -#include "code\modules\gamemaster\event2\events\everyone\solar_storm.dm" -#include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" -#include "code\modules\gamemaster\event2\events\legacy\legacy.dm" -#include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" -#include "code\modules\gamemaster\event2\events\medical\virus.dm" -#include "code\modules\gamemaster\event2\events\security\carp_migration.dm" -#include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" -#include "code\modules\gamemaster\event2\events\security\prison_break.dm" -#include "code\modules\gamemaster\event2\events\security\rogue_drones.dm" -#include "code\modules\gamemaster\event2\events\security\security_advisement.dm" -#include "code\modules\gamemaster\event2\events\security\spider_infestation.dm" -#include "code\modules\gamemaster\event2\events\security\stowaway.dm" -#include "code\modules\gamemaster\event2\events\security\surprise_carp.dm" -#include "code\modules\gamemaster\event2\events\security\swarm_boarder.dm" -#include "code\modules\gamemaster\event2\events\synthetic\ion_storm.dm" -#include "code\modules\games\cah.dm" -#include "code\modules\games\cah_black_cards.dm" -#include "code\modules\games\cah_white_cards.dm" -#include "code\modules\games\cardemon.dm" -#include "code\modules\games\cards.dm" -#include "code\modules\games\dice.dm" -#include "code\modules\games\spaceball_cards.dm" -#include "code\modules\games\tarot.dm" -#include "code\modules\genetics\side_effects.dm" -#include "code\modules\ghosttrap\trap.dm" -#include "code\modules\holodeck\HolodeckControl.dm" -#include "code\modules\holodeck\HolodeckObjects.dm" -#include "code\modules\holodeck\HolodeckPrograms.dm" -#include "code\modules\holomap\generate_holomap.dm" -#include "code\modules\holomap\holomap_area.dm" -#include "code\modules\holomap\holomap_datum.dm" -#include "code\modules\holomap\mapper.dm" -#include "code\modules\holomap\station_holomap.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\grown_inedible.dm" -#include "code\modules\hydroponics\grown_predefined.dm" -#include "code\modules\hydroponics\seed.dm" -#include "code\modules\hydroponics\seed_datums_vr.dm" -#include "code\modules\hydroponics\seed_gene_mut.dm" -#include "code\modules\hydroponics\seed_machines.dm" -#include "code\modules\hydroponics\seed_mobs.dm" -#include "code\modules\hydroponics\seed_packets.dm" -#include "code\modules\hydroponics\seed_packets_vr.dm" -#include "code\modules\hydroponics\seed_storage.dm" -#include "code\modules\hydroponics\seed_storage_vr.dm" -#include "code\modules\hydroponics\beekeeping\beehive.dm" -#include "code\modules\hydroponics\seedtypes\amauri.dm" -#include "code\modules\hydroponics\seedtypes\ambrosia.dm" -#include "code\modules\hydroponics\seedtypes\apples.dm" -#include "code\modules\hydroponics\seedtypes\banana.dm" -#include "code\modules\hydroponics\seedtypes\berries.dm" -#include "code\modules\hydroponics\seedtypes\cabbage.dm" -#include "code\modules\hydroponics\seedtypes\carrots.dm" -#include "code\modules\hydroponics\seedtypes\celery.dm" -#include "code\modules\hydroponics\seedtypes\cherries.dm" -#include "code\modules\hydroponics\seedtypes\chili.dm" -#include "code\modules\hydroponics\seedtypes\citrus.dm" -#include "code\modules\hydroponics\seedtypes\cocoa.dm" -#include "code\modules\hydroponics\seedtypes\corn.dm" -#include "code\modules\hydroponics\seedtypes\diona.dm" -#include "code\modules\hydroponics\seedtypes\durian.dm" -#include "code\modules\hydroponics\seedtypes\eggplant.dm" -#include "code\modules\hydroponics\seedtypes\flowers.dm" -#include "code\modules\hydroponics\seedtypes\gelthi.dm" -#include "code\modules\hydroponics\seedtypes\gnomes.dm" -#include "code\modules\hydroponics\seedtypes\grapes.dm" -#include "code\modules\hydroponics\seedtypes\grass.dm" -#include "code\modules\hydroponics\seedtypes\jurlmah.dm" -#include "code\modules\hydroponics\seedtypes\kudzu.dm" -#include "code\modules\hydroponics\seedtypes\lettuce.dm" -#include "code\modules\hydroponics\seedtypes\malanitear.dm" -#include "code\modules\hydroponics\seedtypes\mushrooms.dm" -#include "code\modules\hydroponics\seedtypes\nettles.dm" -#include "code\modules\hydroponics\seedtypes\onion.dm" -#include "code\modules\hydroponics\seedtypes\peanuts.dm" -#include "code\modules\hydroponics\seedtypes\pineapple.dm" -#include "code\modules\hydroponics\seedtypes\potato.dm" -#include "code\modules\hydroponics\seedtypes\pumpkin.dm" -#include "code\modules\hydroponics\seedtypes\rhubarb.dm" -#include "code\modules\hydroponics\seedtypes\rice.dm" -#include "code\modules\hydroponics\seedtypes\selemhand.dm" -#include "code\modules\hydroponics\seedtypes\soybean.dm" -#include "code\modules\hydroponics\seedtypes\sugarcane.dm" -#include "code\modules\hydroponics\seedtypes\surik.dm" -#include "code\modules\hydroponics\seedtypes\telriis.dm" -#include "code\modules\hydroponics\seedtypes\thaadra.dm" -#include "code\modules\hydroponics\seedtypes\tobacco.dm" -#include "code\modules\hydroponics\seedtypes\tomatoes.dm" -#include "code\modules\hydroponics\seedtypes\vale.dm" -#include "code\modules\hydroponics\seedtypes\vanilla.dm" -#include "code\modules\hydroponics\seedtypes\wabback.dm" -#include "code\modules\hydroponics\seedtypes\watermelon.dm" -#include "code\modules\hydroponics\seedtypes\weeds.dm" -#include "code\modules\hydroponics\seedtypes\wheat.dm" -#include "code\modules\hydroponics\seedtypes\whitebeets.dm" -#include "code\modules\hydroponics\seedtypes\wurmwoad.dm" -#include "code\modules\hydroponics\seedtypes\xeno.dm" -#include "code\modules\hydroponics\spreading\spreading.dm" -#include "code\modules\hydroponics\spreading\spreading_growth.dm" -#include "code\modules\hydroponics\spreading\spreading_response.dm" -#include "code\modules\hydroponics\trays\tray.dm" -#include "code\modules\hydroponics\trays\tray_process.dm" -#include "code\modules\hydroponics\trays\tray_reagents.dm" -#include "code\modules\hydroponics\trays\tray_soil.dm" -#include "code\modules\hydroponics\trays\tray_tools.dm" -#include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\identification\identification.dm" -#include "code\modules\identification\item_procs.dm" -#include "code\modules\instruments\items.dm" -#include "code\modules\instruments\stationary.dm" -#include "code\modules\instruments\instrument_data\_instrument_data.dm" -#include "code\modules\instruments\instrument_data\_instrument_key.dm" -#include "code\modules\instruments\instrument_data\brass.dm" -#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" -#include "code\modules\instruments\instrument_data\fun.dm" -#include "code\modules\instruments\instrument_data\guitar.dm" -#include "code\modules\instruments\instrument_data\hardcoded.dm" -#include "code\modules\instruments\instrument_data\organ.dm" -#include "code\modules\instruments\instrument_data\piano.dm" -#include "code\modules\instruments\instrument_data\synth_tones.dm" -#include "code\modules\instruments\songs\_song.dm" -#include "code\modules\instruments\songs\editor.dm" -#include "code\modules\instruments\songs\play_legacy.dm" -#include "code\modules\instruments\songs\play_synthesized.dm" -#include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\core\assemblies.dm" -#include "code\modules\integrated_electronics\core\detailer.dm" -#include "code\modules\integrated_electronics\core\helpers.dm" -#include "code\modules\integrated_electronics\core\integrated_circuit.dm" -#include "code\modules\integrated_electronics\core\pins.dm" -#include "code\modules\integrated_electronics\core\printer.dm" -#include "code\modules\integrated_electronics\core\tools.dm" -#include "code\modules\integrated_electronics\core\assemblies\clothing.dm" -#include "code\modules\integrated_electronics\core\assemblies\device.dm" -#include "code\modules\integrated_electronics\core\assemblies\generic.dm" -#include "code\modules\integrated_electronics\core\assemblies\implant.dm" -#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" -#include "code\modules\integrated_electronics\passive\passive.dm" -#include "code\modules\integrated_electronics\passive\power.dm" -#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" -#include "code\modules\integrated_electronics\subtypes\built_in.dm" -#include "code\modules\integrated_electronics\subtypes\converters.dm" -#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" -#include "code\modules\integrated_electronics\subtypes\input.dm" -#include "code\modules\integrated_electronics\subtypes\lists.dm" -#include "code\modules\integrated_electronics\subtypes\logic.dm" -#include "code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "code\modules\integrated_electronics\subtypes\memory.dm" -#include "code\modules\integrated_electronics\subtypes\output.dm" -#include "code\modules\integrated_electronics\subtypes\power.dm" -#include "code\modules\integrated_electronics\subtypes\reagents.dm" -#include "code\modules\integrated_electronics\subtypes\smart.dm" -#include "code\modules\integrated_electronics\subtypes\time.dm" -#include "code\modules\integrated_electronics\subtypes\trig.dm" -#include "code\modules\integrated_electronics\~defines\~defines.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\lib_readme.dm" -#include "code\modules\library\hardcode_library\_library.dm" -#include "code\modules\library\hardcode_library\fiction\APsychonaut.dm" -#include "code\modules\library\hardcode_library\fiction\battlefieldcommander.dm" -#include "code\modules\library\hardcode_library\fiction\PortedBooks.dm" -#include "code\modules\library\hardcode_library\fiction\schnayy.dm" -#include "code\modules\library\hardcode_library\non-fiction\PortedBooks.dm" -#include "code\modules\library\hardcode_library\reference\PortedBooks.dm" -#include "code\modules\library\hardcode_library\reference\Schnayy.dm" -#include "code\modules\library\hardcode_library\religious\PortedBooks.dm" -#include "code\modules\lighting\emissive_blocker.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_fake_sun_vr.dm" -#include "code\modules\lighting\lighting_overlay.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\looking_glass\lg_area.dm" -#include "code\modules\looking_glass\lg_console.dm" -#include "code\modules\looking_glass\lg_imageholder.dm" -#include "code\modules\looking_glass\lg_turfs.dm" -#include "code\modules\lore_codex\codex.dm" -#include "code\modules\lore_codex\codex_tree.dm" -#include "code\modules\lore_codex\pages.dm" -#include "code\modules\lore_codex\lore_data_vr\important_locations.dm" -#include "code\modules\lore_codex\lore_data_vr\main.dm" -#include "code\modules\lore_codex\lore_data_vr\orgs.dm" -#include "code\modules\lore_codex\lore_data_vr\political_parties.dm" -#include "code\modules\lore_codex\lore_data_vr\species.dm" -#include "code\modules\lore_codex\news_data\main.dm" -#include "code\modules\lore_codex\robutt_data\bybrand.dm" -#include "code\modules\lore_codex\robutt_data\main_robutts.dm" -#include "code\modules\lore_codex\robutt_data\more.dm" -#include "code\modules\maps\tg\dmm_suite.dm" -#include "code\modules\maps\tg\map_template.dm" -#include "code\modules\maps\tg\map_template_vr.dm" -#include "code\modules\maps\tg\reader.dm" -#include "code\modules\materials\fifty_spawner.dm" -#include "code\modules\materials\fifty_spawner_mats.dm" -#include "code\modules\materials\fifty_spawner_mats_vr.dm" -#include "code\modules\materials\material_synth.dm" -#include "code\modules\materials\materials\_materials.dm" -#include "code\modules\materials\materials\_materials_vr.dm" -#include "code\modules\materials\materials\alien_alloy.dm" -#include "code\modules\materials\materials\cult.dm" -#include "code\modules\materials\materials\gems.dm" -#include "code\modules\materials\materials\glass.dm" -#include "code\modules\materials\materials\glass_vr.dm" -#include "code\modules\materials\materials\holographic.dm" -#include "code\modules\materials\materials\other_vr.dm" -#include "code\modules\materials\materials\plastic.dm" -#include "code\modules\materials\materials\snow.dm" -#include "code\modules\materials\materials\stone.dm" -#include "code\modules\materials\materials\supermatter.dm" -#include "code\modules\materials\materials\metals\hull.dm" -#include "code\modules\materials\materials\metals\hull_vr.dm" -#include "code\modules\materials\materials\metals\metals.dm" -#include "code\modules\materials\materials\metals\metals_vr.dm" -#include "code\modules\materials\materials\metals\plasteel.dm" -#include "code\modules\materials\materials\metals\plasteel_vr.dm" -#include "code\modules\materials\materials\metals\steel.dm" -#include "code\modules\materials\materials\metals\steel_vr.dm" -#include "code\modules\materials\materials\organic\animal_products.dm" -#include "code\modules\materials\materials\organic\cloth.dm" -#include "code\modules\materials\materials\organic\leather.dm" -#include "code\modules\materials\materials\organic\resin.dm" -#include "code\modules\materials\materials\organic\wood.dm" -#include "code\modules\materials\sheets\_sheets.dm" -#include "code\modules\materials\sheets\gems.dm" -#include "code\modules\materials\sheets\glass.dm" -#include "code\modules\materials\sheets\glass_vr.dm" -#include "code\modules\materials\sheets\plastic.dm" -#include "code\modules\materials\sheets\snow.dm" -#include "code\modules\materials\sheets\stone.dm" -#include "code\modules\materials\sheets\supermatter.dm" -#include "code\modules\materials\sheets\metals\hull.dm" -#include "code\modules\materials\sheets\metals\hull_vr.dm" -#include "code\modules\materials\sheets\metals\metal.dm" -#include "code\modules\materials\sheets\metals\metal_vr.dm" -#include "code\modules\materials\sheets\metals\rods.dm" -#include "code\modules\materials\sheets\organic\animal_products.dm" -#include "code\modules\materials\sheets\organic\resin.dm" -#include "code\modules\materials\sheets\organic\textiles.dm" -#include "code\modules\materials\sheets\organic\wood.dm" -#include "code\modules\materials\sheets\organic\tanning\hide.dm" -#include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" -#include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" -#include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" -#include "code\modules\media\juke_remote.dm" -#include "code\modules\media\media_machinery.dm" -#include "code\modules\media\media_player_html5.dm" -#include "code\modules\media\media_player_vlc.dm" -#include "code\modules\media\media_player_wmp.dm" -#include "code\modules\media\media_tracks.dm" -#include "code\modules\media\mediamanager.dm" -#include "code\modules\media\walkpod.dm" -#include "code\modules\metric\activity.dm" -#include "code\modules\metric\count.dm" -#include "code\modules\metric\department.dm" -#include "code\modules\metric\metric.dm" -#include "code\modules\mining\abandonedcrates.dm" -#include "code\modules\mining\abandonedcrates_vr.dm" -#include "code\modules\mining\alloys.dm" -#include "code\modules\mining\alloys_vr.dm" -#include "code\modules\mining\fulton.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\mine_items_vr.dm" -#include "code\modules\mining\mine_outcrops.dm" -#include "code\modules\mining\mine_turfs.dm" -#include "code\modules\mining\mine_turfs_vr.dm" -#include "code\modules\mining\mineral_effect.dm" -#include "code\modules\mining\ore.dm" -#include "code\modules\mining\ore_box.dm" -#include "code\modules\mining\ore_datum.dm" -#include "code\modules\mining\resonator_vr.dm" -#include "code\modules\mining\shelter_atoms_vr.dm" -#include "code\modules\mining\shelters_vr.dm" -#include "code\modules\mining\drilling\drill.dm" -#include "code\modules\mining\drilling\scanner.dm" -#include "code\modules\mining\machinery\machine_input_output_plates.dm" -#include "code\modules\mining\machinery\machine_processing.dm" -#include "code\modules\mining\machinery\machine_stacking.dm" -#include "code\modules\mining\machinery\machine_unloading.dm" -#include "code\modules\mining\ore_redemption_machine\construction.dm" -#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm" -#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm" -#include "code\modules\mining\ore_redemption_machine\survey_vendor.dm" -#include "code\modules\mob\animations.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\gender.dm" -#include "code\modules\mob\gender_vr.dm" -#include "code\modules\mob\hear_say.dm" -#include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\login_vr.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_defines_vr.dm" -#include "code\modules\mob\mob_grab.dm" -#include "code\modules\mob\mob_grab_specials.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_helpers_vr.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_planes.dm" -#include "code\modules\mob\mob_planes_vr.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\say_vr.dm" -#include "code\modules\mob\skillset.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\_modifiers\aura.dm" -#include "code\modules\mob\_modifiers\changeling.dm" -#include "code\modules\mob\_modifiers\cloning.dm" -#include "code\modules\mob\_modifiers\feysight.dm" -#include "code\modules\mob\_modifiers\fire.dm" -#include "code\modules\mob\_modifiers\medical.dm" -#include "code\modules\mob\_modifiers\modifiers.dm" -#include "code\modules\mob\_modifiers\modifiers_misc.dm" -#include "code\modules\mob\_modifiers\traits.dm" -#include "code\modules\mob\_modifiers\traits_phobias.dm" -#include "code\modules\mob\_modifiers\unholy.dm" -#include "code\modules\mob\dead\corpse.dm" -#include "code\modules\mob\dead\corpse_vr.dm" -#include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\free_vr.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\observer_vr.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\freelook\chunk.dm" -#include "code\modules\mob\freelook\eye.dm" -#include "code\modules\mob\freelook\life.dm" -#include "code\modules\mob\freelook\update_triggers.dm" -#include "code\modules\mob\freelook\visualnet.dm" -#include "code\modules\mob\freelook\ai\cameranet.dm" -#include "code\modules\mob\freelook\ai\chunk.dm" -#include "code\modules\mob\freelook\ai\eye.dm" -#include "code\modules\mob\freelook\ai\update_triggers.dm" -#include "code\modules\mob\freelook\mask\chunk.dm" -#include "code\modules\mob\freelook\mask\cultnet.dm" -#include "code\modules\mob\freelook\mask\eye.dm" -#include "code\modules\mob\freelook\mask\update_triggers.dm" -#include "code\modules\mob\language\generic.dm" -#include "code\modules\mob\language\language.dm" -#include "code\modules\mob\language\monkey.dm" -#include "code\modules\mob\language\outsider.dm" -#include "code\modules\mob\language\station.dm" -#include "code\modules\mob\language\station_vr.dm" -#include "code\modules\mob\language\synthetic.dm" -#include "code\modules\mob\living\autohiss.dm" -#include "code\modules\mob\living\butchering.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\inventory.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\living_defines_vr.dm" -#include "code\modules\mob\living\living_movement.dm" -#include "code\modules\mob\living\living_powers.dm" -#include "code\modules\mob\living\living_vr.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\organs.dm" -#include "code\modules\mob\living\riding.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\status_indicators.dm" -#include "code\modules\mob\living\bot\bot.dm" -#include "code\modules\mob\living\bot\bot_vr.dm" -#include "code\modules\mob\living\bot\cleanbot.dm" -#include "code\modules\mob\living\bot\ed209bot.dm" -#include "code\modules\mob\living\bot\edCLNbot.dm" -#include "code\modules\mob\living\bot\farmbot.dm" -#include "code\modules\mob\living\bot\floorbot.dm" -#include "code\modules\mob\living\bot\medbot.dm" -#include "code\modules\mob\living\bot\mulebot.dm" -#include "code\modules\mob\living\bot\mulebot_vr.dm" -#include "code\modules\mob\living\bot\secbot.dm" -#include "code\modules\mob\living\bot\SLed209bot.dm" -#include "code\modules\mob\living\carbon\breathe.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_powers.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\lick_wounds.dm" -#include "code\modules\mob\living\carbon\resist.dm" -#include "code\modules\mob\living\carbon\shock.dm" -#include "code\modules\mob\living\carbon\taste.dm" -#include "code\modules\mob\living\carbon\viruses.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" -#include "code\modules\mob\living\carbon\alien\alien_damage.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\progression.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" -#include "code\modules\mob\living\carbon\alien\diona\life.dm" -#include "code\modules\mob\living\carbon\alien\diona\progression.dm" -#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" -#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\progression.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\robot.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\death_vr.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\emote_vr.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\examine_vr.dm" -#include "code\modules\mob\living\carbon\human\gradient.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_defines_vr.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" -#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\human_powers.dm" -#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" -#include "code\modules\mob\living\carbon\human\human_resist.dm" -#include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\human_species_vr.dm" -#include "code\modules\mob\living\carbon\human\human_vr.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\life_vr.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\stripping.dm" -#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm" -#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" -#include "code\modules\mob\living\carbon\human\species\species.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_helpers.dm" -#include "code\modules\mob\living\carbon\human\species\species_hud.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_vr.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\event.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" -#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\golem.dm" -#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" -#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" -#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\emote.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_vr.dm" -#include "code\modules\mob\living\silicon\subystems.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_movement.dm" -#include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" -#include "code\modules\mob\living\silicon\ai\ai_vr.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\icons.dm" -#include "code\modules\mob\living\silicon\ai\latejoin.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\malf.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\admin.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\examine.dm" -#include "code\modules\mob\living\silicon\pai\life.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\pai_vr.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\recruit.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" -#include "code\modules\mob\living\silicon\robot\analyzer.dm" -#include "code\modules\mob\living\silicon\robot\component.dm" -#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\examine_vr.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\photos.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_damage.dm" -#include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" -#include "code\modules\mob\living\silicon\robot\robot_vr.dm" -#include "code\modules\mob\living\silicon\robot\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\event_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" -#include "code\modules\mob\living\simple_mob\appearance.dm" -#include "code\modules\mob\living\simple_mob\butchering.dm" -#include "code\modules\mob\living\simple_mob\combat.dm" -#include "code\modules\mob\living\simple_mob\defense.dm" -#include "code\modules\mob\living\simple_mob\donteatpets_vr.dm" -#include "code\modules\mob\living\simple_mob\hands.dm" -#include "code\modules\mob\living\simple_mob\harvesting.dm" -#include "code\modules\mob\living\simple_mob\life.dm" -#include "code\modules\mob\living\simple_mob\on_click.dm" -#include "code\modules\mob\living\simple_mob\simple_hud.dm" -#include "code\modules\mob\living\simple_mob\simple_mob.dm" -#include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" -#include "code\modules\mob\living\simple_mob\taming.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_powers.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\chicken.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\giant_spider_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\pepper.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\phorogenic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\thermic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\jerboa_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\fox_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\fluffy_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" -#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" -#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\wahlem_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\hoverpod.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\marauder.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\mecha.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\odysseus.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\phazon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\ripley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\monitor_ward.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\ward.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" -#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" -#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\slime_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\xeno_vore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bus.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\busclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\c_shift.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Clowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\hespawner.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\_defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" -#include "code\modules\mob\living\voice\voice.dm" -#include "code\modules\mob\living\voice\voice_vr.dm" -#include "code\modules\mob\new_player\login.dm" -#include "code\modules\mob\new_player\login_vr.dm" -#include "code\modules\mob\new_player\logout.dm" -#include "code\modules\mob\new_player\new_player.dm" -#include "code\modules\mob\new_player\new_player_vr.dm" -#include "code\modules\mob\new_player\news.dm" -#include "code\modules\mob\new_player\poll.dm" -#include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\preferences_setup_vr.dm" -#include "code\modules\mob\new_player\skill.dm" -#include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories_ear.dm" -#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_extra.dm" -#include "code\modules\mob\new_player\sprite_accessories_extra_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_tail.dm" -#include "code\modules\mob\new_player\sprite_accessories_tail_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_taur.dm" -#include "code\modules\mob\new_player\sprite_accessories_taur_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_wing.dm" -#include "code\modules\mob\new_player\sprite_accessories_wing_vr.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\modular_computer\core.dm" -#include "code\modules\modular_computers\computers\modular_computer\damage.dm" -#include "code\modules\modular_computers\computers\modular_computer\hardware.dm" -#include "code\modules\modular_computers\computers\modular_computer\interaction.dm" -#include "code\modules\modular_computers\computers\modular_computer\power.dm" -#include "code\modules\modular_computers\computers\modular_computer\ui.dm" -#include "code\modules\modular_computers\computers\modular_computer\variables.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_console.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_console.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_laptop_vr.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_tablet_vr.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\news_article.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\file_system\programs\command\card.dm" -#include "code\modules\modular_computers\file_system\programs\command\comm.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\alarm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\atmos_control.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\shutoff_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\generic\camera.dm" -#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\game.dm" -#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" -#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" -#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" -#include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" -#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" -#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm" -#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\nano_printer.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" -#include "code\modules\modular_computers\hardware\processor_unit.dm" -#include "code\modules\modular_computers\hardware\tesla_link.dm" -#include "code\modules\modular_computers\NTNet\NTNet.dm" -#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" -#include "code\modules\modular_computers\NTNet\emails\email_account.dm" -#include "code\modules\modular_computers\NTNet\emails\email_message.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\multi-tile\multi-tile.dm" -#include "code\modules\multiz\_stubs.dm" -#include "code\modules\multiz\admin_upload.dm" -#include "code\modules\multiz\basic.dm" -#include "code\modules\multiz\hoist.dm" -#include "code\modules\multiz\ladder_assembly_vr.dm" -#include "code\modules\multiz\ladders.dm" -#include "code\modules\multiz\ladders_vr.dm" -#include "code\modules\multiz\movement.dm" -#include "code\modules\multiz\movement_vr.dm" -#include "code\modules\multiz\pipes.dm" -#include "code\modules\multiz\stairs.dm" -#include "code\modules\multiz\turf.dm" -#include "code\modules\multiz\zshadow.dm" -#include "code\modules\news\news_init.dm" -#include "code\modules\news\newspaper.dm" -#include "code\modules\news\newspaper_layout.dm" -#include "code\modules\nifsoft\nif.dm" -#include "code\modules\nifsoft\nif_softshop.dm" -#include "code\modules\nifsoft\nif_tgui.dm" -#include "code\modules\nifsoft\nifsoft.dm" -#include "code\modules\nifsoft\software\01_vision.dm" -#include "code\modules\nifsoft\software\05_health.dm" -#include "code\modules\nifsoft\software\06_screens.dm" -#include "code\modules\nifsoft\software\10_combat.dm" -#include "code\modules\nifsoft\software\13_soulcatcher.dm" -#include "code\modules\nifsoft\software\14_commlink.dm" -#include "code\modules\nifsoft\software\15_misc.dm" -#include "code\modules\organs\blood.dm" -#include "code\modules\organs\misc.dm" -#include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_external.dm" -#include "code\modules\organs\organ_external_vr.dm" -#include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_stump.dm" -#include "code\modules\organs\pain.dm" -#include "code\modules\organs\robolimbs.dm" -#include "code\modules\organs\robolimbs_custom.dm" -#include "code\modules\organs\robolimbs_vr.dm" -#include "code\modules\organs\wound.dm" -#include "code\modules\organs\internal\appendix.dm" -#include "code\modules\organs\internal\augment.dm" -#include "code\modules\organs\internal\brain.dm" -#include "code\modules\organs\internal\eyes.dm" -#include "code\modules\organs\internal\heart.dm" -#include "code\modules\organs\internal\intestine.dm" -#include "code\modules\organs\internal\kidneys.dm" -#include "code\modules\organs\internal\liver.dm" -#include "code\modules\organs\internal\lungs.dm" -#include "code\modules\organs\internal\organ_internal.dm" -#include "code\modules\organs\internal\spleen.dm" -#include "code\modules\organs\internal\stomach.dm" -#include "code\modules\organs\internal\voicebox.dm" -#include "code\modules\organs\internal\augment\armmounted.dm" -#include "code\modules\organs\internal\augment\bio.dm" -#include "code\modules\organs\internal\robotic\diagnostic.dm" -#include "code\modules\organs\internal\robotic\heatsink.dm" -#include "code\modules\organs\internal\robotic\robotic.dm" -#include "code\modules\organs\subtypes\diona.dm" -#include "code\modules\organs\subtypes\indestructible.dm" -#include "code\modules\organs\subtypes\machine.dm" -#include "code\modules\organs\subtypes\nano.dm" -#include "code\modules\organs\subtypes\replicant.dm" -#include "code\modules\organs\subtypes\shadekin.dm" -#include "code\modules\organs\subtypes\shadekin_vr.dm" -#include "code\modules\organs\subtypes\slime.dm" -#include "code\modules\organs\subtypes\slime_vr.dm" -#include "code\modules\organs\subtypes\standard.dm" -#include "code\modules\organs\subtypes\standard_vr.dm" -#include "code\modules\organs\subtypes\teshari.dm" -#include "code\modules\organs\subtypes\unathi.dm" -#include "code\modules\organs\subtypes\unbreakable.dm" -#include "code\modules\organs\subtypes\unseverable.dm" -#include "code\modules\organs\subtypes\vox.dm" -#include "code\modules\organs\subtypes\vox_vr.dm" -#include "code\modules\organs\subtypes\xenos.dm" -#include "code\modules\overmap\abductor_vr.dm" -#include "code\modules\overmap\bluespace_rift_vr.dm" -#include "code\modules\overmap\champagne.dm" -#include "code\modules\overmap\helpers.dm" -#include "code\modules\overmap\overmap_object.dm" -#include "code\modules\overmap\overmap_planet.dm" -#include "code\modules\overmap\overmap_shuttle.dm" -#include "code\modules\overmap\sectors.dm" -#include "code\modules\overmap\spacetravel.dm" -#include "code\modules\overmap\turfs.dm" -#include "code\modules\overmap\disperser\disperser.dm" -#include "code\modules\overmap\disperser\disperser_charge.dm" -#include "code\modules\overmap\disperser\disperser_circuit.dm" -#include "code\modules\overmap\disperser\disperser_console.dm" -#include "code\modules\overmap\disperser\disperser_fire.dm" -#include "code\modules\overmap\events\event_handler.dm" -#include "code\modules\overmap\events\generation.dm" -#include "code\modules\overmap\events\overmap_event.dm" -#include "code\modules\overmap\ships\landable.dm" -#include "code\modules\overmap\ships\panicbutton.dm" -#include "code\modules\overmap\ships\ship.dm" -#include "code\modules\overmap\ships\computers\computer_shims.dm" -#include "code\modules\overmap\ships\computers\engine_control.dm" -#include "code\modules\overmap\ships\computers\helm.dm" -#include "code\modules\overmap\ships\computers\sensors.dm" -#include "code\modules\overmap\ships\computers\ship.dm" -#include "code\modules\overmap\ships\computers\ship_vr.dm" -#include "code\modules\overmap\ships\computers\shuttle.dm" -#include "code\modules\overmap\ships\engines\engine.dm" -#include "code\modules\overmap\ships\engines\gas_thruster.dm" -#include "code\modules\overmap\ships\engines\gas_thruster_vr.dm" -#include "code\modules\overmap\ships\engines\ion_thruster.dm" -#include "code\modules\paperwork\adminpaper.dm" -#include "code\modules\paperwork\carbonpaper.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\faxmachine.dm" -#include "code\modules\paperwork\faxmachine_vr.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_bundle.dm" -#include "code\modules\paperwork\paper_sticky.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\papershredder.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" -#include "code\modules\paperwork\silicon_photography.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\pda\ai.dm" -#include "code\modules\pda\app.dm" -#include "code\modules\pda\cart.dm" -#include "code\modules\pda\cart_apps.dm" -#include "code\modules\pda\cart_vr.dm" -#include "code\modules\pda\core_apps.dm" -#include "code\modules\pda\messenger.dm" -#include "code\modules\pda\messenger_plugins.dm" -#include "code\modules\pda\pda.dm" -#include "code\modules\pda\pda_subtypes.dm" -#include "code\modules\pda\pda_tgui.dm" -#include "code\modules\pda\pda_vr.dm" -#include "code\modules\pda\radio.dm" -#include "code\modules\pda\utilities.dm" -#include "code\modules\persistence\filth.dm" -#include "code\modules\persistence\graffiti.dm" -#include "code\modules\persistence\noticeboard.dm" -#include "code\modules\persistence\serialize.dm" -#include "code\modules\persistence\datum\persistence_datum.dm" -#include "code\modules\persistence\effects\filth.dm" -#include "code\modules\persistence\effects\graffiti.dm" -#include "code\modules\persistence\effects\paper.dm" -#include "code\modules\persistence\effects\paper_sticky.dm" -#include "code\modules\persistence\effects\trash.dm" -#include "code\modules\persistence\storage\smartfridge.dm" -#include "code\modules\persistence\storage\storage.dm" -#include "code\modules\planet\planet.dm" -#include "code\modules\planet\sun.dm" -#include "code\modules\planet\time.dm" -#include "code\modules\planet\virgo3b_vr.dm" -#include "code\modules\planet\virgo4_vr.dm" -#include "code\modules\planet\weather.dm" -#include "code\modules\planet\weather_vr.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\apc_vr.dm" -#include "code\modules\power\batteryrack.dm" -#include "code\modules\power\batteryrack_vr.dm" -#include "code\modules\power\breaker_box.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cable_ender.dm" -#include "code\modules\power\cable_heavyduty.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\debug_items.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\generator_type2.dm" -#include "code\modules\power\gravitygenerator_vr.dm" -#include "code\modules\power\grid_checker.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\lighting_vr.dm" -#include "code\modules\power\lightswitch_vr.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\port_gen_vr.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\smes_construction.dm" -#include "code\modules\power\smes_vr.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\antimatter\containment_jar.dm" -#include "code\modules\power\antimatter\control.dm" -#include "code\modules\power\antimatter\shielding.dm" -#include "code\modules\power\cells\device_cells.dm" -#include "code\modules\power\cells\device_cells_vr.dm" -#include "code\modules\power\cells\esoteric_cells.dm" -#include "code\modules\power\cells\power_cells.dm" -#include "code\modules\power\fusion\_setup.dm" -#include "code\modules\power\fusion\fusion_circuits.dm" -#include "code\modules\power\fusion\fusion_particle_catcher.dm" -#include "code\modules\power\fusion\fusion_reactions.dm" -#include "code\modules\power\fusion\magpower.dm" -#include "code\modules\power\fusion\core\_core.dm" -#include "code\modules\power\fusion\core\core_control.dm" -#include "code\modules\power\fusion\core\core_field.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_assembly.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_compressor.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_control.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_injector.dm" -#include "code\modules\power\fusion\gyrotron\gyrotron.dm" -#include "code\modules\power\fusion\gyrotron\gyrotron_control.dm" -#include "code\modules\power\sensors\powernet_sensor.dm" -#include "code\modules\power\sensors\sensor_monitoring.dm" -#include "code\modules\power\singularity\act.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm" -#include "code\modules\power\supermatter\setup_supermatter.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\power\tesla\telsa_construction.dm" -#include "code\modules\power\tesla\tesla_act.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\broken.dm" -#include "code\modules\projectiles\dnalocking.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\magazines.dm" -#include "code\modules\projectiles\ammunition\magazines_vr.dm" -#include "code\modules\projectiles\ammunition\magnetic.dm" -#include "code\modules\projectiles\ammunition\rounds.dm" -#include "code\modules\projectiles\ammunition\smartmag.dm" -#include "code\modules\projectiles\brokenguns\energy.dm" -#include "code\modules\projectiles\brokenguns\launcher.dm" -#include "code\modules\projectiles\brokenguns\magnetic.dm" -#include "code\modules\projectiles\brokenguns\projectile.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\launcher.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\modular_guns.dm" -#include "code\modules\projectiles\guns\projectile.dm" -#include "code\modules\projectiles\guns\vox.dm" -#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" -#include "code\modules\projectiles\guns\energy\crestrose_vr.dm" -#include "code\modules\projectiles\guns\energy\dominator_vr.dm" -#include "code\modules\projectiles\guns\energy\gunsword_vr.dm" -#include "code\modules\projectiles\guns\energy\hooklauncher.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\laser_vr.dm" -#include "code\modules\projectiles\guns\energy\netgun_vr.dm" -#include "code\modules\projectiles\guns\energy\nuclear.dm" -#include "code\modules\projectiles\guns\energy\nuclear_vr.dm" -#include "code\modules\projectiles\guns\energy\particle.dm" -#include "code\modules\projectiles\guns\energy\phase.dm" -#include "code\modules\projectiles\guns\energy\protector_vr.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\pummeler_vr.dm" -#include "code\modules\projectiles\guns\energy\sickshot_vr.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\special_vr.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\energy\stun_vr.dm" -#include "code\modules\projectiles\guns\energy\temperature.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\cell_loaded.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m_cells.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon_cells.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw_cells.dm" -#include "code\modules\projectiles\guns\launcher\crossbow.dm" -#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" -#include "code\modules\projectiles\guns\launcher\pneumatic.dm" -#include "code\modules\projectiles\guns\launcher\rocket.dm" -#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" -#include "code\modules\projectiles\guns\magic\fireball.dm" -#include "code\modules\projectiles\guns\magnetic\bore.dm" -#include "code\modules\projectiles\guns\magnetic\gasthrower.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\automatic.dm" -#include "code\modules\projectiles\guns\projectile\automatic_vr.dm" -#include "code\modules\projectiles\guns\projectile\boltaction.dm" -#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm" -#include "code\modules\projectiles\guns\projectile\caseless.dm" -#include "code\modules\projectiles\guns\projectile\contender.dm" -#include "code\modules\projectiles\guns\projectile\dartgun.dm" -#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\pistol.dm" -#include "code\modules\projectiles\guns\projectile\pistol_vr.dm" -#include "code\modules\projectiles\guns\projectile\revolver.dm" -#include "code\modules\projectiles\guns\projectile\revolver_vr.dm" -#include "code\modules\projectiles\guns\projectile\semiauto.dm" -#include "code\modules\projectiles\guns\projectile\shotgun.dm" -#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\sniper.dm" -#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" -#include "code\modules\projectiles\projectile\arc.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\beams_vr.dm" -#include "code\modules\projectiles\projectile\blob.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\bullets_vr.dm" -#include "code\modules\projectiles\projectile\change.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\energy_vr.dm" -#include "code\modules\projectiles\projectile\explosive.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\hook.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\magnetic.dm" -#include "code\modules\projectiles\projectile\pellets.dm" -#include "code\modules\projectiles\projectile\scatter.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\projectiles\projectile\trace.dm" -#include "code\modules\projectiles\targeting\targeting_client.dm" -#include "code\modules\projectiles\targeting\targeting_gun.dm" -#include "code\modules\projectiles\targeting\targeting_mob.dm" -#include "code\modules\projectiles\targeting\targeting_overlay.dm" -#include "code\modules\projectiles\targeting\targeting_triggers.dm" -#include "code\modules\radiation\radiation.dm" -#include "code\modules\random_map\_random_map_setup.dm" -#include "code\modules\random_map\random_map.dm" -#include "code\modules\random_map\random_map_verbs.dm" -#include "code\modules\random_map\automata\automata.dm" -#include "code\modules\random_map\automata\caves.dm" -#include "code\modules\random_map\building\building.dm" -#include "code\modules\random_map\drop\drop_types.dm" -#include "code\modules\random_map\drop\droppod.dm" -#include "code\modules\random_map\drop\droppod_doors.dm" -#include "code\modules\random_map\drop\supply.dm" -#include "code\modules\random_map\mazes\maze.dm" -#include "code\modules\random_map\mazes\maze_cell.dm" -#include "code\modules\random_map\noise\desert.dm" -#include "code\modules\random_map\noise\noise.dm" -#include "code\modules\random_map\noise\ore.dm" -#include "code\modules\random_map\noise\tundra.dm" -#include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Logging.dm" -#include "code\modules\reagents\Chemistry-Metabolism.dm" -#include "code\modules\reagents\holder\distilling.dm" -#include "code\modules\reagents\holder\holder.dm" -#include "code\modules\reagents\hoses\connector.dm" -#include "code\modules\reagents\hoses\hose.dm" -#include "code\modules\reagents\hoses\hose_connector.dm" -#include "code\modules\reagents\machinery\chem_master.dm" -#include "code\modules\reagents\machinery\chem_master_vr.dm" -#include "code\modules\reagents\machinery\chemalyzer.dm" -#include "code\modules\reagents\machinery\distillery.dm" -#include "code\modules\reagents\machinery\grinder.dm" -#include "code\modules\reagents\machinery\dispenser\_defines.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser2.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm" -#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" -#include "code\modules\reagents\machinery\dispenser\supply.dm" -#include "code\modules\reagents\reactions\_reactions.dm" -#include "code\modules\reagents\reactions\distilling\distilling.dm" -#include "code\modules\reagents\reactions\fusion\fusion.dm" -#include "code\modules\reagents\reactions\instant\drinks.dm" -#include "code\modules\reagents\reactions\instant\drinks_vr.dm" -#include "code\modules\reagents\reactions\instant\food.dm" -#include "code\modules\reagents\reactions\instant\food_vr.dm" -#include "code\modules\reagents\reactions\instant\instant.dm" -#include "code\modules\reagents\reactions\instant\instant_vr.dm" -#include "code\modules\reagents\reagent_containers\_reagent_containers.dm" -#include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" -#include "code\modules\reagents\reagent_containers\borghypo.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\glass_vr.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\hypospray_vr.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\pill_vr.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\spray_vr.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\reagents\reagent_containers\syringes_vr.dm" -#include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" -#include "code\modules\reagents\reagents\_helpers.dm" -#include "code\modules\reagents\reagents\_reagents.dm" -#include "code\modules\reagents\reagents\core.dm" -#include "code\modules\reagents\reagents\dispenser.dm" -#include "code\modules\reagents\reagents\food_drinks.dm" -#include "code\modules\reagents\reagents\food_drinks_vr.dm" -#include "code\modules\reagents\reagents\medicine.dm" -#include "code\modules\reagents\reagents\medicine_vr.dm" -#include "code\modules\reagents\reagents\modifiers.dm" -#include "code\modules\reagents\reagents\other.dm" -#include "code\modules\reagents\reagents\other_vr.dm" -#include "code\modules\reagents\reagents\toxins.dm" -#include "code\modules\reagents\reagents\vore_vr.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\mechfab_designs.dm" -#include "code\modules\research\message_server.dm" -#include "code\modules\research\prosfab_designs.dm" -#include "code\modules\research\prosfab_designs_vr.dm" -#include "code\modules\research\protolathe.dm" -#include "code\modules\research\rd-readme.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdconsole_tgui.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\teleport_vr.dm" -#include "code\modules\research\designs\ai_holders.dm" -#include "code\modules\research\designs\bag_of_holding.dm" -#include "code\modules\research\designs\beakers.dm" -#include "code\modules\research\designs\bio_devices.dm" -#include "code\modules\research\designs\bio_devices_vr.dm" -#include "code\modules\research\designs\circuit_assembly.dm" -#include "code\modules\research\designs\engineering.dm" -#include "code\modules\research\designs\HUDs.dm" -#include "code\modules\research\designs\HUDs_vr.dm" -#include "code\modules\research\designs\implants.dm" -#include "code\modules\research\designs\implants_vr.dm" -#include "code\modules\research\designs\locator_devices.dm" -#include "code\modules\research\designs\medical.dm" -#include "code\modules\research\designs\medical_vr.dm" -#include "code\modules\research\designs\mining_toys.dm" -#include "code\modules\research\designs\misc.dm" -#include "code\modules\research\designs\misc_vr.dm" -#include "code\modules\research\designs\modular_computer.dm" -#include "code\modules\research\designs\pdas.dm" -#include "code\modules\research\designs\power_cells.dm" -#include "code\modules\research\designs\precursor.dm" -#include "code\modules\research\designs\stock_parts.dm" -#include "code\modules\research\designs\subspace_parts.dm" -#include "code\modules\research\designs\tech_disks.dm" -#include "code\modules\research\designs\weapons.dm" -#include "code\modules\research\designs\weapons_vr.dm" -#include "code\modules\research\designs\xenoarch_toys.dm" -#include "code\modules\research\designs\xenobio_toys.dm" -#include "code\modules\research\designs\circuits\ai_modules.dm" -#include "code\modules\research\designs\circuits\ai_modules_vr.dm" -#include "code\modules\research\designs\circuits\circuits.dm" -#include "code\modules\research\designs\circuits\circuits_vr.dm" -#include "code\modules\research\designs\circuits\disks.dm" -#include "code\modules\resleeving\circuitboards.dm" -#include "code\modules\resleeving\computers.dm" -#include "code\modules\resleeving\designer.dm" -#include "code\modules\resleeving\documents.dm" -#include "code\modules\resleeving\implant.dm" -#include "code\modules\resleeving\infocore_records.dm" -#include "code\modules\resleeving\infomorph.dm" -#include "code\modules\resleeving\infomorph_software.dm" -#include "code\modules\resleeving\machines.dm" -#include "code\modules\resleeving\machines_vr.dm" -#include "code\modules\resleeving\resleeving_sickness.dm" -#include "code\modules\resleeving\sleevecard.dm" -#include "code\modules\rogueminer_vr\asteroid.dm" -#include "code\modules\rogueminer_vr\controller.dm" -#include "code\modules\rogueminer_vr\debug.dm" -#include "code\modules\rogueminer_vr\landmarks.dm" -#include "code\modules\rogueminer_vr\roguemines_mobs.dm" -#include "code\modules\rogueminer_vr\wrappers.dm" -#include "code\modules\rogueminer_vr\zone_console.dm" -#include "code\modules\rogueminer_vr\zonemaster.dm" -#include "code\modules\scripting\Errors.dm" -#include "code\modules\scripting\IDE.dm" -#include "code\modules\scripting\Options.dm" -#include "code\modules\scripting\stack.dm" -#include "code\modules\scripting\AST\AST Nodes.dm" -#include "code\modules\scripting\AST\Blocks.dm" -#include "code\modules\scripting\AST\Statements.dm" -#include "code\modules\scripting\AST\Operators\Binary Operators.dm" -#include "code\modules\scripting\AST\Operators\Unary Operators.dm" -#include "code\modules\scripting\Implementations\_Logic.dm" -#include "code\modules\scripting\Implementations\Telecomms.dm" -#include "code\modules\scripting\Interpreter\Evaluation.dm" -#include "code\modules\scripting\Interpreter\Interaction.dm" -#include "code\modules\scripting\Interpreter\Interpreter.dm" -#include "code\modules\scripting\Interpreter\Scope.dm" -#include "code\modules\scripting\Parser\Expressions.dm" -#include "code\modules\scripting\Parser\Keywords.dm" -#include "code\modules\scripting\Parser\Parser.dm" -#include "code\modules\scripting\Scanner\Scanner.dm" -#include "code\modules\scripting\Scanner\Tokens.dm" -#include "code\modules\security levels\keycard authentication.dm" -#include "code\modules\security levels\security levels.dm" -#include "code\modules\shieldgen\directional_shield.dm" -#include "code\modules\shieldgen\emergency_shield.dm" -#include "code\modules\shieldgen\energy_field.dm" -#include "code\modules\shieldgen\energy_shield.dm" -#include "code\modules\shieldgen\handheld_defuser.dm" -#include "code\modules\shieldgen\sheldwallgen.dm" -#include "code\modules\shieldgen\shield_capacitor.dm" -#include "code\modules\shieldgen\shield_diffuser.dm" -#include "code\modules\shieldgen\shield_gen.dm" -#include "code\modules\shieldgen\shield_gen_external.dm" -#include "code\modules\shieldgen\shield_generator.dm" -#include "code\modules\shieldgen\shield_modes.dm" -#include "code\modules\shuttles\antagonist.dm" -#include "code\modules\shuttles\crashes.dm" -#include "code\modules\shuttles\departmental.dm" -#include "code\modules\shuttles\escape_pods.dm" -#include "code\modules\shuttles\landmarks.dm" -#include "code\modules\shuttles\shuttle.dm" -#include "code\modules\shuttles\shuttle_autodock.dm" -#include "code\modules\shuttles\shuttle_console.dm" -#include "code\modules\shuttles\shuttle_console_multi.dm" -#include "code\modules\shuttles\shuttle_emergency.dm" -#include "code\modules\shuttles\shuttle_ferry.dm" -#include "code\modules\shuttles\shuttle_specops.dm" -#include "code\modules\shuttles\shuttle_supply.dm" -#include "code\modules\shuttles\shuttles_multi.dm" -#include "code\modules\shuttles\shuttles_vr.dm" -#include "code\modules\shuttles\shuttles_web.dm" -#include "code\modules\shuttles\web_datums.dm" -#include "code\modules\spells\artifacts.dm" -#include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" -#include "code\modules\spells\spells.dm" -#include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" -#include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\construct.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\rune_write.dm" -#include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\harvest.dm" -#include "code\modules\spells\targeted\mind_transfer.dm" -#include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\surgery\_defines.dm" -#include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\external_repair.dm" -#include "code\modules\surgery\face.dm" -#include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\implant.dm" -#include "code\modules\surgery\limb_reattach.dm" -#include "code\modules\surgery\neck.dm" -#include "code\modules\surgery\organs_internal.dm" -#include "code\modules\surgery\other.dm" -#include "code\modules\surgery\robotics.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\~defines.dm" -#include "code\modules\tables\bench.dm" -#include "code\modules\tables\flipping.dm" -#include "code\modules\tables\interactions.dm" -#include "code\modules\tables\presets.dm" -#include "code\modules\tables\presets_vr.dm" -#include "code\modules\tables\rack.dm" -#include "code\modules\tables\rack_vr.dm" -#include "code\modules\tables\tables.dm" -#include "code\modules\tables\update_triggers.dm" -#include "code\modules\telesci\bscyrstal.dm" -#include "code\modules\telesci\construction.dm" -#include "code\modules\telesci\gps_advanced.dm" -#include "code\modules\telesci\quantum_pad.dm" -#include "code\modules\telesci\telepad.dm" -#include "code\modules\telesci\telesci_computer.dm" -#include "code\modules\tension\tension.dm" -#include "code\modules\tgs\includes.dm" -#include "code\modules\tgui\external.dm" -#include "code\modules\tgui\modal.dm" -#include "code\modules\tgui\states.dm" -#include "code\modules\tgui\tgui.dm" -#include "code\modules\tgui\tgui_window.dm" -#include "code\modules\tgui\modules\_base.dm" -#include "code\modules\tgui\modules\admin_shuttle_controller.dm" -#include "code\modules\tgui\modules\agentcard.dm" -#include "code\modules\tgui\modules\alarm.dm" -#include "code\modules\tgui\modules\appearance_changer.dm" -#include "code\modules\tgui\modules\appearance_changer_vr.dm" -#include "code\modules\tgui\modules\atmos_control.dm" -#include "code\modules\tgui\modules\camera.dm" -#include "code\modules\tgui\modules\communications.dm" -#include "code\modules\tgui\modules\crew_manifest.dm" -#include "code\modules\tgui\modules\crew_monitor.dm" -#include "code\modules\tgui\modules\gyrotron_control.dm" -#include "code\modules\tgui\modules\law_manager.dm" -#include "code\modules\tgui\modules\overmap.dm" -#include "code\modules\tgui\modules\power_monitor.dm" -#include "code\modules\tgui\modules\rcon.dm" -#include "code\modules\tgui\modules\rustcore_monitor.dm" -#include "code\modules\tgui\modules\rustfuel_control.dm" -#include "code\modules\tgui\modules\shutoff_monitor.dm" -#include "code\modules\tgui\modules\supermatter_monitor.dm" -#include "code\modules\tgui\modules\teleporter.dm" -#include "code\modules\tgui\modules\ntos-only\cardmod.dm" -#include "code\modules\tgui\modules\ntos-only\configurator.dm" -#include "code\modules\tgui\modules\ntos-only\email.dm" -#include "code\modules\tgui\modules\ntos-only\uav.dm" -#include "code\modules\tgui\states\admin.dm" -#include "code\modules\tgui\states\always.dm" -#include "code\modules\tgui\states\conscious.dm" -#include "code\modules\tgui\states\contained.dm" -#include "code\modules\tgui\states\deep_inventory.dm" -#include "code\modules\tgui\states\default.dm" -#include "code\modules\tgui\states\hands.dm" -#include "code\modules\tgui\states\human_adjacent.dm" -#include "code\modules\tgui\states\inventory.dm" -#include "code\modules\tgui\states\inventory_vr.dm" -#include "code\modules\tgui\states\not_incapacitated.dm" -#include "code\modules\tgui\states\notcontained.dm" -#include "code\modules\tgui\states\observer.dm" -#include "code\modules\tgui\states\physical.dm" -#include "code\modules\tgui\states\self.dm" -#include "code\modules\tgui\states\vorepanel_vr.dm" -#include "code\modules\tgui\states\zlevel.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\turbolift\_turbolift.dm" -#include "code\modules\turbolift\turbolift.dm" -#include "code\modules\turbolift\turbolift_areas.dm" -#include "code\modules\turbolift\turbolift_console.dm" -#include "code\modules\turbolift\turbolift_console_vr.dm" -#include "code\modules\turbolift\turbolift_door.dm" -#include "code\modules\turbolift\turbolift_door_vr.dm" -#include "code\modules\turbolift\turbolift_floor.dm" -#include "code\modules\turbolift\turbolift_map.dm" -#include "code\modules\turbolift\turbolift_turfs.dm" -#include "code\modules\vchat\vchat_client.dm" -#include "code\modules\vchat\vchat_db.dm" -#include "code\modules\vehicles\bike.dm" -#include "code\modules\vehicles\boat.dm" -#include "code\modules\vehicles\cargo_train.dm" -#include "code\modules\vehicles\construction.dm" -#include "code\modules\vehicles\quad.dm" -#include "code\modules\vehicles\train.dm" -#include "code\modules\vehicles\vehicle.dm" -#include "code\modules\ventcrawl\ventcrawl.dm" -#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" -#include "code\modules\ventcrawl\ventcrawl_multiz.dm" -#include "code\modules\ventcrawl\ventcrawl_verb.dm" -#include "code\modules\virus2\admin.dm" -#include "code\modules\virus2\analyser.dm" -#include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\centrifuge.dm" -#include "code\modules\virus2\curer.dm" -#include "code\modules\virus2\disease2.dm" -#include "code\modules\virus2\diseasesplicer.dm" -#include "code\modules\virus2\dishincubator.dm" -#include "code\modules\virus2\effect.dm" -#include "code\modules\virus2\effect_vr.dm" -#include "code\modules\virus2\helpers.dm" -#include "code\modules\virus2\isolator.dm" -#include "code\modules\virus2\items_devices.dm" -#include "code\modules\vore\hook-defs_vr.dm" -#include "code\modules\vore\trycatch_vr.dm" -#include "code\modules\vore\appearance\preferences_vr.dm" -#include "code\modules\vore\appearance\update_icons_vr.dm" -#include "code\modules\vore\eating\belly_dat_vr.dm" -#include "code\modules\vore\eating\belly_obj_vr.dm" -#include "code\modules\vore\eating\bellymodes_datum_vr.dm" -#include "code\modules\vore\eating\bellymodes_vr.dm" -#include "code\modules\vore\eating\contaminate_vr.dm" -#include "code\modules\vore\eating\digest_act_vr.dm" -#include "code\modules\vore\eating\leave_remains_vr.dm" -#include "code\modules\vore\eating\living_vr.dm" -#include "code\modules\vore\eating\silicon_vr.dm" -#include "code\modules\vore\eating\simple_animal_vr.dm" -#include "code\modules\vore\eating\transforming_vr.dm" -#include "code\modules\vore\eating\vore_vr.dm" -#include "code\modules\vore\eating\vorehooks_vr.dm" -#include "code\modules\vore\eating\vorepanel_vr.dm" -#include "code\modules\vore\fluffstuff\custom_boxes_vr.dm" -#include "code\modules\vore\fluffstuff\custom_clothes_vr.dm" -#include "code\modules\vore\fluffstuff\custom_items_vr.dm" -#include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" -#include "code\modules\vore\fluffstuff\custom_permits_vr.dm" -#include "code\modules\vore\persist\persist_vr.dm" -#include "code\modules\vore\resizing\grav_pull_vr.dm" -#include "code\modules\vore\resizing\holder_micro_vr.dm" -#include "code\modules\vore\resizing\resize_vr.dm" -#include "code\modules\vore\resizing\sizegun_vr.dm" -#include "code\modules\vore\smoleworld\smoleworld_vr.dm" -#include "code\modules\vore\weight\fitness_machines_vr.dm" -#include "code\modules\webhooks\_webhook.dm" -#include "code\modules\webhooks\webhook_ahelp2discord.dm" -#include "code\modules\webhooks\webhook_custom_event.dm" -#include "code\modules\webhooks\webhook_fax2discord.dm" -#include "code\modules\webhooks\webhook_roundend.dm" -#include "code\modules\webhooks\webhook_roundprep.dm" -#include "code\modules\webhooks\webhook_roundstart.dm" -#include "code\modules\xenoarcheaology\anomaly_container.dm" -#include "code\modules\xenoarcheaology\boulder.dm" -#include "code\modules\xenoarcheaology\effect.dm" -#include "code\modules\xenoarcheaology\manuals.dm" -#include "code\modules\xenoarcheaology\misc.dm" -#include "code\modules\xenoarcheaology\sampling.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact_vr.dm" -#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" -#include "code\modules\xenoarcheaology\artifacts\crystal.dm" -#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" -#include "code\modules\xenoarcheaology\artifacts\replicator.dm" -#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm" -#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm" -#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm" -#include "code\modules\xenoarcheaology\effects\badfeeling.dm" -#include "code\modules\xenoarcheaology\effects\berserk.dm" -#include "code\modules\xenoarcheaology\effects\cannibal.dm" -#include "code\modules\xenoarcheaology\effects\cellcharge.dm" -#include "code\modules\xenoarcheaology\effects\celldrain.dm" -#include "code\modules\xenoarcheaology\effects\cold.dm" -#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" -#include "code\modules\xenoarcheaology\effects\electric_field.dm" -#include "code\modules\xenoarcheaology\effects\emp.dm" -#include "code\modules\xenoarcheaology\effects\feysight.dm" -#include "code\modules\xenoarcheaology\effects\forcefield.dm" -#include "code\modules\xenoarcheaology\effects\gaia.dm" -#include "code\modules\xenoarcheaology\effects\gasco2.dm" -#include "code\modules\xenoarcheaology\effects\gasnitro.dm" -#include "code\modules\xenoarcheaology\effects\gasoxy.dm" -#include "code\modules\xenoarcheaology\effects\gasphoron.dm" -#include "code\modules\xenoarcheaology\effects\gassleeping.dm" -#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" -#include "code\modules\xenoarcheaology\effects\gravitational_waves.dm" -#include "code\modules\xenoarcheaology\effects\heal.dm" -#include "code\modules\xenoarcheaology\effects\heat.dm" -#include "code\modules\xenoarcheaology\effects\hurt.dm" -#include "code\modules\xenoarcheaology\effects\poltergeist.dm" -#include "code\modules\xenoarcheaology\effects\radiate.dm" -#include "code\modules\xenoarcheaology\effects\resurrect.dm" -#include "code\modules\xenoarcheaology\effects\roboheal.dm" -#include "code\modules\xenoarcheaology\effects\robohurt.dm" -#include "code\modules\xenoarcheaology\effects\sleepy.dm" -#include "code\modules\xenoarcheaology\effects\stun.dm" -#include "code\modules\xenoarcheaology\effects\teleport.dm" -#include "code\modules\xenoarcheaology\effects\vampire.dm" -#include "code\modules\xenoarcheaology\finds\eguns.dm" -#include "code\modules\xenoarcheaology\finds\eguns_vr.dm" -#include "code\modules\xenoarcheaology\finds\find_spawning.dm" -#include "code\modules\xenoarcheaology\finds\finds.dm" -#include "code\modules\xenoarcheaology\finds\finds_defines.dm" -#include "code\modules\xenoarcheaology\finds\fossils.dm" -#include "code\modules\xenoarcheaology\finds\misc.dm" -#include "code\modules\xenoarcheaology\finds\special.dm" -#include "code\modules\xenoarcheaology\finds\talking.dm" -#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" -#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" -#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" -#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" -#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" -#include "code\modules\xenoarcheaology\tools\equipment.dm" -#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" -#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" -#include "code\modules\xenoarcheaology\tools\tools.dm" -#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" -#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" -#include "code\modules\xenoarcheaology\tools\tools_vr.dm" -#include "code\modules\xenobio\items\extracts.dm" -#include "code\modules\xenobio\items\slime_objects.dm" -#include "code\modules\xenobio\items\slimepotions.dm" -#include "code\modules\xenobio\items\weapons.dm" -#include "code\modules\xenobio\machinery\processor.dm" -#include "code\modules\xgm\xgm_gas_data.dm" -#include "code\modules\xgm\xgm_gas_mixture.dm" -#include "code\unit_tests\decl_tests.dm" -#include "code\unit_tests\language_tests.dm" -#include "code\unit_tests\loadout_tests.dm" -#include "code\unit_tests\map_tests.dm" -#include "code\unit_tests\mob_tests.dm" -#include "code\unit_tests\recipe_tests.dm" -#include "code\unit_tests\research_tests.dm" -#include "code\unit_tests\sqlite_tests.dm" -#include "code\unit_tests\subsystem_tests.dm" -#include "code\unit_tests\unit_test.dm" -#include "code\unit_tests\unit_test_vr.dm" -#include "code\unit_tests\vore_tests_vr.dm" -#include "code\unit_tests\zas_tests.dm" -#include "code\unit_tests\integrated_circuits\arithmetic.dm" -#include "code\unit_tests\integrated_circuits\circuits.dm" -#include "code\unit_tests\integrated_circuits\converter.dm" -#include "code\unit_tests\integrated_circuits\logic.dm" -#include "code\unit_tests\integrated_circuits\trig.dm" -#include "code\ZAS\Airflow.dm" -#include "code\ZAS\Atom.dm" -#include "code\ZAS\Connection.dm" -#include "code\ZAS\ConnectionGroup.dm" -#include "code\ZAS\ConnectionManager.dm" -#include "code\ZAS\Controller.dm" -#include "code\ZAS\Debug.dm" -#include "code\ZAS\Diagnostic.dm" -#include "code\ZAS\Fire.dm" -#include "code\ZAS\Phoron.dm" -#include "code\ZAS\Turf.dm" -#include "code\ZAS\Variable Settings.dm" -#include "code\ZAS\Zone.dm" -#include "interface\interface.dm" -#include "interface\skin.dmf" -#include "maps\gateway_archive_vr\blackmarketpackers.dm" -#include "maps\offmap_vr\om_ships\abductor.dm" -#include "maps\southern_cross\items\clothing\sc_accessory.dm" -#include "maps\southern_cross\items\clothing\sc_suit.dm" -#include "maps\southern_cross\items\clothing\sc_under.dm" -#include "maps\southern_cross\loadout\loadout_suit.dm" -#include "maps\southern_cross\loadout\loadout_uniform.dm" -#include "maps\southern_cross\loadout\loadout_vr.dm" -#include "maps\submaps\_helpers.dm" -#include "maps\submaps\_readme.dm" -#include "maps\submaps\engine_submaps\engine.dm" -#include "maps\submaps\engine_submaps\engine_areas.dm" -#include "maps\submaps\engine_submaps_vr\tether\_engine_submaps.dm" -#include "maps\submaps\space_submaps\space.dm" -#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" -#include "maps\submaps\surface_submaps\mountains\mountains.dm" -#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" -#include "maps\submaps\surface_submaps\mountains\mountains_areas_vr.dm" -#include "maps\submaps\surface_submaps\plains\plains.dm" -#include "maps\submaps\surface_submaps\plains\plains_areas.dm" -#include "maps\submaps\surface_submaps\wilderness\wilderness.dm" -#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" -#include "maps\tether\tether.dm" -#include "maps\~map_system\maps.dm" -// END_INCLUDE -======= // DM Environment file for baystation12.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. @@ -4058,11 +10,14 @@ #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\_away_mission_tests.dm" #include "code\_macros.dm" +#include "code\_macros_vr.dm" #include "code\_map_tests.dm" #include "code\_unit_tests.dm" #include "code\global.dm" #include "code\global_init.dm" +#include "code\global_vr.dm" #include "code\hub.dm" #include "code\names.dm" #include "code\stylesheet.dm" @@ -4072,27 +27,34 @@ #include "code\__defines\_compile_options.dm" #include "code\__defines\_lists.dm" #include "code\__defines\_planes+layers.dm" +#include "code\__defines\_planes+layers_vr.dm" #include "code\__defines\_protect.dm" #include "code\__defines\_tick.dm" #include "code\__defines\admin.dm" +#include "code\__defines\admin_vr.dm" #include "code\__defines\appearance.dm" #include "code\__defines\atmos.dm" +#include "code\__defines\belly_modes_vr.dm" #include "code\__defines\callbacks.dm" #include "code\__defines\chemistry.dm" +#include "code\__defines\chemistry_vr.dm" #include "code\__defines\color.dm" #include "code\__defines\construction.dm" #include "code\__defines\crafting.dm" #include "code\__defines\damage_organs.dm" #include "code\__defines\dna.dm" +#include "code\__defines\exosuit_fab.dm" #include "code\__defines\flags.dm" #include "code\__defines\gamemode.dm" #include "code\__defines\holomap.dm" #include "code\__defines\hoses.dm" +#include "code\__defines\instruments.dm" #include "code\__defines\integrated_circuits.dm" #include "code\__defines\inventory_sizes.dm" #include "code\__defines\is_helpers.dm" #include "code\__defines\items_clothing.dm" #include "code\__defines\lighting.dm" +#include "code\__defines\lighting_vr.dm" #include "code\__defines\machinery.dm" #include "code\__defines\map.dm" #include "code\__defines\materials.dm" @@ -4100,25 +62,36 @@ #include "code\__defines\math_physics.dm" #include "code\__defines\MC.dm" #include "code\__defines\misc.dm" +#include "code\__defines\misc_vr.dm" #include "code\__defines\mobs.dm" +#include "code\__defines\mobs_vr.dm" +#include "code\__defines\nifsoft.dm" #include "code\__defines\objects.dm" #include "code\__defines\overmap.dm" #include "code\__defines\pda.dm" #include "code\__defines\planets.dm" +#include "code\__defines\planets_vr.dm" +#include "code\__defines\plants.dm" #include "code\__defines\preferences.dm" #include "code\__defines\process_scheduler.dm" #include "code\__defines\qdel.dm" #include "code\__defines\research.dm" +#include "code\__defines\roguemining_vr.dm" #include "code\__defines\rust_g.dm" +#include "code\__defines\shields.dm" #include "code\__defines\shuttle.dm" #include "code\__defines\sound.dm" #include "code\__defines\spaceman_dmm.dm" #include "code\__defines\species_languages.dm" +#include "code\__defines\species_languages_vr.dm" #include "code\__defines\sqlite_defines.dm" #include "code\__defines\stat_tracking.dm" #include "code\__defines\subsystems.dm" +#include "code\__defines\subsystems_vr.dm" #include "code\__defines\supply.dm" #include "code\__defines\targeting.dm" +#include "code\__defines\tgs.config.dm" +#include "code\__defines\tgs.dm" #include "code\__defines\tgui.dm" #include "code\__defines\tools.dm" #include "code\__defines\turfs.dm" @@ -4141,11 +114,14 @@ #include "code\_global_vars\bitfields.dm" #include "code\_global_vars\misc.dm" #include "code\_global_vars\mobs.dm" +#include "code\_global_vars\religion.dm" #include "code\_global_vars\sensitive.dm" +#include "code\_global_vars\typecache.dm" #include "code\_global_vars\lists\mapping.dm" #include "code\_global_vars\lists\misc.dm" #include "code\_global_vars\lists\species.dm" #include "code\_helpers\_global_objects.dm" +#include "code\_helpers\_global_objects_vr.dm" #include "code\_helpers\_lists.dm" #include "code\_helpers\atmospherics.dm" #include "code\_helpers\atom_movables.dm" @@ -4153,8 +129,12 @@ #include "code\_helpers\files.dm" #include "code\_helpers\game.dm" #include "code\_helpers\global_lists.dm" +#include "code\_helpers\global_lists_vr.dm" #include "code\_helpers\icons.dm" +#include "code\_helpers\icons_vr.dm" +#include "code\_helpers\lighting.dm" #include "code\_helpers\logging.dm" +#include "code\_helpers\logging_vr.dm" #include "code\_helpers\matrices.dm" #include "code\_helpers\mobs.dm" #include "code\_helpers\names.dm" @@ -4166,6 +146,7 @@ #include "code\_helpers\turfs.dm" #include "code\_helpers\type2type.dm" #include "code\_helpers\unsorted.dm" +#include "code\_helpers\unsorted_vr.dm" #include "code\_helpers\view.dm" #include "code\_helpers\visual_filters.dm" #include "code\_helpers\sorts\__main.dm" @@ -4183,10 +164,12 @@ #include "code\_onclick\rig.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\_defines_vr.dm" #include "code\_onclick\hud\ability_screen_objects.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alert_vr.dm" #include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\ghost.dm" @@ -4198,12 +181,16 @@ #include "code\_onclick\hud\minihud_mapper.dm" #include "code\_onclick\hud\minihud_rigmech.dm" #include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\picture_in_picture.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" #include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\robot_vr.dm" #include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\screen_objects_vr.dm" #include "code\_onclick\hud\skybox.dm" +#include "code\_onclick\hud\soulcatcher_guest.dm" #include "code\_onclick\hud\spell_screen_objects.dm" #include "code\ATMOSPHERICS\_atmos_setup.dm" #include "code\ATMOSPHERICS\_atmospherics_helpers.dm" @@ -4215,10 +202,12 @@ #include "code\ATMOSPHERICS\components\shutoff.dm" #include "code\ATMOSPHERICS\components\tvalve.dm" #include "code\ATMOSPHERICS\components\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\algae_generator_vr.dm" #include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" #include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" #include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" #include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" #include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" #include "code\ATMOSPHERICS\components\binary_devices\pump.dm" #include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" @@ -4238,18 +227,23 @@ #include "code\ATMOSPHERICS\components\unary\unary_base.dm" #include "code\ATMOSPHERICS\components\unary\vent_pump.dm" #include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber_vr.dm" #include "code\ATMOSPHERICS\pipes\cap.dm" #include "code\ATMOSPHERICS\pipes\he_pipes.dm" +#include "code\ATMOSPHERICS\pipes\he_pipes_vr.dm" #include "code\ATMOSPHERICS\pipes\manifold.dm" #include "code\ATMOSPHERICS\pipes\manifold4w.dm" #include "code\ATMOSPHERICS\pipes\pipe_base.dm" +#include "code\ATMOSPHERICS\pipes\pipe_base_vr.dm" #include "code\ATMOSPHERICS\pipes\simple.dm" #include "code\ATMOSPHERICS\pipes\tank.dm" +#include "code\ATMOSPHERICS\pipes\tank_vr.dm" #include "code\ATMOSPHERICS\pipes\universal.dm" #include "code\ATMOSPHERICS\pipes\vent.dm" #include "code\controllers\autotransfer.dm" #include "code\controllers\communications.dm" #include "code\controllers\configuration.dm" +#include "code\controllers\configuration_vr.dm" #include "code\controllers\controller.dm" #include "code\controllers\emergency_shuttle_controller.dm" #include "code\controllers\failsafe.dm" @@ -4274,8 +268,6 @@ #include "code\controllers\subsystems\circuits.dm" #include "code\controllers\subsystems\dcs.dm" #include "code\controllers\subsystems\events.dm" -#include "code\controllers\subsystems\events2.dm" -#include "code\controllers\subsystems\game_master.dm" #include "code\controllers\subsystems\garbage.dm" #include "code\controllers\subsystems\holomaps.dm" #include "code\controllers\subsystems\inactivity.dm" @@ -4283,17 +275,20 @@ #include "code\controllers\subsystems\lighting.dm" #include "code\controllers\subsystems\machines.dm" #include "code\controllers\subsystems\mapping.dm" +#include "code\controllers\subsystems\media_tracks.dm" #include "code\controllers\subsystems\mobs.dm" -#include "code\controllers\subsystems\nanoui.dm" #include "code\controllers\subsystems\nightshift.dm" #include "code\controllers\subsystems\open_space.dm" #include "code\controllers\subsystems\orbits.dm" #include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\persist_vr.dm" #include "code\controllers\subsystems\persistence.dm" #include "code\controllers\subsystems\planets.dm" +#include "code\controllers\subsystems\plants.dm" #include "code\controllers\subsystems\radiation.dm" #include "code\controllers\subsystems\shuttles.dm" #include "code\controllers\subsystems\skybox.dm" +#include "code\controllers\subsystems\sounds.dm" #include "code\controllers\subsystems\sqlite.dm" #include "code\controllers\subsystems\sun.dm" #include "code\controllers\subsystems\supply.dm" @@ -4301,15 +296,20 @@ #include "code\controllers\subsystems\ticker.dm" #include "code\controllers\subsystems\time_track.dm" #include "code\controllers\subsystems\timer.dm" +#include "code\controllers\subsystems\transcore_vr.dm" +#include "code\controllers\subsystems\vis_overlays.dm" #include "code\controllers\subsystems\vote.dm" #include "code\controllers\subsystems\webhooks.dm" #include "code\controllers\subsystems\xenoarch.dm" +#include "code\controllers\subsystems\processing\bellies_vr.dm" #include "code\controllers\subsystems\processing\fastprocess.dm" +#include "code\controllers\subsystems\processing\instruments.dm" #include "code\controllers\subsystems\processing\obj.dm" #include "code\controllers\subsystems\processing\processing.dm" #include "code\controllers\subsystems\processing\projectiles.dm" #include "code\controllers\subsystems\processing\turfs.dm" #include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_law_sets_vr.dm" #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" #include "code\datums\browser.dm" @@ -4322,8 +322,10 @@ #include "code\datums\datumvars.dm" #include "code\datums\EPv2.dm" #include "code\datums\ghost_query.dm" +#include "code\datums\ghost_query_vr.dm" #include "code\datums\hierarchy.dm" #include "code\datums\mind.dm" +#include "code\datums\mind_vr.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" #include "code\datums\mutable_appearance.dm" @@ -4336,26 +338,35 @@ #include "code\datums\sun.dm" #include "code\datums\weakref.dm" #include "code\datums\autolathe\arms.dm" +#include "code\datums\autolathe\arms_vr.dm" #include "code\datums\autolathe\autolathe.dm" #include "code\datums\autolathe\devices.dm" +#include "code\datums\autolathe\devices_vr.dm" #include "code\datums\autolathe\engineering.dm" +#include "code\datums\autolathe\engineering_vr.dm" #include "code\datums\autolathe\general.dm" +#include "code\datums\autolathe\general_vr.dm" #include "code\datums\autolathe\materials.dm" #include "code\datums\autolathe\medical.dm" +#include "code\datums\autolathe\medical_vr.dm" #include "code\datums\autolathe\tools.dm" +#include "code\datums\autolathe\tools_vr.dm" #include "code\datums\components\_component.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\overlay_lighting.dm" +#include "code\datums\components\resize_guard.dm" #include "code\datums\components\crafting\crafting.dm" #include "code\datums\components\crafting\crafting_external.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\tool_quality.dm" #include "code\datums\elements\_element.dm" +#include "code\datums\elements\light_blocking.dm" #include "code\datums\game_masters\_common.dm" -#include "code\datums\game_masters\default.dm" -#include "code\datums\game_masters\other_game_masters.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\teleport_vr.dm" #include "code\datums\helper_datums\topic_input.dm" #include "code\datums\locations\locations.dm" #include "code\datums\locations\nyx.dm" @@ -4396,6 +407,7 @@ #include "code\datums\outfits\misc.dm" #include "code\datums\outfits\nanotrasen.dm" #include "code\datums\outfits\outfit.dm" +#include "code\datums\outfits\outfit_vr.dm" #include "code\datums\outfits\pirates.dm" #include "code\datums\outfits\spec_op.dm" #include "code\datums\outfits\tournament.dm" @@ -4404,13 +416,18 @@ #include "code\datums\outfits\costumes\halloween.dm" #include "code\datums\outfits\jobs\cargo.dm" #include "code\datums\outfits\jobs\civilian.dm" +#include "code\datums\outfits\jobs\civilian_vr.dm" #include "code\datums\outfits\jobs\command.dm" +#include "code\datums\outfits\jobs\command_vr.dm" #include "code\datums\outfits\jobs\engineering.dm" #include "code\datums\outfits\jobs\job.dm" #include "code\datums\outfits\jobs\medical.dm" +#include "code\datums\outfits\jobs\medical_vr.dm" #include "code\datums\outfits\jobs\misc.dm" #include "code\datums\outfits\jobs\science.dm" +#include "code\datums\outfits\jobs\science_vr.dm" #include "code\datums\outfits\jobs\security.dm" +#include "code\datums\outfits\jobs\special_vr.dm" #include "code\datums\outfits\military\fleet.dm" #include "code\datums\outfits\military\marines.dm" #include "code\datums\outfits\military\military.dm" @@ -4426,27 +443,43 @@ #include "code\datums\roundstats\roundstats.dm" #include "code\datums\supplypacks\atmospherics.dm" #include "code\datums\supplypacks\contraband.dm" +#include "code\datums\supplypacks\contraband_vr.dm" #include "code\datums\supplypacks\costumes.dm" +#include "code\datums\supplypacks\costumes_vr.dm" #include "code\datums\supplypacks\engineering.dm" +#include "code\datums\supplypacks\engineering_vr.dm" #include "code\datums\supplypacks\hospitality.dm" +#include "code\datums\supplypacks\hospitality_vr.dm" #include "code\datums\supplypacks\hydroponics.dm" +#include "code\datums\supplypacks\hydroponics_vr.dm" #include "code\datums\supplypacks\materials.dm" #include "code\datums\supplypacks\medical.dm" +#include "code\datums\supplypacks\medical_vr.dm" #include "code\datums\supplypacks\misc.dm" +#include "code\datums\supplypacks\misc_vr.dm" #include "code\datums\supplypacks\munitions.dm" +#include "code\datums\supplypacks\munitions_vr.dm" +#include "code\datums\supplypacks\musical.dm" #include "code\datums\supplypacks\recreation.dm" +#include "code\datums\supplypacks\recreation_vr.dm" #include "code\datums\supplypacks\robotics.dm" +#include "code\datums\supplypacks\robotics_vr.dm" #include "code\datums\supplypacks\science.dm" +#include "code\datums\supplypacks\science_vr.dm" #include "code\datums\supplypacks\security.dm" +#include "code\datums\supplypacks\security_vr.dm" #include "code\datums\supplypacks\supply.dm" +#include "code\datums\supplypacks\supply_vr.dm" #include "code\datums\supplypacks\supplypacks.dm" #include "code\datums\supplypacks\voidsuits.dm" +#include "code\datums\supplypacks\voidsuits_vr.dm" #include "code\datums\underwear\bottom.dm" #include "code\datums\underwear\socks.dm" #include "code\datums\underwear\top.dm" #include "code\datums\underwear\undershirts.dm" #include "code\datums\underwear\underwear.dm" #include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\ammunition_vr.dm" #include "code\datums\uplink\announcements.dm" #include "code\datums\uplink\armor.dm" #include "code\datums\uplink\backup.dm" @@ -4455,14 +488,17 @@ #include "code\datums\uplink\hardsuit_modules.dm" #include "code\datums\uplink\implants.dm" #include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\medical_vr.dm" #include "code\datums\uplink\resources.dm" #include "code\datums\uplink\stealth_items.dm" #include "code\datums\uplink\stealthy_weapons.dm" #include "code\datums\uplink\telecrystals.dm" #include "code\datums\uplink\tools.dm" +#include "code\datums\uplink\tools_vr.dm" #include "code\datums\uplink\uplink_categories.dm" #include "code\datums\uplink\uplink_items.dm" #include "code\datums\uplink\visible_weapons.dm" +#include "code\datums\uplink\visible_weapons_vr.dm" #include "code\datums\vending\stored_item.dm" #include "code\datums\vending\vending.dm" #include "code\datums\wires\airlock.dm" @@ -4478,6 +514,7 @@ #include "code\datums\wires\radio.dm" #include "code\datums\wires\robot.dm" #include "code\datums\wires\seedstorage.dm" +#include "code\datums\wires\shield_generator.dm" #include "code\datums\wires\smartfridge.dm" #include "code\datums\wires\smes.dm" #include "code\datums\wires\suit_storage_unit.dm" @@ -4495,13 +532,16 @@ #include "code\defines\procs\statistics.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" +#include "code\game\atoms_movable_vr.dm" #include "code\game\base_turf.dm" #include "code\game\periodic_news.dm" #include "code\game\response_team.dm" +#include "code\game\response_team_vr.dm" #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" #include "code\game\sound.dm" #include "code\game\trader_visit.dm" +#include "code\game\trader_visit_vr.dm" #include "code\game\world.dm" #include "code\game\antagonist\_antagonist_setup.dm" #include "code\game\antagonist\antagonist.dm" @@ -4520,6 +560,7 @@ #include "code\game\antagonist\outsider\commando.dm" #include "code\game\antagonist\outsider\deathsquad.dm" #include "code\game\antagonist\outsider\ert.dm" +#include "code\game\antagonist\outsider\ert_vr.dm" #include "code\game\antagonist\outsider\mercenary.dm" #include "code\game\antagonist\outsider\ninja.dm" #include "code\game\antagonist\outsider\raider.dm" @@ -4539,8 +580,11 @@ #include "code\game\antagonist\station\traitor.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" +#include "code\game\area\areas_vr.dm" #include "code\game\area\asteroid_areas.dm" +#include "code\game\area\Away Mission areas.dm" #include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\Space Station 13 areas_vr.dm" #include "code\game\area\ss13_deprecated_areas.dm" #include "code\game\dna\dna2.dm" #include "code\game\dna\dna2_domutcheck.dm" @@ -4634,6 +678,7 @@ #include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\meteor\meteors_vr.dm" #include "code\game\gamemodes\mixed\conflux.dm" #include "code\game\gamemodes\mixed\infestation.dm" #include "code\game\gamemodes\mixed\intrigue.dm" @@ -4726,37 +771,59 @@ #include "code\game\jobs\_access_defs.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" +#include "code\game\jobs\access_datum_vr.dm" #include "code\game\jobs\job_controller.dm" #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\whitelist_vr.dm" #include "code\game\jobs\job\_alt_title.dm" #include "code\game\jobs\job\assistant.dm" +#include "code\game\jobs\job\assistant_vr.dm" #include "code\game\jobs\job\captain.dm" +#include "code\game\jobs\job\captain_vr.dm" #include "code\game\jobs\job\civilian.dm" #include "code\game\jobs\job\civilian_chaplain.dm" +#include "code\game\jobs\job\civilian_vr.dm" #include "code\game\jobs\job\department.dm" +#include "code\game\jobs\job\department_vr.dm" #include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\engineering_vr.dm" +#include "code\game\jobs\job\exploration_vr.dm" #include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\job_vr.dm" #include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\medical_vr.dm" +#include "code\game\jobs\job\offduty_vr.dm" #include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\science_vr.dm" #include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\security_vr.dm" #include "code\game\jobs\job\silicon.dm" +#include "code\game\jobs\job\silicon_vr.dm" +#include "code\game\jobs\job\special_vr.dm" #include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\adv_med_vr.dm" #include "code\game\machinery\ai_slipper.dm" #include "code\game\machinery\air_alarm.dm" +#include "code\game\machinery\airconditioner_vr.dm" #include "code\game\machinery\atmo_control.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\Beacon.dm" #include "code\game\machinery\biogenerator.dm" #include "code\game\machinery\bioprinter.dm" +#include "code\game\machinery\bomb_tester_vr.dm" #include "code\game\machinery\buttons.dm" +#include "code\game\machinery\buttons_vr.dm" #include "code\game\machinery\CableLayer.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" #include "code\game\machinery\cryo.dm" #include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\cryopod_vr.dm" #include "code\game\machinery\deployable.dm" +#include "code\game\machinery\deployable_vr.dm" #include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doorbell_vr.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\exonet_node.dm" #include "code\game\machinery\fire_alarm.dm" @@ -4765,7 +832,9 @@ #include "code\game\machinery\floor_light.dm" #include "code\game\machinery\floorlayer.dm" #include "code\game\machinery\frame.dm" +#include "code\game\machinery\gear_dispenser.dm" #include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holoposter.dm" #include "code\game\machinery\holosign.dm" #include "code\game\machinery\igniter.dm" #include "code\game\machinery\iv_drip.dm" @@ -4782,12 +851,16 @@ #include "code\game\machinery\OpTable.dm" #include "code\game\machinery\overview.dm" #include "code\game\machinery\oxygen_pump.dm" +#include "code\game\machinery\painter_vr.dm" +#include "code\game\machinery\partslathe_vr.dm" #include "code\game\machinery\pda_multicaster.dm" #include "code\game\machinery\pointdefense.dm" #include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\portable_turret_vr.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" #include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\requests_console_vr.dm" #include "code\game\machinery\robot_fabricator.dm" #include "code\game\machinery\seed_extractor.dm" #include "code\game\machinery\Sleeper.dm" @@ -4795,39 +868,49 @@ #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" #include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\suit_storage_unit_vr.dm" #include "code\game\machinery\supply_display.dm" #include "code\game\machinery\supplybeacon.dm" #include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebeacon_vr.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\transportpod.dm" #include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\vending_machines_vr.dm" +#include "code\game\machinery\vitals_monitor.dm" #include "code\game\machinery\wall_frames.dm" #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer_vr.dm" #include "code\game\machinery\atmoalter\canister.dm" #include "code\game\machinery\atmoalter\clamp.dm" #include "code\game\machinery\atmoalter\meter.dm" #include "code\game\machinery\atmoalter\portable_atmospherics.dm" #include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\pump_vr.dm" #include "code\game\machinery\atmoalter\scrubber.dm" #include "code\game\machinery\camera\camera.dm" #include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\camera_vr.dm" #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" #include "code\game\machinery\camera\tracking.dm" #include "code\game\machinery\computer\ai_core.dm" #include "code\game\machinery\computer\aifixer.dm" #include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\arcade_vr.dm" #include "code\game\machinery\computer\atmos_alert.dm" #include "code\game\machinery\computer\atmos_control.dm" #include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_vr.dm" #include "code\game\machinery\computer\card.dm" #include "code\game\machinery\computer\cloning.dm" #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" #include "code\game\machinery\computer\guestpass.dm" +#include "code\game\machinery\computer\id_restorer_vr.dm" #include "code\game\machinery\computer\law.dm" #include "code\game\machinery\computer\medical.dm" #include "code\game\machinery\computer\message.dm" @@ -4845,17 +928,23 @@ #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\supply.dm" #include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer\timeclock_vr.dm" +#include "code\game\machinery\computer\~computer_vr.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_control.dm" #include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_vr.dm" #include "code\game\machinery\doors\alarmlock.dm" #include "code\game\machinery\doors\blast_door.dm" #include "code\game\machinery\doors\brigdoors.dm" #include "code\game\machinery\doors\checkForMultipleDoors.dm" #include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\door_vr.dm" #include "code\game\machinery\doors\firedoor.dm" #include "code\game\machinery\doors\firedoor_assembly.dm" +#include "code\game\machinery\doors\firedoor_vr.dm" #include "code\game\machinery\doors\multi_tile.dm" +#include "code\game\machinery\doors\multi_tile_vr.dm" #include "code\game\machinery\doors\unpowered.dm" #include "code\game\machinery\doors\windowdoor.dm" #include "code\game\machinery\embedded_controller\airlock_controllers.dm" @@ -4868,15 +957,18 @@ #include "code\game\machinery\embedded_controller\embedded_program_base.dm" #include "code\game\machinery\embedded_controller\mapping_helpers.dm" #include "code\game\machinery\embedded_controller\simple_docking_controller.dm" +#include "code\game\machinery\event\stage_vr.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" #include "code\game\machinery\pipe\pipe_recipes.dm" #include "code\game\machinery\pipe\pipelayer.dm" #include "code\game\machinery\reagents\pump.dm" #include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\broadcaster_vr.dm" #include "code\game\machinery\telecomms\logbrowser.dm" #include "code\game\machinery\telecomms\machine_interactions.dm" #include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\presets_vr.dm" #include "code\game\machinery\telecomms\telecomunications.dm" #include "code\game\machinery\telecomms\telemonitor.dm" #include "code\game\machinery\telecomms\traffic_control.dm" @@ -4894,6 +986,7 @@ #include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_helpers.dm" #include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_vr.dm" #include "code\game\mecha\mecha_wreckage.dm" #include "code\game\mecha\combat\combat.dm" #include "code\game\mecha\combat\durand.dm" @@ -4923,6 +1016,7 @@ #include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" #include "code\game\mecha\equipment\tools\inflatables.dm" #include "code\game\mecha\equipment\tools\jetpack.dm" +#include "code\game\mecha\equipment\tools\medigun_vr.dm" #include "code\game\mecha\equipment\tools\orescanner.dm" #include "code\game\mecha\equipment\tools\passenger.dm" #include "code\game\mecha\equipment\tools\powertool.dm" @@ -4957,38 +1051,56 @@ #include "code\game\mecha\equipment\weapons\fire\incendiary.dm" #include "code\game\mecha\medical\medical.dm" #include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\medical\odysseus_vr.dm" +#include "code\game\mecha\micro\mecha_construction_paths_vr.dm" +#include "code\game\mecha\micro\mecha_parts_vr.dm" +#include "code\game\mecha\micro\mecha_vr.dm" +#include "code\game\mecha\micro\mechfab_designs_vr.dm" +#include "code\game\mecha\micro\micro.dm" +#include "code\game\mecha\micro\micro_equipment.dm" +#include "code\game\mecha\micro\security.dm" +#include "code\game\mecha\micro\utility.dm" #include "code\game\mecha\space\hoverpod.dm" #include "code\game\mecha\space\shuttle.dm" #include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\ripley_vr.dm" #include "code\game\mecha\working\working.dm" #include "code\game\objects\banners.dm" +#include "code\game\objects\banners_vr.dm" #include "code\game\objects\buckling.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\explosion_recursive.dm" #include "code\game\objects\items.dm" +#include "code\game\objects\mob_spawner_vr.dm" #include "code\game\objects\objs.dm" #include "code\game\objects\structures.dm" +#include "code\game\objects\stumble_into_vr.dm" #include "code\game\objects\weapons.dm" #include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\confetti_vr.dm" #include "code\game\objects\effects\effect_system.dm" #include "code\game\objects\effects\explosion_particles.dm" #include "code\game\objects\effects\gibs.dm" #include "code\game\objects\effects\glowshroom.dm" #include "code\game\objects\effects\item_pickup_ghost.dm" #include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\landmarks_vr.dm" #include "code\game\objects\effects\manifest.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" #include "code\game\objects\effects\overlays.dm" #include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\semirandom_mobs_vr.dm" #include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\spiders_vr.dm" #include "code\game\objects\effects\step_triggers.dm" #include "code\game\objects\effects\zone_divider.dm" #include "code\game\objects\effects\alien\aliens.dm" #include "code\game\objects\effects\chem\chemsmoke.dm" #include "code\game\objects\effects\chem\coating.dm" #include "code\game\objects\effects\chem\foam.dm" +#include "code\game\objects\effects\chem\foam_vr.dm" #include "code\game\objects\effects\chem\water.dm" #include "code\game\objects\effects\decals\cleanable.dm" #include "code\game\objects\effects\decals\contraband.dm" @@ -5004,6 +1116,9 @@ #include "code\game\objects\effects\decals\Cleanable\tracks.dm" #include "code\game\objects\effects\decals\posters\bs12.dm" #include "code\game\objects\effects\decals\posters\polarisposters.dm" +#include "code\game\objects\effects\decals\posters\polarisposters_vr.dm" +#include "code\game\objects\effects\decals\posters\tgposters.dm" +#include "code\game\objects\effects\decals\posters\voreposters_vr.dm" #include "code\game\objects\effects\map_effects\beam_point.dm" #include "code\game\objects\effects\map_effects\effect_emitter.dm" #include "code\game\objects\effects\map_effects\map_effects.dm" @@ -5029,26 +1144,36 @@ #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\contraband_vr.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\falling_object_vr.dm" #include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\gunbox.dm" +#include "code\game\objects\items\gunbox_vr.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\paintkit.dm" +#include "code\game\objects\items\pizza_voucher_vr.dm" #include "code\game\objects\items\poi_items.dm" #include "code\game\objects\items\robobag.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\tailoring.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\trash_material.dm" +#include "code\game\objects\items\trash_vr.dm" #include "code\game\objects\items\uav.dm" +#include "code\game\objects\items\devices\advnifrepair.dm" #include "code\game\objects\items\devices\ai_detector.dm" #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\binoculars.dm" +#include "code\game\objects\items\devices\body_snatcher_vr.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\defib.dm" +#include "code\game\objects\items\devices\denecrotizer_vr.dm" #include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flash_vr.dm" #include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\flashlight_vr.dm" #include "code\game\objects\items\devices\floor_painter.dm" #include "code\game\objects\items\devices\geiger.dm" #include "code\game\objects\items\devices\gps.dm" @@ -5063,6 +1188,7 @@ #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\scanners_vr.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\t_scanner.dm" @@ -5071,47 +1197,58 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\translator.dm" +#include "code\game\objects\items\devices\translocator_vr.dm" #include "code\game\objects\items\devices\tvcamera.dm" #include "code\game\objects\items\devices\uplink.dm" #include "code\game\objects\items\devices\uplink_random_lists.dm" -#include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\communicator\communicator.dm" #include "code\game\objects\items\devices\communicator\helper.dm" #include "code\game\objects\items\devices\communicator\integrated.dm" #include "code\game\objects\items\devices\communicator\messaging.dm" #include "code\game\objects\items\devices\communicator\phone.dm" -#include "code\game\objects\items\devices\communicator\UI.dm" +#include "code\game\objects\items\devices\communicator\UI_tgui.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" #include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" #include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\headset_vr.dm" #include "code\game\objects\items\devices\radio\intercom.dm" #include "code\game\objects\items\devices\radio\jammer.dm" +#include "code\game\objects\items\devices\radio\jammer_vr.dm" #include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\devices\radio\radio_vr.dm" #include "code\game\objects\items\devices\radio\radiopack.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" #include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\robot\robot_upgrades_vr.dm" #include "code\game\objects\items\stacks\marker_beacons.dm" #include "code\game\objects\items\stacks\matter_synth.dm" #include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\medical_vr.dm" #include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\nanopaste_vr.dm" #include "code\game\objects\items\stacks\sandbags.dm" #include "code\game\objects\items\stacks\stack.dm" #include "code\game\objects\items\stacks\telecrystal.dm" #include "code\game\objects\items\stacks\tickets.dm" #include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\toys\balls_vr.dm" #include "code\game\objects\items\toys\godfigures.dm" #include "code\game\objects\items\toys\mech_toys.dm" #include "code\game\objects\items\toys\toys.dm" +#include "code\game\objects\items\toys\toys_vr.dm" #include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\AI_modules_vr.dm" #include "code\game\objects\items\weapons\augment_items.dm" #include "code\game\objects\items\weapons\autopsy.dm" #include "code\game\objects\items\weapons\bones.dm" #include "code\game\objects\items\weapons\candle.dm" #include "code\game\objects\items\weapons\canes.dm" +#include "code\game\objects\items\weapons\cards_ids_vr.dm" #include "code\game\objects\items\weapons\chewables.dm" #include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\clown_items.dm" @@ -5119,22 +1256,29 @@ #include "code\game\objects\items\weapons\dna_injector.dm" #include "code\game\objects\items\weapons\ecigs.dm" #include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\explosives_vr.dm" #include "code\game\objects\items\weapons\extinguisher.dm" #include "code\game\objects\items\weapons\flamethrower.dm" #include "code\game\objects\items\weapons\gift_wrappaper.dm" #include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\handcuffs_vr.dm" #include "code\game\objects\items\weapons\improvised_components.dm" +#include "code\game\objects\items\weapons\inducer_vr.dm" #include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\manuals_vr.dm" #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\mop_deploy.dm" #include "code\game\objects\items\weapons\paint.dm" #include "code\game\objects\items\weapons\paiwire.dm" #include "code\game\objects\items\weapons\policetape.dm" #include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RPD.dm" +#include "code\game\objects\items\weapons\RCD_vr.dm" +#include "code\game\objects\items\weapons\RMS_vr.dm" +#include "code\game\objects\items\weapons\RPD_vr.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\shields_vr.dm" #include "code\game\objects\items\weapons\stunbaton.dm" #include "code\game\objects\items\weapons\surgery_tools.dm" #include "code\game\objects\items\weapons\swords_axes_etc.dm" @@ -5143,11 +1287,13 @@ #include "code\game\objects\items\weapons\teleportation.dm" #include "code\game\objects\items\weapons\towels.dm" #include "code\game\objects\items\weapons\traps.dm" +#include "code\game\objects\items\weapons\traps_vr.dm" #include "code\game\objects\items\weapons\trays.dm" #include "code\game\objects\items\weapons\weaponry.dm" #include "code\game\objects\items\weapons\weldbackpack.dm" #include "code\game\objects\items\weapons\circuitboards\broken.dm" #include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" #include "code\game\objects\items\weapons\circuitboards\frame.dm" #include "code\game\objects\items\weapons\circuitboards\mecha.dm" #include "code\game\objects\items\weapons\circuitboards\other.dm" @@ -5185,21 +1331,29 @@ #include "code\game\objects\items\weapons\grenades\projectile.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade_vr.dm" #include "code\game\objects\items\weapons\grenades\supermatter.dm" #include "code\game\objects\items\weapons\id cards\cards.dm" +#include "code\game\objects\items\weapons\id cards\cards_vr.dm" #include "code\game\objects\items\weapons\id cards\id_stacks.dm" +#include "code\game\objects\items\weapons\id cards\id_stacks_vr.dm" #include "code\game\objects\items\weapons\id cards\station_ids.dm" +#include "code\game\objects\items\weapons\id cards\station_ids_vr.dm" #include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" #include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implant_vr.dm" #include "code\game\objects\items\weapons\implants\implantaugment.dm" #include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantcase_vr.dm" #include "code\game\objects\items\weapons\implants\implantchair.dm" #include "code\game\objects\items\weapons\implants\implantcircuits.dm" #include "code\game\objects\items\weapons\implants\implantdud.dm" #include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implanter_vr.dm" #include "code\game\objects\items\weapons\implants\implantfreedom.dm" #include "code\game\objects\items\weapons\implants\implantlanguage.dm" #include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" #include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" #include "code\game\objects\items\weapons\implants\implantuplink.dm" #include "code\game\objects\items\weapons\implants\neuralbasic.dm" @@ -5210,25 +1364,36 @@ #include "code\game\objects\items\weapons\material\gravemarker.dm" #include "code\game\objects\items\weapons\material\kitchen.dm" #include "code\game\objects\items\weapons\material\knives.dm" +#include "code\game\objects\items\weapons\material\knives_vr.dm" #include "code\game\objects\items\weapons\material\material_armor.dm" #include "code\game\objects\items\weapons\material\material_weapons.dm" #include "code\game\objects\items\weapons\material\misc.dm" #include "code\game\objects\items\weapons\material\shards.dm" +#include "code\game\objects\items\weapons\material\shards_vr.dm" #include "code\game\objects\items\weapons\material\swords.dm" #include "code\game\objects\items\weapons\material\thrown.dm" #include "code\game\objects\items\weapons\material\twohanded.dm" +#include "code\game\objects\items\weapons\material\twohanded_vr.dm" #include "code\game\objects\items\weapons\material\whetstone.dm" #include "code\game\objects\items\weapons\melee\deflect.dm" #include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\energy_vr.dm" #include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\melee\misc_vr.dm" #include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\backpack_vr.dm" #include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\bags_vr.dm" #include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\belt_vr.dm" #include "code\game\objects\items\weapons\storage\bible.dm" #include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\boxes_vr.dm" #include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\egg_vr.dm" #include "code\game\objects\items\weapons\storage\fancy.dm" #include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\firstaid_vr.dm" #include "code\game\objects\items\weapons\storage\internal.dm" #include "code\game\objects\items\weapons\storage\laundry_basket.dm" #include "code\game\objects\items\weapons\storage\lockbox.dm" @@ -5238,12 +1403,15 @@ #include "code\game\objects\items\weapons\storage\secure.dm" #include "code\game\objects\items\weapons\storage\storage.dm" #include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\toolbox_vr.dm" #include "code\game\objects\items\weapons\storage\uplink_kits.dm" #include "code\game\objects\items\weapons\storage\wallets.dm" #include "code\game\objects\items\weapons\tanks\jetpack.dm" #include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" #include "code\game\objects\items\weapons\tanks\tanks.dm" #include "code\game\objects\items\weapons\tools\crowbar.dm" +#include "code\game\objects\items\weapons\tools\crowbar_vr.dm" #include "code\game\objects\items\weapons\tools\screwdriver.dm" #include "code\game\objects\items\weapons\tools\weldingtool.dm" #include "code\game\objects\items\weapons\tools\wirecutters.dm" @@ -5252,19 +1420,24 @@ #include "code\game\objects\random\guns_and_ammo.dm" #include "code\game\objects\random\maintenance.dm" #include "code\game\objects\random\mapping.dm" +#include "code\game\objects\random\mapping_vr.dm" #include "code\game\objects\random\mechs.dm" #include "code\game\objects\random\misc.dm" +#include "code\game\objects\random\misc_vr.dm" #include "code\game\objects\random\mob.dm" +#include "code\game\objects\random\mob_vr.dm" #include "code\game\objects\random\spacesuits.dm" #include "code\game\objects\random\unidentified\medicine.dm" #include "code\game\objects\structures\barricades.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\bedsheet_bin_vr.dm" #include "code\game\objects\structures\bonfire.dm" #include "code\game\objects\structures\catwalk.dm" #include "code\game\objects\structures\cliff.dm" #include "code\game\objects\structures\coathanger.dm" #include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\dancepole_vr.dm" #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\dogbed.dm" #include "code\game\objects\structures\door_assembly.dm" @@ -5273,6 +1446,7 @@ #include "code\game\objects\structures\fence.dm" #include "code\game\objects\structures\fireaxe.dm" #include "code\game\objects\structures\fitness.dm" +#include "code\game\objects\structures\fitness_vr.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\gravemarker.dm" #include "code\game\objects\structures\grille.dm" @@ -5280,67 +1454,91 @@ #include "code\game\objects\structures\holoplant.dm" #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_foodcart_vr.dm" #include "code\game\objects\structures\kitchen_spike.dm" #include "code\game\objects\structures\lattice.dm" #include "code\game\objects\structures\ledges.dm" #include "code\game\objects\structures\lightpost.dm" #include "code\game\objects\structures\loot_piles.dm" +#include "code\game\objects\structures\map_blocker_vr.dm" +#include "code\game\objects\structures\medical_stand_vr.dm" #include "code\game\objects\structures\mirror.dm" #include "code\game\objects\structures\mop_bucket.dm" #include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\morgue_vr.dm" #include "code\game\objects\structures\plasticflaps.dm" #include "code\game\objects\structures\railing.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\salvageable.dm" #include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\signs_vr.dm" #include "code\game\objects\structures\simple_doors.dm" +#include "code\game\objects\structures\simple_doors_vr.dm" #include "code\game\objects\structures\snowman.dm" #include "code\game\objects\structures\stasis_cage.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" #include "code\game\objects\structures\transit_tubes.dm" +#include "code\game\objects\structures\trash_pile_vr.dm" #include "code\game\objects\structures\under_wardrobe.dm" #include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\watercloset_vr.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\window_vr.dm" #include "code\game\objects\structures\crates_lockers\__closets.dm" #include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" +#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\crates_vr.dm" #include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\largecrate_vr.dm" #include "code\game\objects\structures\crates_lockers\vehiclecage.dm" #include "code\game\objects\structures\crates_lockers\closets\coffin.dm" #include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\egg_vr.dm" #include "code\game\objects\structures\crates_lockers\closets\fitness.dm" #include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" #include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" #include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\misc_vr.dm" #include "code\game\objects\structures\crates_lockers\closets\statue.dm" #include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" #include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets_vr.dm" #include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" #include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe_vr.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo_vr.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical_vr.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" #include "code\game\objects\structures\flora\flora.dm" +#include "code\game\objects\structures\flora\flora_vr.dm" #include "code\game\objects\structures\flora\grass.dm" +#include "code\game\objects\structures\flora\moretrees_vr.dm" #include "code\game\objects\structures\flora\trees.dm" +#include "code\game\objects\structures\ghost_pods\event_vr.dm" #include "code\game\objects\structures\ghost_pods\ghost_pods.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" #include "code\game\objects\structures\ghost_pods\human.dm" #include "code\game\objects\structures\ghost_pods\mysterious.dm" #include "code\game\objects\structures\ghost_pods\silicon.dm" +#include "code\game\objects\structures\ghost_pods\silicon_vr.dm" #include "code\game\objects\structures\props\alien_props.dm" +#include "code\game\objects\structures\props\alien_props_vr.dm" #include "code\game\objects\structures\props\beam_prism.dm" #include "code\game\objects\structures\props\blackbox.dm" #include "code\game\objects\structures\props\fake_ai.dm" @@ -5354,17 +1552,23 @@ #include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs_vr.dm" #include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" #include "code\game\turfs\simulated.dm" +#include "code\game\turfs\simulated_vr.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\turf_changing.dm" #include "code\game\turfs\turf_flick_animations.dm" #include "code\game\turfs\unsimulated.dm" #include "code\game\turfs\flooring\flooring.dm" #include "code\game\turfs\flooring\flooring_decals.dm" +#include "code\game\turfs\flooring\flooring_decals_vr.dm" #include "code\game\turfs\flooring\flooring_premade.dm" +#include "code\game\turfs\flooring\flooring_vr.dm" +#include "code\game\turfs\flooring\shuttle_vr.dm" #include "code\game\turfs\initialization\init.dm" #include "code\game\turfs\initialization\maintenance.dm" #include "code\game\turfs\simulated\floor.dm" @@ -5375,18 +1579,23 @@ #include "code\game\turfs\simulated\floor_static.dm" #include "code\game\turfs\simulated\floor_types.dm" #include "code\game\turfs\simulated\floor_types_eris.dm" +#include "code\game\turfs\simulated\floor_types_vr.dm" #include "code\game\turfs\simulated\lava.dm" #include "code\game\turfs\simulated\wall_attacks.dm" #include "code\game\turfs\simulated\wall_icon.dm" #include "code\game\turfs\simulated\wall_types.dm" +#include "code\game\turfs\simulated\wall_types_vr.dm" #include "code\game\turfs\simulated\walls.dm" #include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\water_vr.dm" #include "code\game\turfs\simulated\dungeon\floor.dm" #include "code\game\turfs\simulated\dungeon\wall.dm" +#include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" #include "code\game\turfs\simulated\outdoors\dirt.dm" #include "code\game\turfs\simulated\outdoors\grass.dm" #include "code\game\turfs\simulated\outdoors\outdoors.dm" #include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" +#include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" #include "code\game\turfs\simulated\outdoors\sky.dm" #include "code\game\turfs\simulated\outdoors\snow.dm" #include "code\game\turfs\snow\snow.dm" @@ -5394,11 +1603,13 @@ #include "code\game\turfs\space\space.dm" #include "code\game\turfs\space\transit.dm" #include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\beach_vr.dm" #include "code\game\turfs\unsimulated\floor.dm" #include "code\game\turfs\unsimulated\planetary.dm" +#include "code\game\turfs\unsimulated\planetary_vr.dm" #include "code\game\turfs\unsimulated\shuttle.dm" +#include "code\game\turfs\unsimulated\sky_vr.dm" #include "code\game\turfs\unsimulated\walls.dm" -#include "code\game\verbs\suicide.dm" #include "code\js\byjax.dm" #include "code\js\menus.dm" #include "code\modules\admin\admin.dm" @@ -5408,9 +1619,11 @@ #include "code\modules\admin\admin_ranks.dm" #include "code\modules\admin\admin_secrets.dm" #include "code\modules\admin\admin_tools.dm" -#include "code\modules\admin\admin_verb_lists.dm" +#include "code\modules\admin\admin_verb_lists_vr.dm" #include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\admin_vr.dm" #include "code\modules\admin\banjob.dm" +#include "code\modules\admin\ckey_vr.dm" #include "code\modules\admin\create_mob.dm" #include "code\modules\admin\create_object.dm" #include "code\modules\admin\create_turf.dm" @@ -5461,10 +1674,11 @@ #include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" #include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" #include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" -#include "code\modules\admin\secrets\random_events\gravity.dm" +#include "code\modules\admin\secrets\random_events\gravity_vr.dm" #include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" #include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" #include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminhelp_vr.dm" #include "code\modules\admin\verbs\adminjump.dm" #include "code\modules\admin\verbs\adminpm.dm" #include "code\modules\admin\verbs\adminsay.dm" @@ -5479,6 +1693,7 @@ #include "code\modules\admin\verbs\dbcon_fix.dm" #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\debug_vr.dm" #include "code\modules\admin\verbs\diagnostics.dm" #include "code\modules\admin\verbs\dice.dm" #include "code\modules\admin\verbs\fps.dm" @@ -5492,7 +1707,10 @@ #include "code\modules\admin\verbs\possess.dm" #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\randomverbs_vr.dm" +#include "code\modules\admin\verbs\resize.dm" #include "code\modules\admin\verbs\smite.dm" +#include "code\modules\admin\verbs\smite_vr.dm" #include "code\modules\admin\verbs\striketeam.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" @@ -5521,10 +1739,12 @@ #include "code\modules\ai\ai_holder_movement.dm" #include "code\modules\ai\ai_holder_pathfinding.dm" #include "code\modules\ai\ai_holder_targeting.dm" +#include "code\modules\ai\ai_holder_targeting_vr.dm" #include "code\modules\ai\interfaces.dm" #include "code\modules\ai\say_list.dm" -#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\aI_holder_subtypes\slime_xenobio_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" +#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" #include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm_handler.dm" #include "code\modules\alarm\atmosphere_alarm.dm" @@ -5555,10 +1775,13 @@ #include "code\modules\awaymissions\corpse.dm" #include "code\modules\awaymissions\exile.dm" #include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\gateway_vr.dm" #include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\loot_vr.dm" #include "code\modules\awaymissions\pamphlet.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\blob\blob.dm" #include "code\modules\blob2\_defines.dm" #include "code\modules\blob2\core_chunk.dm" #include "code\modules\blob2\blobs\base_blob.dm" @@ -5590,25 +1813,30 @@ #include "code\modules\blob2\overmind\types\shifting_fragments.dm" #include "code\modules\blob2\overmind\types\synchronous_mesh.dm" #include "code\modules\blob2\overmind\types\volatile_alluvium.dm" -#include "code\modules\busy_space\air_traffic.dm" -#include "code\modules\busy_space\loremaster.dm" -#include "code\modules\busy_space\organizations.dm" +#include "code\modules\busy_space_vr\air_traffic.dm" +#include "code\modules\busy_space_vr\loremaster.dm" +#include "code\modules\busy_space_vr\organizations.dm" #include "code\modules\catalogue\atoms.dm" #include "code\modules\catalogue\catalogue_data.dm" +#include "code\modules\catalogue\catalogue_data_vr.dm" #include "code\modules\catalogue\cataloguer.dm" #include "code\modules\catalogue\cataloguer_visuals.dm" +#include "code\modules\catalogue\cataloguer_vr.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" +#include "code\modules\client\client procs_vr.dm" #include "code\modules\client\movement.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_factions.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_toggle_procs.dm" +#include "code\modules\client\preferences_vr.dm" #include "code\modules\client\spam_prevention.dm" #include "code\modules\client\ui_style.dm" #include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\preference_setup_vr.dm" #include "code\modules\client\preference_setup\antagonism\01_basic.dm" #include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" #include "code\modules\client\preference_setup\general\01_basic.dm" @@ -5620,72 +1848,114 @@ #include "code\modules\client\preference_setup\global\01_ui.dm" #include "code\modules\client\preference_setup\global\02_settings.dm" #include "code\modules\client\preference_setup\global\03_pai.dm" +#include "code\modules\client\preference_setup\global\04_ooc.dm" #include "code\modules\client\preference_setup\global\setting_datums.dm" #include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" +#include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout.dm" #include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" +#include "code\modules\client\preference_setup\loadout\loadout_accessories_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" #include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" #include "code\modules\client\preference_setup\loadout\loadout_ears.dm" #include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_eyes_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_general.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" +#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_head.dm" +#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_mask.dm" #include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" #include "code\modules\client\preference_setup\loadout\loadout_suit.dm" +#include "code\modules\client\preference_setup\loadout\loadout_suit_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" +#include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_utility.dm" +#include "code\modules\client\preference_setup\loadout\loadout_utility_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" #include "code\modules\client\preference_setup\occupation\occupation.dm" #include "code\modules\client\preference_setup\skills\skills.dm" -#include "code\modules\client\preference_setup\traits\trait_defines.dm" -#include "code\modules\client\preference_setup\traits\traits.dm" #include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" +#include "code\modules\client\preference_setup\volume_sliders\02_media.dm" +#include "code\modules\client\preference_setup\vore\01_ears.dm" +#include "code\modules\client\preference_setup\vore\02_size.dm" +#include "code\modules\client\preference_setup\vore\03_egg.dm" +#include "code\modules\client\preference_setup\vore\04_resleeving.dm" +#include "code\modules\client\preference_setup\vore\05_persistence.dm" +#include "code\modules\client\preference_setup\vore\06_vantag.dm" +#include "code\modules\client\preference_setup\vore\07_traits.dm" +#include "code\modules\client\preference_setup\vore\08_nif.dm" +#include "code\modules\client\preference_setup\vore\09_misc.dm" #include "code\modules\client\verbs\advanced_who.dm" +#include "code\modules\client\verbs\character_directory.dm" #include "code\modules\client\verbs\ignore.dm" #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" +#include "code\modules\client\verbs\suicide.dm" #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\clothing_accessories.dm" #include "code\modules\clothing\clothing_icons.dm" +#include "code\modules\clothing\clothing_vr.dm" #include "code\modules\clothing\ears\earrings.dm" #include "code\modules\clothing\ears\ears.dm" #include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\glasses_vr.dm" #include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\hud_vr.dm" #include "code\modules\clothing\gloves\antagonist.dm" #include "code\modules\clothing\gloves\arm_guards.dm" +#include "code\modules\clothing\gloves\arm_guards_vr.dm" #include "code\modules\clothing\gloves\boxing.dm" #include "code\modules\clothing\gloves\color.dm" #include "code\modules\clothing\gloves\gauntlets.dm" #include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\miscellaneous_vr.dm" #include "code\modules\clothing\head\collectable.dm" #include "code\modules\clothing\head\flowercrowns.dm" #include "code\modules\clothing\head\hardhat.dm" #include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\helmet_vr.dm" #include "code\modules\clothing\head\hood.dm" +#include "code\modules\clothing\head\hood_vr.dm" #include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\jobs_vr.dm" #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\misc_vr.dm" #include "code\modules\clothing\head\pilot_helmet.dm" +#include "code\modules\clothing\head\pilot_helmet_vr.dm" #include "code\modules\clothing\head\soft_caps.dm" #include "code\modules\clothing\head\solgov.dm" +#include "code\modules\clothing\head\solgov_vr.dm" #include "code\modules\clothing\masks\boxing.dm" #include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\breath_vr.dm" #include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\gasmask_vr.dm" #include "code\modules\clothing\masks\hailer.dm" #include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\shiny_vr.dm" #include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\rings\material.dm" #include "code\modules\clothing\rings\rings.dm" +#include "code\modules\clothing\rings\rings_vr.dm" #include "code\modules\clothing\shoes\boots.dm" +#include "code\modules\clothing\shoes\boots_vr.dm" #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\leg_guards.dm" +#include "code\modules\clothing\shoes\leg_guards_vr.dm" #include "code\modules\clothing\shoes\magboots.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\shoes\miscellaneous_vr.dm" #include "code\modules\clothing\spacesuits\alien.dm" #include "code\modules\clothing\spacesuits\breaches.dm" #include "code\modules\clothing\spacesuits\miscellaneous.dm" @@ -5694,6 +1964,7 @@ #include "code\modules\clothing\spacesuits\rig\rig.dm" #include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" #include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" #include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" #include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" #include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" @@ -5710,7 +1981,10 @@ #include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" @@ -5719,47 +1993,71 @@ #include "code\modules\clothing\spacesuits\rig\suits\alien.dm" #include "code\modules\clothing\spacesuits\rig\suits\combat.dm" #include "code\modules\clothing\spacesuits\rig\suits\ert.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm" #include "code\modules\clothing\spacesuits\rig\suits\light.dm" #include "code\modules\clothing\spacesuits\rig\suits\merc.dm" #include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" #include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" #include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" +#include "code\modules\clothing\spacesuits\void\ert_vr.dm" #include "code\modules\clothing\spacesuits\void\event.dm" +#include "code\modules\clothing\spacesuits\void\event_vr.dm" #include "code\modules\clothing\spacesuits\void\merc.dm" +#include "code\modules\clothing\spacesuits\void\military_vr.dm" #include "code\modules\clothing\spacesuits\void\station.dm" +#include "code\modules\clothing\spacesuits\void\station_vr.dm" #include "code\modules\clothing\spacesuits\void\void.dm" +#include "code\modules\clothing\spacesuits\void\void_vr.dm" #include "code\modules\clothing\spacesuits\void\wizard.dm" #include "code\modules\clothing\spacesuits\void\zaddat.dm" #include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\armor_vr.dm" #include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\bio_vr.dm" #include "code\modules\clothing\suits\hooded.dm" +#include "code\modules\clothing\suits\hooded_vr.dm" #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" #include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\miscellaneous_vr.dm" #include "code\modules\clothing\suits\solgov.dm" +#include "code\modules\clothing\suits\solgov_vr.dm" #include "code\modules\clothing\suits\storage.dm" #include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\utility_vr.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\suits\aliens\tajara.dm" #include "code\modules\clothing\suits\aliens\teshari.dm" #include "code\modules\clothing\suits\aliens\unathi.dm" #include "code\modules\clothing\suits\aliens\vox.dm" #include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\imperial_vr.dm" #include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\miscellaneous_vr.dm" +#include "code\modules\clothing\under\nanotrasen_vr.dm" #include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shiny_vr.dm" #include "code\modules\clothing\under\shorts.dm" #include "code\modules\clothing\under\solgov.dm" +#include "code\modules\clothing\under\solgov_vr.dm" #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\accessory_vr.dm" #include "code\modules\clothing\under\accessories\armband.dm" #include "code\modules\clothing\under\accessories\armor.dm" #include "code\modules\clothing\under\accessories\badges.dm" #include "code\modules\clothing\under\accessories\clothing.dm" #include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\holster_vr.dm" #include "code\modules\clothing\under\accessories\lockets.dm" #include "code\modules\clothing\under\accessories\permits.dm" +#include "code\modules\clothing\under\accessories\permits_vr.dm" +#include "code\modules\clothing\under\accessories\shiny_vr.dm" #include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\accessories\storage_vr.dm" #include "code\modules\clothing\under\accessories\torch.dm" +#include "code\modules\clothing\under\accessories\torch_vr.dm" #include "code\modules\clothing\under\accessories\temperature\poncho.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" @@ -5791,6 +2089,7 @@ #include "code\modules\economy\cash.dm" #include "code\modules\economy\cash_register.dm" #include "code\modules\economy\coins.dm" +#include "code\modules\economy\coins_vr.dm" #include "code\modules\economy\economy_misc.dm" #include "code\modules\economy\EFTPOS.dm" #include "code\modules\economy\Events.dm" @@ -5809,18 +2108,24 @@ #include "code\modules\emotes\definitions\_species.dm" #include "code\modules\emotes\definitions\audible.dm" #include "code\modules\emotes\definitions\audible_cough.dm" +#include "code\modules\emotes\definitions\audible_furry_vr.dm" #include "code\modules\emotes\definitions\audible_scream.dm" +#include "code\modules\emotes\definitions\audible_scream_vr.dm" #include "code\modules\emotes\definitions\audible_slap.dm" #include "code\modules\emotes\definitions\audible_snap.dm" #include "code\modules\emotes\definitions\audible_sneeze.dm" #include "code\modules\emotes\definitions\audible_whistle.dm" #include "code\modules\emotes\definitions\exertion.dm" +#include "code\modules\emotes\definitions\helpers_vr.dm" #include "code\modules\emotes\definitions\human.dm" #include "code\modules\emotes\definitions\slimes.dm" #include "code\modules\emotes\definitions\synthetics.dm" #include "code\modules\emotes\definitions\visible.dm" #include "code\modules\emotes\definitions\visible_animated.dm" #include "code\modules\emotes\definitions\visible_vomit.dm" +#include "code\modules\emotes\definitions\visible_vr.dm" +#include "code\modules\entopics_vr\alternate_appearance.dm" +#include "code\modules\entopics_vr\entopics.dm" #include "code\modules\error_handler\_defines.dm" #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" @@ -5835,20 +2140,27 @@ #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" #include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\drone_pod_vr.dm" #include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\event.dm" #include "code\modules\events\event_container.dm" +#include "code\modules\events\event_container_vr.dm" #include "code\modules\events\event_dynamic.dm" #include "code\modules\events\event_manager.dm" -#include "code\modules\events\gravity.dm" +#include "code\modules\events\gravity_vr.dm" #include "code\modules\events\grid_check.dm" +#include "code\modules\events\grubinfestation_vr.dm" +#include "code\modules\events\ian_storm_vr.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" +#include "code\modules\events\maintenance_predator_vr.dm" +#include "code\modules\events\meteor_strike_vr.dm" #include "code\modules\events\meteors.dm" #include "code\modules\events\money_hacker.dm" #include "code\modules\events\money_lotto.dm" #include "code\modules\events\money_spam.dm" +#include "code\modules\events\morph_spawn_vr.dm" #include "code\modules\events\prison_break.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\random_antagonist.dm" @@ -5859,6 +2171,8 @@ #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\spontaneous_appendicitis_vr.dm" +#include "code\modules\events\supply_demand_vr.dm" #include "code\modules\events\wallrot.dm" #include "code\modules\examine\examine.dm" #include "code\modules\examine\stat_icons.dm" @@ -5881,6 +2195,8 @@ #include "code\modules\fishing\fishing.dm" #include "code\modules\fishing\fishing_net.dm" #include "code\modules\fishing\fishing_rod.dm" +#include "code\modules\fishing\fishing_rod_vr.dm" +#include "code\modules\fishing\fishing_vr.dm" #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\look_up.dm" @@ -5889,22 +2205,31 @@ #include "code\modules\food\recipe.dm" #include "code\modules\food\recipe_dump.dm" #include "code\modules\food\recipes_fryer.dm" +#include "code\modules\food\recipes_fryer_vr.dm" #include "code\modules\food\recipes_grill.dm" #include "code\modules\food\recipes_microwave.dm" +#include "code\modules\food\recipes_microwave_vr.dm" #include "code\modules\food\recipes_oven.dm" +#include "code\modules\food\recipes_oven_vr.dm" #include "code\modules\food\drinkingglass\drinkingglass.dm" #include "code\modules\food\drinkingglass\extras.dm" #include "code\modules\food\drinkingglass\glass_boxes.dm" #include "code\modules\food\drinkingglass\glass_types.dm" #include "code\modules\food\drinkingglass\metaglass.dm" +#include "code\modules\food\drinkingglass\metaglass_vr.dm" +#include "code\modules\food\drinkingglass\serving_glasses.dm" #include "code\modules\food\drinkingglass\shaker.dm" +#include "code\modules\food\drinkingglass\shaker_vr.dm" #include "code\modules\food\food\cans.dm" +#include "code\modules\food\food\cans_vr.dm" #include "code\modules\food\food\condiment.dm" #include "code\modules\food\food\drinks.dm" #include "code\modules\food\food\lunch.dm" #include "code\modules\food\food\sandwich.dm" #include "code\modules\food\food\snacks.dm" +#include "code\modules\food\food\snacks_vr.dm" #include "code\modules\food\food\thecake.dm" +#include "code\modules\food\food\z_custom_food_vr.dm" #include "code\modules\food\food\drinks\bottle.dm" #include "code\modules\food\food\drinks\cup.dm" #include "code\modules\food\food\drinks\drinkingglass.dm" @@ -5912,6 +2237,7 @@ #include "code\modules\food\food\drinks\bottle\robot.dm" #include "code\modules\food\food\snacks\meat.dm" #include "code\modules\food\glass\bottle.dm" +#include "code\modules\food\glass\bottle_vr.dm" #include "code\modules\food\glass\bottle\robot.dm" #include "code\modules\food\kitchen\gibber.dm" #include "code\modules\food\kitchen\icecream.dm" @@ -5931,6 +2257,7 @@ #include "code\modules\food\kitchen\smartfridge\hydroponics.dm" #include "code\modules\food\kitchen\smartfridge\medical.dm" #include "code\modules\food\kitchen\smartfridge\smartfridge.dm" +#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm" #include "code\modules\gamemaster\defines.dm" #include "code\modules\gamemaster\event2\event.dm" #include "code\modules\gamemaster\event2\meta.dm" @@ -5954,7 +2281,7 @@ #include "code\modules\gamemaster\event2\events\engineering\window_break.dm" #include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" #include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" -#include "code\modules\gamemaster\event2\events\everyone\gravity.dm" +#include "code\modules\gamemaster\event2\events\everyone\gravity_vr.dm" #include "code\modules\gamemaster\event2\events\everyone\infestation.dm" #include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" #include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" @@ -5992,17 +2319,18 @@ #include "code\modules\holomap\holomap_datum.dm" #include "code\modules\holomap\mapper.dm" #include "code\modules\holomap\station_holomap.dm" -#include "code\modules\hydroponics\_hydro_setup.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\grown_inedible.dm" #include "code\modules\hydroponics\grown_predefined.dm" #include "code\modules\hydroponics\seed.dm" -#include "code\modules\hydroponics\seed_controller.dm" +#include "code\modules\hydroponics\seed_datums_vr.dm" #include "code\modules\hydroponics\seed_gene_mut.dm" #include "code\modules\hydroponics\seed_machines.dm" #include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seed_packets.dm" +#include "code\modules\hydroponics\seed_packets_vr.dm" #include "code\modules\hydroponics\seed_storage.dm" +#include "code\modules\hydroponics\seed_storage_vr.dm" #include "code\modules\hydroponics\beekeeping\beehive.dm" #include "code\modules\hydroponics\seedtypes\amauri.dm" #include "code\modules\hydroponics\seedtypes\ambrosia.dm" @@ -6066,6 +2394,22 @@ #include "code\modules\hydroponics\trays\tray_update_icons.dm" #include "code\modules\identification\identification.dm" #include "code\modules\identification\item_procs.dm" +#include "code\modules\instruments\items.dm" +#include "code\modules\instruments\stationary.dm" +#include "code\modules\instruments\instrument_data\_instrument_data.dm" +#include "code\modules\instruments\instrument_data\_instrument_key.dm" +#include "code\modules\instruments\instrument_data\brass.dm" +#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" +#include "code\modules\instruments\instrument_data\fun.dm" +#include "code\modules\instruments\instrument_data\guitar.dm" +#include "code\modules\instruments\instrument_data\hardcoded.dm" +#include "code\modules\instruments\instrument_data\organ.dm" +#include "code\modules\instruments\instrument_data\piano.dm" +#include "code\modules\instruments\instrument_data\synth_tones.dm" +#include "code\modules\instruments\songs\_song.dm" +#include "code\modules\instruments\songs\editor.dm" +#include "code\modules\instruments\songs\play_legacy.dm" +#include "code\modules\instruments\songs\play_synthesized.dm" #include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\assemblies.dm" #include "code\modules\integrated_electronics\core\detailer.dm" @@ -6116,9 +2460,11 @@ #include "code\modules\library\hardcode_library\reference\PortedBooks.dm" #include "code\modules\library\hardcode_library\reference\Schnayy.dm" #include "code\modules\library\hardcode_library\religious\PortedBooks.dm" +#include "code\modules\lighting\emissive_blocker.dm" #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" #include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_fake_sun_vr.dm" #include "code\modules\lighting\lighting_overlay.dm" #include "code\modules\lighting\lighting_setup.dm" #include "code\modules\lighting\lighting_source.dm" @@ -6130,39 +2476,44 @@ #include "code\modules\lore_codex\codex.dm" #include "code\modules\lore_codex\codex_tree.dm" #include "code\modules\lore_codex\pages.dm" -#include "code\modules\lore_codex\legal_code_data\corporate_regulations.dm" -#include "code\modules\lore_codex\legal_code_data\main.dm" -#include "code\modules\lore_codex\legal_code_data\sif_law.dm" -#include "code\modules\lore_codex\legal_code_data\sop.dm" -#include "code\modules\lore_codex\lore_data\important_locations.dm" -#include "code\modules\lore_codex\lore_data\main.dm" -#include "code\modules\lore_codex\lore_data\orgs.dm" -#include "code\modules\lore_codex\lore_data\political_parties.dm" -#include "code\modules\lore_codex\lore_data\species.dm" +#include "code\modules\lore_codex\lore_data_vr\important_locations.dm" +#include "code\modules\lore_codex\lore_data_vr\main.dm" +#include "code\modules\lore_codex\lore_data_vr\orgs.dm" +#include "code\modules\lore_codex\lore_data_vr\political_parties.dm" +#include "code\modules\lore_codex\lore_data_vr\species.dm" #include "code\modules\lore_codex\news_data\main.dm" #include "code\modules\lore_codex\robutt_data\bybrand.dm" #include "code\modules\lore_codex\robutt_data\main_robutts.dm" #include "code\modules\lore_codex\robutt_data\more.dm" #include "code\modules\maps\tg\dmm_suite.dm" #include "code\modules\maps\tg\map_template.dm" +#include "code\modules\maps\tg\map_template_vr.dm" #include "code\modules\maps\tg\reader.dm" #include "code\modules\materials\fifty_spawner.dm" #include "code\modules\materials\fifty_spawner_mats.dm" +#include "code\modules\materials\fifty_spawner_mats_vr.dm" #include "code\modules\materials\material_synth.dm" #include "code\modules\materials\materials\_materials.dm" +#include "code\modules\materials\materials\_materials_vr.dm" #include "code\modules\materials\materials\alien_alloy.dm" #include "code\modules\materials\materials\cult.dm" #include "code\modules\materials\materials\gems.dm" #include "code\modules\materials\materials\glass.dm" +#include "code\modules\materials\materials\glass_vr.dm" #include "code\modules\materials\materials\holographic.dm" +#include "code\modules\materials\materials\other_vr.dm" #include "code\modules\materials\materials\plastic.dm" #include "code\modules\materials\materials\snow.dm" #include "code\modules\materials\materials\stone.dm" #include "code\modules\materials\materials\supermatter.dm" #include "code\modules\materials\materials\metals\hull.dm" +#include "code\modules\materials\materials\metals\hull_vr.dm" #include "code\modules\materials\materials\metals\metals.dm" +#include "code\modules\materials\materials\metals\metals_vr.dm" #include "code\modules\materials\materials\metals\plasteel.dm" +#include "code\modules\materials\materials\metals\plasteel_vr.dm" #include "code\modules\materials\materials\metals\steel.dm" +#include "code\modules\materials\materials\metals\steel_vr.dm" #include "code\modules\materials\materials\organic\animal_products.dm" #include "code\modules\materials\materials\organic\cloth.dm" #include "code\modules\materials\materials\organic\leather.dm" @@ -6171,12 +2522,15 @@ #include "code\modules\materials\sheets\_sheets.dm" #include "code\modules\materials\sheets\gems.dm" #include "code\modules\materials\sheets\glass.dm" +#include "code\modules\materials\sheets\glass_vr.dm" #include "code\modules\materials\sheets\plastic.dm" #include "code\modules\materials\sheets\snow.dm" #include "code\modules\materials\sheets\stone.dm" #include "code\modules\materials\sheets\supermatter.dm" #include "code\modules\materials\sheets\metals\hull.dm" +#include "code\modules\materials\sheets\metals\hull_vr.dm" #include "code\modules\materials\sheets\metals\metal.dm" +#include "code\modules\materials\sheets\metals\metal_vr.dm" #include "code\modules\materials\sheets\metals\rods.dm" #include "code\modules\materials\sheets\organic\animal_products.dm" #include "code\modules\materials\sheets\organic\resin.dm" @@ -6186,20 +2540,35 @@ #include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" #include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" #include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" +#include "code\modules\media\juke_remote.dm" +#include "code\modules\media\media_machinery.dm" +#include "code\modules\media\media_player_html5.dm" +#include "code\modules\media\media_player_vlc.dm" +#include "code\modules\media\media_player_wmp.dm" +#include "code\modules\media\media_tracks.dm" +#include "code\modules\media\mediamanager.dm" +#include "code\modules\media\walkpod.dm" #include "code\modules\metric\activity.dm" #include "code\modules\metric\count.dm" #include "code\modules\metric\department.dm" #include "code\modules\metric\metric.dm" #include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\abandonedcrates_vr.dm" #include "code\modules\mining\alloys.dm" +#include "code\modules\mining\alloys_vr.dm" #include "code\modules\mining\fulton.dm" #include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\mine_items_vr.dm" #include "code\modules\mining\mine_outcrops.dm" #include "code\modules\mining\mine_turfs.dm" +#include "code\modules\mining\mine_turfs_vr.dm" #include "code\modules\mining\mineral_effect.dm" #include "code\modules\mining\ore.dm" #include "code\modules\mining\ore_box.dm" #include "code\modules\mining\ore_datum.dm" +#include "code\modules\mining\resonator_vr.dm" +#include "code\modules\mining\shelter_atoms_vr.dm" +#include "code\modules\mining\shelters_vr.dm" #include "code\modules\mining\drilling\drill.dm" #include "code\modules\mining\drilling\scanner.dm" #include "code\modules\mining\machinery\machine_input_output_plates.dm" @@ -6214,20 +2583,26 @@ #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" #include "code\modules\mob\gender.dm" +#include "code\modules\mob\gender_vr.dm" #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\login.dm" +#include "code\modules\mob\login_vr.dm" #include "code\modules\mob\logout.dm" #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_defines_vr.dm" #include "code\modules\mob\mob_grab.dm" #include "code\modules\mob\mob_grab_specials.dm" #include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_helpers_vr.dm" #include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_planes.dm" +#include "code\modules\mob\mob_planes_vr.dm" #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\say.dm" +#include "code\modules\mob\say_vr.dm" #include "code\modules\mob\skillset.dm" #include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\typing_indicator.dm" @@ -6244,10 +2619,13 @@ #include "code\modules\mob\_modifiers\traits_phobias.dm" #include "code\modules\mob\_modifiers\unholy.dm" #include "code\modules\mob\dead\corpse.dm" +#include "code\modules\mob\dead\corpse_vr.dm" #include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\free_vr.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\observer_vr.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\freelook\chunk.dm" #include "code\modules\mob\freelook\eye.dm" @@ -6267,6 +2645,7 @@ #include "code\modules\mob\language\monkey.dm" #include "code\modules\mob\language\outsider.dm" #include "code\modules\mob\language\station.dm" +#include "code\modules\mob\language\station_vr.dm" #include "code\modules\mob\language\synthetic.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\butchering.dm" @@ -6278,8 +2657,10 @@ #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_defines_vr.dm" #include "code\modules\mob\living\living_movement.dm" #include "code\modules\mob\living\living_powers.dm" +#include "code\modules\mob\living\living_vr.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\organs.dm" @@ -6287,6 +2668,7 @@ #include "code\modules\mob\living\say.dm" #include "code\modules\mob\living\status_indicators.dm" #include "code\modules\mob\living\bot\bot.dm" +#include "code\modules\mob\living\bot\bot_vr.dm" #include "code\modules\mob\living\bot\cleanbot.dm" #include "code\modules\mob\living\bot\ed209bot.dm" #include "code\modules\mob\living\bot\edCLNbot.dm" @@ -6294,6 +2676,7 @@ #include "code\modules\mob\living\bot\floorbot.dm" #include "code\modules\mob\living\bot\medbot.dm" #include "code\modules\mob\living\bot\mulebot.dm" +#include "code\modules\mob\living\bot\mulebot_vr.dm" #include "code\modules\mob\living\bot\secbot.dm" #include "code\modules\mob\living\bot\SLed209bot.dm" #include "code\modules\mob\living\carbon\breathe.dm" @@ -6302,6 +2685,7 @@ #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\lick_wounds.dm" #include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\taste.dm" @@ -6330,26 +2714,36 @@ #include "code\modules\mob\living\carbon\brain\life.dm" #include "code\modules\mob\living\carbon\brain\login.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\robot.dm" #include "code\modules\mob\living\carbon\brain\say.dm" #include "code\modules\mob\living\carbon\human\appearance.dm" #include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\death_vr.dm" #include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\emote_vr.dm" #include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\examine_vr.dm" #include "code\modules\mob\living\carbon\human\gradient.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" #include "code\modules\mob\living\carbon\human\human_damage.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_defines_vr.dm" #include "code\modules\mob\living\carbon\human\human_helpers.dm" +#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" #include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" #include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm" +#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" #include "code\modules\mob\living\carbon\human\human_resist.dm" #include "code\modules\mob\living\carbon\human\human_species.dm" +#include "code\modules\mob\living\carbon\human\human_species_vr.dm" +#include "code\modules\mob\living\carbon\human\human_vr.dm" #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\life_vr.dm" #include "code\modules\mob\living\carbon\human\login.dm" #include "code\modules\mob\living\carbon\human\logout.dm" #include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" @@ -6365,21 +2759,51 @@ #include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\species_attack.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" #include "code\modules\mob\living\carbon\human\species\species_getters.dm" +#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" #include "code\modules\mob\living\carbon\human\species\species_helpers.dm" #include "code\modules\mob\living\carbon\human\species\species_hud.dm" #include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" +#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_vr.dm" #include "code\modules\mob\living\carbon\human\species\outsider\event.dm" #include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" #include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" #include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" +#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" #include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" +#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\station.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\teshari.dm" +#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" #include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" #include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" @@ -6391,10 +2815,12 @@ #include "code\modules\mob\living\silicon\login.dm" #include "code\modules\mob\living\silicon\say.dm" #include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_vr.dm" #include "code\modules\mob\living\silicon\subystems.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai_movement.dm" #include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" +#include "code\modules\mob\living\silicon\ai\ai_vr.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" #include "code\modules\mob\living\silicon\ai\icons.dm" @@ -6413,6 +2839,7 @@ #include "code\modules\mob\living\silicon\pai\examine.dm" #include "code\modules\mob\living\silicon\pai\life.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\pai_vr.dm" #include "code\modules\mob\living\silicon\pai\personality.dm" #include "code\modules\mob\living\silicon\pai\recruit.dm" #include "code\modules\mob\living\silicon\pai\say.dm" @@ -6424,16 +2851,22 @@ #include "code\modules\mob\living\silicon\robot\death.dm" #include "code\modules\mob\living\silicon\robot\emote.dm" #include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\examine_vr.dm" #include "code\modules\mob\living\silicon\robot\inventory.dm" #include "code\modules\mob\living\silicon\robot\laws.dm" #include "code\modules\mob\living\silicon\robot\life.dm" #include "code\modules\mob\living\silicon\robot\login.dm" #include "code\modules\mob\living\silicon\robot\photos.dm" #include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm" #include "code\modules\mob\living\silicon\robot\robot_damage.dm" #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" +#include "code\modules\mob\living\silicon\robot\robot_vr.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" @@ -6441,15 +2874,19 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" #include "code\modules\mob\living\silicon\robot\drone\swarm.dm" #include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event_vr.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" #include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" #include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" #include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" #include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" #include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" @@ -6461,12 +2898,14 @@ #include "code\modules\mob\living\simple_mob\butchering.dm" #include "code\modules\mob\living\simple_mob\combat.dm" #include "code\modules\mob\living\simple_mob\defense.dm" +#include "code\modules\mob\living\simple_mob\donteatpets_vr.dm" #include "code\modules\mob\living\simple_mob\hands.dm" #include "code\modules\mob\living\simple_mob\harvesting.dm" #include "code\modules\mob\living\simple_mob\life.dm" #include "code\modules\mob\living\simple_mob\on_click.dm" #include "code\modules\mob\living\simple_mob\simple_hud.dm" #include "code\modules\mob\living\simple_mob\simple_mob.dm" +#include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" #include "code\modules\mob\living\simple_mob\taming.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" @@ -6479,6 +2918,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\giant_spider_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" @@ -6489,18 +2929,25 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\jerboa_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\fox_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\fluffy_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" @@ -6518,27 +2965,55 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" #include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" #include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\wahlem_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" @@ -6561,27 +3036,93 @@ #include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" #include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\slime_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\xeno_vore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bus.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\busclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\c_shift.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Clowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\hespawner.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\_defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" #include "code\modules\mob\living\voice\voice.dm" +#include "code\modules\mob\living\voice\voice_vr.dm" #include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\login_vr.dm" #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\new_player_vr.dm" #include "code\modules\mob\new_player\news.dm" #include "code\modules\mob\new_player\poll.dm" #include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\preferences_setup_vr.dm" #include "code\modules\mob\new_player\skill.dm" #include "code\modules\mob\new_player\sprite_accessories.dm" #include "code\modules\mob\new_player\sprite_accessories_ear.dm" +#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm" #include "code\modules\mob\new_player\sprite_accessories_extra.dm" +#include "code\modules\mob\new_player\sprite_accessories_extra_vr.dm" #include "code\modules\mob\new_player\sprite_accessories_tail.dm" +#include "code\modules\mob\new_player\sprite_accessories_tail_vr.dm" #include "code\modules\mob\new_player\sprite_accessories_taur.dm" +#include "code\modules\mob\new_player\sprite_accessories_taur_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_vr.dm" #include "code\modules\mob\new_player\sprite_accessories_wing.dm" +#include "code\modules\mob\new_player\sprite_accessories_wing_vr.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\modular_computer\core.dm" #include "code\modules\modular_computers\computers\modular_computer\damage.dm" @@ -6596,7 +3137,9 @@ #include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" #include "code\modules\modular_computers\computers\subtypes\preset_console.dm" #include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop_vr.dm" #include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_tablet_vr.dm" #include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" #include "code\modules\modular_computers\file_system\computer_file.dm" #include "code\modules\modular_computers\file_system\data.dm" @@ -6648,44 +3191,43 @@ #include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" #include "code\modules\multi-tile\multi-tile.dm" #include "code\modules\multiz\_stubs.dm" +#include "code\modules\multiz\admin_upload.dm" #include "code\modules\multiz\basic.dm" #include "code\modules\multiz\hoist.dm" +#include "code\modules\multiz\ladder_assembly_vr.dm" #include "code\modules\multiz\ladders.dm" +#include "code\modules\multiz\ladders_vr.dm" #include "code\modules\multiz\movement.dm" +#include "code\modules\multiz\movement_vr.dm" #include "code\modules\multiz\pipes.dm" #include "code\modules\multiz\stairs.dm" #include "code\modules\multiz\turf.dm" #include "code\modules\multiz\zshadow.dm" -#include "code\modules\nano\nanoexternal.dm" -#include "code\modules\nano\nanomanager.dm" -#include "code\modules\nano\nanomapgen.dm" -#include "code\modules\nano\nanoui.dm" -#include "code\modules\nano\interaction\admin.dm" -#include "code\modules\nano\interaction\base.dm" -#include "code\modules\nano\interaction\conscious.dm" -#include "code\modules\nano\interaction\contained.dm" -#include "code\modules\nano\interaction\default.dm" -#include "code\modules\nano\interaction\interactive.dm" -#include "code\modules\nano\interaction\inventory.dm" -#include "code\modules\nano\interaction\inventory_deep.dm" -#include "code\modules\nano\interaction\outside.dm" -#include "code\modules\nano\interaction\physical.dm" -#include "code\modules\nano\interaction\remote.dm" -#include "code\modules\nano\interaction\self.dm" -#include "code\modules\nano\interaction\zlevel.dm" -#include "code\modules\nano\modules\nano_module.dm" #include "code\modules\news\news_init.dm" #include "code\modules\news\newspaper.dm" #include "code\modules\news\newspaper_layout.dm" +#include "code\modules\nifsoft\nif.dm" +#include "code\modules\nifsoft\nif_softshop.dm" +#include "code\modules\nifsoft\nif_tgui.dm" +#include "code\modules\nifsoft\nifsoft.dm" +#include "code\modules\nifsoft\software\01_vision.dm" +#include "code\modules\nifsoft\software\05_health.dm" +#include "code\modules\nifsoft\software\06_screens.dm" +#include "code\modules\nifsoft\software\10_combat.dm" +#include "code\modules\nifsoft\software\13_soulcatcher.dm" +#include "code\modules\nifsoft\software\14_commlink.dm" +#include "code\modules\nifsoft\software\15_misc.dm" #include "code\modules\organs\blood.dm" #include "code\modules\organs\misc.dm" #include "code\modules\organs\organ.dm" #include "code\modules\organs\organ_external.dm" +#include "code\modules\organs\organ_external_vr.dm" #include "code\modules\organs\organ_icon.dm" #include "code\modules\organs\organ_stump.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\robolimbs.dm" #include "code\modules\organs\robolimbs_custom.dm" +#include "code\modules\organs\robolimbs_vr.dm" #include "code\modules\organs\wound.dm" #include "code\modules\organs\internal\appendix.dm" #include "code\modules\organs\internal\augment.dm" @@ -6708,15 +3250,24 @@ #include "code\modules\organs\subtypes\diona.dm" #include "code\modules\organs\subtypes\indestructible.dm" #include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\nano.dm" #include "code\modules\organs\subtypes\replicant.dm" +#include "code\modules\organs\subtypes\shadekin.dm" +#include "code\modules\organs\subtypes\shadekin_vr.dm" #include "code\modules\organs\subtypes\slime.dm" +#include "code\modules\organs\subtypes\slime_vr.dm" #include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\standard_vr.dm" #include "code\modules\organs\subtypes\teshari.dm" #include "code\modules\organs\subtypes\unathi.dm" #include "code\modules\organs\subtypes\unbreakable.dm" #include "code\modules\organs\subtypes\unseverable.dm" #include "code\modules\organs\subtypes\vox.dm" +#include "code\modules\organs\subtypes\vox_vr.dm" #include "code\modules\organs\subtypes\xenos.dm" +#include "code\modules\overmap\abductor_vr.dm" +#include "code\modules\overmap\bluespace_rift_vr.dm" +#include "code\modules\overmap\champagne.dm" #include "code\modules\overmap\helpers.dm" #include "code\modules\overmap\overmap_object.dm" #include "code\modules\overmap\overmap_planet.dm" @@ -6724,24 +3275,33 @@ #include "code\modules\overmap\sectors.dm" #include "code\modules\overmap\spacetravel.dm" #include "code\modules\overmap\turfs.dm" +#include "code\modules\overmap\disperser\disperser.dm" +#include "code\modules\overmap\disperser\disperser_charge.dm" +#include "code\modules\overmap\disperser\disperser_circuit.dm" +#include "code\modules\overmap\disperser\disperser_console.dm" +#include "code\modules\overmap\disperser\disperser_fire.dm" #include "code\modules\overmap\events\event_handler.dm" #include "code\modules\overmap\events\generation.dm" #include "code\modules\overmap\events\overmap_event.dm" #include "code\modules\overmap\ships\landable.dm" +#include "code\modules\overmap\ships\panicbutton.dm" #include "code\modules\overmap\ships\ship.dm" #include "code\modules\overmap\ships\computers\computer_shims.dm" #include "code\modules\overmap\ships\computers\engine_control.dm" #include "code\modules\overmap\ships\computers\helm.dm" #include "code\modules\overmap\ships\computers\sensors.dm" #include "code\modules\overmap\ships\computers\ship.dm" +#include "code\modules\overmap\ships\computers\ship_vr.dm" #include "code\modules\overmap\ships\computers\shuttle.dm" #include "code\modules\overmap\ships\engines\engine.dm" #include "code\modules\overmap\ships\engines\gas_thruster.dm" +#include "code\modules\overmap\ships\engines\gas_thruster_vr.dm" #include "code\modules\overmap\ships\engines\ion_thruster.dm" #include "code\modules\paperwork\adminpaper.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\faxmachine_vr.dm" #include "code\modules\paperwork\filingcabinet.dm" #include "code\modules\paperwork\folders.dm" #include "code\modules\paperwork\handlabeler.dm" @@ -6760,17 +3320,20 @@ #include "code\modules\pda\app.dm" #include "code\modules\pda\cart.dm" #include "code\modules\pda\cart_apps.dm" +#include "code\modules\pda\cart_vr.dm" #include "code\modules\pda\core_apps.dm" #include "code\modules\pda\messenger.dm" #include "code\modules\pda\messenger_plugins.dm" #include "code\modules\pda\pda.dm" #include "code\modules\pda\pda_subtypes.dm" #include "code\modules\pda\pda_tgui.dm" +#include "code\modules\pda\pda_vr.dm" #include "code\modules\pda\radio.dm" #include "code\modules\pda\utilities.dm" #include "code\modules\persistence\filth.dm" #include "code\modules\persistence\graffiti.dm" #include "code\modules\persistence\noticeboard.dm" +#include "code\modules\persistence\serialize.dm" #include "code\modules\persistence\datum\persistence_datum.dm" #include "code\modules\persistence\effects\filth.dm" #include "code\modules\persistence\effects\graffiti.dm" @@ -6780,11 +3343,16 @@ #include "code\modules\persistence\storage\smartfridge.dm" #include "code\modules\persistence\storage\storage.dm" #include "code\modules\planet\planet.dm" -#include "code\modules\planet\sif.dm" +#include "code\modules\planet\sun.dm" #include "code\modules\planet\time.dm" +#include "code\modules\planet\virgo3b_vr.dm" +#include "code\modules\planet\virgo4_vr.dm" #include "code\modules\planet\weather.dm" +#include "code\modules\planet\weather_vr.dm" #include "code\modules\power\apc.dm" +#include "code\modules\power\apc_vr.dm" #include "code\modules\power\batteryrack.dm" +#include "code\modules\power\batteryrack_vr.dm" #include "code\modules\power\breaker_box.dm" #include "code\modules\power\cable.dm" #include "code\modules\power\cable_ender.dm" @@ -6793,14 +3361,18 @@ #include "code\modules\power\debug_items.dm" #include "code\modules\power\generator.dm" #include "code\modules\power\generator_type2.dm" -#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\gravitygenerator_vr.dm" #include "code\modules\power\grid_checker.dm" #include "code\modules\power\lighting.dm" +#include "code\modules\power\lighting_vr.dm" +#include "code\modules\power\lightswitch_vr.dm" #include "code\modules\power\port_gen.dm" +#include "code\modules\power\port_gen_vr.dm" #include "code\modules\power\power.dm" #include "code\modules\power\powernet.dm" #include "code\modules\power\smes.dm" #include "code\modules\power\smes_construction.dm" +#include "code\modules\power\smes_vr.dm" #include "code\modules\power\solar.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" @@ -6809,6 +3381,7 @@ #include "code\modules\power\antimatter\control.dm" #include "code\modules\power\antimatter\shielding.dm" #include "code\modules\power\cells\device_cells.dm" +#include "code\modules\power\cells\device_cells_vr.dm" #include "code\modules\power\cells\esoteric_cells.dm" #include "code\modules\power\cells\power_cells.dm" #include "code\modules\power\fusion\_setup.dm" @@ -6855,6 +3428,7 @@ #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\magazines_vr.dm" #include "code\modules\projectiles\ammunition\magnetic.dm" #include "code\modules\projectiles\ammunition\rounds.dm" #include "code\modules\projectiles\ammunition\smartmag.dm" @@ -6868,14 +3442,35 @@ #include "code\modules\projectiles\guns\modular_guns.dm" #include "code\modules\projectiles\guns\projectile.dm" #include "code\modules\projectiles\guns\vox.dm" +#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" +#include "code\modules\projectiles\guns\energy\crestrose_vr.dm" +#include "code\modules\projectiles\guns\energy\dominator_vr.dm" +#include "code\modules\projectiles\guns\energy\gunsword_vr.dm" #include "code\modules\projectiles\guns\energy\hooklauncher.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" #include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\laser_vr.dm" +#include "code\modules\projectiles\guns\energy\netgun_vr.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\nuclear_vr.dm" +#include "code\modules\projectiles\guns\energy\particle.dm" #include "code\modules\projectiles\guns\energy\phase.dm" +#include "code\modules\projectiles\guns\energy\protector_vr.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\pummeler_vr.dm" +#include "code\modules\projectiles\guns\energy\sickshot_vr.dm" #include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\special_vr.dm" #include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\stun_vr.dm" #include "code\modules\projectiles\guns\energy\temperature.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\cell_loaded.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m_cells.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon_cells.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw_cells.dm" #include "code\modules\projectiles\guns\launcher\crossbow.dm" #include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" #include "code\modules\projectiles\guns\launcher\pneumatic.dm" @@ -6887,23 +3482,33 @@ #include "code\modules\projectiles\guns\magnetic\magnetic.dm" #include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" #include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" #include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\automatic_vr.dm" #include "code\modules\projectiles\guns\projectile\boltaction.dm" +#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm" #include "code\modules\projectiles\guns\projectile\caseless.dm" #include "code\modules\projectiles\guns\projectile\contender.dm" #include "code\modules\projectiles\guns\projectile\dartgun.dm" +#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm" #include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\pistol_vr.dm" #include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\revolver_vr.dm" #include "code\modules\projectiles\guns\projectile\semiauto.dm" #include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm" #include "code\modules\projectiles\guns\projectile\sniper.dm" #include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" #include "code\modules\projectiles\projectile\arc.dm" #include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\beams_vr.dm" #include "code\modules\projectiles\projectile\blob.dm" #include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\bullets_vr.dm" #include "code\modules\projectiles\projectile\change.dm" #include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\energy_vr.dm" #include "code\modules\projectiles\projectile\explosive.dm" #include "code\modules\projectiles\projectile\force.dm" #include "code\modules\projectiles\projectile\hook.dm" @@ -6944,44 +3549,60 @@ #include "code\modules\reagents\hoses\hose.dm" #include "code\modules\reagents\hoses\hose_connector.dm" #include "code\modules\reagents\machinery\chem_master.dm" +#include "code\modules\reagents\machinery\chem_master_vr.dm" #include "code\modules\reagents\machinery\chemalyzer.dm" #include "code\modules\reagents\machinery\distillery.dm" #include "code\modules\reagents\machinery\grinder.dm" #include "code\modules\reagents\machinery\dispenser\_defines.dm" #include "code\modules\reagents\machinery\dispenser\cartridge.dm" #include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm" #include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" #include "code\modules\reagents\machinery\dispenser\dispenser2.dm" #include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" #include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm" #include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" #include "code\modules\reagents\machinery\dispenser\supply.dm" #include "code\modules\reagents\reactions\_reactions.dm" #include "code\modules\reagents\reactions\distilling\distilling.dm" #include "code\modules\reagents\reactions\fusion\fusion.dm" #include "code\modules\reagents\reactions\instant\drinks.dm" +#include "code\modules\reagents\reactions\instant\drinks_vr.dm" #include "code\modules\reagents\reactions\instant\food.dm" +#include "code\modules\reagents\reactions\instant\food_vr.dm" #include "code\modules\reagents\reactions\instant\instant.dm" +#include "code\modules\reagents\reactions\instant\instant_vr.dm" #include "code\modules\reagents\reagent_containers\_reagent_containers.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" +#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" #include "code\modules\reagents\reagent_containers\borghypo.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\glass_vr.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypospray_vr.dm" #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\pill_vr.dm" #include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\spray_vr.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\reagents\reagent_containers\syringes_vr.dm" #include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" #include "code\modules\reagents\reagents\_helpers.dm" #include "code\modules\reagents\reagents\_reagents.dm" #include "code\modules\reagents\reagents\core.dm" #include "code\modules\reagents\reagents\dispenser.dm" #include "code\modules\reagents\reagents\food_drinks.dm" +#include "code\modules\reagents\reagents\food_drinks_vr.dm" #include "code\modules\reagents\reagents\medicine.dm" +#include "code\modules\reagents\reagents\medicine_vr.dm" #include "code\modules\reagents\reagents\modifiers.dm" #include "code\modules\reagents\reagents\other.dm" +#include "code\modules\reagents\reagents\other_vr.dm" #include "code\modules\reagents\reagents\toxins.dm" +#include "code\modules\reagents\reagents\vore_vr.dm" #include "code\modules\recycling\conveyor2.dm" #include "code\modules\recycling\disposal-construction.dm" #include "code\modules\recycling\disposal.dm" @@ -6992,24 +3613,32 @@ #include "code\modules\research\mechfab_designs.dm" #include "code\modules\research\message_server.dm" #include "code\modules\research\prosfab_designs.dm" +#include "code\modules\research\prosfab_designs_vr.dm" #include "code\modules\research\protolathe.dm" #include "code\modules\research\rd-readme.dm" #include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdconsole_tgui.dm" #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research.dm" #include "code\modules\research\server.dm" +#include "code\modules\research\teleport_vr.dm" #include "code\modules\research\designs\ai_holders.dm" #include "code\modules\research\designs\bag_of_holding.dm" #include "code\modules\research\designs\beakers.dm" #include "code\modules\research\designs\bio_devices.dm" +#include "code\modules\research\designs\bio_devices_vr.dm" #include "code\modules\research\designs\circuit_assembly.dm" #include "code\modules\research\designs\engineering.dm" #include "code\modules\research\designs\HUDs.dm" +#include "code\modules\research\designs\HUDs_vr.dm" #include "code\modules\research\designs\implants.dm" +#include "code\modules\research\designs\implants_vr.dm" #include "code\modules\research\designs\locator_devices.dm" #include "code\modules\research\designs\medical.dm" +#include "code\modules\research\designs\medical_vr.dm" #include "code\modules\research\designs\mining_toys.dm" #include "code\modules\research\designs\misc.dm" +#include "code\modules\research\designs\misc_vr.dm" #include "code\modules\research\designs\modular_computer.dm" #include "code\modules\research\designs\pdas.dm" #include "code\modules\research\designs\power_cells.dm" @@ -7018,11 +3647,34 @@ #include "code\modules\research\designs\subspace_parts.dm" #include "code\modules\research\designs\tech_disks.dm" #include "code\modules\research\designs\weapons.dm" +#include "code\modules\research\designs\weapons_vr.dm" #include "code\modules\research\designs\xenoarch_toys.dm" #include "code\modules\research\designs\xenobio_toys.dm" #include "code\modules\research\designs\circuits\ai_modules.dm" +#include "code\modules\research\designs\circuits\ai_modules_vr.dm" #include "code\modules\research\designs\circuits\circuits.dm" +#include "code\modules\research\designs\circuits\circuits_vr.dm" #include "code\modules\research\designs\circuits\disks.dm" +#include "code\modules\resleeving\circuitboards.dm" +#include "code\modules\resleeving\computers.dm" +#include "code\modules\resleeving\designer.dm" +#include "code\modules\resleeving\documents.dm" +#include "code\modules\resleeving\implant.dm" +#include "code\modules\resleeving\infocore_records.dm" +#include "code\modules\resleeving\infomorph.dm" +#include "code\modules\resleeving\infomorph_software.dm" +#include "code\modules\resleeving\machines.dm" +#include "code\modules\resleeving\machines_vr.dm" +#include "code\modules\resleeving\resleeving_sickness.dm" +#include "code\modules\resleeving\sleevecard.dm" +#include "code\modules\rogueminer_vr\asteroid.dm" +#include "code\modules\rogueminer_vr\controller.dm" +#include "code\modules\rogueminer_vr\debug.dm" +#include "code\modules\rogueminer_vr\landmarks.dm" +#include "code\modules\rogueminer_vr\roguemines_mobs.dm" +#include "code\modules\rogueminer_vr\wrappers.dm" +#include "code\modules\rogueminer_vr\zone_console.dm" +#include "code\modules\rogueminer_vr\zonemaster.dm" #include "code\modules\scripting\Errors.dm" #include "code\modules\scripting\IDE.dm" #include "code\modules\scripting\Options.dm" @@ -7048,18 +3700,21 @@ #include "code\modules\shieldgen\directional_shield.dm" #include "code\modules\shieldgen\emergency_shield.dm" #include "code\modules\shieldgen\energy_field.dm" +#include "code\modules\shieldgen\energy_shield.dm" #include "code\modules\shieldgen\handheld_defuser.dm" #include "code\modules\shieldgen\sheldwallgen.dm" #include "code\modules\shieldgen\shield_capacitor.dm" #include "code\modules\shieldgen\shield_diffuser.dm" #include "code\modules\shieldgen\shield_gen.dm" #include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shieldgen\shield_generator.dm" +#include "code\modules\shieldgen\shield_modes.dm" #include "code\modules\shuttles\antagonist.dm" +#include "code\modules\shuttles\crashes.dm" #include "code\modules\shuttles\departmental.dm" #include "code\modules\shuttles\escape_pods.dm" #include "code\modules\shuttles\landmarks.dm" #include "code\modules\shuttles\shuttle.dm" -#include "code\modules\shuttles\shuttle_arrivals.dm" #include "code\modules\shuttles\shuttle_autodock.dm" #include "code\modules\shuttles\shuttle_console.dm" #include "code\modules\shuttles\shuttle_console_multi.dm" @@ -7068,6 +3723,7 @@ #include "code\modules\shuttles\shuttle_specops.dm" #include "code\modules\shuttles\shuttle_supply.dm" #include "code\modules\shuttles\shuttles_multi.dm" +#include "code\modules\shuttles\shuttles_vr.dm" #include "code\modules\shuttles\shuttles_web.dm" #include "code\modules\shuttles\web_datums.dm" #include "code\modules\spells\artifacts.dm" @@ -7120,21 +3776,34 @@ #include "code\modules\tables\flipping.dm" #include "code\modules\tables\interactions.dm" #include "code\modules\tables\presets.dm" +#include "code\modules\tables\presets_vr.dm" #include "code\modules\tables\rack.dm" +#include "code\modules\tables\rack_vr.dm" #include "code\modules\tables\tables.dm" #include "code\modules\tables\update_triggers.dm" +#include "code\modules\telesci\bscyrstal.dm" +#include "code\modules\telesci\construction.dm" +#include "code\modules\telesci\gps_advanced.dm" +#include "code\modules\telesci\quantum_pad.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" #include "code\modules\tension\tension.dm" +#include "code\modules\tgs\includes.dm" #include "code\modules\tgui\external.dm" #include "code\modules\tgui\modal.dm" #include "code\modules\tgui\states.dm" #include "code\modules\tgui\tgui.dm" #include "code\modules\tgui\tgui_window.dm" #include "code\modules\tgui\modules\_base.dm" +#include "code\modules\tgui\modules\admin_shuttle_controller.dm" +#include "code\modules\tgui\modules\agentcard.dm" #include "code\modules\tgui\modules\alarm.dm" #include "code\modules\tgui\modules\appearance_changer.dm" +#include "code\modules\tgui\modules\appearance_changer_vr.dm" #include "code\modules\tgui\modules\atmos_control.dm" #include "code\modules\tgui\modules\camera.dm" #include "code\modules\tgui\modules\communications.dm" +#include "code\modules\tgui\modules\crew_manifest.dm" #include "code\modules\tgui\modules\crew_monitor.dm" #include "code\modules\tgui\modules\gyrotron_control.dm" #include "code\modules\tgui\modules\law_manager.dm" @@ -7145,6 +3814,7 @@ #include "code\modules\tgui\modules\rustfuel_control.dm" #include "code\modules\tgui\modules\shutoff_monitor.dm" #include "code\modules\tgui\modules\supermatter_monitor.dm" +#include "code\modules\tgui\modules\teleporter.dm" #include "code\modules\tgui\modules\ntos-only\cardmod.dm" #include "code\modules\tgui\modules\ntos-only\configurator.dm" #include "code\modules\tgui\modules\ntos-only\email.dm" @@ -7158,19 +3828,22 @@ #include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\inventory_vr.dm" #include "code\modules\tgui\states\not_incapacitated.dm" #include "code\modules\tgui\states\notcontained.dm" -#include "code\modules\tgui\states\ntos.dm" #include "code\modules\tgui\states\observer.dm" #include "code\modules\tgui\states\physical.dm" #include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\vorepanel_vr.dm" #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tooltip\tooltip.dm" #include "code\modules\turbolift\_turbolift.dm" #include "code\modules\turbolift\turbolift.dm" #include "code\modules\turbolift\turbolift_areas.dm" #include "code\modules\turbolift\turbolift_console.dm" +#include "code\modules\turbolift\turbolift_console_vr.dm" #include "code\modules\turbolift\turbolift_door.dm" +#include "code\modules\turbolift\turbolift_door_vr.dm" #include "code\modules\turbolift\turbolift_floor.dm" #include "code\modules\turbolift\turbolift_map.dm" #include "code\modules\turbolift\turbolift_turfs.dm" @@ -7196,9 +3869,40 @@ #include "code\modules\virus2\diseasesplicer.dm" #include "code\modules\virus2\dishincubator.dm" #include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\effect_vr.dm" #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" +#include "code\modules\vore\hook-defs_vr.dm" +#include "code\modules\vore\trycatch_vr.dm" +#include "code\modules\vore\appearance\preferences_vr.dm" +#include "code\modules\vore\appearance\update_icons_vr.dm" +#include "code\modules\vore\eating\belly_dat_vr.dm" +#include "code\modules\vore\eating\belly_obj_vr.dm" +#include "code\modules\vore\eating\bellymodes_datum_vr.dm" +#include "code\modules\vore\eating\bellymodes_vr.dm" +#include "code\modules\vore\eating\contaminate_vr.dm" +#include "code\modules\vore\eating\digest_act_vr.dm" +#include "code\modules\vore\eating\leave_remains_vr.dm" +#include "code\modules\vore\eating\living_vr.dm" +#include "code\modules\vore\eating\silicon_vr.dm" +#include "code\modules\vore\eating\simple_animal_vr.dm" +#include "code\modules\vore\eating\transforming_vr.dm" +#include "code\modules\vore\eating\vore_vr.dm" +#include "code\modules\vore\eating\vorehooks_vr.dm" +#include "code\modules\vore\eating\vorepanel_vr.dm" +#include "code\modules\vore\fluffstuff\custom_boxes_vr.dm" +#include "code\modules\vore\fluffstuff\custom_clothes_vr.dm" +#include "code\modules\vore\fluffstuff\custom_items_vr.dm" +#include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" +#include "code\modules\vore\fluffstuff\custom_permits_vr.dm" +#include "code\modules\vore\persist\persist_vr.dm" +#include "code\modules\vore\resizing\grav_pull_vr.dm" +#include "code\modules\vore\resizing\holder_micro_vr.dm" +#include "code\modules\vore\resizing\resize_vr.dm" +#include "code\modules\vore\resizing\sizegun_vr.dm" +#include "code\modules\vore\smoleworld\smoleworld_vr.dm" +#include "code\modules\vore\weight\fitness_machines_vr.dm" #include "code\modules\webhooks\_webhook.dm" #include "code\modules\webhooks\webhook_ahelp2discord.dm" #include "code\modules\webhooks\webhook_custom_event.dm" @@ -7214,6 +3918,7 @@ #include "code\modules\xenoarcheaology\sampling.dm" #include "code\modules\xenoarcheaology\artifacts\artifact.dm" #include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_vr.dm" #include "code\modules\xenoarcheaology\artifacts\autocloner.dm" #include "code\modules\xenoarcheaology\artifacts\crystal.dm" #include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" @@ -7253,6 +3958,7 @@ #include "code\modules\xenoarcheaology\effects\teleport.dm" #include "code\modules\xenoarcheaology\effects\vampire.dm" #include "code\modules\xenoarcheaology\finds\eguns.dm" +#include "code\modules\xenoarcheaology\finds\eguns_vr.dm" #include "code\modules\xenoarcheaology\finds\find_spawning.dm" #include "code\modules\xenoarcheaology\finds\finds.dm" #include "code\modules\xenoarcheaology\finds\finds_defines.dm" @@ -7270,6 +3976,8 @@ #include "code\modules\xenoarcheaology\tools\suspension_generator.dm" #include "code\modules\xenoarcheaology\tools\tools.dm" #include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" +#include "code\modules\xenoarcheaology\tools\tools_vr.dm" #include "code\modules\xenobio\items\extracts.dm" #include "code\modules\xenobio\items\slime_objects.dm" #include "code\modules\xenobio\items\slimepotions.dm" @@ -7287,6 +3995,8 @@ #include "code\unit_tests\sqlite_tests.dm" #include "code\unit_tests\subsystem_tests.dm" #include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\unit_test_vr.dm" +#include "code\unit_tests\vore_tests_vr.dm" #include "code\unit_tests\zas_tests.dm" #include "code\unit_tests\integrated_circuits\arithmetic.dm" #include "code\unit_tests\integrated_circuits\circuits.dm" @@ -7308,18 +4018,28 @@ #include "code\ZAS\Zone.dm" #include "interface\interface.dm" #include "interface\skin.dmf" -#include "maps\southern_cross\southern_cross.dm" +#include "maps\gateway_archive_vr\blackmarketpackers.dm" +#include "maps\offmap_vr\om_ships\abductor.dm" +#include "maps\southern_cross\items\clothing\sc_accessory.dm" +#include "maps\southern_cross\items\clothing\sc_suit.dm" +#include "maps\southern_cross\items\clothing\sc_under.dm" +#include "maps\southern_cross\loadout\loadout_suit.dm" +#include "maps\southern_cross\loadout\loadout_uniform.dm" +#include "maps\southern_cross\loadout\loadout_vr.dm" #include "maps\submaps\_helpers.dm" +#include "maps\submaps\_readme.dm" #include "maps\submaps\engine_submaps\engine.dm" #include "maps\submaps\engine_submaps\engine_areas.dm" -#include "maps\submaps\engine_submaps\southern_cross\_engine_submaps.dm" +#include "maps\submaps\engine_submaps_vr\tether\_engine_submaps.dm" #include "maps\submaps\space_submaps\space.dm" +#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" #include "maps\submaps\surface_submaps\mountains\mountains.dm" #include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" +#include "maps\submaps\surface_submaps\mountains\mountains_areas_vr.dm" #include "maps\submaps\surface_submaps\plains\plains.dm" #include "maps\submaps\surface_submaps\plains\plains_areas.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" +#include "maps\tether\tether.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE ->>>>>>> f9613f2... Removes Global Iterators (#8146):polaris.dme From 4e0cba3b804ff02b0c51588cba5420a9172682ca Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:22:31 -0400 Subject: [PATCH 37/81] Update kitchen.dm --- .../game/objects/items/weapons/material/kitchen.dm | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 071f581e4b..ea16a3be20 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -48,19 +48,6 @@ if (loaded && reagents.total_volume > 0) var/atom/movable/eaten = loaded?.resolve() reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) -<<<<<<< HEAD - if(M == user) - if(!M.can_eat(loaded)) - return - M.visible_message("\The [user] eats some [loaded] from \the [src].") - else - user.visible_message("\The [user] begins to feed \the [M]!") - if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) - return - M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].") - playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1) - cut_overlays() -======= if(eaten) if(M == user) if(!M.can_eat(eaten)) @@ -73,7 +60,6 @@ M.visible_message(SPAN_NOTICE("\The [user] feeds some of \the [eaten] to \the [M] with \the [src].")) playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1) update_icon() ->>>>>>> 1672a51... Refactors utensils to use weakrefs (#8140) return else to_chat(user, SPAN_WARNING("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK From 11d28d72cece0c73232ca0caf15ff348d973a678 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:23:17 -0400 Subject: [PATCH 38/81] Update snacks.dm --- code/modules/food/food/snacks.dm | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index eea1309af6..3f5213f728 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -187,16 +187,7 @@ "You scoop up some [src] with \the [U]!" \ ) -<<<<<<< HEAD - src.bitecount++ - U.cut_overlays() - U.loaded = "[src]" - var/image/I = new(U.icon, "loadedfood") - I.color = src.filling_color - U.add_overlay(I) -======= bitecount++ ->>>>>>> 1672a51... Refactors utensils to use weakrefs (#8140) reagents.trans_to_obj(U, min(reagents.total_volume,5)) From a6548ebbb29d1c7aec282145641df733600b56fd Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:24:59 -0400 Subject: [PATCH 39/81] Update air_alarm.dm --- code/game/machinery/air_alarm.dm | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 741ce1d354..5d2deb079b 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -568,27 +568,12 @@ var/list/info = alarm_area.air_scrub_info[id_tag] if(!info) continue -<<<<<<< HEAD - var/list/list/filters = list() - scrubbers.Add(list(list( -======= scrubbers += list(list( ->>>>>>> a132767... Fixes unlocked air alarm uis (#8149) "id_tag" = id_tag, "long_name" = sanitize(long_name), "power" = info["power"], "scrubbing" = info["scrubbing"], "panic" = info["panic"], -<<<<<<< HEAD - "filters" = filters - ))) - filters.Add(list(list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"]))) - filters.Add(list(list("name" = "Nitrogen", "command" = "n2_scrub", "val" = info["filter_n2"]))) - filters.Add(list(list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]))) - filters.Add(list(list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]))) - filters.Add(list(list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]))) - filters.Add(list(list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"]))) -======= "filters" = list( list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"]), list("name" = "Nitrogen", "command" = "n2_scrub", "val" = info["filter_n2"]), @@ -599,7 +584,6 @@ ) )) data["scrubbers"] = scrubbers ->>>>>>> a132767... Fixes unlocked air alarm uis (#8149) data["mode"] = mode @@ -815,4 +799,4 @@ TLV["temperature"] = list(T0C - 40, T0C - 20, T0C + 40, T0C + 66) // K, Lower Temperature for Freezer Air Alarms (This is because TLV is hardcoded to be generated on first_run, and therefore the only way to modify this without changing TLV generation) -// VOREStation Edit End \ No newline at end of file +// VOREStation Edit End From 50f5a25bb54d36d081e099b9dcb5babe131ce35a Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:25:50 -0400 Subject: [PATCH 40/81] Update mecha_equipment.dm --- code/game/mecha/equipment/mecha_equipment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 976bb17ad1..0cd2173ee2 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -247,7 +247,7 @@ chassis.micro_utility_equipment -= src if(EQUIP_MICRO_WEAPON) chassis.micro_weapon_equipment -= src - //VOREStation Addition end: MICROMECHS + //VOREStation Addition end: MICROMECHS if(chassis.selected == src) chassis.selected = null update_chassis_page() From 80f20d7174455aa0875cc7ba75279fc2e88b67f4 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Sat, 19 Jun 2021 09:29:22 -0400 Subject: [PATCH 41/81] Update mecha_equipment.dm --- code/game/mecha/equipment/mecha_equipment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 0cd2173ee2..82db351ed1 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -246,7 +246,7 @@ if(EQUIP_MICRO_UTILITY) chassis.micro_utility_equipment -= src if(EQUIP_MICRO_WEAPON) - chassis.micro_weapon_equipment -= src + chassis.micro_weapon_equipment -= src //VOREStation Addition end: MICROMECHS if(chassis.selected == src) chassis.selected = null From 10464097d3329db2a85a1229e28e080cd4ab9dec Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 19 Jun 2021 10:53:22 -0400 Subject: [PATCH 42/81] Really fixes eggs being operable by ghosts --- code/game/objects/items/weapons/storage/egg_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm index 3bb085fc6d..a035ce2264 100644 --- a/code/game/objects/items/weapons/storage/egg_vr.dm +++ b/code/game/objects/items/weapons/storage/egg_vr.dm @@ -17,7 +17,7 @@ use_sound = 'sound/items/drop/flesh.ogg' /obj/item/weapon/storage/vore_egg/open(mob/user as mob) - if(isobserver(usr)) + if(isobserver(user)) return icon = open_egg_icon ..() From 1df281c0f3197e671bb6a06d4790a2d09ff87004 Mon Sep 17 00:00:00 2001 From: ShadowLarkens Date: Sat, 19 Jun 2021 14:34:50 -0700 Subject: [PATCH 43/81] Fix warning in recipe.dm --- code/modules/food/recipe.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/food/recipe.dm b/code/modules/food/recipe.dm index 8b13f8b55c..8e553bf532 100644 --- a/code/modules/food/recipe.dm +++ b/code/modules/food/recipe.dm @@ -316,7 +316,6 @@ // When exact is true, extraneous ingredients will fail the recipe // In both cases, the full set of required ingredients is still needed /proc/select_recipe(var/list/datum/recipe/available_recipes, var/obj/obj as obj, var/exact) - var/list/datum/recipe/possible_recipes = list() var/highest_count = 0 var/count = 0 for (var/datum/recipe/recipe in available_recipes) From 539837dc2a8f55d539fa51dd133e0836b0492b0f Mon Sep 17 00:00:00 2001 From: TheDavestDave <30513964+TheDavestDave@users.noreply.github.com> Date: Sun, 20 Jun 2021 00:50:59 +0100 Subject: [PATCH 44/81] Update munitions_vr.dm small name error for handbow crate --- code/datums/supplypacks/munitions_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks/munitions_vr.dm b/code/datums/supplypacks/munitions_vr.dm index fb0f0f9048..d9f23902f8 100644 --- a/code/datums/supplypacks/munitions_vr.dm +++ b/code/datums/supplypacks/munitions_vr.dm @@ -16,5 +16,5 @@ ) cost = 20 containertype = /obj/structure/closet/crate/secure - containername = "frontier phaser crate" + containername = "phaser handbow crate" access = access_explorer From 40b6fa692f16ed3123673c9fe5b9ffd0d9097676 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 19 Jun 2021 20:40:41 -0400 Subject: [PATCH 45/81] Phaser tweaks and bugfixes -Slightly increases the energy cost of low power phaser modes. -Fixes a typepath error for unlocked phaser bows -Fixes a typo in phaser bows --- code/modules/projectiles/guns/energy/laser_vr.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/projectiles/guns/energy/laser_vr.dm b/code/modules/projectiles/guns/energy/laser_vr.dm index 500239e8e0..5e5f9897e0 100644 --- a/code/modules/projectiles/guns/energy/laser_vr.dm +++ b/code/modules/projectiles/guns/energy/laser_vr.dm @@ -214,7 +214,7 @@ modifystate = "phaserkill" firemodes = list( list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam/blue, modifystate="phaserkill", charge_cost = 300), - list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="phaserstun", charge_cost = 80), + list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="phaserstun", charge_cost = 100), ) /obj/item/weapon/gun/energy/locked/frontier/unload_ammo(var/mob/user) @@ -268,7 +268,7 @@ modifystate = "carbinekill" firemodes = list( list(mode_name="lethal", fire_delay=8, projectile_type=/obj/item/projectile/beam/blue, modifystate="carbinekill", charge_cost = 300), - list(mode_name="low-power", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="carbinestun", charge_cost = 80), + list(mode_name="low-power", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="carbinestun", charge_cost = 100), ) /obj/item/weapon/gun/energy/locked/frontier/carbine/update_icon() @@ -299,7 +299,7 @@ modifystate = "holdoutkill" firemodes = list( list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam/blue, modifystate="holdoutkill", charge_cost = 600), - list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="holdoutstun", charge_cost = 160), + list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser/blue, modifystate="holdoutstun", charge_cost = 200), list(mode_name="stun", fire_delay=12, projectile_type=/obj/item/projectile/beam/stun/med, modifystate="holdoutshock", charge_cost = 300), ) @@ -361,7 +361,7 @@ /obj/item/weapon/gun/energy/locked/frontier/handbow name = "phaser handbow" - desc = "An minaturized weapon that fires a bolt of engery. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility." + desc = "An minaturized weapon that fires a bolt of energy. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility." icon = 'icons/obj/gun_vr.dmi' icon_state = "handbowkill" item_state = null @@ -372,11 +372,11 @@ modifystate = "handbowkill" firemodes = list( list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/energy/bolt/heavy, modifystate="handbowkill", charge_cost = 600), - list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/energy/bolt, modifystate="handbowstun", charge_cost = 160), + list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/energy/bolt, modifystate="handbowstun", charge_cost = 200), ) -/obj/item/weapon/gun/energy/locked/frontier/holdout/unlocked - desc = "An minaturized weapon that fires a bolt of engery. Includes a built-in crank charger for recharging away from civilization." +/obj/item/weapon/gun/energy/locked/frontier/handbow/unlocked + desc = "An minaturized weapon that fires a bolt of energy. Includes a built-in crank charger for recharging away from civilization." req_access = newlist() //for toggling safety locked = 0 lockable = 0 \ No newline at end of file From 8657f21c478f2aaefedfcdb58448ecf14e35b106 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 20 Jun 2021 06:19:16 -0400 Subject: [PATCH 46/81] Let's not edit the old one --- code/game/turfs/flooring/flooring_vr.dm | 35 +- .../turfs/simulated/outdoors/ironsand_vr.dm | 45 + icons/turf/flooring/circuit_vr.dmi | Bin 0 -> 1989 bytes icons/turf/flooring/ironsand_vr.dmi | Bin 0 -> 2034 bytes maps/gateway_vr/wildwest.dm | 187 + maps/gateway_vr/wildwest.dmm | 22232 ++++++++++++++++ maps/tether/submaps/_tether_submaps.dm | 7 + maps/tether/tether_defines.dm | 17 +- vorestation.dme | 1 + 9 files changed, 22515 insertions(+), 9 deletions(-) create mode 100644 code/game/turfs/simulated/outdoors/ironsand_vr.dm create mode 100644 icons/turf/flooring/circuit_vr.dmi create mode 100644 icons/turf/flooring/ironsand_vr.dmi create mode 100644 maps/gateway_vr/wildwest.dm create mode 100644 maps/gateway_vr/wildwest.dmm diff --git a/code/game/turfs/flooring/flooring_vr.dm b/code/game/turfs/flooring/flooring_vr.dm index 787c6bd10c..5ba1dfffb5 100644 --- a/code/game/turfs/flooring/flooring_vr.dm +++ b/code/game/turfs/flooring/flooring_vr.dm @@ -26,4 +26,37 @@ icon_base = "grass-dark" /turf/simulated/floor/tiled/freezer/cold - temperature = T0C - 5 \ No newline at end of file + temperature = T0C - 5 + +/turf/simulated/floor/redgrid + name = "processing strata" + icon = 'icons/turf/flooring/circuit_vr.dmi' + icon_state = "rcircuit" + initial_flooring = /decl/flooring/reinforced/circuit/red + +/decl/flooring/reinforced/circuit/red + name = "processing strata" + icon = 'icons/turf/flooring/circuit_vr.dmi' + icon_base = "rcircuit" + +/turf/simulated/floor/redgrid/animated + name = "pulsing pattern" + icon = 'icons/turf/flooring/circuit_vr.dmi' + icon_state = "rcircuitanim" + initial_flooring = /decl/flooring/reinforced/circuit/red/animated + +/decl/flooring/reinforced/circuit/red/animated + name = "pulsing pattern" + icon = 'icons/turf/flooring/circuit_vr.dmi' + icon_base = "rcircuitanim" + +/turf/simulated/floor/redgrid/off + name = "dark pattern" + icon = 'icons/turf/flooring/circuit_vr.dmi' + icon_state = "rcircuitanim_broken" + initial_flooring = /decl/flooring/reinforced/circuit/red/off + +/decl/flooring/reinforced/circuit/red/off + name = "dark pattern" + icon = 'icons/turf/flooring/circuit_vr.dmi' + icon_base = "rcircuitanim_broken" diff --git a/code/game/turfs/simulated/outdoors/ironsand_vr.dm b/code/game/turfs/simulated/outdoors/ironsand_vr.dm new file mode 100644 index 0000000000..3a3f5be828 --- /dev/null +++ b/code/game/turfs/simulated/outdoors/ironsand_vr.dm @@ -0,0 +1,45 @@ +/turf/simulated/floor/outdoors/ironsand + name = "iron sand" + desc = "Red and gritty." + icon = 'icons/turf/flooring/ironsand_vr.dmi' + icon_state = "ironsand1" + edge_blending_priority = 1 + initial_flooring = /decl/flooring/outdoors/ironsand + +/decl/flooring/outdoors/ironsand + name = "iron sand" + desc = "Red and gritty." + icon = 'icons/turf/flooring/ironsand_vr.dmi' + icon_base = "ironsand1" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg', + 'sound/effects/footstep/MedDirt1.ogg', + 'sound/effects/footstep/MedDirt2.ogg', + 'sound/effects/footstep/MedDirt3.ogg', + 'sound/effects/footstep/MedDirt4.ogg')) + +/turf/simulated/floor/outdoors/ironsand/Initialize(mapload) + var/possiblesands = list( + "ironsand1" = 50, + "ironsand2" = 1, + "ironsand3" = 1, + "ironsand4" = 1, + "ironsand5" = 1, + "ironsand6" = 1, + "ironsand7" = 1, + "ironsand8" = 1, + "ironsand9" = 1, + "ironsand10" = 1, + "ironsand11" = 1, + "ironsand12" = 1, + "ironsand13" = 1, + "ironsand14" = 1, + "ironsand15" = 1 + + ) + flooring_override = pickweight(possiblesands) + return ..() diff --git a/icons/turf/flooring/circuit_vr.dmi b/icons/turf/flooring/circuit_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f03a29ae422a66f9cb27310807a1c292b29f08ad GIT binary patch literal 1989 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 Q6#xJL07*qoM6N<$f`5()UH||9 literal 0 HcmV?d00001 diff --git a/maps/gateway_vr/wildwest.dm b/maps/gateway_vr/wildwest.dm new file mode 100644 index 0000000000..e2c0d2cb9a --- /dev/null +++ b/maps/gateway_vr/wildwest.dm @@ -0,0 +1,187 @@ +/* Code for the Wild West map by Brotemis + * Contains: + * Wish Granter + * Meat Grinder + */ + +/* + * Wish Granter + */ + +//I copied this from the archive thingy for in case it goes missing. I would like to spice up the wish granter with some new, more appropriate stuff eventually +//At present neither of these things are on the map. +/* +/obj/machinery/wish_granter_dark + name = "Wish Granter" + desc = "You're not so sure about this, anymore..." + icon = 'icons/obj/device.dmi' + icon_state = "syndbeacon" + + anchored = 1 + density = 1 + use_power = USE_POWER_OFF + + var/chargesa = 1 + var/insistinga = 0 + +/obj/machinery/wish_granter_dark/attack_hand(var/mob/living/carbon/human/user as mob) + usr.set_machine(src) + + if(chargesa <= 0) + to_chat(user, "The Wish Granter lies silent.") + return + + else if(!istype(user, /mob/living/carbon/human)) + to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") + return + + else if(is_special_character(user)) + to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") + + else if (!insistinga) + to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") + insistinga++ + + else + chargesa-- + insistinga = 0 + var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","To Kill","Peace") + switch(wish) + if("Power") + to_chat(user, "Your wish is granted, but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") + if (!(LASER in user.mutations)) + user.mutations.Add(LASER) + to_chat(user, "You feel pressure building behind your eyes.") + if (!(COLD_RESISTANCE in user.mutations)) + user.mutations.Add(COLD_RESISTANCE) + to_chat(user, "Your body feels warm.") + if (!(XRAY in user.mutations)) + user.mutations.Add(XRAY) + user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) + user.see_in_dark = 8 + user.see_invisible = SEE_INVISIBLE_LEVEL_TWO + to_chat(user, "The walls suddenly disappear.") + user.dna.mutantrace = "shadow" + user.update_mutantrace() + if("Wealth") + to_chat(user, "Your wish is granted, but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") + new /obj/structure/closet/syndicate/resources/everything(loc) + user.dna.mutantrace = "shadow" + user.update_mutantrace() + if("Immortality") + to_chat(user, "Your wish is granted, but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") + user.verbs += /mob/living/carbon/proc/immortality + user.dna.mutantrace = "shadow" + user.update_mutantrace() + if("To Kill") + to_chat(user, "Your wish is granted, but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") + ticker.mode.traitors += user.mind + user.mind.special_role = "traitor" + var/datum/objective/hijack/hijack = new + hijack.owner = user.mind + user.mind.objectives += hijack + to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") + var/obj_count = 1 + for(var/datum/objective/OBJ in user.mind.objectives) + to_chat(user, "Objective #[obj_count]: [OBJ.explanation_text]") + obj_count++ + user.dna.mutantrace = "shadow" + user.update_mutantrace() + if("Peace") + to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") + to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") + for(var/mob/living/simple_mob/faithless/F in living_mob_list) + F.health = -10 + F.set_stat(DEAD) + F.icon_state = "faithless_dead" + + +///////////////Meatgrinder////////////// + + +/obj/effect/meatgrinder + name = "Meat Grinder" + desc = "What is that thing?" + density = 1 + anchored = 1 + icon = 'icons/mob/critter.dmi' + icon_state = "blob" + var/triggerproc = "explode" //name of the proc thats called when the mine is triggered + var/triggered = 0 + +/obj/effect/meatgrinder/New() + icon_state = "blob" + +/obj/effect/meatgrinder/HasEntered(AM as mob|obj) + Bumped(AM) + +/obj/effect/meatgrinder/Bumped(mob/M as mob|obj) + + if(triggered) return + + if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) + for(var/mob/O in viewers(world.view, src.loc)) + to_chat(O, "[M] triggered the [bicon(src)] [src]") + triggered = 1 + call(src,triggerproc)(M) + +/obj/effect/meatgrinder/proc/triggerrad1(mob) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + for(var/mob/O in viewers(world.view, src.loc)) + s.set_up(3, 1, src) + s.start() + explosion(mob, 1, 0, 0, 0) + spawn(0) + qdel(src) + +/obj/effect/meatgrinder + name = "Meat Grinder" + icon_state = "blob" + triggerproc = "triggerrad1" + + +/////For the Wishgranter/////////// + +/mob/living/carbon/proc/immortality() + set category = "Immortality" + set name = "Resurrection" + + var/mob/living/carbon/C = usr + if(!C.stat) + to_chat(C, "You're not dead yet!") + return + to_chat(C, "Death is not your end!") + + spawn(rand(800,1200)) + if(C.stat == DEAD) + dead_mob_list -= C + living_mob_list += C + C.set_stat(CONSCIOUS) + C.tod = null + C.setToxLoss(0) + C.setOxyLoss(0) + C.setCloneLoss(0) + C.SetParalysis(0) + C.SetStunned(0) + C.SetWeakened(0) + C.radiation = 0 + C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) + C.reagents.clear_reagents() + to_chat(C, "You have regenerated.") + C.visible_message("[usr] appears to wake from the dead, having healed all wounds.") + C.update_canmove() + return 1 +*/ + +/obj/effect/overmap/visitable/sector/tether_gateway/wildwest + name = "redspace shimmer" + desc = "The shimmering reflection of some sort of redspace phenomena." + scanner_desc = @{"It is difficult to tell just what is beyond this strange shimmering shape. The air beyond seems breathable."} + icon = 'icons/obj/overmap_vr.dmi' + icon_state = "shimmer" + color = "#8b0b0b" //red + in_space = 1 \ No newline at end of file diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm new file mode 100644 index 0000000000..9382b8b1da --- /dev/null +++ b/maps/gateway_vr/wildwest.dmm @@ -0,0 +1,22232 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area) +"ab" = ( +/turf/simulated/shuttle/wall, +/area/awaymission/wwvault) +"ah" = ( +/turf/simulated/wall/cult, +/area/awaymission/wwvault) +"an" = ( +/obj/structure/cult/pylon, +/turf/simulated/floor/cult, +/area/awaymission/wwvault) +"ao" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"ap" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/wall/cult, +/area/awaymission/wwvault) +"as" = ( +/obj/effect/gateway, +/turf/simulated/floor/cult, +/area/awaymission/wwvault) +"at" = ( +/mob/living/simple_mob/faithless, +/turf/simulated/floor/redgrid/animated, +/area/awaymission/wwvault) +"au" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/shuttle/wall, +/area/awaymission/wwvault) +"av" = ( +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"aw" = ( +/obj/machinery/gear_dispenser/adventure_box/weapon, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"ay" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"az" = ( +/obj/machinery/gateway{ + dir = 1 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"aA" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"aB" = ( +/mob/living/simple_mob/faithless, +/turf/simulated/floor/cult, +/area/awaymission/wwvault) +"aF" = ( +/turf/simulated/floor/cult, +/area/awaymission/wwvault) +"aG" = ( +/turf/simulated/mineral, +/area) +"aH" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/space, +/area) +"aJ" = ( +/obj/item/weapon/paper{ + info = "meat grinder requires sacri" + }, +/turf/simulated/floor/cult{ + nitrogen = 0; + oxygen = 0 + }, +/area/awaymission/wwvault) +"aK" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"aL" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/mineral, +/area/awaymission/wwmines) +"aN" = ( +/turf/simulated/mineral, +/area/awaymission/wwmines) +"aP" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"bh" = ( +/obj/structure/bed/chair/wood{ + dir = 4 + }, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"bi" = ( +/obj/machinery/gateway/centeraway{ + calibrated = 0 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"bj" = ( +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"bk" = ( +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"bn" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/paper{ + info = " The miners in the town have become sick and almost all production has stopped. They, in a fit of delusion, tossed all of their mining equipment into the furnaces. They all claimed the same thing. A voice beckoning them to lay down their arms. Stupid miners."; + name = "Planer Saul's Journal: Page 4" + }, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"bo" = ( +/obj/structure/table/woodentable, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"br" = ( +/obj/structure/lattice, +/turf/space, +/area) +"bt" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/shuttle/wall/hard_corner, +/area/awaymission/wwvault) +"bA" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"bB" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"bC" = ( +/obj/machinery/washing_machine, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"bN" = ( +/obj/machinery/gateway, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"bR" = ( +/obj/item/weapon/paper{ + info = "We've discovered something floating in space. We can't really tell how old it is, but it is scraped and bent to hell. There object is the size of about a room with double doors that we have yet to break into. It is a lot sturdier than we could have imagined. We have decided to call it 'The Vault' "; + name = "Planer Saul's Journal: Page 1" + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwgov) +"bS" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"bT" = ( +/obj/structure/largecrate, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"bV" = ( +/obj/structure/bed/chair/wood{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"bX" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"bY" = ( +/turf/simulated/floor/carpet, +/area/awaymission/wwgov) +"bZ" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/turf/space, +/area) +"ca" = ( +/obj/machinery/gibber, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"ce" = ( +/obj/item/weapon/moneybag, +/turf/simulated/floor/carpet, +/area/awaymission/wwgov) +"ck" = ( +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"cm" = ( +/mob/living/simple_mob/creature, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"cn" = ( +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"co" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/drinks/bottle/wine, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"cp" = ( +/obj/structure/cult/pylon, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"cq" = ( +/turf/simulated/floor/redgrid/animated, +/area/awaymission/wwvault) +"cr" = ( +/turf/simulated/floor/carpet, +/area/awaymission/wwvault) +"cs" = ( +/mob/living/simple_mob/faithless, +/turf/simulated/floor/carpet, +/area/awaymission/wwvault) +"cx" = ( +/turf/simulated/wall/sandstone, +/area/awaymission/wwgov) +"cA" = ( +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"cB" = ( +/obj/machinery/door/airlock/vault{ + locked = 1 + }, +/turf/simulated/floor/cult, +/area/awaymission/wwvaultdoors) +"cI" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"cJ" = ( +/obj/effect/mine/dnascramble, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"cL" = ( +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"cT" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"cV" = ( +/obj/machinery/door/airlock/vault{ + locked = 1 + }, +/turf/simulated/floor/cult, +/area/awaymission/wwvault) +"dd" = ( +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/cult, +/area/awaymission/wwvault) +"dh" = ( +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwgov) +"di" = ( +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"dk" = ( +/turf/simulated/mineral/ignore_cavegen, +/area/awaymission/wwmines) +"dl" = ( +/obj/machinery/door/airlock/vault{ + locked = 1 + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/cult, +/area/awaymission/wwvaultdoors) +"dm" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/mineral/ignore_cavegen, +/area/awaymission/wwmines) +"dn" = ( +/obj/effect/landmark/corpse/syndicatecommando, +/turf/simulated/floor/cult{ + nitrogen = 0; + oxygen = 0 + }, +/area/awaymission/wwvault) +"dq" = ( +/mob/living/simple_mob/faithless, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) +"dr" = ( +/turf/simulated/wall/sandstone, +/area/awaymission/wwrefine) +"ds" = ( +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"du" = ( +/obj/structure/bed/padded, +/obj/item/weapon/bedsheet/blue, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"dv" = ( +/turf/simulated/mineral, +/area/awaymission/wwrefine) +"dw" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"dA" = ( +/obj/machinery/mineral/mint, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"dB" = ( +/obj/effect/mine/dnascramble, +/obj/item/ammo_casing/a10mm, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"dD" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"dE" = ( +/obj/machinery/door/airlock/sandstone, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"dF" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"dJ" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"dK" = ( +/obj/effect/landmark/corpse/doctor{ + mobname = "Doctor Mugabee" + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"dM" = ( +/obj/item/ammo_casing/a10mm, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"dN" = ( +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"dO" = ( +/mob/living/simple_mob/humanoid/merc/melee, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"dQ" = ( +/obj/effect/landmark/corpse/miner/rig, +/obj/effect/mine/dnascramble, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"dS" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"dU" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"dY" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eb" = ( +/obj/item/stack/medical/bruise_pack, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"ee" = ( +/turf/simulated/floor, +/area/awaymission/wwrefine) +"ef" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"eg" = ( +/obj/effect/mine/dnascramble, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"eh" = ( +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"ei" = ( +/obj/random/multiple/random_size_crate/no_weapons, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"em" = ( +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"en" = ( +/obj/structure/table/woodentable, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"ep" = ( +/obj/structure/bed/chair/wood{ + dir = 8 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eq" = ( +/obj/effect/mine/dnascramble, +/obj/item/ammo_casing/a10mm, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"es" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/random/multiple/random_size_crate/no_weapons, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"ew" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/light/small, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"ex" = ( +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/space, +/area) +"ey" = ( +/obj/structure/lattice, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/space, +/area) +"eC" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eD" = ( +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eE" = ( +/mob/living/simple_mob/humanoid/merc/ranged, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eI" = ( +/obj/structure/closet/cabinet, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"eL" = ( +/obj/structure/bed/chair/wood{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eM" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"eN" = ( +/turf/simulated/floor/airless, +/area) +"eO" = ( +/obj/structure/ore_box, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"eT" = ( +/obj/structure/bed/padded, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"eU" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"eW" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"eX" = ( +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"eY" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/book/manual/barman_recipes, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"eZ" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fa" = ( +/obj/machinery/vending/boozeomat, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fb" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"fc" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/book/manual/chef_recipes, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"fe" = ( +/obj/structure/table/woodentable, +/obj/machinery/microwave, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"ff" = ( +/obj/structure/table/woodentable, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"fg" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, +/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, +/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, +/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, +/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"fi" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"fm" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"fp" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"ft" = ( +/obj/structure/bed/chair/wood{ + dir = 8 + }, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"fu" = ( +/mob/living/simple_mob/humanoid/merc/melee, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fv" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/space, +/area) +"fy" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fz" = ( +/obj/structure/table/woodentable, +/obj/item/ammo_casing/a357, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fA" = ( +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"fC" = ( +/obj/structure/simple_door/wood, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fD" = ( +/obj/effect/landmark/corpse/chef{ + mobname = "Chef" + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"fE" = ( +/obj/structure/table/woodentable, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fF" = ( +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"fH" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"fI" = ( +/obj/structure/table/woodentable, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/random/gun/random, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"fJ" = ( +/obj/item/weapon/stool, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"fK" = ( +/obj/effect/landmark/corpse/syndicatecommando{ + mobname = "Syndicate Commando" + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"fL" = ( +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"fM" = ( +/turf/simulated/wall/r_wall, +/area/awaymission/wwrefine) +"fO" = ( +/obj/item/ammo_casing/a10mm, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"fS" = ( +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"fT" = ( +/obj/item/weapon/stool, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"fW" = ( +/obj/structure/bookcase{ + = on_state = "book-5" + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"fY" = ( +/obj/item/weapon/moneybag, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"fZ" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"ga" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gb" = ( +/obj/structure/table/woodentable, +/obj/machinery/microwave, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gc" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall_s"; + dir = 14 + }, +/area/awaymission/wwrefine) +"gd" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"gf" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gh" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"gi" = ( +/obj/structure/bed/chair/wood/wings, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gj" = ( +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gk" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/storage/toolbox/electrical, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gl" = ( +/obj/structure/table/woodentable, +/obj/item/clothing/gloves/yellow, +/obj/item/device/multitool, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gm" = ( +/obj/structure/bed/chair/wood{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gn" = ( +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/space, +/area) +"go" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gq" = ( +/mob/living/simple_mob/creature, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gr" = ( +/obj/effect/landmark/corpse/chef{ + mobname = "Chef" + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gs" = ( +/obj/structure/bookcase{ + = on_state = "book-5" + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"gt" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/condiment/small/peppermill, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"gu" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"gv" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/melee/energy/spear, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gw" = ( +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gx" = ( +/obj/structure/simple_door/wood, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gy" = ( +/mob/living/simple_mob/creature, +/turf/simulated/floor/carpet, +/area/awaymission/wwgov) +"gC" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/space, +/area) +"gE" = ( +/obj/structure/bed/chair/wood/wings{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"gF" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"gH" = ( +/obj/effect/decal/remains/human, +/mob/living/simple_mob/humanoid/merc/ranged/space, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"gM" = ( +/obj/effect/landmark/gateway_scatter, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"gN" = ( +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"gP" = ( +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"gQ" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gS" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/material/knife/butch, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gT" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/stew, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"gW" = ( +/obj/structure/bed/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"gX" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/mineral, +/area) +"gY" = ( +/obj/structure/bed/chair/comfy/teal{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"hf" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"hg" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"hp" = ( +/obj/machinery/vending/cigarette, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"hq" = ( +/obj/structure/bed/chair, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"hD" = ( +/obj/structure/simple_door/wood, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"hI" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 8 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"hZ" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall"; + dir = 4 + }, +/area/awaymission/wwrefine) +"ia" = ( +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/obj/effect/overmap/visitable/sector/tether_gateway/wildwest, +/turf/space, +/area) +"iv" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall_s"; + dir = 8 + }, +/area/awaymission/wwrefine) +"iA" = ( +/obj/structure/bed/chair/office/light{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"iE" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"iU" = ( +/obj/machinery/light/small, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"jq" = ( +/obj/effect/landmark/corpse/syndicatecommando{ + mobname = "Syndicate Commando" + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwgov) +"jw" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/shuttle/plating, +/area/awaymission/wwrefine) +"jO" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"ka" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"kf" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"kh" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"kj" = ( +/obj/machinery/door/unpowered/shuttle, +/turf/simulated/shuttle{ + = on_state = "floor2" + }, +/area/awaymission/wwrefine) +"kG" = ( +/obj/structure/largecrate, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"kS" = ( +/obj/machinery/light/small, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"kZ" = ( +/obj/machinery/light/small, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"lh" = ( +/obj/structure/sign/vacuum, +/turf/simulated/wall/r_wall, +/area/awaymission/wwrefine) +"lv" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"ly" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"lE" = ( +/obj/effect/mine/dnascramble, +/obj/random/gun/random, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"lI" = ( +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"lY" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"lZ" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"mD" = ( +/obj/structure/bed/padded, +/obj/item/weapon/bedsheet/blue, +/obj/item/ammo_casing/a357, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"nd" = ( +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"nh" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"no" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall_straight"; + dir = 4 + }, +/area/awaymission/wwrefine) +"ns" = ( +/obj/effect/decal/mecha_wreckage/durand{ + anchored = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"nE" = ( +/obj/structure/simple_door/wood, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"oa" = ( +/obj/machinery/door/airlock/sandstone, +/obj/structure/fans/tiny, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"oW" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"pc" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/turf/simulated/floor/airless, +/area) +"pg" = ( +/obj/structure/table/woodentable, +/obj/item/toy/russian_revolver, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"pr" = ( +/obj/structure/simple_door/wood, +/obj/effect/decal/cleanable/blood/tracks, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"ps" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"pv" = ( +/turf/simulated/floor/cult{ + nitrogen = 0; + oxygen = 0 + }, +/area/awaymission/wwvault) +"pM" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/space, +/area) +"pN" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"pT" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall_s"; + dir = 1 + }, +/area/awaymission/wwrefine) +"pV" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"pW" = ( +/obj/item/weapon/paper{ + info = "The syndicate have invaded. Their ships appeared out of nowhere and now they likely intend to kill us all and take everything. On the off-chance that the Vault may grant us sanctuary, many of us have decided to force our way inside and bolt the door, taking as many provisions with us as we can carry. In case you find this, send for help immediately and open the Vault. Find us inside."; + name = "Planer Saul's Journal: Page 8" + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"qQ" = ( +/obj/effect/decal/mecha_wreckage/ripley/deathripley{ + anchored = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"rh" = ( +/obj/structure/bed/chair, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"ry" = ( +/obj/machinery/photocopier, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"rO" = ( +/obj/machinery/vending/coffee, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"rV" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/mineral, +/area/awaymission/wwmines) +"rX" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/light/small, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"se" = ( +/obj/machinery/door/airlock/external, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"sG" = ( +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"sI" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"sS" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"sX" = ( +/obj/structure/bed/chair/comfy/brown, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"td" = ( +/obj/machinery/door/airlock/sandstone, +/obj/structure/fans/tiny, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"tg" = ( +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"tk" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"tn" = ( +/obj/machinery/door/airlock/external, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"tA" = ( +/mob/living/simple_mob/humanoid/merc/melee, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"tO" = ( +/obj/machinery/door/airlock/sandstone, +/obj/structure/fans/tiny, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"ul" = ( +/obj/structure/bed/chair/comfy/brown{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"uH" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/material/kitchen/rollingpin, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"uJ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"uO" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"uT" = ( +/obj/structure/bed/chair/comfy/brown{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"vc" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/storage/toolbox/electrical, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"vr" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"wa" = ( +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"we" = ( +/obj/item/weapon/stool, +/mob/living/simple_mob/humanoid/merc/melee, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"wj" = ( +/turf/simulated/shuttle/wall/hard_corner, +/area/awaymission/wwvault) +"wp" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall"; + dir = 8 + }, +/area/awaymission/wwrefine) +"ws" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"xo" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"xx" = ( +/obj/structure/bed/chair/comfy/brown{ + dir = 1 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"xy" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"xT" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"yf" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"yi" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"yB" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"yJ" = ( +/obj/structure/closet/cabinet, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"yW" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"za" = ( +/obj/structure/bed/chair, +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"zf" = ( +/obj/structure/bed/chair/comfy/brown, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"zg" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"zr" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/space, +/area) +"zt" = ( +/obj/structure/cult/pylon, +/turf/simulated/floor/redgrid/animated, +/area/awaymission/wwvault) +"zM" = ( +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"zS" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"zY" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Ag" = ( +/obj/structure/lattice, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/turf/space, +/area) +"AA" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"Bf" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/drinks/bottle/patron, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"BQ" = ( +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Ce" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/donut/normal, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Ch" = ( +/obj/structure/table/woodentable, +/obj/machinery/light/small, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Ci" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"Cr" = ( +/obj/structure/bed/chair/comfy/brown{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Cx" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"CC" = ( +/obj/structure/bed/chair/wood{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"CN" = ( +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"CO" = ( +/obj/item/weapon/paper{ + info = "The Vault...it just keeps growing and growing. I went on my daily walk through the garden and now its just right outside the mansion... a few days ago it was only barely visible. But whatever is inside...its calling to me."; + name = "Planer Sauls' Journal: Page 7" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"CU" = ( +/obj/structure/largecrate, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Dy" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/space, +/area) +"Ee" = ( +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/machinery/light/small, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Ei" = ( +/obj/structure/largecrate, +/obj/machinery/light/small, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Ek" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"El" = ( +/obj/effect/decal/mecha_wreckage/ripley/deathripley{ + anchored = 1 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"Em" = ( +/obj/machinery/light/small, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"Ep" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"EE" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"EK" = ( +/obj/structure/bed/chair/office/dark{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"EW" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/space/syndicate/black/orange, +/obj/item/clothing/head/helmet/space/syndicate/black/orange, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/weapon/tank/oxygen, +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"Ft" = ( +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Fz" = ( +/mob/living/simple_mob/creature, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"FG" = ( +/obj/machinery/vending/cola, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"FS" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall"; + dir = 10 + }, +/area/awaymission/wwrefine) +"Gh" = ( +/obj/effect/decal/cleanable/blood/gibs/up, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Gu" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"GJ" = ( +/obj/machinery/washing_machine, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Hg" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Hi" = ( +/obj/structure/toilet, +/mob/living/simple_mob/creature, +/turf/simulated/floor{ + = on_state = "white" + }, +/area/awaymission/wwgov) +"Hl" = ( +/obj/machinery/mineral/input, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"Hq" = ( +/obj/item/weapon/material/knife/machete/hatchet, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Ht" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Hw" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/bed/padded, +/obj/item/weapon/bedsheet/blue, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"HA" = ( +/obj/structure/table/woodentable, +/obj/random/gun/random, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"HK" = ( +/obj/effect/landmark/corpse/miner/rig, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"HO" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"HT" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/drinks/coffee, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"HU" = ( +/obj/effect/decal/mecha_wreckage/seraph{ + anchored = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"Ia" = ( +/obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Ij" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/obj/structure/bed/chair/wood, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Io" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/drinks/coffee, +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Iy" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"IC" = ( +/obj/effect/decal/mecha_wreckage/ripley/deathripley{ + anchored = 1 + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"IM" = ( +/obj/effect/decal/mecha_wreckage/gygax{ + anchored = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"Jd" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"Jo" = ( +/obj/structure/bed/padded, +/obj/item/weapon/bedsheet/brown, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"Jx" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/forcefield{ + desc = "You can't get in. Heh."; + layer = 1; + name = "Blocker" + }, +/turf/simulated/mineral, +/area/awaymission/wwmines) +"JC" = ( +/obj/item/ammo_casing/a10mm, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) +"JF" = ( +/obj/machinery/washing_machine, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"JH" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall"; + dir = 6 + }, +/area/awaymission/wwrefine) +"JN" = ( +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"JQ" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/space, +/area) +"JS" = ( +/obj/structure/sign/double/maltesefalcon/right, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"JW" = ( +/obj/random/gun/random, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"Kj" = ( +/mob/living/simple_mob/humanoid/merc/melee, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"KI" = ( +/obj/structure/bed/chair/wood, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"KT" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"Lg" = ( +/obj/machinery/vending/snack, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Li" = ( +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/machinery/shower{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Lu" = ( +/obj/machinery/mineral/output, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"Mo" = ( +/obj/structure/bed/chair/office/light{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Mq" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Nc" = ( +/obj/machinery/mineral/mint, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"Ni" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"Nk" = ( +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"ND" = ( +/obj/machinery/light/small, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwrefine) +"NY" = ( +/turf/simulated/shuttle/wall/hard_corner, +/area) +"Oe" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"Ou" = ( +/obj/machinery/computer/security/telescreen/entertainment, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"Ov" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"OB" = ( +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"OH" = ( +/turf/simulated/shuttle/floor, +/area/awaymission/wwrefine) +"OI" = ( +/obj/structure/sink{ + pixel_y = 24 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"OU" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwgov) +"Pl" = ( +/obj/structure/bed/chair/comfy/beige, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Pq" = ( +/obj/random/gun/random, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"PG" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"PJ" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"PW" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Qk" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"Ql" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"Qv" = ( +/obj/structure/bed/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Qy" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibup1" + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"QL" = ( +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor, +/area/awaymission/wwrefine) +"QR" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/obj/structure/window/reinforced{ + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"Rb" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Rj" = ( +/obj/machinery/vending/cola, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"RP" = ( +/obj/structure/bed/padded, +/obj/item/weapon/bedsheet/blue, +/obj/random/gun/random, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"RR" = ( +/obj/structure/table/woodentable, +/obj/machinery/computer/security/telescreen/entertainment, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Sb" = ( +/obj/item/weapon/stool, +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Sd" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"So" = ( +/obj/effect/decal/mecha_wreckage/mauler{ + anchored = 1 + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"St" = ( +/obj/structure/sign/double/maltesefalcon/left, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"Sy" = ( +/mob/living/simple_mob/creature, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"SC" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"SH" = ( +/obj/structure/bed/chair/comfy/teal{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/mob/living/simple_mob/humanoid/merc/melee, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"SL" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/turf/simulated/wall/sandstone, +/area/awaymission/wwmines) +"Tk" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/awaymission/wwrefine) +"Tz" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"TE" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"Ui" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"Uo" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall_straight"; + dir = 1 + }, +/area/awaymission/wwrefine) +"UG" = ( +/obj/structure/table/woodentable, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/random/gun/random, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"UT" = ( +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/obj/machinery/shower{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Vg" = ( +/obj/structure/lattice, +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/space, +/area) +"Vn" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/item/ammo_casing/a357, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"VN" = ( +/obj/structure/window/reinforced{ + dir = 1; + health = 1e+007 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"VW" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"VZ" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Wo" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"Wv" = ( +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/simulated/floor/grass, +/area/awaymission/wwgov) +"Xl" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) +"Xn" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwmines) +"Xs" = ( +/obj/structure/lattice, +/obj/structure/window/reinforced{ + dir = 4; + health = 1e+007 + }, +/turf/space, +/area) +"XP" = ( +/turf/simulated/shuttle/wall{ + = on_state = "swall_s" + }, +/area/awaymission/wwrefine) +"XU" = ( +/obj/structure/bed/chair/wood{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"Yg" = ( +/obj/machinery/door/airlock/sandstone, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Ys" = ( +/obj/effect/decal/cleanable/blood/gibs/body{ + = on_state = "gibdown1" + }, +/turf/simulated/floor/outdoors/ironsand, +/area/awaymission/wwmines) +"YI" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/random/gun/random, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"YL" = ( +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass, +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass, +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass, +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass, +/turf/simulated/floor/tiled/eris/cafe, +/area/awaymission/wwgov) +"YV" = ( +/obj/structure/bed/chair/office/dark{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"YW" = ( +/obj/effect/decal/cleanable/blood, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) +"Zs" = ( +/obj/structure/bed/chair/comfy/brown{ + dir = 8 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"ZD" = ( +/obj/structure/bed/chair/comfy/beige{ + dir = 1 + }, +/turf/simulated/floor/carpet, +/area/awaymission/wwmines) +"ZR" = ( +/obj/effect/decal/cleanable/blood, +/obj/machinery/washing_machine, +/obj/effect/floor_decal/corner/lightgrey/diagonal, +/turf/simulated/floor/tiled/white, +/area/awaymission/wwmines) +"ZW" = ( +/obj/item/weapon/moneybag, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/awaymission/wwgov) + +(1,1,1) = {" +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +ia +"} +(2,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +br +br +gC +br +br +br +br +br +br +br +br +br +aa +br +br +aa +aa +aa +aa +aa +aa +aa +aa +fv +fv +fv +fv +fv +fv +fv +fv +fv +fv +fv +fv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(3,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +br +br +br +br +aa +aa +aa +br +aa +aa +br +aa +br +br +aa +aa +br +br +br +br +br +aa +aa +aa +aa +aa +aa +ex +yf +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd +QR +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(4,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +Xs +fv +fv +fv +fv +Xs +fv +fv +Xs +Xs +fv +fv +fv +fv +fv +Xs +Xs +fv +fv +fv +aa +aa +br +aa +aa +aa +aa +aa +aa +ex +Ui +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +Em +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(5,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +ex +cx +OU +fH +fH +fH +fH +fH +gF +cx +OU +fH +fH +fH +fH +fH +fH +fH +fH +gF +cx +gn +aa +br +br +aa +aa +aa +aa +aa +ex +lI +wa +fL +wa +fL +wa +fL +wa +fL +wa +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(6,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ey +fi +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +fi +gn +aa +aa +br +aa +aa +aa +aa +aa +ex +lI +wa +fL +wa +Fz +wa +fL +wa +fL +wa +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(7,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +br +aa +aa +aa +aa +aa +ex +lI +wa +fL +wa +fL +wa +fL +wa +fL +wa +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(8,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +fW +cn +vc +gv +gk +cn +Wo +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +br +aa +aa +aa +aa +aa +ex +lI +wa +fL +wa +fL +wa +fL +wa +fL +wa +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(9,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +fW +cn +gl +gw +gl +cn +cn +cn +Jo +cx +dh +dh +cx +cx +cx +dh +fm +gn +aa +aa +br +aa +aa +aa +aa +aa +ex +lI +wa +fL +wa +fL +wa +fL +wa +fL +wa +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(10,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +fW +cn +cn +cn +cn +cn +cm +cn +fY +cx +dh +dh +cx +Hi +hD +cL +fm +gn +aa +aa +br +aa +aa +aa +aa +aa +ex +Ui +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +Em +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(11,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ey +fm +dh +cx +fW +fY +cn +cn +cn +cn +cn +cn +cn +cx +dh +dh +cx +cx +cx +dh +fm +gn +aa +aa +br +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +Fz +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(12,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +fW +cn +cn +cm +cn +cn +fY +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +br +br +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(13,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +fW +cn +Xl +cn +cn +cn +Xl +fY +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +br +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(14,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +cx +cx +cx +gx +cx +cx +cx +cx +cx +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(15,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +cn +cn +Wo +cn +cn +cn +Wo +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(16,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +ZW +bY +ce +bY +bY +bY +bY +ce +kS +cx +dh +dh +dh +dh +dh +dh +fm +Vg +br +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fK +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(17,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +au +au +au +aa +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ey +fm +dh +cx +cn +bY +bY +bY +bY +bY +bY +bY +cn +cx +dh +dh +dh +dh +dh +dh +xy +Dy +fv +fv +fv +fv +fv +fv +fv +fv +JQ +Ui +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +Em +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(18,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +au +au +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +aF +aF +aF +au +au +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ey +fm +dh +cx +fY +bY +bY +bY +bY +bR +bY +jq +cn +gx +cL +cL +cL +cL +cL +cL +oa +dS +dS +dS +dS +dS +dS +dS +dS +dS +td +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(19,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +au +aF +aF +au +au +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +aF +aF +au +aa +aa +aa +aa +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +fY +bY +bY +bY +bY +bY +bY +bY +cn +gx +cL +cL +cL +cL +cL +cL +oa +ka +ka +ka +ka +ka +ka +ka +ka +ka +tO +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(20,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +aF +aF +aF +aF +aF +au +au +aa +aa +aa +aa +aa +aa +aa +au +aF +ah +ah +ah +aF +au +au +au +au +au +bt +wj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +ex +fm +dh +cx +cn +ce +bY +gy +bY +bY +bY +bY +cn +cx +dh +dh +dh +dh +dh +dh +fi +zr +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +pM +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(21,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +aF +aF +aF +aF +aF +aF +au +au +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +ah +wj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +aa +ex +fm +dh +cx +fY +bY +bY +bY +bY +bY +bY +bY +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(22,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +aF +aF +ah +ah +aF +aF +au +au +aa +aa +aa +aa +aa +au +ab +aF +aF +ah +ah +ah +ah +ah +ah +aF +ah +wj +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +ey +fm +dh +cx +fY +ce +bY +bY +bY +bY +bY +bY +cm +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(23,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +ah +aF +aF +aF +au +au +au +au +au +au +au +wj +ah +aF +ah +ah +aF +aF +aF +aF +aF +ah +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +aa +ex +fm +dh +cx +cn +cn +gm +gm +gE +gE +gE +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +fL +fL +fL +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(24,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +ah +ah +aF +aF +aF +aF +ah +aF +aF +aF +aF +ah +aF +aF +ah +aF +aB +ah +ah +ah +ah +ah +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +ex +fm +dh +cx +cn +gi +go +go +go +go +go +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +aa +aa +aa +aa +aa +aa +ex +Ui +fL +OB +tn +lI +fL +fL +fL +fL +fL +fL +Em +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(25,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +bt +aF +aB +aF +an +ah +aF +aF +aF +aF +ah +aF +aF +ah +aF +ah +aB +aF +ah +aF +ah +ah +aF +aF +aF +ah +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +cn +gi +go +go +go +go +go +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +aa +aa +aa +aa +aa +aa +ex +lI +fL +OB +fL +lI +fL +fL +fL +fL +fL +fL +OB +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(26,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +au +au +au +aF +ah +aF +aF +aF +ah +ah +aF +aF +aB +aF +ah +aF +aF +ah +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +Ov +fY +cn +cn +cn +cn +cn +cn +kS +cx +dh +dh +dh +dh +dh +dh +fm +gn +aa +aa +aa +aa +aa +aa +aa +aa +ex +JN +Wv +KT +pN +nh +Wv +Wv +Wv +Wv +Wv +Wv +KT +gn +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(27,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +au +aF +aF +aF +aF +aF +ah +aF +aF +ah +ah +ah +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +an +ah +aF +an +aF +aF +aF +aF +ah +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ey +fm +dh +cx +fY +cn +Xl +cn +cn +cn +Xl +cn +cn +cx +dh +dh +dh +dh +dh +dh +fm +Vg +br +aa +aa +aa +aa +aa +aa +aa +aa +Ag +Ag +pc +eN +pc +Ag +bZ +bZ +bZ +bZ +bZ +bZ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(28,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +bt +aF +aF +aF +aF +aF +aF +ah +ah +aF +ah +aF +aF +ah +aF +aF +aF +ah +ah +aF +ah +aF +aF +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +cx +cx +cx +cx +gx +cx +cx +cx +cx +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +aa +aa +br +br +eN +eN +eN +br +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(29,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +bt +ah +aF +aF +aF +aF +aF +aF +aF +ah +aF +ah +aF +aB +ah +ah +aF +aF +aF +ah +aF +ah +ah +ah +ah +ah +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +fZ +gj +Ek +gj +gj +gj +Sy +gj +co +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +aa +aa +br +br +eN +eN +br +br +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(30,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +aF +ah +aF +aF +aF +ah +ah +aF +aF +ah +aF +ah +aF +aF +aF +ah +an +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +ah +ah +ah +ah +aF +aF +ah +aF +an +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ey +fm +dh +cx +ga +gj +gj +gj +gj +gQ +Jd +gj +co +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +aa +aa +br +br +br +br +br +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(31,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +au +aF +aF +ah +ah +aF +aF +aF +ah +aF +aF +ah +aF +ah +ah +aF +aF +ah +ah +aF +ah +ah +aF +ah +aF +aF +aF +aF +aF +an +aF +ah +aF +aF +aF +ah +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ey +fm +dh +cx +gb +gj +gq +gj +gj +gS +uH +gj +YL +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +aa +aa +br +br +br +br +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(32,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +au +aF +aF +aF +aF +aF +ah +aF +aF +aF +ah +an +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +ah +aF +aF +ah +ah +ah +aB +aF +aF +aF +aF +ah +aF +aF +aF +ah +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +ga +gj +gr +gj +gj +gT +tk +gj +Bf +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +br +br +br +aa +br +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(33,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +aF +aF +aF +aF +ah +ah +aF +aF +ah +aF +aF +ah +aF +aF +ah +ah +ah +aF +aF +aF +ah +aF +aF +aF +aF +ah +ah +ah +aF +aF +aF +ah +aF +aF +aF +ah +aF +an +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +gf +gj +VW +gj +gj +gj +VW +gj +Bf +cx +dh +dh +dh +dh +dh +dh +fm +gn +br +aa +aa +aa +aa +aa +aa +br +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(34,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +aF +aF +aF +ah +an +aF +aF +aF +ah +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +ah +ah +aF +aF +ah +ah +aF +aF +aF +aF +aF +ah +ah +aF +aF +ah +aF +aB +aF +cV +aF +aF +aF +aF +aF +aF +ab +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +fm +dh +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +cx +dh +dh +dh +dh +dh +dh +fm +Vg +aa +br +aa +aa +QL +dF +QL +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(35,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +bt +ah +aF +aF +aF +ah +ah +aF +aB +aF +ah +aF +aF +ah +aF +aF +ah +an +aF +aF +aF +aF +ah +ah +aF +aF +ah +ah +aF +aF +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +cV +aF +aF +aF +aF +aF +aF +ab +aa +aa +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +xy +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +dh +xy +gn +aa +br +aa +aa +yW +ee +yW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(36,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +ah +ah +aF +aF +aF +ah +aF +aF +aF +ah +aB +aF +ah +aF +aF +ah +ah +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +ah +ah +an +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +aF +an +aF +aF +aF +aF +ab +aa +aa +aa +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +ex +cx +OU +fH +fH +fH +fH +fH +gF +cx +OU +fH +fH +fH +fH +fH +fH +fH +fH +gF +cx +Vg +gC +br +aa +aa +yW +ee +yW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(37,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +aF +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +ah +ah +aF +aF +aF +aB +ah +ah +aF +aF +ah +aF +aF +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +ab +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +aa +bZ +bZ +bZ +Ag +Ag +Ag +bZ +bZ +bZ +bZ +bZ +Ag +Ag +Ag +bZ +bZ +bZ +bZ +bZ +bZ +br +br +fM +fM +lh +Ni +se +PJ +gd +zS +fM +uO +gd +zS +fM +uO +gd +zS +fM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(38,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +ah +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +ah +aF +aF +aF +aF +ah +ah +aF +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ab +aa +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +aa +aa +aa +aa +aa +br +aa +aa +aa +aa +br +br +aa +br +br +br +br +br +br +br +gC +aG +fM +nd +Gu +nd +nd +nd +nd +nd +Gu +nd +nd +nd +Gu +nd +nd +nd +QL +aa +aa +aa +gc +Uo +Uo +Uo +pT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(39,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +ah +aF +aF +ah +aF +aF +ah +ah +aF +aF +aF +ah +aF +aF +aF +aF +aF +ah +aF +ah +ah +aF +aF +aF +aF +aF +ah +aF +an +dd +aF +aF +aF +ab +pv +pv +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +aa +aa +aa +aa +aa +aa +br +gC +br +br +br +br +aa +aa +aa +aa +aa +br +br +aa +aa +aa +fM +fM +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +yW +aa +aa +aa +no +za +rh +za +FS +Uo +Uo +Uo +pT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(40,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +ah +aF +ah +aF +aF +ah +aF +aF +aF +ah +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +ah +aF +aB +aF +ah +ah +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ab +aa +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +fM +Hl +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +PJ +gd +gd +zS +wp +za +za +za +OH +ly +OH +EW +no +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(41,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +ah +aF +aB +aF +aF +ah +aF +aF +ah +ah +aF +aF +aF +ah +aF +aF +ah +ah +aF +aF +ah +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +ah +ah +ah +ah +ah +aF +aF +ah +aF +aF +aB +aF +aF +aF +ab +pv +pv +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +fM +dA +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +se +ee +ee +se +kj +OH +OH +OH +OH +OH +za +EW +jw +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(42,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +ah +ah +aF +aF +aF +ah +aF +aF +ah +an +aF +aF +aF +ah +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +ah +ah +ah +aF +aF +aF +aF +aF +aF +ah +aF +an +aF +aF +aF +aF +ab +aa +aa +aa +aa +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +aa +aa +aa +aa +aa +aG +aG +dr +dr +dr +dr +dr +dr +dr +dr +fM +Lu +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +sS +gd +gd +zS +hZ +za +za +za +OH +uJ +OH +EW +no +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(43,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +an +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +ah +ah +an +aF +aF +ah +ah +ah +ah +aF +aF +aF +aF +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +aa +aa +aG +aG +aG +aG +dr +dD +ds +AA +ds +ei +ds +dE +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +Ni +aa +aa +aa +no +za +hq +za +JH +Uo +Uo +Uo +iv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(44,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +ah +ah +ah +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +aF +aF +an +aF +aF +ah +aF +aF +aF +aF +aF +aF +wj +ab +ab +ab +ab +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +aa +aa +aG +aG +aG +aG +dr +ds +ds +bT +ds +ds +ds +dE +nd +nd +nd +nd +nd +nd +nd +nd +nd +Kj +nd +HK +nd +nd +nd +nd +ND +lh +aa +aa +aa +XP +Uo +Uo +Uo +iv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(45,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +ah +ah +ah +aF +aB +aF +aF +aF +aF +an +ah +aF +aB +aF +ah +aF +aF +aF +aF +aF +aF +ah +ah +ah +aF +aF +ah +aF +an +aF +aF +aF +aF +dl +aJ +dn +pv +pv +pv +pv +pv +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +br +br +aG +aG +aG +aG +aG +dr +ei +ds +ds +ds +ds +ds +dr +fM +hf +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +QL +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(46,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +bt +ah +ah +ah +aF +aF +ah +ah +ah +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +ah +ah +aF +aF +aF +aF +ah +ah +ah +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +dl +pv +pv +pv +pv +pv +pv +pv +pv +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +dr +Iy +ds +ds +ds +ds +Tk +dr +fM +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +yW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(47,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bt +bt +aF +ah +ah +aF +aF +aF +ah +ah +ah +aF +ah +aF +aF +ah +ah +ah +ah +ah +ah +ah +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +ah +ah +an +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +wj +ab +ab +ab +ab +pv +pv +pv +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +dr +ds +ds +ds +ds +bT +ds +dr +fM +fM +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +Ni +aa +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(48,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +aF +aF +aF +aF +an +ah +ah +ah +aF +aF +ah +aF +aB +aF +aF +aF +ah +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +ah +aF +aF +aB +aF +ah +aF +aF +ah +aF +an +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +dr +bT +ds +eh +ds +ds +ds +dr +dr +fM +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +fM +aG +aG +aG +aG +aG +aa +aa +aG +aG +aG +aG +aG +aG +aG +aa +aG +aa +aa +aa +aa +aa +aa +aa +aH +"} +(49,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +ab +aa +aa +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dr +ds +ds +ds +ds +ds +ei +ds +dr +fM +nd +nd +sI +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +sI +nd +fM +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aH +"} +(50,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +ah +ah +ah +ah +aF +aF +aF +ah +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +ah +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +ab +pv +pv +pv +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dr +dr +dr +ds +ds +ds +ds +ds +ds +ei +dr +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +fM +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aN +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aH +"} +(51,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +an +ah +aF +aF +aF +ah +ah +ah +ah +ah +ah +ah +ah +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +ah +aF +an +aF +aF +aF +aF +ab +pv +pv +pv +pv +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dr +dr +dD +ds +ds +ei +ds +ds +ds +ds +dr +dr +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aL +aL +aL +aG +aG +aG +aG +aN +aN +aN +aG +aG +aL +aL +aL +aL +aL +aL +gX +gX +gX +aa +aa +aa +aa +aa +aa +aa +aH +"} +(52,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +aF +ah +ah +ah +aF +aF +aF +aF +aB +ah +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +bT +ds +ds +ds +ds +ds +bT +dr +dr +dr +aN +aN +aN +aN +aN +aN +aN +aN +aN +aL +aL +aL +aL +aL +eO +aL +aN +aN +aN +aN +aN +aN +aN +aL +aL +aL +gN +gN +gN +aL +aN +aG +aG +gX +gX +aa +aa +aa +aa +aa +aa +aH +"} +(53,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +au +au +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +ah +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +ab +ab +ab +ab +pv +pv +pv +aa +aa +aG +aG +aG +aG +aG +dr +dr +dr +dr +dr +es +AA +ds +bT +ds +ds +AA +ds +bT +ds +ds +AA +ds +ei +ds +ds +ds +ds +ds +Tk +dr +aN +aN +aN +aL +aL +aL +aL +aN +aN +aN +aL +aL +gN +gN +gN +gN +gN +aL +aN +aN +aL +aL +aL +aN +aL +aL +gN +gN +gN +gN +aL +aL +aL +aG +aG +aG +gX +aa +aa +aa +aa +aa +aa +aH +"} +(54,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +NY +bt +bt +aF +aF +aB +aF +aF +aF +ah +ah +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +ah +ah +ah +ah +ah +ah +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +wj +ab +ab +ab +aa +pv +aa +aa +aa +pv +aG +aG +aG +aG +aG +dr +dr +dr +bT +ds +ds +ds +ds +ds +ds +ds +ds +ds +ei +ds +ds +bT +ds +ds +ds +ds +ds +ds +ds +bT +Ql +ds +dr +aN +aN +aN +aL +gN +gN +aL +aL +aL +aL +aL +eO +gN +gN +gN +gN +gN +aL +aL +aL +aL +gN +aL +aL +aL +gN +gN +gN +gN +gN +aL +gN +aL +aG +aG +aG +gX +gX +gX +aa +aa +aa +aa +aH +"} +(55,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +wj +ap +ah +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +pv +aa +aa +aa +aa +aG +aG +dr +dr +dr +dr +ds +AA +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +dr +dr +dr +aN +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +aL +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +aL +aG +aG +aG +aG +aG +gX +gX +aa +aa +aa +aH +"} +(56,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +wj +ap +aF +aF +aF +an +ah +aF +aF +aF +ah +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aB +ah +ah +aF +aF +aF +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +pv +pv +pv +aa +aa +aG +aG +dr +dD +ds +ds +bT +ds +ds +ds +em +ds +ds +ds +bT +ds +ds +ds +ei +ds +ds +gH +ds +ds +ds +ds +ds +bT +ei +dr +dr +aN +aN +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +aL +aN +aG +aG +aG +aG +aG +gX +gX +aa +aa +aH +"} +(57,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +ap +ap +aF +aF +aF +ah +aF +aF +aF +aF +ah +ah +ah +aF +aF +aB +aF +ah +aF +aF +ah +ah +ah +ah +aF +aF +aF +aF +ah +aB +aF +aF +ah +ah +ah +ah +ah +ah +ah +ab +aa +aa +aa +aa +aa +aa +aa +aa +pv +aa +aG +aG +aG +dr +ds +ds +ds +ds +ds +eh +ds +ds +bT +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +bT +ds +ei +ds +Ql +ds +dr +aN +aN +aN +aL +gN +gN +dO +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +aL +aN +aG +aG +aG +aG +aG +gX +gX +aa +aa +aH +"} +(58,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +ap +ap +aF +aF +ah +ah +aF +aF +aF +aF +an +ah +aF +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +aF +ah +ah +aF +aF +wj +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +dv +dr +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +bT +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +ds +dr +dr +dr +aN +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +aL +aN +aG +aG +aG +aG +aG +gX +aa +aa +aa +aH +"} +(59,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +ap +ap +aF +aF +ah +ah +ah +aF +aF +aF +ah +ah +ah +an +aF +ah +aF +aF +ah +aF +aF +aF +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +dv +dr +ds +ds +ds +ds +Ql +ei +ds +bT +ds +ds +Ql +ds +ds +ds +ei +Ql +ds +ds +ds +ds +Ql +Nc +ds +bT +dr +aN +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +aN +aL +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gM +gM +gM +aL +aN +aG +aG +aG +aG +aG +gX +aa +aa +aa +aH +"} +(60,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +aF +aF +aF +ap +ap +aF +aF +aF +ah +ah +ah +aF +aF +aF +ah +ah +aF +ah +aF +aF +ah +aF +aF +aF +ah +an +aF +aF +aF +aF +ah +ah +ah +ah +ah +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +dr +dr +ds +ds +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +dr +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aL +gN +gN +gN +gN +gN +gN +gN +Jx +aL +aL +gN +gN +gN +gM +gM +gM +aL +aN +aG +aG +aG +aG +aG +gX +aa +aa +aa +aH +"} +(61,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +ap +aF +aF +aF +aF +an +ah +aF +aF +aF +aF +aF +aF +ah +aF +aF +ah +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +an +ah +ah +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aL +aL +dw +dr +dE +dE +dr +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aL +gN +gN +aL +aL +gN +gN +gN +aL +aN +aL +aL +gN +gN +gN +gN +gN +aL +aG +aG +aG +aG +aG +gX +gX +aa +aa +aa +aH +"} +(62,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +ap +aF +aF +aF +aF +aF +ah +ah +ah +aF +aF +aF +aF +ah +aF +aF +ah +ah +ah +aF +aF +aF +aF +ah +ah +ah +aF +aF +aB +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aL +aL +gN +gN +kf +gN +gN +kf +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aL +gN +gN +aL +aL +gN +gN +gN +aL +aL +aN +aL +gN +gN +gN +gN +gN +aL +aG +aG +aG +aG +aG +gX +aa +aa +aa +aa +aH +"} +(63,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +aF +aF +aF +aB +aF +aF +ah +ah +ah +ah +ah +ah +aF +aF +aF +aB +ah +ah +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aN +aL +eO +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aP +gN +gN +gN +gN +gN +dB +gN +gN +gN +gN +gN +gN +gN +aP +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +dN +gN +gN +gN +eO +aN +aL +gN +JW +aL +aL +gN +gN +gN +gN +aL +aL +aL +aL +aL +gN +gN +gN +Jx +aG +aG +aG +aG +aG +gX +gX +aa +aa +aa +aH +"} +(64,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +ap +aF +aF +aF +aF +aF +aF +aF +aF +an +ah +ah +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +ah +ah +ah +ab +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +aL +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aL +gN +gN +Jx +aL +gN +gN +gN +gN +gN +aL +aN +aL +Jx +aL +gN +gN +aL +aG +aG +aG +aG +aG +aG +gX +gX +aa +aa +aH +"} +(65,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +ap +ap +ap +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +aF +aF +ab +aa +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aN +aL +gN +gN +gN +aL +aL +gN +gN +gN +gN +aL +aL +aL +gN +gN +gN +gN +aL +aG +aG +aG +aG +aG +aG +aG +gX +aa +aa +aH +"} +(66,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aB +aF +aF +aF +an +aF +aF +aF +aF +ap +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +ah +ah +aF +aF +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +dN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aN +gN +gN +gN +gN +aN +aN +aL +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +pW +aL +aL +aG +aG +aG +aG +aG +aG +gX +gX +aa +aH +"} +(67,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +ap +ap +ap +ap +aF +aF +aF +aF +aF +aF +aF +ah +ah +aF +aF +aF +ah +ah +ah +ah +aB +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +gX +dm +gN +dO +gN +gN +gN +cJ +gN +gN +gN +cA +ef +cA +cA +cA +eg +cA +cA +cA +cA +dU +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +dU +eq +gN +aP +gN +gN +TE +gN +gN +gN +gN +gN +aN +aN +aN +gN +gN +gN +aN +aN +aL +Ci +gN +gN +aL +aL +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +aL +aG +aG +aG +aG +aG +aG +aG +gX +aa +aH +"} +(68,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +ap +aF +aF +aF +aF +aB +aF +ah +ah +ah +ah +ah +an +aF +aF +aF +aF +ah +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +dU +cA +cA +cA +cA +cA +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aN +aN +gN +gN +aN +aN +aL +gN +gN +gN +gN +aL +Jx +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +aL +aG +aG +aG +aG +aG +aG +aG +gX +gX +aH +"} +(69,1,1) = {" +aH +aa +aa +aa +aa +ab +ab +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +ap +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +eO +gN +gN +gN +gN +gN +gN +dM +gN +gN +cA +cA +cA +cA +cA +cA +cA +cA +cA +eg +cA +cA +cA +cA +cA +cA +eg +cA +cA +dU +sG +cA +cA +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +aN +aN +aN +gN +aN +aN +aL +gN +gN +gN +gN +aL +aL +aL +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +aL +aG +aG +aG +aG +aG +aG +aG +aG +gX +gX +"} +(70,1,1) = {" +aH +aa +aa +aa +aa +ab +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +ap +ap +aF +aF +aF +aF +aF +aF +aF +aF +aF +ah +ah +ah +aF +aB +ab +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cT +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +aN +aN +aN +aN +aN +Jx +gN +TE +gN +gN +aL +aL +aL +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +aL +aG +aG +aG +aG +aG +aG +aG +aG +gX +gX +"} +(71,1,1) = {" +aH +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +aF +aF +aF +aF +aF +ah +ah +ah +ah +an +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +dk +dm +gN +gN +gN +gN +aP +gN +gN +gN +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aN +aN +aN +aN +aL +aL +gN +gN +TE +gN +aL +aL +aL +gN +gN +gN +gN +aL +aL +gN +gN +gN +Jx +aG +aG +aG +aG +aG +aG +aG +gX +gX +aH +"} +(72,1,1) = {" +aH +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +ap +ap +ap +ap +ap +ap +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +aL +gN +gN +gN +gN +aL +aL +aL +aL +gN +gN +aL +aL +gN +gN +gN +aL +aG +aG +aG +aG +aG +aG +gX +gX +aa +aH +"} +(73,1,1) = {" +aH +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +as +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +as +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +dm +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eC +Ft +Ft +Ft +Ft +fS +gs +gs +gs +gs +gs +fS +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +aL +aL +aN +aL +gN +gN +Jx +aL +gN +gN +gN +aL +aG +aG +aG +aG +gX +gX +gX +aa +aa +aH +"} +(74,1,1) = {" +aH +aa +aa +aa +aa +ab +ab +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ap +cB +cB +ap +ap +ap +ap +ap +ap +au +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +aL +dm +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eD +bh +Ft +bh +Ee +fS +bj +bj +gP +bj +kZ +fS +gN +cA +cA +cA +cT +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +aL +aL +aL +gN +gN +aL +aL +aL +gN +gN +aL +aG +aG +aG +aG +gX +aa +aa +aa +aa +aH +"} +(75,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +Ft +bo +bo +bn +Ft +fS +bj +hg +bj +bj +bj +fS +gN +cA +cA +cA +cA +gN +fS +Ft +Li +Li +Li +Li +fS +bj +bj +bj +bj +lv +fS +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +TE +gN +gN +aL +aL +aL +gN +gN +aL +aL +gN +gN +aL +aG +aG +aG +aG +gX +gX +aa +aa +aa +aH +"} +(76,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +cr +cr +cr +cr +an +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eE +bo +bo +fI +Ft +fS +bj +fS +gs +gs +gs +fS +gN +cA +cA +cA +cA +gN +fS +eD +Ft +eE +Ft +Ee +fS +Ht +bj +bj +kZ +fS +fS +gN +gN +gN +gN +gN +gN +gN +gN +aL +Jx +gN +gN +gN +gN +aL +aL +gN +gN +gN +gN +gN +gN +aL +aG +aG +aG +gX +gX +aa +aa +aa +aa +aH +"} +(77,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cs +cr +cr +cr +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +dm +gN +gN +gN +gN +gN +gN +gN +gN +dU +dU +cA +cA +gN +fS +Ft +bo +bo +bo +Ft +fS +bj +fS +fS +fS +fS +fS +yi +cA +cA +cA +cA +gN +fS +Ft +Ft +Ft +Ft +Ft +Ft +bj +bj +bj +bj +lv +fS +gN +gN +gN +gN +gN +gN +gN +gN +aL +aL +gN +gN +aP +gN +gN +aL +aL +aL +gN +gN +gN +gN +aL +aG +aG +gX +gX +aa +aa +aa +aa +aa +aH +"} +(78,1,1) = {" +aH +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aB +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +eg +cA +cA +gN +fS +eD +ft +Ft +ft +Ee +fS +bj +bj +bj +bj +bj +fC +iE +iE +iE +cA +cA +gN +fS +Ft +Ft +Ft +ps +Ft +Ft +bj +bj +bj +bj +fS +fS +gN +fS +fS +fS +fS +fS +fS +fS +fS +aL +aL +rV +TE +gN +aP +rV +aL +aL +aL +Jx +gN +gN +aL +aG +aG +gX +aa +aa +aa +aa +aa +aa +aH +"} +(79,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +ab +ab +aG +aG +aG +aG +aG +aG +aG +aG +aG +dm +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +Ft +Ft +Ft +Ft +Ft +fS +bj +bj +bj +hg +bj +fC +cA +eg +cA +cA +cA +gN +fS +eD +Ft +Ft +Ft +Ee +fS +bj +fS +Ht +tg +lv +fS +gN +fS +EE +bj +bj +bj +bj +bj +fS +gN +gN +gN +gN +TE +gN +gN +gN +aL +aN +aL +aL +aL +aL +aG +aG +gX +aa +aa +aa +aa +aa +aa +aH +"} +(80,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aB +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +ab +ab +aG +aG +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fC +fS +bj +fS +fS +fS +fS +fS +yi +cA +cA +cA +cA +gN +fS +Ft +UT +UT +UT +UT +fS +bj +fS +OI +Rb +fS +fS +gN +fS +bj +bj +bj +tg +bj +bj +fS +gN +gN +aP +gN +gN +gN +gN +gN +aL +aN +aG +aG +aG +aN +aG +aG +gX +aa +aa +aa +aa +aa +aa +aH +"} +(81,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +as +aF +aF +an +cr +cr +cr +cr +an +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aL +eO +gN +gN +gN +gN +gN +dN +gN +gN +cA +cA +cA +cA +gN +fS +eI +bj +bj +fS +bj +bj +bj +fS +bj +Qv +gW +fS +gN +cA +cA +cA +cA +iU +fS +fS +fS +fS +fS +fS +fS +bj +fS +OI +bj +lv +fS +gN +fS +Ht +bj +bj +bj +zg +kZ +fS +gN +TE +gN +gN +rV +aL +aL +aL +aL +aG +aG +aG +aG +aG +aG +gX +gX +aa +aa +aa +aa +aa +aa +aH +"} +(82,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +aF +ab +ab +aG +aG +aG +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eT +bj +bj +fS +bj +bj +bj +bj +bj +bj +bj +ck +gN +cA +cA +dU +iE +lY +fC +bj +bj +bj +bj +bj +fC +bj +fS +OI +bj +fS +fS +gN +fS +bj +bj +bj +bj +bj +bj +fS +gN +gN +gN +gN +aL +gX +gX +gX +aG +aG +aG +aG +aG +aG +gX +gX +aa +aa +aa +aa +aa +aa +aa +aH +"} +(83,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +as +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cs +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aN +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +UG +bj +kZ +fS +Ht +bj +bj +bj +bj +bj +bj +ck +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +bj +fS +OI +bj +fS +fS +gN +fS +bj +zg +bj +bj +xT +bj +lZ +gN +aL +Jx +aL +aL +aa +aa +gX +gX +gX +gX +gX +gX +gX +gX +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(84,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +as +aF +aF +ab +aG +aG +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +aP +gN +cA +cA +cA +cA +gN +fS +eT +bj +bj +fS +bj +bj +bj +fS +bj +bj +bj +fS +gN +cA +cA +cA +eg +gN +fS +GJ +bC +ZR +bC +GJ +fS +bj +fS +Ht +bj +lv +fS +gN +fS +bj +bj +fu +bj +bj +bj +gN +gN +aL +aG +aG +aG +aa +aa +aa +aa +gX +gX +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(85,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aB +aF +aF +cr +cr +cr +cr +aF +av +aF +aF +aF +aF +aF +aF +ab +ab +aG +aG +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eM +bj +bj +fC +bj +bj +bj +fS +bj +SH +gY +fS +gN +cA +cA +cA +cA +gN +fS +Ft +Ft +Ft +Ft +Ft +Ft +bj +bj +bj +bj +fS +lZ +gN +fS +bj +Nk +Gh +bj +bj +bj +fS +lZ +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(86,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +cr +cr +cr +cr +an +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +cJ +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +gN +cA +cA +cA +cA +gN +fS +Ft +Ft +Ft +Ft +Ft +Ft +bj +bj +bj +bj +lv +fS +gN +fS +bj +bj +tg +bj +tg +bj +fS +fS +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(87,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +Ft +Ft +Ft +eE +Ft +fS +Ht +bj +bj +kZ +fS +fS +gN +fS +Ht +zg +bj +Hq +bj +eU +fS +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(88,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +av +av +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +eq +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +eg +cA +cA +cA +cA +cA +cA +gN +fS +Ft +fA +Ft +fA +Ft +fS +bj +bj +bj +bj +Vn +fS +gN +fS +bj +eU +PG +bj +bj +kZ +fS +gN +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(89,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +cq +av +cq +aF +aF +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aB +aF +aF +av +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +aP +gN +gN +gN +dQ +ef +cA +cA +cA +cA +cA +cA +cA +eg +cT +cA +cI +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +El +fS +bj +bj +bj +bj +bj +bj +fS +gN +aL +aG +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(90,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +cq +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aG +aG +aa +aa +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +cA +cA +eX +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +ef +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +ef +iE +iE +iE +iE +qQ +cA +aP +lZ +fS +fS +fC +kh +fS +fS +fS +gN +aL +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(91,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +av +aF +aF +aF +aF +aF +dq +aF +aF +aF +aF +av +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +cr +cr +cr +cr +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +eg +cA +cA +cA +cA +cI +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +ef +cA +HU +eg +cA +jO +lY +lY +Ys +gN +kf +aP +gN +gN +gN +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(92,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +cq +aF +aF +aF +aF +cq +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +ab +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +lZ +gN +lZ +fS +kh +fS +fS +fS +fS +fS +fS +gN +gN +aL +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(93,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +av +cq +as +aF +aF +av +aF +aF +aF +cq +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +cs +cr +cr +cr +aF +aF +aF +aF +aF +aF +ab +ab +ab +aa +aa +aa +aa +aa +aa +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +gN +cA +cA +cA +cA +gN +fS +bj +bj +bj +bj +bj +bj +bj +bj +bj +bj +fS +gN +fS +VZ +bj +bj +bj +bj +bj +bj +fS +gN +aL +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(94,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +av +aF +aF +aF +cq +aF +aF +aF +cq +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aG +aL +aL +gN +gN +gN +gN +gN +cJ +gN +gN +cA +cA +cA +cA +gN +fS +bk +bk +yB +bk +bk +yB +eM +bj +Tz +CC +bj +fS +gN +cA +cA +cA +cA +gN +fS +du +bj +du +bj +bj +RP +bj +du +bj +bj +fS +aP +fS +bj +bj +bj +bj +bj +bj +bj +fS +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(95,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +cq +cq +aF +cq +aF +aF +aF +aB +av +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +cr +cr +cr +cr +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +eg +cA +cA +gN +fS +Cx +bk +bk +fJ +bk +bk +eM +fT +bj +eM +kZ +fS +gN +cA +cA +cA +cA +gN +fS +Ht +bj +bj +Rb +hg +bj +bj +bj +bj +kZ +fS +gN +fS +Ht +bj +eU +bj +bj +fp +kZ +fS +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(96,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +cq +aF +cq +aF +cq +aF +aF +aF +cq +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +cr +cr +cr +cr +an +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +bk +bk +bk +bk +bk +bk +eM +fT +bj +bV +bj +fS +gN +cA +cA +eg +cA +gN +fS +du +bj +du +bj +fS +du +bj +Hw +bj +bj +kh +gN +fS +bj +bj +bj +bj +bj +bj +bj +kh +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(97,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +cq +aF +cq +aF +cq +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +bk +bk +bk +bk +gh +bk +eM +we +bj +bj +bj +ck +gN +cA +cA +cA +cA +gN +fS +bj +bj +bj +bj +Tz +bj +bj +bj +bj +bj +fS +gN +fS +bj +tg +bj +bj +Pq +bj +bj +ck +gN +aL +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(98,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +cq +aF +cq +aF +aF +cq +aF +cq +cq +aF +cq +av +aF +aF +aF +aF +aF +av +aF +aF +aF +as +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aL +aL +gN +gN +gN +cJ +gN +gN +gN +cA +cA +cA +cA +gN +fS +bk +bk +bk +fO +bk +bk +eM +fT +bj +CC +bj +ck +gN +cA +cA +cA +cA +gN +fS +du +bj +du +bj +gP +du +bj +du +bj +bj +fS +gN +kh +bj +fp +bj +bj +bj +bj +bj +ck +gN +gN +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(99,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +at +cq +cq +aF +aF +cq +aF +cq +aF +aF +cq +aF +aF +aF +aF +av +cq +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +Cx +bk +bk +fJ +bk +bk +eM +fT +bj +eM +bj +ck +gN +cA +cA +cA +cA +gN +fS +bj +bj +bj +bj +hg +bj +bj +bj +bj +bj +fS +Ys +fS +bj +bj +bj +bj +tg +Rb +bj +fS +gN +gN +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(100,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +cq +cq +cq +an +cq +aF +av +aF +av +av +aF +aB +aF +aF +cq +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +as +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +eg +gN +fS +bk +bk +bk +bk +bk +bk +eM +fT +bj +bV +kZ +fS +gN +cA +cA +cA +cA +gN +fS +du +bj +mD +bj +fS +Hw +bj +du +bj +bj +fS +So +fS +bj +bj +bj +bj +bj +bj +bj +fS +gN +aL +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(101,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +cq +aF +cq +cq +cq +cq +cq +as +cq +aF +aF +aF +aF +cq +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eM +bj +eM +eM +eM +eM +eM +bj +bj +bj +bj +fS +gN +cA +cA +cA +cA +gN +fS +Ht +bj +bj +bj +Tz +bj +bj +bj +bj +kZ +fS +aP +fS +Ht +bj +bj +bj +bj +bj +kZ +fS +gN +aL +aL +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(102,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +cq +aF +cq +cq +cq +cq +aF +aF +cq +aF +aF +aF +cq +av +aF +aF +aB +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eM +bj +eM +fT +bj +bj +bj +bj +bj +CC +bj +fS +gN +JC +cA +cA +cA +gN +fS +du +bj +du +bj +bj +du +bj +du +bj +bj +fS +gN +fS +bj +bj +fp +bj +eU +bj +bj +fS +gN +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(103,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +av +cq +cq +av +cq +aB +cq +aF +aF +aF +aF +cq +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +dU +cA +cA +cA +gN +fS +fE +bj +eM +Sb +bj +bj +bj +bj +bj +eM +kZ +fS +gN +cA +dU +cA +cA +gN +fS +bj +bj +bj +bj +bj +bj +bj +bj +bj +bj +fS +gN +fS +bj +bj +bj +bj +bj +bj +bj +fS +gN +gN +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(104,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +cq +cq +cq +aF +cq +cq +av +cq +cq +aF +cq +cq +zt +aF +av +cq +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eY +bj +eM +fT +bj +bj +bj +bj +bj +bV +bj +St +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fC +fS +fS +fS +fS +fS +fS +gN +fS +fS +nE +fS +fS +kh +fS +lZ +fS +IC +aL +aL +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(105,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +cq +aF +cq +cq +cq +aF +cq +cq +cq +aF +cq +aF +cq +cq +aF +av +cq +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aL +aL +gN +gN +gN +lE +gN +gN +dN +gN +cA +cA +cA +cA +gN +fS +eM +bj +eM +fT +bj +bj +ao +bj +bj +bj +bj +JS +gN +cA +cA +cA +cA +gN +gN +gN +gN +kf +gN +cA +gN +gN +gN +gN +gN +IC +gN +gN +kf +cA +gN +Ci +gN +gN +gN +gN +gN +gN +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(106,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +cq +cq +cq +cq +cq +cq +cq +cq +aF +cq +cq +cq +aF +cq +cq +aF +aF +av +av +aF +aF +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eZ +bj +eM +fT +bj +kZ +fS +Ht +bj +CC +kZ +fS +yi +cA +cA +cA +cA +cA +ef +cA +eg +cA +IM +cA +cA +cA +IM +cA +cA +cA +cA +ef +cA +cA +cA +cA +cA +gN +cJ +gN +gN +gN +aL +aL +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(107,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +cq +cq +cq +cq +aF +cq +aF +cq +at +av +aF +cq +cq +aF +aF +av +cq +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +dU +gN +fS +fa +bj +eM +fT +bj +bj +Tz +bj +bj +eM +bj +nE +eg +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +sG +cA +ns +cA +cA +cA +cA +CO +ef +tA +cA +cA +gN +gN +gN +gN +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(108,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +cq +cq +cq +aF +an +cq +aF +cq +cq +aF +cq +cq +cq +cq +cq +cq +aF +aF +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +an +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aa +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +eM +bj +HA +fT +bj +bj +hg +bj +bj +bV +bj +pr +iE +iE +iE +iE +iE +sG +cA +cA +cA +cA +cA +cT +cA +cA +cA +ns +cA +cI +qQ +eg +cA +cA +cA +cA +cA +gN +gN +gN +gN +gN +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(109,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +cq +cq +cq +cq +aF +aF +cq +cq +cq +cq +cq +cq +av +cq +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aa +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fE +bj +eM +fT +bj +kZ +fS +Ht +bj +bj +kZ +fS +yi +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +bX +cA +cA +bX +gN +gN +gN +gN +gN +gN +gN +aL +aL +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(110,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +cq +cq +cq +aF +aF +cq +cq +cq +cq +cq +cq +aF +cq +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aa +aa +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cT +cA +cA +gN +fS +bj +bj +fy +bj +bj +bj +Tz +bj +bj +CC +bj +fS +gN +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +SL +fS +fC +fC +fS +fS +kh +fS +fS +fS +fS +aL +aL +aL +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(111,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +cq +cq +cq +aF +cq +cq +cq +cq +cq +aF +cq +cq +aF +cq +cq +cq +aF +aF +aF +av +av +av +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aa +aa +aG +aG +aN +aL +aL +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +bj +bj +eM +bj +bj +bj +bj +bj +bj +eM +bj +fS +gN +cA +cA +cA +gN +fS +bj +bj +Tz +bj +bj +bj +eU +Tz +bj +bj +fS +pV +SC +bj +bj +pV +pV +PW +pV +Tz +bj +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(112,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +cq +cq +cq +cq +aF +cq +cq +cq +cq +cq +av +cq +aF +av +at +cq +av +cq +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aG +aG +aG +aN +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +Ht +bj +eM +bj +bj +bj +bj +bj +bj +bV +kZ +fS +gN +eg +cA +cA +gN +fS +bj +bk +bk +bk +bk +bk +bk +bk +bk +bj +fS +bj +bj +bj +bj +zg +bj +bj +bj +bj +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(113,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +cq +cq +cq +au +au +av +au +au +cq +cq +cq +cq +cq +cq +cq +at +cq +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +as +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +ab +aa +aa +aa +aG +aG +aG +aL +aL +gN +gN +gN +gN +aP +gN +gN +gN +cA +cA +cA +cA +gN +fS +bj +bj +eM +bj +bj +bj +bj +bj +bj +bj +bj +fS +gN +cA +cA +ef +gN +fS +Ht +vr +xo +Cr +xo +Cr +xo +Cr +bk +kZ +fS +bj +bj +bj +bj +bj +bj +bj +bj +fp +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(114,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +an +cq +cq +au +av +av +av +au +cq +cq +cq +cq +cq +aF +aF +cq +cq +av +cq +av +av +cq +av +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +bj +bj +eM +eM +eM +eM +eM +bj +bj +CC +bj +fS +gN +cA +cA +cA +gN +fS +bj +bk +ws +HT +Ce +zY +HT +Ce +bk +bj +fS +eM +eM +eM +eM +eM +eM +eM +eM +eM +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(115,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +au +au +av +au +av +au +au +cq +cq +cq +cq +at +cq +cq +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aG +aG +aG +aG +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +Oe +di +di +di +di +di +eM +fT +bj +eM +kZ +fS +gN +cA +cA +cA +gN +fS +bj +sX +HT +Qk +Qk +Qk +Qk +HT +ZD +bj +fS +bj +EK +bj +EK +bj +bj +EK +bj +eM +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(116,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aF +aF +aF +au +av +aF +av +av +av +au +cq +cq +cq +cq +av +cq +cq +av +cq +av +cq +aF +aF +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +eg +cA +cA +cA +gN +fS +di +di +di +di +di +di +eM +fT +bj +bV +bj +ck +gN +cA +cA +cI +gN +fS +bj +Pl +zY +Qk +Qk +Qk +Qk +ws +xx +bj +fS +bj +bj +hg +bj +bj +bj +bj +hg +bj +fp +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(117,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +au +av +av +av +av +av +au +cq +cq +cq +aF +aF +aF +aF +an +aF +aF +cq +av +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +an +aF +aF +aF +aF +ab +aa +aa +aG +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +eg +cA +cA +cA +gN +fS +fb +di +di +di +di +di +gt +fT +bj +bj +bj +ck +gN +cA +cA +cA +gN +fS +bj +bk +Ce +HT +Ce +zY +Io +zY +Qy +bj +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fC +fS +aL +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(118,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +au +aF +an +av +cp +aF +au +aF +aF +cq +av +cq +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fc +di +di +di +di +di +gu +we +bj +CC +bj +ck +gN +cA +cA +eg +gN +fS +YW +bk +hI +Zs +hI +Zs +oW +Zs +bk +kZ +fS +bj +Tz +bj +bj +bj +Tz +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(119,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +au +au +au +au +au +av +au +au +au +au +au +aF +an +cq +cq +cq +av +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fe +di +fD +di +di +di +eM +fT +bj +eM +bj +fS +gN +cA +cA +cA +gN +fS +bj +bk +bk +vr +CN +bk +bk +Hg +bk +bj +fS +bj +YV +bj +YV +bj +YV +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(120,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +au +ay +aK +bB +av +av +av +av +av +av +au +aF +aF +aF +aF +aF +cq +aF +aF +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +ab +aa +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +ff +di +di +di +di +di +eM +fT +bj +bV +kZ +fS +gN +cA +cA +cA +gN +fS +bj +bj +hg +bj +bj +bj +bj +hg +bj +bj +fS +bj +eM +HA +eM +eM +eM +bj +fC +zg +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(121,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +au +az +bi +bN +av +av +av +av +av +av +au +aF +aF +aF +aB +aF +aF +aF +aF +aF +as +aF +aF +aF +aF +aF +aF +aB +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aG +aG +aG +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fg +di +Xn +di +di +Xn +eM +bj +hg +bj +bj +fS +gN +cA +cA +cA +gN +fS +fS +Yg +fS +fS +fS +fS +fS +fS +Yg +fS +fS +bj +EK +bj +EK +bj +EK +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(122,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +aA +bA +bS +av +av +av +cp +av +av +au +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +av +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +gN +cA +cA +cA +gN +fS +kG +bj +bj +kG +kG +fS +eI +bj +bj +bj +fS +bj +hg +gP +zg +bj +hg +bj +kh +bj +eU +fS +aL +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(123,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +au +av +av +av +av +av +au +au +au +au +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +jO +fS +CU +bj +bj +Pq +Ei +fS +yJ +bj +fp +kZ +fS +fS +fS +fS +fS +fS +fS +fS +fS +Ep +bj +fS +aL +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(124,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +au +av +av +av +av +au +au +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aF +aF +aF +aF +an +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +aa +aa +aa +aa +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +eg +cA +cA +cA +cA +cI +cA +ef +cA +cA +gN +fS +kG +bj +bj +bj +bj +fS +eI +bj +bj +bj +fS +bj +Tz +zg +bj +bj +Tz +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(125,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +av +av +av +au +au +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aG +aG +aL +aL +gN +gN +gN +gN +cJ +gN +gN +gN +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +gN +fS +kG +bj +bj +bj +bj +fS +eI +bj +bj +bj +fS +bj +iA +bj +iA +fp +iA +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(126,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +au +ab +av +ab +au +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +aa +aa +aa +aG +aG +aN +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +eg +cA +cA +cA +cA +cA +cA +eX +cA +cA +cT +cA +cA +cA +cA +eg +cA +cA +cA +eg +gN +fS +kG +bj +eU +bj +bj +fS +eI +bj +zg +bj +fS +bj +eM +fz +eM +pg +eM +bj +fC +bj +bj +fS +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(127,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +av +ca +av +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +aF +aF +aF +aF +aF +ab +ab +ab +ab +aa +aa +aa +aa +aG +aG +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +cA +gN +fS +Ht +bj +bj +bj +rX +fS +yJ +bj +bj +kZ +fS +bj +Mo +bj +Mo +bj +Mo +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(128,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +av +av +ab +av +cp +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aF +aF +aF +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +fS +kG +bj +bj +bj +bj +fS +eI +bj +bj +bj +fS +bj +hg +bj +bj +bj +hg +bj +fS +bj +bj +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(129,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +cp +av +av +av +av +av +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +dN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +fS +fS +fS +fS +fS +Yg +fS +fS +fS +Yg +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +Ht +fu +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(130,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +av +av +av +av +av +av +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +aP +gN +gN +gN +gN +gN +gN +gN +gN +gN +JW +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +fS +bj +RR +eM +RR +bj +bj +bj +fS +fF +fF +BQ +XU +fF +Ia +bj +fS +ry +JF +fS +bj +fp +fS +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(131,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +av +av +av +av +av +av +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +dB +gN +gN +gN +gN +gN +fS +bj +fp +bj +bj +bj +zf +RR +fS +fF +fF +fF +en +fF +Ia +bj +fS +YI +bj +kh +bj +bj +fS +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(132,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +av +av +av +av +av +av +av +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +Ci +gN +gN +gN +fS +Ht +uT +uT +uT +bj +zf +Ch +fS +hp +fF +dY +ep +fF +Ia +bj +fS +fS +fC +fS +bj +bj +fS +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(133,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +av +av +av +av +av +av +av +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +VN +bj +bj +bj +bj +eU +zf +eM +fS +rO +dJ +fF +fF +ew +fS +bj +bj +Mq +bj +bj +zg +bj +fS +aL +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(134,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aw +av +cp +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +dN +gN +gN +gN +gN +VN +bj +zg +bj +bj +bj +zf +RR +fS +Lg +dK +fF +XU +fF +Yg +bj +bj +bj +bj +bj +bj +bj +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(135,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aL +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +cJ +gN +gN +fS +bj +bj +bj +fp +bj +bj +bj +kh +Lg +eb +eb +en +fF +fS +eW +eW +eW +eW +eW +fS +fS +fS +aL +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(136,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +aL +gN +gN +gN +gN +gN +gN +aP +gN +gN +gN +gN +gN +gN +gN +gN +gN +fS +Ht +ul +ul +ul +ul +ul +kZ +fS +FG +fF +fF +ep +fF +BQ +fF +fF +fF +fF +fF +BQ +fF +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(137,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aL +gN +gN +gN +gN +gN +gN +gN +aL +aL +aL +aL +aL +aL +aL +aL +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +gN +fS +bj +eU +bj +bj +bj +bj +bj +fS +Rj +fF +fF +fF +HO +KI +en +eL +fF +Ij +en +eL +fF +fS +aL +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(138,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aL +aL +aL +gN +gN +aL +aL +aL +aL +aG +aG +aG +aG +aG +aG +aL +aL +aL +gN +gN +aL +aL +aL +aL +aL +aL +aL +gN +fS +bj +bj +bj +bj +bj +bj +bj +fS +fF +fF +zM +fF +fF +zM +fF +fF +fF +fF +zM +fF +fF +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(139,1,1) = {" +aH +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aG +aG +aG +aG +aG +aG +aG +aG +aL +aL +aL +aL +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aG +aL +aL +aL +aL +aG +aG +aG +aG +aG +aL +aL +fS +fS +Ou +fS +Ou +fS +Ou +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +fS +aL +aG +aG +aG +aG +aG +aG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aH +"} +(140,1,1) = {" +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +gX +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL +gX +gX +gX +gX +gX +gX +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +aH +"} diff --git a/maps/tether/submaps/_tether_submaps.dm b/maps/tether/submaps/_tether_submaps.dm index 77be4b0e7c..cb98932fa1 100644 --- a/maps/tether/submaps/_tether_submaps.dm +++ b/maps/tether/submaps/_tether_submaps.dm @@ -355,6 +355,13 @@ mappath = 'maps/gateway_vr/eggnogtownunderground.dmm' associated_map_datum = /datum/map_z_level/tether_lateload/gateway_destination +#include "../../gateway_vr/wildwest.dm" +/datum/map_template/tether_lateload/gateway/wildwest + name = "Wild West" + desc = "A classic." + mappath = 'maps/gateway_vr/wildwest.dmm' + associated_map_datum = /datum/map_z_level/tether_lateload/gateway_destination + ////////////////////////////////////////////////////////////////////////////////////// // Admin-use z-levels for loading whenever an admin feels like #if AWAY_MISSION_TEST diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index adffcc49d6..2003b79b75 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -164,14 +164,15 @@ ) lateload_single_pick = list( - list("Carp Farm"), - list("Snow Field"), - list("Listening Post"), - list("Honleth Highlands A"), - list("Honleth Highlands B"), - list("Arynthi Lake Underground A","Arynthi Lake A"), - list("Arynthi Lake Underground B","Arynthi Lake B"), - list("Eggnog Town Underground","Eggnog Town") +// list("Carp Farm"), +// list("Snow Field"), +// list("Listening Post"), +// list("Honleth Highlands A"), +// list("Honleth Highlands B"), +// list("Arynthi Lake Underground A","Arynthi Lake A"), +// list("Arynthi Lake Underground B","Arynthi Lake B"), +// list("Eggnog Town Underground","Eggnog Town"), + list("Wild West") ) ai_shell_restricted = TRUE diff --git a/vorestation.dme b/vorestation.dme index 3cf368173a..924ab2ee34 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1593,6 +1593,7 @@ #include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" #include "code\game\turfs\simulated\outdoors\dirt.dm" #include "code\game\turfs\simulated\outdoors\grass.dm" +#include "code\game\turfs\simulated\outdoors\ironsand_vr.dm" #include "code\game\turfs\simulated\outdoors\outdoors.dm" #include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" #include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" From bb6c9c7d862e25a57d5cbe0514af1bd568ba7c59 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 20 Jun 2021 06:32:51 -0400 Subject: [PATCH 47/81] once more with feeling --- maps/gateway_vr/wildwest.dmm | 330 +++++++++-------------------------- 1 file changed, 85 insertions(+), 245 deletions(-) diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm index 9382b8b1da..7f9d8c3425 100644 --- a/maps/gateway_vr/wildwest.dmm +++ b/maps/gateway_vr/wildwest.dmm @@ -112,12 +112,6 @@ "aN" = ( /turf/simulated/mineral, /area/awaymission/wwmines) -"aP" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, -/turf/simulated/floor/outdoors/ironsand, -/area/awaymission/wwmines) "bh" = ( /obj/structure/bed/chair/wood{ dir = 4 @@ -382,13 +376,6 @@ /obj/structure/fans/tiny, /turf/simulated/floor, /area/awaymission/wwrefine) -"dJ" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/obj/effect/floor_decal/corner/paleblue/diagonal, -/turf/simulated/floor/tiled/white, -/area/awaymission/wwmines) "dK" = ( /obj/effect/landmark/corpse/doctor{ mobname = "Doctor Mugabee" @@ -437,12 +424,6 @@ "ee" = ( /turf/simulated/floor, /area/awaymission/wwrefine) -"ef" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, -/turf/simulated/floor/tiled/asteroid_steel, -/area/awaymission/wwmines) "eg" = ( /obj/effect/mine/dnascramble, /turf/simulated/floor/tiled/asteroid_steel, @@ -482,9 +463,6 @@ /turf/simulated/floor/plating, /area/awaymission/wwrefine) "ew" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, /obj/effect/floor_decal/corner/paleblue/diagonal, /obj/machinery/light/small, /turf/simulated/floor/tiled/white, @@ -545,12 +523,6 @@ /obj/structure/bed/padded, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"eU" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/turf/simulated/floor/wood, -/area/awaymission/wwmines) "eW" = ( /obj/structure/window/reinforced{ dir = 8; @@ -767,12 +739,6 @@ /obj/machinery/microwave, /turf/simulated/floor/tiled/eris/cafe, /area/awaymission/wwgov) -"gc" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall_s"; - dir = 14 - }, -/area/awaymission/wwrefine) "gd" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -985,12 +951,6 @@ }, /turf/simulated/floor/carpet, /area/awaymission/wwmines) -"hZ" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall"; - dir = 4 - }, -/area/awaymission/wwrefine) "ia" = ( /obj/effect/forcefield{ desc = "You can't get in. Heh."; @@ -1000,12 +960,6 @@ /obj/effect/overmap/visitable/sector/tether_gateway/wildwest, /turf/space, /area) -"iv" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall_s"; - dir = 8 - }, -/area/awaymission/wwrefine) "iA" = ( /obj/structure/bed/chair/office/light{ dir = 4 @@ -1068,9 +1022,7 @@ /area/awaymission/wwmines) "kj" = ( /obj/machinery/door/unpowered/shuttle, -/turf/simulated/shuttle{ - = on_state = "floor2" - }, +/turf/simulated/shuttle/floor, /area/awaymission/wwrefine) "kG" = ( /obj/structure/largecrate, @@ -1140,12 +1092,6 @@ }, /turf/simulated/floor/grass, /area/awaymission/wwgov) -"no" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall_straight"; - dir = 4 - }, -/area/awaymission/wwrefine) "ns" = ( /obj/effect/decal/mecha_wreckage/durand{ anchored = 1 @@ -1161,15 +1107,6 @@ /obj/structure/fans/tiny, /turf/simulated/floor/tiled/asteroid_steel, /area/awaymission/wwgov) -"oW" = ( -/obj/structure/bed/chair/comfy/beige{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/turf/simulated/floor/carpet, -/area/awaymission/wwmines) "pc" = ( /obj/structure/window/reinforced{ dir = 8; @@ -1213,12 +1150,6 @@ /obj/structure/fans/tiny, /turf/simulated/floor/grass, /area/awaymission/wwgov) -"pT" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall_s"; - dir = 1 - }, -/area/awaymission/wwrefine) "pV" = ( /obj/structure/bed/chair/comfy/beige{ dir = 4 @@ -1380,12 +1311,6 @@ }, /turf/simulated/floor/wood, /area/awaymission/wwgov) -"vr" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/turf/simulated/floor/carpet, -/area/awaymission/wwmines) "wa" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, /turf/simulated/floor/grass, @@ -1398,12 +1323,6 @@ "wj" = ( /turf/simulated/shuttle/wall/hard_corner, /area/awaymission/wwvault) -"wp" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall"; - dir = 8 - }, -/area/awaymission/wwrefine) "ws" = ( /obj/structure/table/woodentable, /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly, @@ -1489,12 +1408,6 @@ /obj/structure/bed/chair/comfy/brown, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"zg" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, -/turf/simulated/floor/wood, -/area/awaymission/wwmines) "zr" = ( /obj/structure/window/reinforced{ dir = 8; @@ -1695,12 +1608,6 @@ }, /turf/simulated/floor/tiled/white, /area/awaymission/wwmines) -"FS" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall"; - dir = 10 - }, -/area/awaymission/wwrefine) "Gh" = ( /obj/effect/decal/cleanable/blood/gibs/up, /turf/simulated/floor/wood, @@ -1724,9 +1631,7 @@ "Hi" = ( /obj/structure/toilet, /mob/living/simple_mob/creature, -/turf/simulated/floor{ - = on_state = "white" - }, +/turf/space, /area/awaymission/wwgov) "Hl" = ( /obj/machinery/mineral/input, @@ -1757,13 +1662,6 @@ /obj/effect/landmark/corpse/miner/rig, /turf/simulated/floor/tiled/asteroid_steel, /area/awaymission/wwrefine) -"HO" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, -/obj/effect/floor_decal/corner/paleblue/diagonal, -/turf/simulated/floor/tiled/white, -/area/awaymission/wwmines) "HT" = ( /obj/structure/table/woodentable, /obj/item/weapon/reagent_containers/food/drinks/coffee, @@ -1782,14 +1680,6 @@ }, /turf/simulated/floor/tiled/white, /area/awaymission/wwmines) -"Ij" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, -/obj/structure/bed/chair/wood, -/obj/effect/floor_decal/corner/paleblue/diagonal, -/turf/simulated/floor/tiled/white, -/area/awaymission/wwmines) "Io" = ( /obj/structure/table/woodentable, /obj/item/weapon/reagent_containers/food/drinks/coffee, @@ -1841,12 +1731,6 @@ /obj/machinery/washing_machine, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"JH" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall"; - dir = 6 - }, -/area/awaymission/wwrefine) "JN" = ( /obj/structure/window/reinforced{ dir = 1; @@ -1920,15 +1804,6 @@ }, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"Mq" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/awaymission/wwmines) "Nc" = ( /obj/machinery/mineral/mint, /turf/simulated/floor/plating, @@ -2030,15 +1905,6 @@ }, /turf/simulated/floor, /area/awaymission/wwrefine) -"PW" = ( -/obj/structure/bed/chair/comfy/beige{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/turf/simulated/floor/wood, -/area/awaymission/wwmines) "Qk" = ( /obj/structure/table/woodentable, /turf/simulated/floor/carpet, @@ -2058,12 +1924,6 @@ }, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"Qy" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibup1" - }, -/turf/simulated/floor/carpet, -/area/awaymission/wwmines) "QL" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -2157,12 +2017,6 @@ /mob/living/simple_mob/humanoid/merc/melee, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"SL" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/turf/simulated/wall/sandstone, -/area/awaymission/wwmines) "Tk" = ( /obj/machinery/light/small, /turf/simulated/floor/plating, @@ -2187,12 +2041,6 @@ }, /turf/simulated/floor/grass, /area/awaymission/wwgov) -"Uo" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall_straight"; - dir = 1 - }, -/area/awaymission/wwrefine) "UG" = ( /obj/structure/table/woodentable, /obj/machinery/light/small{ @@ -2275,9 +2123,7 @@ /turf/space, /area) "XP" = ( -/turf/simulated/shuttle/wall{ - = on_state = "swall_s" - }, +/turf/simulated/shuttle/wall, /area/awaymission/wwrefine) "XU" = ( /obj/structure/bed/chair/wood{ @@ -2290,12 +2136,6 @@ /obj/machinery/door/airlock/sandstone, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"Ys" = ( -/obj/effect/decal/cleanable/blood/gibs/body{ - = on_state = "gibdown1" - }, -/turf/simulated/floor/outdoors/ironsand, -/area/awaymission/wwmines) "YI" = ( /obj/machinery/light/small{ dir = 1 @@ -7724,11 +7564,11 @@ QL aa aa aa -gc -Uo -Uo -Uo -pT +XP +XP +XP +XP +XP aa aa aa @@ -7866,15 +7706,15 @@ yW aa aa aa -no +XP za rh za -FS -Uo -Uo -Uo -pT +XP +XP +XP +XP +XP aa aa aa @@ -8008,7 +7848,7 @@ PJ gd gd zS -wp +XP za za za @@ -8016,7 +7856,7 @@ OH ly OH EW -no +XP aa aa aa @@ -8292,7 +8132,7 @@ sS gd gd zS -hZ +XP za za za @@ -8300,7 +8140,7 @@ OH uJ OH EW -no +XP aa aa aa @@ -8434,15 +8274,15 @@ Ni aa aa aa -no +XP za hq za -JH -Uo -Uo -Uo -iv +XP +XP +XP +XP +XP aa aa aa @@ -8577,10 +8417,10 @@ aa aa aa XP -Uo -Uo -Uo -iv +XP +XP +XP +XP aa aa aa @@ -11233,7 +11073,7 @@ gN gN gN gN -aP +gN gN gN gN @@ -11247,7 +11087,7 @@ gN gN gN gN -aP +gN gN gN gN @@ -11794,7 +11634,7 @@ gN gN gN cA -ef +cA cA cA cA @@ -11817,7 +11657,7 @@ cA dU eq gN -aP +gN gN gN TE @@ -12356,7 +12196,7 @@ gN gN gN gN -aP +gN gN gN gN @@ -13262,7 +13102,7 @@ aL aL gN gN -aP +gN gN gN aL @@ -13406,7 +13246,7 @@ aL rV TE gN -aP +gN rV aL aL @@ -13687,7 +13527,7 @@ bj fS gN gN -aP +gN gN gN gN @@ -13824,7 +13664,7 @@ Ht bj bj bj -zg +bj kZ fS gN @@ -14105,7 +13945,7 @@ fS gN fS bj -zg +bj bj bj xT @@ -14205,7 +14045,7 @@ gN gN gN gN -aP +gN gN cA cA @@ -14673,11 +14513,11 @@ fS gN fS Ht -zg +bj bj Hq bj -eU +bj fS fS aL @@ -14815,7 +14655,7 @@ fS gN fS bj -eU +bj PG bj bj @@ -14912,12 +14752,12 @@ gN gN gN gN -aP +gN gN gN gN dQ -ef +cA cA cA cA @@ -15076,7 +14916,6 @@ cA cA cA cA -ef cA cA cA @@ -15089,14 +14928,15 @@ cA cA cA cA -ef +cA +cA iE iE iE iE qQ cA -aP +gN lZ fS fS @@ -15233,7 +15073,7 @@ cA cA cA cA -ef +cA cA HU eg @@ -15241,10 +15081,10 @@ cA jO lY lY -Ys +gN gN kf -aP +gN gN gN gN @@ -15663,7 +15503,7 @@ du bj bj fS -aP +gN fS bj bj @@ -15809,7 +15649,7 @@ gN fS Ht bj -eU +bj bj bj fp @@ -16373,7 +16213,7 @@ bj bj bj fS -Ys +gN fS bj bj @@ -16657,7 +16497,7 @@ bj bj kZ fS -aP +gN fS Ht bj @@ -16805,7 +16645,7 @@ bj bj fp bj -eU +bj bj bj fS @@ -17355,7 +17195,7 @@ cA cA cA cA -ef +cA cA eg cA @@ -17368,7 +17208,7 @@ cA cA cA cA -ef +cA cA cA cA @@ -17512,7 +17352,7 @@ cA cA cA CO -ef +cA tA cA cA @@ -17934,7 +17774,7 @@ fS fS fS fS -SL +fS fS fC fC @@ -18071,7 +17911,7 @@ Tz bj bj bj -eU +bj Tz bj bj @@ -18082,7 +17922,7 @@ bj bj pV pV -PW +pV pV Tz bj @@ -18222,7 +18062,7 @@ bj bj bj bj -zg +bj bj bj bj @@ -18321,7 +18161,7 @@ gN gN gN gN -aP +gN gN gN gN @@ -18346,11 +18186,11 @@ fS gN cA cA -ef +cA gN fS Ht -vr +bk xo Cr xo @@ -18925,7 +18765,7 @@ Ce zY Io zY -Qy +bk bj fS fS @@ -19065,7 +18905,7 @@ hI Zs hI Zs -oW +hI Zs bk kZ @@ -19204,7 +19044,7 @@ fS bj bk bk -vr +bk CN bk bk @@ -19362,7 +19202,7 @@ eM eM bj fC -zg +bj bj fS aL @@ -19641,13 +19481,13 @@ fS bj hg gP -zg +bj bj hg bj kh bj -eU +bj fS aL aG @@ -19906,7 +19746,7 @@ cA cA cI cA -ef +cA cA cA gN @@ -19924,7 +19764,7 @@ bj fS bj Tz -zg +bj bj bj Tz @@ -20197,13 +20037,13 @@ gN fS kG bj -eU +bj bj bj fS eI bj -zg +bj bj fS bj @@ -20740,7 +20580,7 @@ gN gN gN gN -aP +gN gN gN gN @@ -21193,22 +21033,22 @@ bj bj bj bj -eU +bj zf eM fS rO -dJ +fF fF fF ew fS bj bj -Mq +Tz +bj bj bj -zg bj fS aL @@ -21332,7 +21172,7 @@ gN gN VN bj -zg +bj bj bj bj @@ -21604,7 +21444,7 @@ gN gN gN gN -aP +gN gN gN gN @@ -21758,7 +21598,7 @@ gN gN fS bj -eU +bj bj bj bj @@ -21769,12 +21609,12 @@ Rj fF fF fF -HO +fF KI en eL fF -Ij +KI en eL fF From 7909f7784d4deb8b6873614023dde09376d086e3 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 20 Jun 2021 07:06:05 -0400 Subject: [PATCH 48/81] Tweaks --- maps/gateway_vr/wildwest.dmm | 62 ++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm index 7f9d8c3425..b74e36a5e0 100644 --- a/maps/gateway_vr/wildwest.dmm +++ b/maps/gateway_vr/wildwest.dmm @@ -112,6 +112,10 @@ "aN" = ( /turf/simulated/mineral, /area/awaymission/wwmines) +"aP" = ( +/obj/random/awayloot, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) "bh" = ( /obj/structure/bed/chair/wood{ dir = 4 @@ -376,6 +380,10 @@ /obj/structure/fans/tiny, /turf/simulated/floor, /area/awaymission/wwrefine) +"dJ" = ( +/obj/random/awayloot/nofail, +/turf/simulated/floor/redgrid/off, +/area/awaymission/wwvault) "dK" = ( /obj/effect/landmark/corpse/doctor{ mobname = "Doctor Mugabee" @@ -424,6 +432,11 @@ "ee" = ( /turf/simulated/floor, /area/awaymission/wwrefine) +"ef" = ( +/obj/item/weapon/stool, +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/wood, +/area/awaymission/wwmines) "eg" = ( /obj/effect/mine/dnascramble, /turf/simulated/floor/tiled/asteroid_steel, @@ -523,6 +536,12 @@ /obj/structure/bed/padded, /turf/simulated/floor/wood, /area/awaymission/wwmines) +"eU" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/awaymission/wwmines) "eW" = ( /obj/structure/window/reinforced{ dir = 8; @@ -706,7 +725,7 @@ /turf/simulated/wall/r_wall, /area/awaymission/wwrefine) "fO" = ( -/obj/item/ammo_casing/a10mm, +/obj/random/gun/random, /turf/simulated/floor/carpet, /area/awaymission/wwmines) "fS" = ( @@ -1969,11 +1988,6 @@ /obj/machinery/computer/security/telescreen/entertainment, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"Sb" = ( -/obj/item/weapon/stool, -/mob/living/simple_mob/humanoid/merc/ranged, -/turf/simulated/floor/wood, -/area/awaymission/wwmines) "Sd" = ( /obj/structure/window/reinforced{ dir = 8; @@ -15078,12 +15092,12 @@ cA HU eg cA -jO -lY -lY -gN -gN -kf +cT +iE +iE +cA +cA +eU gN gN gN @@ -15906,7 +15920,7 @@ bk gh bk eM -we +fT bj bj bj @@ -16332,7 +16346,7 @@ bk bk bk eM -fT +ef bj bV kZ @@ -16754,7 +16768,7 @@ fS fE bj eM -Sb +fT bj bj bj @@ -18315,7 +18329,7 @@ gN fS bj bj -eM +HA eM eM eM @@ -20020,7 +20034,7 @@ cA cA cA cA -eX +cA cA cA cT @@ -20436,7 +20450,6 @@ gN gN gN gN -gN dN gN gN @@ -20444,6 +20457,7 @@ gN gN gN gN +gN cJ gN gN @@ -20732,7 +20746,7 @@ gN gN gN gN -gN +dN gN gN cJ @@ -20807,7 +20821,7 @@ aa aa aa ab -av +aP av av av @@ -20949,8 +20963,8 @@ aa aa aa ab -av -av +aP +dJ av av av @@ -21092,7 +21106,7 @@ aa aa ab aw -av +aP cp ab ab @@ -21165,7 +21179,7 @@ gN gN gN gN -dN +gN gN gN gN From 773d19869fc9a7c876dbc48e70f5f93d822adc2b Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 20 Jun 2021 07:20:16 -0400 Subject: [PATCH 49/81] final touchups (I think) --- maps/gateway_vr/wildwest.dmm | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm index b74e36a5e0..823c71a8cf 100644 --- a/maps/gateway_vr/wildwest.dmm +++ b/maps/gateway_vr/wildwest.dmm @@ -392,8 +392,9 @@ /turf/simulated/floor/tiled/white, /area/awaymission/wwmines) "dM" = ( -/obj/item/ammo_casing/a10mm, -/turf/simulated/floor/outdoors/ironsand, +/obj/item/weapon/stool, +/mob/living/simple_mob/humanoid/merc/ranged, +/turf/simulated/floor/wood, /area/awaymission/wwmines) "dN" = ( /mob/living/simple_mob/humanoid/merc/ranged, @@ -433,9 +434,8 @@ /turf/simulated/floor, /area/awaymission/wwrefine) "ef" = ( -/obj/item/weapon/stool, -/mob/living/simple_mob/humanoid/merc/ranged, -/turf/simulated/floor/wood, +/obj/effect/gibspawner/human, +/turf/simulated/floor/tiled/asteroid_steel, /area/awaymission/wwmines) "eg" = ( /obj/effect/mine/dnascramble, @@ -1084,7 +1084,7 @@ /turf/simulated/floor/grass, /area/awaymission/wwgov) "lY" = ( -/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/gibspawner/human, /turf/simulated/floor/outdoors/ironsand, /area/awaymission/wwmines) "lZ" = ( @@ -11928,7 +11928,7 @@ gN gN gN gN -dM +gN gN gN cA @@ -13227,9 +13227,9 @@ bj bj bj fC -iE -iE -iE +ef +cA +cA cA cA gN @@ -13799,7 +13799,7 @@ gN cA cA dU -iE +cA lY fC bj @@ -16346,7 +16346,7 @@ bk bk bk eM -ef +dM bj bV kZ @@ -17487,11 +17487,11 @@ bj bV bj pr -iE -iE -iE -iE -iE +cA +cA +ef +cA +cA sG cA cA From 1fe03e783a27415fc3e52a7aa20c1e9c25f4ee43 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 20 Jun 2021 07:21:59 -0400 Subject: [PATCH 50/81] Actually turns the other gateways back on too --- maps/tether/tether_defines.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index 2003b79b75..a5ab946684 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -164,14 +164,14 @@ ) lateload_single_pick = list( -// list("Carp Farm"), -// list("Snow Field"), -// list("Listening Post"), -// list("Honleth Highlands A"), -// list("Honleth Highlands B"), -// list("Arynthi Lake Underground A","Arynthi Lake A"), -// list("Arynthi Lake Underground B","Arynthi Lake B"), -// list("Eggnog Town Underground","Eggnog Town"), + list("Carp Farm"), + list("Snow Field"), + list("Listening Post"), + list("Honleth Highlands A"), + list("Honleth Highlands B"), + list("Arynthi Lake Underground A","Arynthi Lake A"), + list("Arynthi Lake Underground B","Arynthi Lake B"), + list("Eggnog Town Underground","Eggnog Town"), list("Wild West") ) From 8fb2370efe1310a867ec76b3dbd9aa8e76f41585 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 20 Jun 2021 07:24:53 -0400 Subject: [PATCH 51/81] REMOVE THE LAST OF THE TRACKS SINCE THEY DON'T SHOW UP ANYWAY I replaced them with gibspawners --- maps/gateway_vr/wildwest.dmm | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm index 823c71a8cf..5d1c592ea6 100644 --- a/maps/gateway_vr/wildwest.dmm +++ b/maps/gateway_vr/wildwest.dmm @@ -985,10 +985,6 @@ }, /turf/simulated/floor/wood, /area/awaymission/wwmines) -"iE" = ( -/obj/effect/decal/cleanable/blood/tracks, -/turf/simulated/floor/tiled/asteroid_steel, -/area/awaymission/wwmines) "iU" = ( /obj/machinery/light/small, /turf/simulated/floor/outdoors/ironsand, @@ -14944,10 +14940,10 @@ cA cA cA cA -iE -iE -iE -iE +cA +ef +cA +cA qQ cA gN @@ -15092,11 +15088,11 @@ cA HU eg cA -cT -iE -iE cA cA +cA +ef +cA eU gN gN From 7aa98d0c1000908f9d8c16aced24bac219d019ae Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Sun, 20 Jun 2021 08:05:43 -0500 Subject: [PATCH 52/81] what the fuck even is waste --- code/game/objects/items/devices/powersink.dm | 2 +- code/modules/assembly/igniter.dm | 2 +- code/modules/assembly/infrared.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/assembly/proximity.dm | 2 +- code/modules/assembly/signaler.dm | 2 +- code/modules/assembly/timer.dm | 2 +- code/modules/assembly/voice.dm | 2 +- code/modules/power/antimatter/shielding.dm | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 477f161e07..64c312b914 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -9,7 +9,7 @@ throw_speed = 1 throw_range = 2 - matter = list(DEFAULT_WALL_MATERIAL = 750,"waste" = 750) + matter = list(DEFAULT_WALL_MATERIAL = 750) origin_tech = list(TECH_POWER = 3, TECH_ILLEGAL = 5) var/drain_rate = 1500000 // amount of power to drain per tick diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 5344d4b15b..a53fbad0ec 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -3,7 +3,7 @@ desc = "A small electronic device able to ignite combustable substances." icon_state = "igniter" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 500, MAT_GLASS = 50) secured = 1 wires = WIRE_RECEIVE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 853f2f230b..b9a8302aa1 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -5,7 +5,7 @@ desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." icon_state = "infrared" origin_tech = list(TECH_MAGNET = 2) - matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100) + matter = list(DEFAULT_WALL_MATERIAL = 1000, MAT_GLASS = 500) wires = WIRE_PULSE diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 6ea9dfdff7..7dc4ac7166 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -3,7 +3,7 @@ desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" origin_tech = list(TECH_COMBAT = 1) - matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 100) var/armed = 0 diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index c13bba9f86..566ba320e4 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -3,7 +3,7 @@ desc = "Used for scanning and alerting when someone enters a certain proximity." icon_state = "prox" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 800, MAT_GLASS = 200) wires = WIRE_PULSE secured = 0 diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index e98ff5372c..91cea6b775 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -4,7 +4,7 @@ icon_state = "signaller" item_state = "signaler" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100) + matter = list(DEFAULT_WALL_MATERIAL = 1000, MAT_GLASS = 200) wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE secured = TRUE diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 30f002de7d..5a0109a031 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -3,7 +3,7 @@ desc = "Used to time things. Works well with contraptions which has to count down. Tick tock." icon_state = "timer" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 500, MAT_GLASS = 50) wires = WIRE_PULSE diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 8990e01d63..e0d383e223 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -3,7 +3,7 @@ desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." icon_state = "voice" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 500, MAT_GLASS = 50) var/listening = 0 var/recorded //the activation message diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 5c39d8e150..3dab7ddb74 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -194,7 +194,7 @@ proc/cardinalrange(var/center) throwforce = 5 throw_speed = 1 throw_range = 2 - matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 2000) + matter = list(DEFAULT_WALL_MATERIAL = 100) /obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) From a88766387d68e12dc7e6a5b6bc42b8ce02948999 Mon Sep 17 00:00:00 2001 From: TheDavestDave <30513964+TheDavestDave@users.noreply.github.com> Date: Sun, 20 Jun 2021 20:16:32 +0100 Subject: [PATCH 53/81] stops handbow changes overiding engery bow I didn't know it existed --- code/modules/projectiles/guns/energy/laser_vr.dm | 4 ++-- code/modules/projectiles/projectile/energy_vr.dm | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/guns/energy/laser_vr.dm b/code/modules/projectiles/guns/energy/laser_vr.dm index 5e5f9897e0..b7e4fe3a66 100644 --- a/code/modules/projectiles/guns/energy/laser_vr.dm +++ b/code/modules/projectiles/guns/energy/laser_vr.dm @@ -371,8 +371,8 @@ charge_cost = 600 modifystate = "handbowkill" firemodes = list( - list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/energy/bolt/heavy, modifystate="handbowkill", charge_cost = 600), - list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/energy/bolt, modifystate="handbowstun", charge_cost = 200), + list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/energy/bow/heavy, modifystate="handbowkill", charge_cost = 600), + list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/energy/bow, modifystate="handbowstun", charge_cost = 200), ) /obj/item/weapon/gun/energy/locked/frontier/handbow/unlocked diff --git a/code/modules/projectiles/projectile/energy_vr.dm b/code/modules/projectiles/projectile/energy_vr.dm index b0e9bebb69..5bc690c1b5 100644 --- a/code/modules/projectiles/projectile/energy_vr.dm +++ b/code/modules/projectiles/projectile/energy_vr.dm @@ -10,16 +10,16 @@ /obj/item/projectile/energy/flash/flare flash_range = 2 -/obj/item/projectile/energy/bolt +/obj/item/projectile/energy/bow name = "engergy bolt" icon_state = "cbbolt" damage = 20 -/obj/item/projectile/energy/bolt/heavy +/obj/item/projectile/energy/bow/heavy damage = 30 icon_state = "cbbolt" - -/obj/item/projectile/energy/bolt/stun + +/obj/item/projectile/energy/bow/stun name = "stun bolt" agony = 30 From d6d18c9d30d9449da3c8021d73f86053201e859f Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Sun, 20 Jun 2021 15:49:14 -0500 Subject: [PATCH 54/81] Indescribable! - A Food Flavor Fixing Pass --- code/modules/food/food/snacks.dm | 668 ++++++++------------------ html/changelogs/MDP-indescribable.yml | 37 ++ 2 files changed, 246 insertions(+), 459 deletions(-) create mode 100644 html/changelogs/MDP-indescribable.yml diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 3f5213f728..51b3e76a02 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -27,7 +27,7 @@ /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) - reagents.add_reagent("nutriment",(nutriment_amt*2),nutriment_desc) + reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc) //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M) @@ -271,15 +271,15 @@ // the bites. No more contained reagents = no more bites. //Here is an example of the new formatting for anyone who wants to add more food items. -///obj/item/weapon/reagent_containers/food/snacks/xenoburger //Identification path for the object. -// name = "Xenoburger" //Name that displays in the UI. -// desc = "Smells caustic. Tastes like heresy." //Duh -// icon_state = "xburger" //Refers to an icon in food.dmi -// Initialize() //Don't mess with this. (We use Initialize now instead of New()) -// . = ..() //Same here. -// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste -// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. -// bitesize = 3 //This is the amount each bite consumes. +///obj/item/weapon/reagent_containers/food/snacks/xenoburger //Identification path for the object. +// name = "Xenoburger" //Name that displays in the UI. +// desc = "Smells caustic. Tastes like heresy." //Duh +// icon_state = "xburger" //Refers to an icon in food.dmi +// nutriment_amt = 2 //How much nutriment to add. +// bitesize = 3 //This is the amount each bite consumes. +///obj/item/weapon/reagent_containers/food/snacks/xenoburger/Initialize() //Don't mess with this. (We use Initialize now instead of New()) +// . = ..() //Same here. +// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste this line of code for all the contents. @@ -293,12 +293,12 @@ center_of_mass = list("x"=17, "y"=11) nutriment_amt = 8 nutriment_desc = list("apples" = 3,"salad" = 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/aesirsalad/Initialize() . = ..() reagents.add_reagent("doctorsdelight", 8) reagents.add_reagent("tricordrazine", 8) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/candy/donor name = "Donor Candy" @@ -306,11 +306,11 @@ trash = /obj/item/trash/candy nutriment_amt = 9 nutriment_desc = list("candy" = 10) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/candy/donor/Initialize() . = ..() reagents.add_reagent("sugar", 3) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/candy_corn name = "candy corn" @@ -321,11 +321,11 @@ center_of_mass = list("x"=14, "y"=10) nutriment_amt = 4 nutriment_desc = list("candy corn" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/candy_corn/Initialize() . = ..() reagents.add_reagent("sugar", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chocolatebar //not a vending item name = "Chocolate Bar" @@ -335,12 +335,12 @@ center_of_mass = list("x"=15, "y"=15) nutriment_amt = 2 nutriment_desc = list("chocolate" = 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chocolatebar/Initialize() . = ..() reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece name = "chocolate piece" @@ -373,12 +373,12 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 3 nutriment_desc = list("chocolate" = 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/Initialize() . = ..() reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/donut name = "donut" @@ -395,12 +395,12 @@ desc = "Goes great with Robust Coffee." icon_state = "donut1" nutriment_amt = 3 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/normal/Initialize() . = ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("nutriment", 3, nutriment_desc) reagents.add_reagent("sprinkles", 1) - src.bitesize = 3 if(prob(30)) src.icon_state = "donut2" src.overlay_state = "box-donut2" @@ -414,15 +414,15 @@ icon_state = "donut1" filling_color = "#ED11E6" nutriment_amt = 2 + bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/donut/chaos/Initialize() . = ..() reagents.add_reagent("sprinkles", 1) - bitesize = 10 var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) switch(chaosselect) if(1) - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("nutriment", 3, nutriment_desc) if(2) reagents.add_reagent("capsaicin", 3) if(3) @@ -454,12 +454,12 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) nutriment_amt = 3 + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/Initialize() . = ..() reagents.add_reagent("sprinkles", 1) reagents.add_reagent("berryjuice", 5) - bitesize = 5 if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" @@ -473,12 +473,12 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) nutriment_amt = 3 + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/donut/poisonberry/Initialize() . = ..() reagents.add_reagent("sprinkles", 1) reagents.add_reagent("poisonberryjuice", 5) - bitesize = 5 if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" @@ -492,12 +492,12 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) nutriment_amt = 3 + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/Initialize() . = ..() reagents.add_reagent("sprinkles", 1) reagents.add_reagent("slimejelly", 5) - bitesize = 5 if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" @@ -511,12 +511,12 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) nutriment_amt = 3 + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/Initialize() . = ..() reagents.add_reagent("sprinkles", 1) reagents.add_reagent("cherryjelly", 5) - bitesize = 5 if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" @@ -596,13 +596,13 @@ icon_state = "friedegg" filling_color = "#FFDF78" center_of_mass = list("x"=16, "y"=14) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/friedegg/Initialize() . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("sodiumchloride", 1) reagents.add_reagent("blackpepper", 1) - bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/boiledegg name = "Boiled egg" @@ -621,12 +621,12 @@ icon_state = "appendix" filling_color = "#E00D34" center_of_mass = list("x"=16, "y"=16) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/organ/Initialize() . = ..() reagents.add_reagent("protein", rand(3,5)) reagents.add_reagent("toxin", rand(1,3)) - src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofu name = "Tofu" @@ -636,10 +636,7 @@ center_of_mass = list("x"=17, "y"=10) nutriment_amt = 3 nutriment_desc = list("tofu" = 3, "goeyness" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/tofu/Initialize() - . = ..() - src.bitesize = 3 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofurkey name = "Tofurkey" @@ -649,11 +646,11 @@ center_of_mass = list("x"=16, "y"=8) nutriment_amt = 12 nutriment_desc = list("turkey" = 3, "tofu" = 5, "goeyness" = 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofurkey/Initialize() . = ..() reagents.add_reagent("stoxin", 3) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/stuffing name = "Stuffing" @@ -663,9 +660,6 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 3 nutriment_desc = list("dryness" = 2, "bread" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/stuffing/Initialize() - . = ..() bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/carpmeat @@ -674,6 +668,7 @@ icon_state = "fishfillet" filling_color = "#FFDEFE" center_of_mass = list("x"=17, "y"=13) + bitesize = 6 var/toxin_type = "carpotoxin" var/toxin_amount = 3 @@ -682,7 +677,6 @@ . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent(toxin_type, toxin_amount) - src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif desc = "A fillet of sivian fish meat." @@ -705,11 +699,11 @@ icon_state = "fishfingers" filling_color = "#FFDEFE" center_of_mass = list("x"=16, "y"=13) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/fishfingers/Initialize() . = ..() reagents.add_reagent("protein", 4) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/zestfish name = "Zesty Fish" @@ -717,11 +711,11 @@ icon_state = "zestfish" filling_color = "#FFDEFE" center_of_mass = list("x"=16, "y"=13) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/zestfish/Initialize() . = ..() reagents.add_reagent("protein", 4) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" @@ -731,11 +725,11 @@ center_of_mass = list("x"=17, "y"=16) nutriment_amt = 3 nutriment_desc = list("raw" = 2, "mushroom" = 2) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/Initialize() . = ..() reagents.add_reagent("psilocybin", 3) - src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" @@ -745,10 +739,7 @@ center_of_mass = list("x"=17, "y"=16) nutriment_amt = 3 nutriment_desc = list("raw" = 2, "tomato" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/tomatomeat/Initialize() - . = ..() - src.bitesize = 6 + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearmeat name = "bear meat" @@ -756,12 +747,12 @@ icon_state = "bearmeat" filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/bearmeat/Initialize() . = ..() reagents.add_reagent("protein", 12) reagents.add_reagent("hyperzine", 5) - src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "xenomeat" @@ -769,12 +760,12 @@ icon_state = "xenomeat" filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=10) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/xenomeat/Initialize() . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("pacid",6) - src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat // Substitute for recipes requiring xeno meat. name = "spider meat" @@ -782,12 +773,12 @@ icon_state = "xenomeat" filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=10) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat/Initialize() . = ..() reagents.add_reagent("spidertoxin",6) reagents.remove_reagent("pacid",6) - src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/meatball name = "meatball" @@ -795,11 +786,11 @@ icon_state = "meatball" filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=16) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatball/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sausage name = "Sausage" @@ -807,11 +798,11 @@ icon_state = "sausage" filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=16) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sausage/Initialize() . = ..() reagents.add_reagent("protein", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/donkpocket name = "Donk-pocket" @@ -820,23 +811,21 @@ icon_state = "donkpocket" filling_color = "#DEDEAB" center_of_mass = list("x"=16, "y"=10) - var/warm - var/list/heated_reagents + nutriment_amt = 2 + nutriment_desc = list("heartiness" = 1, "dough" = 2) + var/warm = FALSE + var/list/heated_reagents = list("tricordrazine" = 5) /obj/item/weapon/reagent_containers/food/snacks/donkpocket/Initialize() . = ..() - reagents.add_reagent("nutriment", 2) reagents.add_reagent("protein", 2) - warm = 0 - heated_reagents = list("tricordrazine" = 5) - /obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/heat() warm = 1 for(var/reagent in heated_reagents) reagents.add_reagent(reagent, heated_reagents[reagent]) bitesize = 6 - name = "Warm " + name + name = "warm [name]" cooltime() /obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/cooltime() @@ -871,12 +860,12 @@ icon_state = "brainburger" filling_color = "#F2B6EA" center_of_mass = list("x"=15, "y"=11) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/brainburger/Initialize() . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("alkysine", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostburger name = "Ghost Burger" @@ -886,9 +875,6 @@ center_of_mass = list("x"=16, "y"=11) nutriment_desc = list("buns" = 3, "spookiness" = 3) nutriment_amt = 2 - -/obj/item/weapon/reagent_containers/food/snacks/ghostburger/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human @@ -901,11 +887,11 @@ desc = "A bloody burger." icon_state = "hburger" center_of_mass = list("x"=16, "y"=11) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human/burger/Initialize() . = ..() reagents.add_reagent("protein", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheeseburger name = "cheeseburger" @@ -927,11 +913,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 3 nutriment_desc = list("bun" = 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkeyburger/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fishburger name = "Fillet -o- Carp Sandwich" @@ -939,11 +925,11 @@ icon_state = "fishburger" filling_color = "#FFDEFE" center_of_mass = list("x"=16, "y"=10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/fishburger/Initialize() . = ..() reagents.add_reagent("protein", 6) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofuburger name = "Tofu Burger" @@ -953,9 +939,6 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 6 nutriment_desc = list("bun" = 2, "pseudo-soy meat" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/tofuburger/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburger @@ -966,9 +949,6 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 2 nutriment_desc = list("bun" = 2, "metal" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/roburger/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburgerbig @@ -978,9 +958,6 @@ filling_color = "#CCCCCC" volume = 100 center_of_mass = list("x"=16, "y"=11) - -/obj/item/weapon/reagent_containers/food/snacks/roburgerbig/Initialize() - . = ..() bitesize = 0.1 /obj/item/weapon/reagent_containers/food/snacks/xenoburger @@ -989,11 +966,11 @@ icon_state = "xburger" filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=11) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xenoburger/Initialize() . = ..() reagents.add_reagent("protein", 8) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/clownburger name = "Clown Burger" @@ -1003,23 +980,17 @@ center_of_mass = list("x"=17, "y"=12) nutriment_amt = 6 nutriment_desc = list("bun" = 2, "clown shoe" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/clownburger/Initialize() - . = ..() bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/mimeburger name = "Mime Burger" desc = "Its taste defies language." icon_state = "mimeburger" filling_color = "#FFFFFF" center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 6 + nutriment_amt = 12 nutriment_desc = list("bun" = 2, "face paint" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/mimeburger/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/omelette @@ -1029,11 +1000,11 @@ trash = /obj/item/trash/plate filling_color = "#FFF9A8" center_of_mass = list("x"=16, "y"=13) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/omelette/Initialize() . = ..() reagents.add_reagent("protein", 8) - bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/muffin name = "Muffin" @@ -1043,10 +1014,6 @@ center_of_mass = list("x"=17, "y"=4) nutriment_amt = 6 nutriment_desc = list("sweetness" = 3, "muffin" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/muffin/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pie @@ -1059,11 +1026,11 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 4 nutriment_desc = list("pie" = 3, "cream" = 2) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/pie/Initialize() . = ..() reagents.add_reagent("banana",5) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) . = ..() @@ -1079,9 +1046,6 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 4 nutriment_desc = list("sweetness" = 2, "pie" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis/berry/Initialize() @@ -1101,9 +1065,6 @@ center_of_mass = list("x"=15, "y"=11) nutriment_amt = 8 nutriment_desc = list("waffle" = 8) - -/obj/item/weapon/reagent_containers/food/snacks/waffles/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggplantparm @@ -1115,9 +1076,6 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 6 nutriment_desc = list("cheese" = 3, "eggplant" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/eggplantparm/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylentgreen @@ -1127,11 +1085,11 @@ trash = /obj/item/trash/waffles filling_color = "#B8E6B5" center_of_mass = list("x"=15, "y"=11) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/Initialize() . = ..() reagents.add_reagent("protein", 10) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylenviridians name = "Soylen Virdians" @@ -1142,9 +1100,6 @@ center_of_mass = list("x"=15, "y"=11) nutriment_amt = 10 nutriment_desc = list("some sort of protein" = 10) //seasoned VERY well. - -/obj/item/weapon/reagent_containers/food/snacks/soylenviridians/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpie @@ -1154,11 +1109,11 @@ trash = /obj/item/trash/plate filling_color = "#948051" center_of_mass = list("x"=16, "y"=13) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpie/Initialize() . = ..() reagents.add_reagent("protein", 10) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofupie name = "Tofu-pie" @@ -1169,9 +1124,6 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 10 nutriment_desc = list("tofu" = 2, "pie" = 8) - -/obj/item/weapon/reagent_containers/food/snacks/tofupie/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/amanita_pie @@ -1182,12 +1134,12 @@ center_of_mass = list("x"=17, "y"=9) nutriment_amt = 5 nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/amanita_pie/Initialize() . = ..() reagents.add_reagent("amatoxin", 3) reagents.add_reagent("psilocybin", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plump_pie name = "plump pie" @@ -1197,17 +1149,15 @@ center_of_mass = list("x"=17, "y"=9) nutriment_amt = 8 nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/plump_pie/Initialize() . = ..() if(prob(10)) name = "exceptional plump pie" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("nutriment", 8, nutriment_desc) reagents.add_reagent("tricordrazine", 5) - bitesize = 2 - else - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xemeatpie name = "Xeno-pie" @@ -1216,11 +1166,11 @@ trash = /obj/item/trash/plate filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=13) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xemeatpie/Initialize() . = ..() reagents.add_reagent("protein", 10) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/wingfangchu name = "Wing Fang Chu" @@ -1229,11 +1179,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#43DE18" center_of_mass = list("x"=17, "y"=9) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/wingfangchu/Initialize() . = ..() reagents.add_reagent("protein", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human/kabob name = "-kabob" @@ -1242,11 +1192,11 @@ trash = /obj/item/stack/rods filling_color = "#A85340" center_of_mass = list("x"=17, "y"=15) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human/kabob/Initialize() . = ..() reagents.add_reagent("protein", 8) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkeykabob name = "Meat-kabob" @@ -1255,11 +1205,11 @@ trash = /obj/item/stack/rods filling_color = "#A85340" center_of_mass = list("x"=17, "y"=15) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkeykabob/Initialize() . = ..() reagents.add_reagent("protein", 8) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofukabob name = "Tofu-kabob" @@ -1267,15 +1217,11 @@ desc = "Vegan meat, on a stick." trash = /obj/item/stack/rods filling_color = "#FFFEE0" - + bitesize = 2 center_of_mass = list("x"=17, "y"=15) nutriment_amt = 8 nutriment_desc = list("tofu" = 3, "metal" = 1) -/obj/item/weapon/reagent_containers/food/snacks/tofukabob/Initialize() - . = ..() - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/cubancarp name = "Cuban Carp" desc = "A sandwich that burns your tongue and then leaves it numb!" @@ -1285,12 +1231,12 @@ center_of_mass = list("x"=12, "y"=5) nutriment_amt = 3 nutriment_desc = list("toasted bread" = 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cubancarp/Initialize() . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("capsaicin", 3) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/popcorn name = "Popcorn" @@ -1302,12 +1248,12 @@ center_of_mass = list("x"=16, "y"=8) nutriment_amt = 2 nutriment_desc = list("popcorn" = 3) + bitesize = 0.1 //This snack is supposed to be eaten for a long time. /obj/item/weapon/reagent_containers/food/snacks/popcorn/Initialize() . = ..() unpopped = rand(1,10) - bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 /obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() if(prob(unpopped)) //lol ...what's the point? @@ -1323,11 +1269,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 3 nutriment_desc = list("baked potato" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fries name = "Space Fries" @@ -1338,9 +1284,6 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 4 nutriment_desc = list("fresh fries" = 4) - -/obj/item/weapon/reagent_containers/food/snacks/fries/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bangersandmash @@ -1352,11 +1295,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 4 nutriment_desc = list("fluffy potato" = 3, "sausage" = 2) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/bangersandmash/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/cheesymash name = "Cheesy Mashed Potato" @@ -1367,11 +1310,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 4 nutriment_desc = list("cheesy potato" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesymash/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/blackpudding name = "Black Pudding" @@ -1379,12 +1322,12 @@ icon_state = "blackpudding" filling_color = "#FF0000" center_of_mass = list("x"=16, "y"=7) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/blackpudding/Initialize() . = ..() reagents.add_reagent("protein", 2) reagents.add_reagent("blood", 5) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/soydope name = "Soy Dope" @@ -1395,9 +1338,6 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 2 nutriment_desc = list("slime" = 2, "soy" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/soydope/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spagetti @@ -1408,9 +1348,6 @@ center_of_mass = list("x"=16, "y"=16) nutriment_amt = 1 nutriment_desc = list("noodles" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/spagetti/Initialize() - . = ..() bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cheesyfries @@ -1422,11 +1359,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 4 nutriment_desc = list("fresh fries" = 3, "cheese" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesyfries/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fortunecookie name = "Fortune cookie" @@ -1436,9 +1373,6 @@ center_of_mass = list("x"=15, "y"=14) nutriment_amt = 3 nutriment_desc = list("fortune cookie" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/badrecipe @@ -1447,12 +1381,12 @@ icon_state = "badrecipe" filling_color = "#211F02" center_of_mass = list("x"=16, "y"=12) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/badrecipe/Initialize() . = ..() reagents.add_reagent("toxin", 1) reagents.add_reagent("carbon", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatsteak name = "Meat steak" @@ -1509,9 +1443,6 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 5 nutriment_desc = list("poppy seeds" = 2, "pretzel" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/poppypretzel/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatballsoup @@ -1616,25 +1547,25 @@ var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) switch(mysteryselect) if(1) - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("nutriment", 6, nutriment_desc) reagents.add_reagent("capsaicin", 3) reagents.add_reagent("tomatojuice", 2) if(2) - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("nutriment", 6, nutriment_desc) reagents.add_reagent("frostoil", 3) reagents.add_reagent("tomatojuice", 2) if(3) - reagents.add_reagent("nutriment", 5) + reagents.add_reagent("nutriment", 5, nutriment_desc) reagents.add_reagent("water", 5) reagents.add_reagent("tricordrazine", 5) if(4) - reagents.add_reagent("nutriment", 5) + reagents.add_reagent("nutriment", 5, nutriment_desc) reagents.add_reagent("water", 10) if(5) - reagents.add_reagent("nutriment", 2) + reagents.add_reagent("nutriment", 2, nutriment_desc) reagents.add_reagent("banana", 10) if(6) - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("nutriment", 6, nutriment_desc) reagents.add_reagent("blood", 10) if(7) reagents.add_reagent("slimejelly", 10) @@ -1643,10 +1574,10 @@ reagents.add_reagent("carbon", 10) reagents.add_reagent("toxin", 10) if(9) - reagents.add_reagent("nutriment", 5) + reagents.add_reagent("nutriment", 5, nutriment_desc) reagents.add_reagent("tomatojuice", 10) if(10) - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("nutriment", 6, nutriment_desc) reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) @@ -1789,9 +1720,6 @@ filling_color = "#D505FF" nutriment_amt = 6 nutriment_desc = list("magic" = 3, "buns" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/spellburger/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger @@ -1972,9 +1900,6 @@ center_of_mass = list("x"=16, "y"=8) nutriment_amt = 1 nutriment_desc = list("toasted bread" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry/Initialize() @@ -1993,9 +1918,6 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 5 nutriment_desc = list("buns" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/jellyburger/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime/Initialize() @@ -2028,9 +1950,6 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 8 nutriment_desc = list("soy" = 4, "tomato" = 4) - -/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti @@ -2042,9 +1961,6 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 2 nutriment_desc = list("noodles" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledrice @@ -2056,9 +1972,6 @@ center_of_mass = list("x"=17, "y"=11) nutriment_amt = 2 nutriment_desc = list("rice" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/boiledrice/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ricepudding @@ -2070,9 +1983,6 @@ center_of_mass = list("x"=17, "y"=11) nutriment_amt = 4 nutriment_desc = list("rice" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/ricepudding/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/kudzudonburi @@ -2171,9 +2081,6 @@ center_of_mass = list("x"=15, "y"=13) nutriment_amt = 3 nutriment_desc = list("apple" = 3, "caramel" = 3, "sweetness" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/candiedapple/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/applepie @@ -2184,9 +2091,6 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 4 nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/applepie/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cherrypie @@ -2197,9 +2101,6 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 4 nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/cherrypie/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/twobread @@ -2211,9 +2112,6 @@ center_of_mass = list("x"=15, "y"=12) nutriment_amt = 2 nutriment_desc = list("sourness" = 2, "bread" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/twobread/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich @@ -2225,9 +2123,6 @@ center_of_mass = list("x"=16, "y"=8) nutriment_amt = 2 nutriment_desc = list("bread" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime/Initialize() @@ -2299,9 +2194,6 @@ center_of_mass = list("x"=17, "y"=10) nutriment_amt = 8 nutriment_desc = list("mushroom" = 8, "milk" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit @@ -2319,9 +2211,7 @@ if(prob(10)) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - else - reagents.add_reagent("nutriment", 5) + reagents.add_reagent("nutriment", 3, nutriment_desc) /obj/item/weapon/reagent_containers/food/snacks/chawanmushi name = "chawanmushi" @@ -2360,9 +2250,6 @@ center_of_mass = list("x"=17, "y"=11) nutriment_amt = 8 nutriment_desc = list("salad" = 2, "tomato" = 2, "carrot" = 2, "apple" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/tossedsalad/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/validsalad @@ -2442,11 +2329,11 @@ center_of_mass = list("x"=19, "y"=9) nutriment_desc = list("bread" = 10) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread/Initialize() . = ..() reagents.add_reagent("protein", 20) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/meatbread name = "meatbread slice" @@ -2471,11 +2358,11 @@ center_of_mass = list("x"=16, "y"=9) nutriment_desc = list("bread" = 10) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread/Initialize() . = ..() reagents.add_reagent("protein", 20) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/xenomeatbread name = "xenomeatbread slice" @@ -2501,11 +2388,11 @@ center_of_mass = list("x"=16, "y"=9) nutriment_desc = list("bread" = 10) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread/Initialize() . = ..() reagents.add_reagent("banana", 20) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/bananabread name = "Banana-nut bread slice" @@ -2530,9 +2417,6 @@ center_of_mass = list("x"=16, "y"=9) nutriment_desc = list("tofu" = 10) nutriment_amt = 10 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/tofubread @@ -2618,11 +2502,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_desc = list("cake" = 10, "cream" = 10, "cheese" = 15) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake/Initialize() . = ..() reagents.add_reagent("protein", 15) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/cheesecake name = "Cheese Cake slice" @@ -2647,11 +2531,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_desc = list("cake" = 10, "peanuts" = 15) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake/Initialize() . = ..() reagents.add_reagent("protein", 5) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/peanutcake name = "Peanut Cake slice" @@ -2799,11 +2683,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_desc = list("cheese" = 10) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel/Initialize() . = ..() reagents.add_reagent("protein", 10) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesewedge name = "Cheese wedge" @@ -2823,11 +2707,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_desc = list("cake" = 10, "sweetness" = 10) nutriment_amt = 20 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake/Initialize() . = ..() reagents.add_reagent("sprinkles", 10) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/slice/birthdaycake name = "Birthday Cake slice" @@ -2852,9 +2736,6 @@ center_of_mass = list("x"=16, "y"=9) nutriment_desc = list("bread" = 6) nutriment_amt = 6 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/bread @@ -2881,11 +2762,11 @@ center_of_mass = list("x"=16, "y"=9) nutriment_desc = list("bread" = 6, "cream" = 3, "cheese" = 3) nutriment_amt = 5 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread/Initialize() . = ..() reagents.add_reagent("protein", 15) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/creamcheesebread name = "Cream Cheese Bread slice" @@ -2985,12 +2866,12 @@ center_of_mass = list("x"=16, "y"=11) nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) nutriment_amt = 35 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita/Initialize() . = ..() reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/margherita name = "Margherita slice" @@ -3044,12 +2925,12 @@ center_of_mass = list("x"=16, "y"=11) nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza/Initialize() . = ..() reagents.add_reagent("protein", 34) reagents.add_reagent("tomatojuice", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza name = "Meatpizza slice" @@ -3072,11 +2953,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "mushroom" = 10) nutriment_amt = 35 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/Initialize() . = ..() reagents.add_reagent("protein", 5) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/mushroompizza name = "Mushroompizza slice" @@ -3128,13 +3009,13 @@ center_of_mass = list("x"=16, "y"=11) nutriment_desc = list("stale pizza crust" = 10, "moldy tomato" = 10, "moldy cheese" = 5) nutriment_amt = 10 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza/Initialize() . = ..() reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) reagents.add_reagent("mold", 8) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/oldpizza name = "moldy pizza slice" @@ -3345,11 +3226,11 @@ center_of_mass = list("x"=16, "y"=7) nutriment_amt = 6 nutriment_desc = list("a chorus of flavor" = 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/dionaroast/Initialize() . = ..() reagents.add_reagent("radium", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/dough name = "dough" @@ -3380,12 +3261,13 @@ icon_state = "flat dough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 + nutriment_amt = 3 + nutriment_desc = list("raw dough" = 3) center_of_mass = list("x"=16, "y"=16) /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/Initialize() . = ..() reagents.add_reagent("protein", 1) - reagents.add_reagent("nutriment", 3) /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "dough slice" @@ -3399,9 +3281,6 @@ nutriment_amt = 1 nutriment_desc = list("uncooked dough" = 1) -/obj/item/weapon/reagent_containers/food/snacks/doughslice/Initialize() - . = ..() - /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" desc = "A base for any self-respecting burger." @@ -3412,9 +3291,6 @@ nutriment_amt = 4 nutriment_desc = "bun" -/obj/item/weapon/reagent_containers/food/snacks/bun/Initialize() - . = ..() - /obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/weapon/W as obj, mob/user as mob) // Bun + meatball = burger if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/meatball)) @@ -3468,9 +3344,6 @@ nutriment_amt = 8 nutriment_desc = list("bun" = 8) -/obj/item/weapon/reagent_containers/food/snacks/bunbun/Initialize() - . = ..() - /obj/item/weapon/reagent_containers/food/snacks/taco name = "taco" desc = "Take a bite!" @@ -3549,9 +3422,6 @@ nutriment_amt = 3 nutriment_desc = list("bread" = 3) -/obj/item/weapon/reagent_containers/food/snacks/flatbread/Initialize() - . = ..() - // potato + knife = raw sticks /obj/item/weapon/reagent_containers/food/snacks/grown/attackby(obj/item/weapon/W, mob/user) if(seed && seed.kitchen_tag && seed.kitchen_tag == "potato" && istype(W,/obj/item/weapon/material/knife)) @@ -3575,9 +3445,6 @@ nutriment_amt = 3 nutriment_desc = list("raw potato" = 3) -/obj/item/weapon/reagent_containers/food/snacks/rawsticks/Initialize() - . = ..() - /obj/item/weapon/reagent_containers/food/snacks/rawsunflower name = "sunflower seeds" desc = "Raw sunflower seeds, alright. They look too damaged to plant." @@ -3588,9 +3455,6 @@ nutriment_amt = 1 nutriment_desc = list("starch" = 3) -/obj/item/weapon/reagent_containers/food/snacks/rawsunflower/Initialize() - . = ..() - /obj/item/weapon/reagent_containers/food/snacks/frostbelle name = "frostbelle bud" desc = "A frostbelle flower from Sif. Its petals shimmer with an inner light." @@ -3718,9 +3582,6 @@ center_of_mass = list("x"=17, "y"=16) nutriment_amt = 6 nutriment_desc = list("bread" = 2, "sweetness" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/tastybread/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks @@ -3734,9 +3595,6 @@ center_of_mass = list("x"=15, "y"=12) nutriment_amt = 10 nutriment_desc = list("mushroom" = 5, "salt" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/skrellsnacks/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/unajerky @@ -3763,11 +3621,11 @@ filling_color = "#FFDEFE" icon_state = "sashimi" nutriment_amt = 6 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sashimi/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/benedict name = "eggs benedict" @@ -3775,11 +3633,12 @@ filling_color = "#FFDF78" icon_state = "benedict" nutriment_amt = 4 + nutriment_desc = list("bread" = 2, "bacon" = 2, "egg" = 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/benedict/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/beans name = "baked beans" @@ -3788,9 +3647,6 @@ icon_state = "beans" nutriment_amt = 4 nutriment_desc = list("beans" = 4) - -/obj/item/weapon/reagent_containers/food/snacks/beans/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sugarcookie @@ -3800,9 +3656,6 @@ icon_state = "sugarcookie" nutriment_amt = 5 nutriment_desc = list("sweetness" = 4, "cookie" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/Initialize() - . = ..() bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/berrymuffin @@ -3813,10 +3666,6 @@ center_of_mass = list("x"=17, "y"=4) nutriment_amt = 6 nutriment_desc = list("sweetness" = 2, "muffin" = 2, "berries" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/berrymuffin/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/berrymuffin/berry/Initialize() @@ -3835,21 +3684,15 @@ center_of_mass = list("x"=17, "y"=4) nutriment_amt = 6 nutriment_desc = list("spookiness" = 4, "muffin" = 1, "berries" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/ghostmuffin/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostmuffin/berry/Initialize() . = ..() reagents.add_reagent("berryjuice", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostmuffin/poison/Initialize() . = ..() reagents.add_reagent("poisonberryjuice", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggroll name = "egg roll" @@ -3859,12 +3702,11 @@ center_of_mass = list("x"=17, "y"=4) nutriment_amt = 4 nutriment_desc = list("egg" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggroll/Initialize() . = ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("protein", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/devilledegg name = "devilled eggs" @@ -3878,7 +3720,6 @@ /obj/item/weapon/reagent_containers/food/snacks/devilledegg/Initialize() . = ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("capsaicin", 2) /obj/item/weapon/reagent_containers/food/snacks/fruitsalad @@ -3888,10 +3729,6 @@ filling_color = "#FF3867" nutriment_amt = 10 nutriment_desc = list("fruit" = 10) - -/obj/item/weapon/reagent_containers/food/snacks/fruitsalad/Initialize() - . = ..() - reagents.add_reagent("nutriment", 10) bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/flowerchildsalad @@ -3901,10 +3738,6 @@ filling_color = "#FF3867" nutriment_amt = 10 nutriment_desc = list("bittersweet" = 10) - -/obj/item/weapon/reagent_containers/food/snacks/flowerchildsalad/Initialize() - . = ..() - reagents.add_reagent("nutriment", 10) bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/rosesalad @@ -3912,13 +3745,12 @@ desc = "A fragrant salad." icon_state = "rosesalad" filling_color = "#FF3867" - nutriment_amt = 5 + nutriment_amt = 10 nutriment_desc = list("bittersweet" = 10, "iron" = 5) bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/rosesalad/Initialize() . = ..() - reagents.add_reagent("nutriment", 10) reagents.add_reagent("stoxin", 2) /obj/item/weapon/reagent_containers/food/snacks/eggbowl @@ -3929,23 +3761,18 @@ filling_color = "#FFFBDB" nutriment_amt = 6 nutriment_desc = list("rice" = 2, "egg" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggbowl/Initialize() . = ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("protein", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tortilla name = "tortilla" desc = "The base for all your burritos." icon_state = "tortilla" - nutriment_amt = 1 - nutriment_desc = list("bread" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/tortilla/Initialize() - . = ..() - reagents.add_reagent("nutriment", 2) + nutriment_amt = 2 + nutriment_desc = list("bread" = 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cubannachos @@ -3958,7 +3785,6 @@ /obj/item/weapon/reagent_containers/food/snacks/cubannachos/Initialize() . = ..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("capsaicin", 4) /obj/item/weapon/reagent_containers/food/snacks/curryrice @@ -3971,7 +3797,6 @@ /obj/item/weapon/reagent_containers/food/snacks/curryrice/Initialize() . = ..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("capsaicin", 4) /obj/item/weapon/reagent_containers/food/snacks/piginblanket @@ -3980,25 +3805,11 @@ icon_state = "piginblanket" nutriment_amt = 6 nutriment_desc = list("meat" = 3, "pastry" = 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/piginblanket/Initialize() . = ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("protein", 4) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/piginblanket - name = "pig in a blanket" - desc = "A sausage embedded in soft, fluffy pastry. Free this pig from its blanket prison by eating it." - icon_state = "piginblanket" - nutriment_amt = 6 - nutriment_desc = list("meat" = 3, "pastry" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/piginblanket/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("protein", 4) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/wormsickly name = "sickly worm" @@ -4066,63 +3877,46 @@ name = "plain bagel" desc = "This bread's got chutzpah!" icon_state = "bagelplain" - nutriment_amt = 3 - nutriment_desc = list("bread" = 1) + nutriment_amt = 6 + nutriment_desc = list("bread" = 6) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/bagelplain/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - /obj/item/weapon/reagent_containers/food/snacks/bagelsunflower name = "sunflower seed bagel" desc = "This bread's got chutzpah - and sunflower seeds!" icon_state = "bagelsunflower" - nutriment_amt = 4 - nutriment_desc = list("bread" = 1, "sunflower seeds" = 1) + nutriment_amt = 7 + nutriment_desc = list("bread" = 4, "sunflower seeds" = 3) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/bagelsunflower/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - /obj/item/weapon/reagent_containers/food/snacks/bagelcheese name = "cheese bagel" desc = "This bread's got cheese n' chutzpah!" icon_state = "bagelcheese" - nutriment_amt = 4 - nutriment_desc = list("bread" = 1, "cheese" = 1) + nutriment_amt = 8 + nutriment_desc = list("bread" = 4, "cheese" = 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelcheese/Initialize() . = ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/bagelraisin name = "cinnamon raisin bagel" desc = "This bread's got... Raisins!" icon_state = "bagelraisin" - nutriment_amt = 5 - nutriment_desc = list("bread" = 1, "sweetness" = 1) + nutriment_amt = 8 + nutriment_desc = list("bread" = 4, "sweetness" = 4) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/bagelraisin/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - /obj/item/weapon/reagent_containers/food/snacks/bagelpoppy name = "poppy seed bagel" desc = "This bread's got Chutzpah, and poppy seeds!" icon_state = "bagelpoppy" - nutriment_amt = 5 + nutriment_amt = 6 nutriment_desc = list("bread" = 1, "sweetness" = 1) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/bagelpoppy/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - /obj/item/weapon/reagent_containers/food/snacks/bageleverything name = "everything bagel" desc = "Mmm... Immeasurably unfathomable!" @@ -4398,9 +4192,6 @@ nutriment_amt = 4 nutriment_desc = list("soggy fries" = 4) center_of_mass = list("x"=16, "y"=11) - -/obj/item/weapon/reagent_containers/food/snacks/microchips/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ovenchips @@ -4413,9 +4204,6 @@ nutriment_amt = 4 nutriment_desc = list("crisp, dry fries" = 4) center_of_mass = list("x"=16, "y"=11) - -/obj/item/weapon/reagent_containers/food/snacks/ovenchips/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/crunch @@ -4453,12 +4241,12 @@ filling_color = "#Ef1479" center_of_mass = list("x"=16, "y"=12) do_coating_prefix = 0 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/funnelcake/Initialize() . = ..() reagents.add_reagent("batter", 10) reagents.add_reagent("sugar", 5) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spreads name = "nutri-spread" @@ -5150,11 +4938,11 @@ icon_state = "carneburrito" nutriment_amt = 6 nutriment_desc = list("tortilla" = 3, "meat" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatburrito/Initialize() . = ..() reagents.add_reagent("protein", 6) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito name = "Cheese burrito" @@ -5162,12 +4950,11 @@ icon_state = "cheeseburrito" nutriment_amt = 6 nutriment_desc = list("tortilla" = 3, "cheese" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito/Initialize() . = ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("protein", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese_spicy name = "spicy cheese burrito" @@ -5189,12 +4976,11 @@ icon_state = "fuegoburrito" nutriment_amt = 6 nutriment_desc = list("chilli peppers" = 5, "tortilla" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito/Initialize() . = ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("capsaicin", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/breakfast_wrap name = "breakfast burrito" @@ -5323,11 +5109,11 @@ nutriment_amt = 8 nutriment_desc = list("savory meat and rice" = 8) center_of_mass = list("x"=16, "y"=8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/redcurry/Initialize() . = ..() reagents.add_reagent("protein", 7) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/greencurry name = "green curry" @@ -5340,12 +5126,12 @@ nutriment_amt = 12 nutriment_desc = list("tofu and rice" = 12) center_of_mass = list("x"=16, "y"=8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/greencurry/Initialize() . = ..() reagents.add_reagent("protein", 1) reagents.add_reagent("capsaicin", 2) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/yellowcurry name = "yellow curry" @@ -5358,11 +5144,11 @@ nutriment_amt = 13 nutriment_desc = list("rice and potatoes" = 13) center_of_mass = list("x"=16, "y"=8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/yellowcurry/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/bearburger name = "bearburger" @@ -5371,11 +5157,11 @@ icon_state = "bearburger" filling_color = "#5d5260" center_of_mass = list("x"=15, "y"=11) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/bearburger/Initialize() . = ..() reagents.add_reagent("protein", 4) //So spawned burgers will not be empty I guess? - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/bearchili name = "bear chili" @@ -5388,6 +5174,7 @@ nutriment_amt = 3 nutriment_desc = list("dark, hearty chili" = 3) center_of_mass = list("x"=15, "y"=9) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearchili/Initialize() . = ..() @@ -5395,7 +5182,6 @@ reagents.add_reagent("capsaicin", 3) reagents.add_reagent("tomatojuice", 2) reagents.add_reagent("hyperzine", 5) - bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearstew name = "bear stew" @@ -5407,6 +5193,7 @@ nutriment_amt = 6 nutriment_desc = list("hearty stew" = 6) center_of_mass = list("x"=16, "y"=5) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearstew/Initialize() . = ..() @@ -5415,7 +5202,6 @@ reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) reagents.add_reagent("water", 5) - bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bibimbap name = "bibimbap bowl" @@ -5427,11 +5213,11 @@ nutriment_amt = 10 nutriment_desc = list("egg" = 5, "vegetables" = 5) center_of_mass = list("x"=15, "y"=9) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/bibimbap/Initialize() . = ..() reagents.add_reagent("protein", 10) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/lomein name = "lo mein" @@ -5444,11 +5230,11 @@ nutriment_amt = 8 nutriment_desc = list("noodles" = 6, "sesame sauce" = 2) center_of_mass = list("x"=16, "y"=10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/lomein/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/friedrice name = "fried rice" @@ -5461,9 +5247,6 @@ nutriment_amt = 7 nutriment_desc = list("rice" = 7) center_of_mass = list("x"=17, "y"=11) - -/obj/item/weapon/reagent_containers/food/snacks/friedrice/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chickenfillet @@ -5475,11 +5258,11 @@ nutriment_amt = 4 nutriment_desc = list("breading" = 4) center_of_mass = list("x"=16, "y"=16) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/chickenfillet/Initialize() . = ..() reagents.add_reagent("protein", 8) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup name = "chicken noodle soup" @@ -5491,12 +5274,12 @@ nutriment_amt = 6 nutriment_desc = list("warm soup" = 6) center_of_mass = list("x"=16, "y"=5) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup/Initialize() . = ..() reagents.add_reagent("protein", 4) reagents.add_reagent("water", 5) - bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries name = "chili cheese fries" @@ -5509,12 +5292,12 @@ nutriment_amt = 8 nutriment_desc = list("hearty, cheesy fries" = 8) center_of_mass = list("x"=16, "y"=11) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries/Initialize() . = ..() reagents.add_reagent("protein", 2) reagents.add_reagent("capsaicin", 2) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/friedmushroom name = "fried mushroom" @@ -5525,11 +5308,11 @@ nutriment_amt = 4 nutriment_desc = list("alcoholic mushrooms" = 4) center_of_mass = list("x"=16, "y"=11) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/friedmushroom/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/pisanggoreng name = "pisang goreng" @@ -5542,11 +5325,11 @@ nutriment_amt = 8 nutriment_desc = list("sweet bananas" = 8) center_of_mass = list("x"=16, "y"=11) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/pisanggoreng/Initialize() . = ..() reagents.add_reagent("protein", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meatbun name = "meat and leaf bun" @@ -5557,10 +5340,10 @@ nutriment_amt = 5 nutriment_desc = list("fried meat" = 5) center_of_mass = list("x"=16, "y"=11) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatbun/Initialize() . = ..() - bitesize = 2 reagents.add_reagent("protein", 4) /obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun @@ -5572,11 +5355,11 @@ nutriment_amt = 5 nutriment_desc = list("char sui" = 5) center_of_mass = list("x"=16, "y"=11) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/custardbun name = "custard bun" @@ -5587,11 +5370,11 @@ nutriment_desc = list("egg custard" = 6) filling_color = "#ebedc2" center_of_mass = list("x"=16, "y"=11) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/custardbun/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/chickenmomo name = "chicken momo" @@ -5604,11 +5387,11 @@ nutriment_amt = 9 nutriment_desc = list("spiced chicken" = 9) center_of_mass = list("x"=15, "y"=9) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/chickenmomo/Initialize() . = ..() reagents.add_reagent("protein", 6) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/veggiemomo name = "veggie momo" @@ -5621,11 +5404,11 @@ nutriment_amt = 13 nutriment_desc = list("spiced vegetables" = 13) center_of_mass = list("x"=15, "y"=9) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/veggiemomo/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/risotto name = "risotto" @@ -5638,11 +5421,11 @@ nutriment_amt = 9 nutriment_desc = list("savory rice" = 6, "cream" = 3) center_of_mass = list("x"=15, "y"=9) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/risotto/Initialize() . = ..() reagents.add_reagent("protein", 1) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/risottoballs name = "risotto balls" @@ -5655,9 +5438,6 @@ nutriment_amt = 1 nutriment_desc = list("batter" = 1) center_of_mass = list("x"=15, "y"=9) - -/obj/item/weapon/reagent_containers/food/snacks/risottoballs/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/honeytoast @@ -5670,9 +5450,6 @@ nutriment_amt = 1 nutriment_desc = list("sweet, crunchy bread" = 1) center_of_mass = list("x"=16, "y"=9) - -/obj/item/weapon/reagent_containers/food/snacks/honeytoast/Initialize() - . = ..() bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/poachedegg @@ -5685,12 +5462,12 @@ nutriment_amt = 1 nutriment_desc = list("egg" = 1) center_of_mass = list("x"=16, "y"=14) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/poachedegg/Initialize() . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("blackpepper", 1) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ribplate name = "plate of ribs" @@ -5702,6 +5479,7 @@ nutriment_amt = 6 nutriment_desc = list("barbecue" = 6) center_of_mass = list("x"=16, "y"=13) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/ribplate/Initialize() . = ..() @@ -5709,7 +5487,6 @@ reagents.add_reagent("triglyceride", 2) reagents.add_reagent("blackpepper", 1) reagents.add_reagent("honey", 5) - bitesize = 4 //Sliceables @@ -5790,11 +5567,11 @@ nutriment_amt = 8 nutriment_desc = list("fudge" = 8) center_of_mass = list("x"=15, "y"=9) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/brownies/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/browniesslice name = "brownie" @@ -5827,6 +5604,7 @@ nutriment_amt = 8 nutriment_desc = list("fudge" = 8) center_of_mass = list("x"=15, "y"=9) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sliceable/cosmicbrownies/Initialize() . = ..() @@ -5835,7 +5613,6 @@ reagents.add_reagent("bicaridine", 1) reagents.add_reagent("kelotane", 1) reagents.add_reagent("toxin", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice name = "cosmic brownie" @@ -5872,12 +5649,10 @@ desc = "A crème caramel of astronomical size." icon = 'icons/obj/food.dmi' icon_state = "gigapuddi" - trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/gigapuddi/New() - ..() - reagents.add_reagent("nutriment", 20) + nutriment_amt = 20 + nutriment_desc = list("caramel" = 20) bitesize = 2 + trash = /obj/item/trash/plate /obj/item/weapon/reagent_containers/food/snacks/gigapuddi/happy desc = "A crème caramel of astronomical size, made with extra love." @@ -5896,14 +5671,15 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/bucheslice slices_num = 5 w_class = 2 + nutriment_amt = 20 + nutriment_desc = list("spongy cake" = 20) + bitesize = 3 trash = /obj/item/trash/tray -/obj/item/weapon/reagent_containers/food/snacks/sliceable/buchedenoel/New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/buchedenoel/Initialize() + . = ..() reagents.add_reagent("sugar", 9) reagents.add_reagent("coco", 5) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/bucheslice name = "\improper Buche de Noel slice" @@ -5921,15 +5697,16 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice slices_num = 6 w_class = 2 + nutriment_amt = 20 + nutriment_desc = list("turkey" = 20) + bitesize = 5 trash = /obj/item/trash/tray -/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey/New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey/Initialize() + . = ..() reagents.add_reagent("blackpepper", 1) reagents.add_reagent("sodiumchloride", 1) reagents.add_reagent("cornoil", 1) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/turkeyslice name = "turkey drumstick" @@ -5946,12 +5723,13 @@ slices_num = 10 icon = 'icons/obj/food.dmi' icon_state = "suppermatter" + nutriment_amt = 48 + nutriment_desc = list("pure power" = 48) + bitesize = 12 w_class = 2 -/obj/item/weapon/reagent_containers/food/snacks/sliceable/suppermatter/New() - ..() - reagents.add_reagent("nutriment", 48) - bitesize = 12 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/suppermatter/Initialize() + . = ..() set_light(1.4,2,"#FFFF00") /obj/item/weapon/reagent_containers/food/snacks/suppermattershard @@ -5962,8 +5740,8 @@ bitesize = 3 trash = null -/obj/item/weapon/reagent_containers/food/snacks/suppermattershard/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/suppermattershard/Initialize() + . = ..() set_light(1.4,1.4,"#FFFF00") /obj/item/weapon/reagent_containers/food/snacks/sliceable/excitingsuppermatter @@ -5973,12 +5751,13 @@ slices_num = 10 icon = 'icons/obj/food.dmi' icon_state = "excitingsuppermatter" + nutriment_amt = 60 + nutriment_desc = list("pure, indescribable power" = 60) + bitesize = 12 w_class = 2 -/obj/item/weapon/reagent_containers/food/snacks/sliceable/excitingsuppermatter/New() - ..() - reagents.add_reagent("nutriment", 60) - bitesize = 12 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/excitingsuppermatter/Initialize() + . = ..() set_light(1.4,2,"#FF0000") /obj/item/weapon/reagent_containers/food/snacks/excitingsuppermattershard @@ -5989,8 +5768,8 @@ bitesize = 4 trash = null -/obj/item/weapon/reagent_containers/food/snacks/excitingsuppermattershard/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/excitingsuppermattershard/Initialize() + . = ..() set_light(1.4,1.4,"#FF0000") /obj/item/weapon/reagent_containers/food/snacks/omurice @@ -5999,10 +5778,8 @@ icon = 'icons/obj/food.dmi' icon_state = "omurice" trash = /obj/item/trash/plate - -/obj/item/weapon/reagent_containers/food/snacks/omurice/New() - ..() - reagents.add_reagent("nutriment", 8) + nutriment_amt = 8 + nutriment_desc = list("rice" = 4, "egg" = 4) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/omurice/heart @@ -6019,10 +5796,8 @@ icon = 'icons/obj/food.dmi' icon_state = "cinnamonbun" trash = null - -/obj/item/weapon/reagent_containers/food/snacks/cinnamonbun/New() - ..() - reagents.add_reagent("nutriment", 8) + nutriment_amt = 8 + nutriment_desc = list("cinnamon sugar" = 4, "frosting" = 4) bitesize = 1 ////////////////////Candy Vend Items/////////////////////////////////////////////////////////////// @@ -6103,12 +5878,12 @@ trash = /obj/item/trash/candy/proteinbar nutriment_amt = 9 nutriment_desc = list("candy" = 1, "protein" = 8) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar/Initialize() . = ..() reagents.add_reagent("protein", 4) reagents.add_reagent("sugar", 4) - bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/candy/gummy name = "\improper AlliCo Gummies" @@ -6118,16 +5893,12 @@ icon_state = "candy_gums" trash = /obj/item/trash/candy/gums nutriment_amt = 5 - nutriment_desc = list("sugar" = 1, "artificial fruit flavour" = 1) + nutriment_desc = list("artificial fruit flavour" = 2) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/candy/gummy/Initialize() . = ..() reagents.add_reagent("sugar", 5) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/cookiesnack/Initialize() - . = ..() - bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cookiesnack name = "Carps Ahoy! miniature cookies" @@ -6139,9 +5910,6 @@ filling_color = "#DBC94F" nutriment_amt = 3 nutriment_desc = list("sweetness" = 1, "stale cookie" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/cookiesnack/Initialize() - . = ..() bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/fruitbar @@ -6151,14 +5919,13 @@ icon = 'icons/obj/food_snacks.dmi' icon_state = "fruitbar" trash = /obj/item/trash/candy/fruitbar - nutriment_amt = 9 + nutriment_amt = 13 nutriment_desc = list("apricot" = 2, "sugar" = 2, "dates" = 2, "cranberry" = 2, "apple" = 2) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar/Initialize() . = ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("sugar", 4) - bitesize = 6 ////////////////////Candy Bars (1-10)/////////////////////////////////////////////////////////////// @@ -6172,11 +5939,11 @@ nutriment_amt = 4 nutriment_desc = list("stale chocolate" = 2, "nougat" = 1, "caramel" = 1) w_class = 1 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb01/Initialize() . = ..() reagents.add_reagent("sugar", 1) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb02 name = "\improper Hundred-Thousand Thaler Bar" @@ -6188,11 +5955,11 @@ nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "caramel" = 1, "puffed rice" = 1) w_class = 1 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb02/Initialize() . = ..() reagents.add_reagent("sugar", 1) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb03 name = "\improper Aerostat Bar" @@ -6204,11 +5971,11 @@ nutriment_amt = 4 nutriment_desc = list("chocolate" = 4) w_class = 1 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb03/Initialize() . = ..() reagents.add_reagent("sugar", 1) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb04 name = "\improper Lars' Saltlakris" @@ -6220,11 +5987,11 @@ nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "salt = 1", "licorice" = 1) w_class = 1 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb04/Initialize() . = ..() reagents.add_reagent("sugar", 1) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cb05 name = "\improper Andromeda Bar" @@ -6236,11 +6003,11 @@ nutriment_amt = 3 nutriment_desc = list("milk chocolate" = 2) w_class = 1 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb05/Initialize() . = ..() reagents.add_reagent("sugar", 3) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb06 name = "\improper Mocha Crunch" @@ -6252,11 +6019,11 @@ nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "coffee" = 1, "vanilla wafer" = 1) w_class = 1 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb06/Initialize() . = ..() reagents.add_reagent("sugar", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb07 name = "\improper TaroMilk Bar" @@ -6268,11 +6035,11 @@ nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "taro" = 2) w_class = 1 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb07/Initialize() . = ..() reagents.add_reagent("sugar", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb08 name = "\improper Cronk Bar" @@ -6284,11 +6051,11 @@ nutriment_amt = 3 nutriment_desc = list("chocolate" = 2, "malt puffs" = 1) w_class = 1 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb08/Initialize() . = ..() reagents.add_reagent("sugar", 2) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb09 name = "\improper Kaju Mamma! Bar" @@ -6300,12 +6067,12 @@ nutriment_amt = 6 nutriment_desc = list("peanuts" = 3, "condensed milk" = 1, "cashews" = 2) w_class = 1 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb09/Initialize() . = ..() reagents.add_reagent("sugar", 1) reagents.add_reagent("milk", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb10 name = "\improper Shantak Bar" @@ -6317,10 +6084,10 @@ nutriment_amt = 5 nutriment_desc = list("chocolate" = 2, "caramel" = 1, "peanuts" = 1, "nougat" = 1) w_class = 1 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cb10/Initialize() . = ..() - bitesize = 3 reagents.add_reagent("sugar", 1) reagents.add_reagent("protein", 1) @@ -6337,9 +6104,6 @@ center_of_mass = list("x"=15, "y"=15) nutriment_amt = 3 nutriment_desc = list("salt" = 1, "chips" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/chips/Initialize() - . = ..() bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/chips/bbq @@ -6363,9 +6127,6 @@ center_of_mass = list("x"=17, "y"=16) nutriment_amt = 6 nutriment_desc = list("bread" = 2, "sweetness" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/tastybread/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks @@ -6379,9 +6140,6 @@ center_of_mass = list("x"=15, "y"=12) nutriment_amt = 10 nutriment_desc = list("mushroom" = 5, "salt" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/skrellsnacks/Initialize() - . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sosjerky @@ -6530,10 +6288,6 @@ nutriment_desc = list("dried raisins" = 6) nutriment_amt = 6 -/obj/item/weapon/reagent_containers/food/snacks/no_raisin/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - ///obj/item/weapon/reagent_containers/food/snacks/spacetwinkie (Commented out to replace with packaged version 04/14/2021) // name = "Spacer Snack Cake" // icon = 'icons/obj/food_snacks.dmi' @@ -6559,9 +6313,6 @@ center_of_mass = list("x"=15, "y"=9) nutriment_amt = 4 nutriment_desc = list("cheese" = 5, "chips" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/Initialize() - . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/syndicake @@ -6925,13 +6676,9 @@ filling_color = "#ff6633" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("beans" = 1, "tomato sauce" = 1) - nutriment_amt = 10 + nutriment_amt = 15 bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/canned/beef/Initialize() - .=..() - reagents.add_reagent("nutriment", 5) - ///obj/item/weapon/reagent_containers/food/snacks/canned/tomato (NEED TO SEE HOW TO CHANGE EATING SOUND) // name = "tomato soup" // icon_state = "tomato" @@ -6957,13 +6704,17 @@ desc = "Wup-Az! Brand canned spinach. Notably has less iron in it than a watermelon." trash = /obj/item/trash/spinach filling_color = "#003300" +<<<<<<< HEAD center_of_mass = list("x"=15, "y"=9) +======= + center_of_mass = "x=15;y=9" + nutriment_amt = 5 +>>>>>>> 4b964bb... Indescribable! - A Food Flavor Fixing Pass (#8144) nutriment_desc = list("soggy" = 1, "vegetable" = 1) bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/canned/spinach/Initialize() .=..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("adrenaline", 5) reagents.add_reagent("hyperzine", 5) reagents.add_reagent("iron", 5) @@ -7073,42 +6824,45 @@ desc = "Now with 20% less lawsuit enabling rhegolith!" //trash = /obj/item/trash/lunacakewrap //need to add code that drops trash but keeps -open state filling_color = "#ffffff" +<<<<<<< HEAD center_of_mass = list("x"=15, "y"=9) +======= + center_of_mass = "x=15;y=9" + nutriment_amt = 6 +>>>>>>> 4b964bb... Indescribable! - A Food Flavor Fixing Pass (#8144) nutriment_desc = list("sweetness" = 4, "vanilla" = 1) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/packaged/lunacake/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - /obj/item/weapon/reagent_containers/food/snacks/packaged/darklunacake name = "\improper Dark Lunar Cake" icon_state = "mooncake" desc = "Explore the dark side! May contain trace amounts of reconstituted cocoa." //trash = /obj/item/trash/mooncakewrap //need to add code that drops trash but keeps -open state filling_color = "#ffffff" +<<<<<<< HEAD center_of_mass = list("x"=15, "y"=9) +======= + center_of_mass = "x=15;y=9" + nutriment_amt = 6 +>>>>>>> 4b964bb... Indescribable! - A Food Flavor Fixing Pass (#8144) nutriment_desc = list("sweetness" = 4, "chocolate" = 1) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/packaged/darklunacake/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - /obj/item/weapon/reagent_containers/food/snacks/packaged/mochicake name = "\improper Mochi Cake" icon_state = "mochicake" desc = "Konnichiwa! Many go lucky rice cakes in future!" //trash = /obj/item/trash/mochicakewrap //need to add code that drops trash but keeps -open state filling_color = "#ffffff" +<<<<<<< HEAD center_of_mass = list("x"=15, "y"=9) +======= + center_of_mass = "x=15;y=9" + nutriment_amt = 6 +>>>>>>> 4b964bb... Indescribable! - A Food Flavor Fixing Pass (#8144) nutriment_desc = list("sweetness" = 4, "rice" = 1) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/packaged/mochicake/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - //////////////Advanced Package Foods////////////// /obj/item/weapon/reagent_containers/food/snacks/packaged/spacetwinkie //ADDED 04/14/2021 @@ -7120,6 +6874,7 @@ trash = /obj/item/trash/spacer_cake_wrap filling_color = "#FFE591" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 6 nutriment_desc = list("sweetness" = 4, "cake" = 2) bitesize = 2 @@ -7135,13 +6890,10 @@ trash = /obj/item/trash/genration filling_color = "#FFFFFF" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 3 nutriment_desc = list("chalk" = 6) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/packaged/genration/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - /obj/item/weapon/reagent_containers/food/snacks/packaged/meatration //ADDED 04/20/2021 name = "meat ration" icon = 'icons/obj/food_canned.dmi' @@ -7150,6 +6902,7 @@ trash = /obj/item/trash/meatration filling_color = "#FFFFFF" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 6 nutriment_desc = list("chalk" = 3, "meat" = 3) bitesize = 2 @@ -7165,13 +6918,10 @@ trash = /obj/item/trash/vegration filling_color = "#FFFFFF" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 3 nutriment_desc = list("sadness" = 3, "veggie" = 3) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/packaged/vegration/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - /obj/item/weapon/reagent_containers/food/snacks/packaged/sweetration //ADDED 04/20/2021 (Contraband Item) name = "desert ration" icon = 'icons/obj/food_canned.dmi' diff --git a/html/changelogs/MDP-indescribable.yml b/html/changelogs/MDP-indescribable.yml new file mode 100644 index 0000000000..5deb0660dd --- /dev/null +++ b/html/changelogs/MDP-indescribable.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: MoondancerPony + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Food will no longer erroneously have double the nutriment it's supposed to." + - bugfix: "Fixed a lot of invalid food nutriment tastes and spruced up some old ones." From 2723b114eb00687ccd98c70ce7247d82e7549863 Mon Sep 17 00:00:00 2001 From: Verkister Date: Sun, 20 Jun 2021 23:51:52 +0300 Subject: [PATCH 55/81] Fixes synthetic var not getting cleared on load (#8148) Fixes synthetic var not getting cleared when loading character slots. Due to the char setup mannequin's nature of being a single same mob just getting its properties loaded from save slots, loading/making a synth character would permanently mess up the var for all non-synth chars on the roster and cause issues with synth-related settings because there was nothing in the code to clear the var. --- code/modules/client/preference_setup/general/03_body.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 5118e90ae9..fef6ae0bb4 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -338,6 +338,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.set_gender(pref.biological_gender) // Destroy/cyborgize organs and limbs. + character.synthetic = null //Clear the existing var. for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) var/status = pref.organ_data[name] var/obj/item/organ/external/O = character.organs_by_name[name] From 385fa640af206a593903583c680eff2928e72cea Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Sun, 20 Jun 2021 17:14:29 -0500 Subject: [PATCH 57/81] Linter diagnostics + bans non-var relative pathing --- .github/workflows/ci.yml | 28 + SpacemanDMM.toml | 10 +- _build_dependencies.sh | 2 +- .../components/binary_devices/circulator.dm | 3 - .../components/trinary_devices/mixer.dm | 2 +- .../components/unary/generator_input.dm | 21 - .../components/unary/heat_exchanger.dm | 118 +- .../components/unary/oxygen_generator.dm | 49 - code/ZAS/Airflow.dm | 30 +- code/ZAS/Atom.dm | 4 +- code/ZAS/ConnectionGroup.dm | 2 +- code/ZAS/Debug.dm | 2 +- code/ZAS/Diagnostic.dm | 10 +- code/ZAS/Fire.dm | 6 +- code/ZAS/Phoron.dm | 4 +- code/__defines/atmos.dm | 4 + code/__defines/color.dm | 3 - code/__defines/construction.dm | 1 - code/__defines/gamemode.dm | 27 +- code/__defines/holomap.dm | 7 +- code/__defines/is_helpers.dm | 2 + code/__defines/items_clothing.dm | 2 - code/__defines/materials.dm | 3 - code/__defines/math_physics.dm | 1 + code/__defines/misc.dm | 6 +- code/__defines/species_languages.dm | 25 +- code/__defines/turfs.dm | 4 + code/_helpers/_lists.dm | 16 +- code/_helpers/game.dm | 58 +- code/_helpers/icons.dm | 165 +- code/_helpers/mobs.dm | 14 +- code/_helpers/text.dm | 2 +- code/_helpers/time.dm | 2 +- code/_helpers/unsorted.dm | 20 +- code/_macros.dm | 5 +- code/_onclick/hud/hud.dm | 2 +- code/_onclick/hud/skybox.dm | 1 - code/_onclick/item_attack.dm | 6 +- code/controllers/autotransfer.dm | 10 +- code/controllers/communications.dm | 3 + code/controllers/master_controller.dm | 8 +- code/controllers/subsystems/lighting.dm | 23 + code/controllers/subsystems/machines.dm | 1 - code/datums/category.dm | 4 +- code/datums/computerfiles.dm | 7 - code/datums/helper_datums/events.dm | 100 +- code/datums/helper_datums/getrev.dm | 2 +- code/datums/helper_datums/topic_input.dm | 88 +- code/datums/managed_browsers/feedback_form.dm | 2 +- code/datums/supplypacks/costumes.dm | 2 +- code/datums/underwear/underwear.dm | 2 +- code/datums/uplink/uplink_categories.dm | 2 +- code/datums/uplink/uplink_items.dm | 2 +- code/defines/obj.dm | 24 +- code/defines/procs/AStar.dm | 116 +- code/defines/procs/announce.dm | 26 + code/defines/procs/dbcore.dm | 50 +- code/defines/procs/sd_Alert.dm | 168 -- code/defines/procs/statistics.dm | 14 +- code/game/antagonist/_antagonist_setup.dm | 13 - code/game/antagonist/outsider/wizard.dm | 2 +- code/game/area/Space Station 13 areas.dm | 36 +- code/game/area/asteroid_areas.dm | 6 +- code/game/base_turf.dm | 4 +- code/game/dna/dna2.dm | 4 - code/game/dna/genes/disabilities.dm | 42 +- code/game/dna/genes/powers.dm | 175 +- .../gamemodes/changeling/changeling_powers.dm | 2 +- code/game/gamemodes/cult/construct_spells.dm | 25 +- code/game/gamemodes/cult/ritual.dm | 805 ++++--- code/game/gamemodes/cult/runes.dm | 1956 ++++++++--------- code/game/gamemodes/cult/talisman.dm | 196 +- code/game/gamemodes/events/clang.dm | 46 +- code/game/gamemodes/game_mode.dm | 4 +- code/game/gamemodes/newobjective.dm | 2 +- code/game/gamemodes/objective.dm | 1214 +++++----- code/game/gamemodes/sandbox/h_sandbox.dm | 2 +- .../game/gamemodes/technomancer/spell_objs.dm | 23 - code/game/jobs/access.dm | 4 +- code/game/jobs/job_controller.dm | 830 ++++--- code/game/json.dm | 10 +- code/game/machinery/atmo_control.dm | 4 +- code/game/machinery/camera/tracking.dm | 10 +- code/game/machinery/cloning.dm | 38 +- code/game/machinery/computer/prisonshuttle.dm | 306 +-- code/game/machinery/computer/shuttle.dm | 108 +- code/game/machinery/doors/airlock_control.dm | 67 +- code/game/machinery/doors/blast_door.dm | 8 +- .../game/machinery/doors/firedoor_assembly.dm | 6 +- .../airlock_controllers.dm | 2 +- .../airlock_docking_controller.dm | 56 +- .../airlock_docking_controller_multi.dm | 12 +- .../embedded_controller/airlock_program.dm | 42 +- .../embedded_controller/docking_program.dm | 48 +- .../docking_program_multi.dm | 42 +- .../embedded_controller_base.dm | 2 +- .../embedded_program_base.dm | 14 +- .../simple_docking_controller.dm | 30 +- code/game/machinery/jukebox.dm | 10 + code/game/machinery/nuclear_bomb.dm | 5 +- code/game/machinery/overview.dm | 6 +- code/game/machinery/oxygen_pump.dm | 3 - code/game/machinery/records_scanner.dm | 6 +- code/game/machinery/seed_extractor.dm | 2 +- code/game/machinery/status_display.dm | 3 +- code/game/machinery/telecomms/presets.dm | 8 +- .../machinery/telecomms/traffic_control.dm | 328 +-- code/game/magic/archived_book.dm | 14 +- code/game/mecha/mecha.dm | 8 - code/game/mecha/mecha_control_console.dm | 92 + code/game/mecha/mecha_parts.dm | 60 +- code/game/mecha/mecha_wreckage.dm | 150 +- .../objects/effects/decals/Cleanable/misc.dm | 7 +- .../effects/decals/Cleanable/tracks.dm | 91 +- code/game/objects/effects/decals/crayon.dm | 35 +- code/game/objects/effects/effect_system.dm | 356 ++- code/game/objects/effects/gibs.dm | 70 +- code/game/objects/effects/overlays.dm | 7 +- .../objects/effects/spawners/gibspawner.dm | 43 +- code/game/objects/effects/step_triggers.dm | 88 +- code/game/objects/empulse.dm | 2 +- code/game/objects/explosion.dm | 4 +- code/game/objects/explosion_recursive.dm | 2 +- code/game/objects/items/bodybag.dm | 19 +- .../items/devices/communicator/messaging.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 7 - code/game/objects/items/robot/robot_items.dm | 16 +- code/game/objects/items/shooting_range.dm | 110 +- code/game/objects/items/toys/toys.dm | 186 +- code/game/objects/items/weapons/autopsy.dm | 16 +- code/game/objects/items/weapons/chewables.dm | 7 +- .../objects/items/weapons/cigs_lighters.dm | 8 +- .../circuitboards/machinery/research.dm | 4 +- .../objects/items/weapons/dna_injector.dm | 372 ++-- .../items/weapons/implants/implantchair.dm | 258 ++- .../items/weapons/implants/implantpad.dm | 142 +- .../items/weapons/material/chainsaw.dm | 24 +- code/game/objects/items/weapons/paint.dm | 82 +- .../objects/items/weapons/storage/lockbox.dm | 66 +- .../objects/items/weapons/storage/storage.dm | 10 +- .../objects/items/weapons/surgery_tools.dm | 22 +- .../game/objects/items/weapons/tanks/tanks.dm | 2 - code/game/objects/items/weapons/weaponry.dm | 8 +- code/game/objects/structures/grille.dm | 9 +- code/game/objects/structures/inflatable.dm | 23 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/salvageable.dm | 12 +- code/game/objects/structures/transit_tubes.dm | 2 +- .../objects/structures/windoor_assembly.dm | 8 +- code/game/periodic_news.dm | 177 +- code/game/response_team.dm | 10 +- code/game/trader_visit.dm | 4 +- code/game/turfs/flooring/flooring_premade.dm | 2 - code/game/turfs/simulated/floor_types.dm | 6 +- code/game/turfs/simulated/wall_attacks.dm | 6 - code/game/turfs/simulated/water.dm | 2 +- code/game/turfs/snow/snow.dm | 2 - code/game/turfs/turf.dm | 2 +- code/game/world.dm | 8 +- code/js/byjax.dm | 2 +- code/modules/admin/DB ban/functions.dm | 8 +- code/modules/admin/IsBanned.dm | 3 +- code/modules/admin/admin.dm | 4 +- code/modules/admin/admin_attack_log.dm | 10 +- code/modules/admin/admin_report.dm | 20 +- code/modules/admin/holder2.dm | 2 +- code/modules/admin/player_notes.dm | 4 +- code/modules/admin/topic.dm | 6 +- code/modules/admin/verbs/buildmode.dm | 182 +- code/modules/admin/verbs/lightning_strike.dm | 1 - code/modules/admin/verbs/mapping.dm | 6 +- code/modules/admin/verbs/playsound.dm | 4 +- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/alarm/alarm.dm | 2 - code/modules/awaymissions/exile.dm | 26 +- code/modules/awaymissions/gateway.dm | 2 +- code/modules/awaymissions/zlevel.dm | 5 + code/modules/client/client procs.dm | 7 +- .../preference_setup/general/01_basic.dm | 8 +- .../preference_setup/loadout/loadout_suit.dm | 2 +- .../preference_setup/occupation/occupation.dm | 5 - code/modules/client/preferences.dm | 2 +- .../modules/client/preferences_spawnpoints.dm | 30 +- code/modules/clothing/clothing.dm | 1046 +++++++++ code/modules/clothing/glasses/glasses.dm | 26 +- code/modules/clothing/gloves/color.dm | 2 +- code/modules/clothing/head/misc_special.dm | 12 +- code/modules/clothing/shoes/miscellaneous.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 4 +- code/modules/clothing/suits/storage.dm | 115 +- .../clothing/under/accessories/armor.dm | 2 +- .../clothing/under/accessories/badges.dm | 31 +- code/modules/compass/compass_waypoint.dm | 3 - .../compass/{^compass.dm => ~compass.dm} | 0 code/modules/detectivework/forensics.dm | 6 +- code/modules/economy/Events.dm | 6 +- code/modules/economy/Events_Mundane.dm | 131 +- code/modules/economy/TradeDestinations.dm | 18 +- code/modules/economy/cash.dm | 9 +- code/modules/economy/economy_misc.dm | 43 +- code/modules/economy/price_list.dm | 5 +- code/modules/events/viral_infection.dm | 8 +- code/modules/flufftext/Dreaming.dm | 6 +- code/modules/flufftext/Hallucination.dm | 150 +- code/modules/flufftext/TextFilters.dm | 8 +- .../modules/food/drinkingglass/glass_boxes.dm | 66 +- code/modules/food/food/drinks/bottle.dm | 3 +- .../modules/food/food/drinks/drinkingglass.dm | 165 +- code/modules/food/kitchen/icecream.dm | 6 +- code/modules/food/recipes_microwave.dm | 16 +- code/modules/genetics/side_effects.dm | 79 +- code/modules/ghosttrap/trap.dm | 4 +- code/modules/holodeck/HolodeckObjects.dm | 4 +- .../integrated_electronics/subtypes/lists.dm | 2 +- code/modules/library/lib_items.dm | 86 +- code/modules/library/lib_machines.dm | 2 +- code/modules/lighting/__lighting_docs.dm | 2 +- code/modules/maps/fromdmp.dm | 14 +- code/modules/maps/swapmaps.dm | 24 +- code/modules/maps/tg/dmm_suite.dm | 16 +- .../machinery/machine_input_output_plates.dm | 10 +- code/modules/mining/mine_turfs.dm | 8 +- code/modules/mob/dead/observer/observer.dm | 963 ++++++++ .../mob/living/carbon/human/human_helpers.dm | 10 +- code/modules/mob/living/carbon/human/life.dm | 2 +- .../carbon/human/species/station/station.dm | 4 +- .../human/species/xenomorphs/xenomorphs.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 45 +- code/modules/mob/living/say.dm | 2 +- .../living/silicon/robot/drone/drone_items.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_helpers.dm | 16 +- .../mob/new_player/sprite_accessories_taur.dm | 4 +- .../file_system/programs/command/comm.dm | 4 +- .../modular_computers/laptop_vendor.dm | 2 +- code/modules/multiz/_stubs.dm | 8 +- code/modules/multiz/basic.dm | 2 +- code/modules/multiz/disabled.dm | 8 +- code/modules/multiz/pipes.dm | 42 +- code/modules/news/newspaper.dm | 8 +- code/modules/organs/blood.dm | 4 +- .../{organ_internal.dm => _organ_internal.dm} | 0 code/modules/organs/internal/appendix.dm | 2 - code/modules/organs/internal/eyes.dm | 2 - code/modules/organs/internal/heart.dm | 2 - code/modules/organs/internal/kidneys.dm | 2 - code/modules/organs/internal/liver.dm | 2 - code/modules/organs/internal/lungs.dm | 2 - code/modules/organs/pain.dm | 12 +- code/modules/organs/wound.dm | 258 +-- code/modules/overmap/spacetravel.dm | 4 +- code/modules/overmap/turfs.dm | 2 +- code/modules/paperwork/adminpaper.dm | 2 +- code/modules/paperwork/silicon_photography.dm | 2 +- code/modules/power/antimatter/shielding.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/fusion/fusion_reactions.dm | 2 +- code/modules/projectiles/guns/energy/phase.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/projectile/revolver.dm | 2 +- .../targeting/targeting_overlay.dm | 2 +- code/modules/random_map/drop/drop_types.dm | 2 +- .../machinery/dispenser/cartridge_presets.dm | 291 ++- .../reagents/machinery/dispenser/supply.dm | 34 +- .../reagents/reagent_containers/glass.dm | 2 +- code/modules/reagents/reagents/_reagents.dm | 2 +- code/modules/reagents/reagents/food_drinks.dm | 380 ++-- code/modules/reagents/reagents/toxins.dm | 2 +- code/modules/recycling/disposal.dm | 1188 +++++----- code/modules/recycling/sortingmachinery.dm | 83 + code/modules/research/designs/misc.dm | 2 +- code/modules/research/designs/uncommented.dm | 10 +- code/modules/research/message_server.dm | 12 +- code/modules/scripting/AST/AST Nodes.dm | 89 +- code/modules/scripting/AST/Blocks.dm | 21 +- .../AST/Operators/Binary Operators.dm | 72 +- .../AST/Operators/Unary Operators.dm | 22 +- code/modules/scripting/AST/Statements.dm | 78 +- code/modules/scripting/Errors.dm | 184 +- code/modules/scripting/IDE.dm | 12 +- .../scripting/Implementations/Telecomms.dm | 402 ++-- .../scripting/Implementations/_Logic.dm | 28 +- .../scripting/Interpreter/Evaluation.dm | 324 ++- .../scripting/Interpreter/Interaction.dm | 122 +- .../scripting/Interpreter/Interpreter.dm | 471 ++-- code/modules/scripting/Interpreter/Scope.dm | 24 +- code/modules/scripting/Options.dm | 122 +- code/modules/scripting/Parser/Expressions.dm | 456 ++-- code/modules/scripting/Parser/Keywords.dm | 226 +- code/modules/scripting/Parser/Parser.dm | 249 +-- code/modules/scripting/Scanner/Scanner.dm | 317 ++- code/modules/scripting/Scanner/Tokens.dm | 47 +- code/modules/scripting/stack.dm | 34 +- code/modules/shuttles/escape_pods.dm | 44 +- code/modules/shuttles/landmarks.dm | 2 +- code/modules/shuttles/shuttle_autodock.dm | 6 +- code/modules/shuttles/shuttle_ferry.dm | 2 - code/modules/spells/construct_spells.dm | 2 +- code/modules/vehicles/bike.dm | 4 +- .../ventcrawl/ventcrawl_atmospherics.dm | 2 +- code/modules/virus2/admin.dm | 310 +-- code/modules/virus2/disease2.dm | 6 +- code/modules/virus2/effect.dm | 6 +- code/modules/virus2/helpers.dm | 4 +- .../effects/gravitational_waves.dm | 2 +- code/stylesheet.dm | 2 +- maps/southern_cross/southern_cross_areas.dm | 2 +- tools/HumanScissors/HumanScissors.dm | 2 +- tools/IconSplitter/IconSplitter.dm | 2 +- tools/ci/install_spaceman_dmm.sh | 19 + vorestation.dme | 19 +- 311 files changed, 11232 insertions(+), 8984 deletions(-) delete mode 100644 code/ATMOSPHERICS/components/unary/generator_input.dm delete mode 100644 code/ATMOSPHERICS/components/unary/oxygen_generator.dm delete mode 100644 code/datums/computerfiles.dm delete mode 100644 code/defines/procs/sd_Alert.dm rename code/modules/compass/{^compass.dm => ~compass.dm} (100%) rename code/modules/organs/internal/{organ_internal.dm => _organ_internal.dm} (100%) create mode 100755 tools/ci/install_spaceman_dmm.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 58a700fd80..33b71bb2aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,34 @@ jobs: tools/ci/validate_files.sh tools/ci/build_tgui.sh + dreamchecker: + name: DreamChecker + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + + - name: Cache SpacemanDMM + uses: actions/cache@v2 + with: + path: ~/SpacemanDMM + key: ${{ runner.os }}-dreamchecker-${{ hashFiles('dependencies.sh')}} + restore-keys: ${{ runner.os }}-dreamchecker + + - name: Install Dependencies + run: | + tools/ci/install_spaceman_dmm.sh dreamchecker + + - name: Run Linter + id: linter + run: | + ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 + + - name: Annotate Linter + uses: yogstation13/DreamAnnotate@v1 + if: always() + with: + outputFile: output-annotations.txt + unit_tests: name: Integration Tests runs-on: ubuntu-18.04 diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index 771e48d2ef..ebc374f630 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,8 +1,6 @@ -[diagnostics] -macro_redefined = "off" -macro_undefined_no_definition = "off" -as_local_var = "off" -tmp_no_effect = "off" - [langserver] dreamchecker = true + +[code_standards] +disallow_relative_type_definitions = true +disallow_relative_proc_definitions = true \ No newline at end of file diff --git a/_build_dependencies.sh b/_build_dependencies.sh index 7d661e3c89..76c52d2e5c 100644 --- a/_build_dependencies.sh +++ b/_build_dependencies.sh @@ -1,6 +1,6 @@ # This file has all the information on what versions of libraries are thrown into the code # For dreamchecker -export SPACEMANDMM_TAG=suite-1.4 +export SPACEMAN_DMM_VERSION=suite-1.7 # For NanoUI + TGUI export NODE_VERSION=12 # Byond Major diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index 72e623351a..c09c482cc1 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -1,8 +1,5 @@ //node1, air1, network1 correspond to input //node2, air2, network2 correspond to output - -#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1. - /obj/machinery/atmospherics/binary/circulator name = "circulator" desc = "A gas circulator turbine and heat exchanger." diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index ef2a4c1a8a..7344a3e732 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -163,7 +163,7 @@ // // "T" Orientation - Inputs are on oposite sides instead of adjacent // -obj/machinery/atmospherics/trinary/mixer/t_mixer +/obj/machinery/atmospherics/trinary/mixer/t_mixer icon_state = "tmap" construction_type = /obj/item/pipe/trinary // Can't flip a "T", its symmetrical pipe_state = "t_mixer" diff --git a/code/ATMOSPHERICS/components/unary/generator_input.dm b/code/ATMOSPHERICS/components/unary/generator_input.dm deleted file mode 100644 index 2b31097dc4..0000000000 --- a/code/ATMOSPHERICS/components/unary/generator_input.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/machinery/atmospherics/unary/generator_input - icon = 'icons/obj/atmospherics/heat_exchanger.dmi' - icon_state = "intact" - density = 1 - - name = "Generator Input" - desc = "Placeholder" - - var/update_cycle - - update_icon() - if(node) - icon_state = "intact" - else - icon_state = "exposed" - - return - - proc - return_exchange_air() - return air_contents \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 2295f70378..bba26185e7 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -11,77 +11,77 @@ var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null var/update_cycle - update_icon() - if(node) - icon_state = "intact" - else - icon_state = "exposed" +/obj/machinery/atmospherics/unary/heat_exchanger/update_icon() + if(node) + icon_state = "intact" + else + icon_state = "exposed" - return + return - atmos_init() - if(!partner) - var/partner_connect = turn(dir,180) +/obj/machinery/atmospherics/unary/heat_exchanger/atmos_init() + if(!partner) + var/partner_connect = turn(dir,180) - for(var/obj/machinery/atmospherics/unary/heat_exchanger/target in get_step(src,partner_connect)) - if(target.dir & get_dir(src,target)) - partner = target - partner.partner = src - break + for(var/obj/machinery/atmospherics/unary/heat_exchanger/target in get_step(src,partner_connect)) + if(target.dir & get_dir(src,target)) + partner = target + partner.partner = src + break - ..() + ..() - process() - ..() - if(!partner) - return 0 +/obj/machinery/atmospherics/unary/heat_exchanger/process() + ..() + if(!partner) + return 0 - if(!air_master || air_master.current_cycle <= update_cycle) - return 0 + if(!air_master || air_master.current_cycle <= update_cycle) + return 0 - update_cycle = air_master.current_cycle - partner.update_cycle = air_master.current_cycle + update_cycle = air_master.current_cycle + partner.update_cycle = air_master.current_cycle - var/air_heat_capacity = air_contents.heat_capacity() - var/other_air_heat_capacity = partner.air_contents.heat_capacity() - var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity + var/air_heat_capacity = air_contents.heat_capacity() + var/other_air_heat_capacity = partner.air_contents.heat_capacity() + var/combined_heat_capacity = other_air_heat_capacity + air_heat_capacity - var/old_temperature = air_contents.temperature - var/other_old_temperature = partner.air_contents.temperature + var/old_temperature = air_contents.temperature + var/other_old_temperature = partner.air_contents.temperature - if(combined_heat_capacity > 0) - var/combined_energy = partner.air_contents.temperature*other_air_heat_capacity + air_heat_capacity*air_contents.temperature + if(combined_heat_capacity > 0) + var/combined_energy = partner.air_contents.temperature*other_air_heat_capacity + air_heat_capacity*air_contents.temperature - var/new_temperature = combined_energy/combined_heat_capacity - air_contents.temperature = new_temperature - partner.air_contents.temperature = new_temperature + var/new_temperature = combined_energy/combined_heat_capacity + air_contents.temperature = new_temperature + partner.air_contents.temperature = new_temperature - if(network) - if(abs(old_temperature-air_contents.temperature) > 1) - network.update = 1 + if(network) + if(abs(old_temperature-air_contents.temperature) > 1) + network.update = 1 - if(partner.network) - if(abs(other_old_temperature-partner.air_contents.temperature) > 1) - partner.network.update = 1 + if(partner.network) + if(abs(other_old_temperature-partner.air_contents.temperature) > 1) + partner.network.update = 1 + return 1 + +/obj/machinery/atmospherics/unary/heat_exchanger/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!W.is_wrench()) + return ..() + var/turf/T = src.loc + if (level==1 && isturf(T) && !T.is_plating()) + to_chat(user, "You must remove the plating first.") return 1 - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!W.is_wrench()) - return ..() - var/turf/T = src.loc - if (level==1 && isturf(T) && !T.is_plating()) - to_chat(user, "You must remove the plating first.") - return 1 - if (!can_unwrench()) - to_chat(user, "You cannot unwrench \the [src], it is too exerted due to internal pressure.") - add_fingerprint(user) - return 1 - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src]...") - if (do_after(user, 40 * W.toolspeed)) - user.visible_message( \ - "\The [user] unfastens \the [src].", \ - "You have unfastened \the [src].", \ - "You hear a ratchet.") - deconstruct() + if (!can_unwrench()) + to_chat(user, "You cannot unwrench \the [src], it is too exerted due to internal pressure.") + add_fingerprint(user) + return 1 + playsound(src, W.usesound, 50, 1) + to_chat(user, "You begin to unfasten \the [src]...") + if (do_after(user, 40 * W.toolspeed)) + user.visible_message( \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") + deconstruct() diff --git a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm deleted file mode 100644 index 14bbb46bba..0000000000 --- a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm +++ /dev/null @@ -1,49 +0,0 @@ -obj/machinery/atmospherics/unary/oxygen_generator - icon = 'icons/obj/atmospherics/oxygen_generator.dmi' - icon_state = "intact_off" - density = 1 - - name = "Oxygen Generator" - desc = "" - - dir = SOUTH - initialize_directions = SOUTH - - var/on = 0 - - var/oxygen_content = 10 - - update_icon() - if(node) - icon_state = "intact_[on?("on"):("off")]" - else - icon_state = "exposed_off" - - on = 0 - - return - - New() - ..() - - air_contents.volume = 50 - - process() - ..() - if(!on) - return 0 - - var/total_moles = air_contents.total_moles - - if(total_moles < oxygen_content) - var/current_heat_capacity = air_contents.heat_capacity() - - var/added_oxygen = oxygen_content - total_moles - - air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen) - air_contents.adjust_gas("oxygen", added_oxygen) - - if(network) - network.update = 1 - - return 1 \ No newline at end of file diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 4d92a42c35..fcc81509c8 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -2,8 +2,8 @@ Contains helper procs for airflow, handled in /connection_group. */ -mob/var/tmp/last_airflow_stun = 0 -mob/proc/airflow_stun() +/mob/var/tmp/last_airflow_stun = 0 +/mob/proc/airflow_stun() if(stat == 2) return 0 if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 @@ -19,16 +19,16 @@ mob/proc/airflow_stun() Weaken(5) last_airflow_stun = world.time -mob/living/silicon/airflow_stun() +/mob/living/silicon/airflow_stun() return -mob/living/carbon/human/airflow_stun() +/mob/living/carbon/human/airflow_stun() if(shoes && (shoes.item_flags & NOSLIP)) to_chat(src, "Air suddenly rushes past you!") return 0 ..() -atom/movable/proc/check_airflow_movable(n) +/atom/movable/proc/check_airflow_movable(n) if(!simulated) return 0 if(anchored && !ismob(src)) return 0 @@ -37,19 +37,19 @@ atom/movable/proc/check_airflow_movable(n) return 1 -mob/check_airflow_movable(n) +/mob/check_airflow_movable(n) if(n < vsc.airflow_heavy_pressure) return 0 return 1 -mob/observer/check_airflow_movable() +/mob/observer/check_airflow_movable() return 0 -mob/living/silicon/check_airflow_movable() +/mob/living/silicon/check_airflow_movable() return 0 -obj/check_airflow_movable(n) +/obj/check_airflow_movable(n) if (!(. = ..())) return 0 if(isnull(w_class)) @@ -90,11 +90,11 @@ obj/check_airflow_movable(n) airflow_time = 0 . = ..() -atom/movable/proc/airflow_hit(atom/A) +/atom/movable/proc/airflow_hit(atom/A) airflow_speed = 0 airflow_dest = null -mob/airflow_hit(atom/A) +/mob/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("\The [src] slams into \a [A]!",1,"You hear a loud slam!",2) playsound(src, "smash.ogg", 25, 1, -1) @@ -102,17 +102,17 @@ mob/airflow_hit(atom/A) Weaken(weak_amt) . = ..() -obj/airflow_hit(atom/A) +/obj/airflow_hit(atom/A) for(var/mob/M in hearers(src)) M.show_message("\The [src] slams into \a [A]!",1,"You hear a loud slam!",2) playsound(src, "smash.ogg", 25, 1, -1) . = ..() -obj/item/airflow_hit(atom/A) +/obj/item/airflow_hit(atom/A) airflow_speed = 0 airflow_dest = null -mob/living/carbon/human/airflow_hit(atom/A) +/mob/living/carbon/human/airflow_hit(atom/A) // for(var/mob/M in hearers(src)) // M.show_message("[src] slams into [A]!",1,"You hear a loud slam!",2) playsound(src, "punch", 25, 1, -1) @@ -140,7 +140,7 @@ mob/living/carbon/human/airflow_hit(atom/A) Stun(round(airflow_speed * vsc.airflow_stun/2)) . = ..() -zone/proc/movables() +/zone/proc/movables() . = list() for(var/turf/T in contents) for(var/atom/movable/A in T) diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index b395c4551e..1953c58e9f 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -64,13 +64,13 @@ // AIR_BLOCKED - Blocked // ZONE_BLOCKED - Not blocked, but zone boundaries will not cross. // BLOCKED - Blocked, zone boundaries will not cross even if opened. -atom/proc/c_airblock(turf/other) +/atom/proc/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif return (AIR_BLOCKED*!CanZASPass(other, FALSE))|(ZONE_BLOCKED*!CanZASPass(other, TRUE)) -turf/c_airblock(turf/other) +/turf/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif diff --git a/code/ZAS/ConnectionGroup.dm b/code/ZAS/ConnectionGroup.dm index 2811ff6c77..0be44bb358 100644 --- a/code/ZAS/ConnectionGroup.dm +++ b/code/ZAS/ConnectionGroup.dm @@ -244,7 +244,7 @@ Class Procs: if(!A.air.compare(air, vacuum_exception = 1)) air_master.mark_edge_active(src) -proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) +/proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) //This implements a simplistic version of the Stefan-Boltzmann law. var/energy_delta = ((A.temperature - B.temperature) ** 4) * STEFAN_BOLTZMANN_CONSTANT * connecting_tiles * 2.5 var/maximum_energy_delta = max(0, min(A.temperature * A.heat_capacity() * A.group_multiplier, B.temperature * B.heat_capacity() * B.group_multiplier)) diff --git a/code/ZAS/Debug.dm b/code/ZAS/Debug.dm index 5aa2c73df2..224904a567 100644 --- a/code/ZAS/Debug.dm +++ b/code/ZAS/Debug.dm @@ -16,5 +16,5 @@ var/image/mark = image('icons/Testing/Zone.dmi', icon_state = "mark") add_overlay(img) dbg_img = img -proc/soft_assert(thing,fail) +/proc/soft_assert(thing,fail) if(!thing) message_admins(fail) \ No newline at end of file diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm index 83537b8575..7166b42dc6 100644 --- a/code/ZAS/Diagnostic.dm +++ b/code/ZAS/Diagnostic.dm @@ -1,4 +1,4 @@ -client/proc/ZoneTick() +/client/proc/ZoneTick() set category = "Debug" set name = "Process Atmos" set desc = "Manually run a single tick of the air subsystem" @@ -16,7 +16,7 @@ client/proc/ZoneTick() to_chat(src, "Failed to process! ([air_master.tick_progress])") */ -client/proc/Zone_Info(turf/T as null|turf) +/client/proc/Zone_Info(turf/T as null|turf) set category = "Debug" if(T) if(istype(T,/turf/simulated) && T:zone) @@ -33,9 +33,9 @@ client/proc/Zone_Info(turf/T as null|turf) images -= zone_debug_images[zone] zone_debug_images = null -client/var/list/zone_debug_images +/client/var/list/zone_debug_images -client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) +/client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) set category = "Debug" if(!istype(T)) return @@ -94,7 +94,7 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) else to_chat(mob, "both turfs can merge.") -client/proc/ZASSettings() +/client/proc/ZASSettings() set category = "Debug" vsc.SetDefault(mob) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index bb4ec95a84..9c8ec74d4d 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -11,11 +11,11 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/var/obj/fire/fire = null //Some legacy definitions so fires can be started. -atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return null -turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) +/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) /turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) @@ -320,7 +320,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return firelevel -datum/gas_mixture/proc/check_recombustability(list/fuel_objs) +/datum/gas_mixture/proc/check_recombustability(list/fuel_objs) . = 0 for(var/g in gas) if(gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index 4017d0a74a..a8c797ec2a 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -38,7 +38,7 @@ var/image/contamination_overlay = image('icons/effects/contamination.dmi') var/N2O_HALLUCINATION_DESC = "Does being in sleeping gas cause you to hallucinate?" -obj/var/contaminated = 0 +/obj/var/contaminated = 0 /obj/item/proc/can_contaminate() @@ -183,7 +183,7 @@ obj/var/contaminated = 0 gloves.contaminate() -turf/Entered(obj/item/I) +/turf/Entered(obj/item/I) . = ..() //Items that are in phoron, but not on a mob, can still be contaminated. if(istype(I) && vsc.plc.CLOTH_CONTAMINATION && I.can_contaminate()) diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm index 424f2a2639..04905878a0 100644 --- a/code/__defines/atmos.dm +++ b/code/__defines/atmos.dm @@ -94,3 +94,7 @@ #define ATMOSTANK_CO2 25000 // CO2 and PH are not critically important for station, only for toxins and alternative coolants, no need to store a lot of those. #define ATMOSTANK_PHORON 25000 #define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? + +// Used in various things like tanks and oxygen pumps. +#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) +#define TANK_DEFAULT_RELEASE_PRESSURE ONE_ATMOSPHERE \ No newline at end of file diff --git a/code/__defines/color.dm b/code/__defines/color.dm index af112ef4d6..cfa5d6aad9 100644 --- a/code/__defines/color.dm +++ b/code/__defines/color.dm @@ -165,9 +165,6 @@ #define COLOR_ASSEMBLY_PURPLE "#6F6192" #define COLOR_ASSEMBLY_HOT_PINK "#FF69B4" -#define COLOR_ASTEROID_ROCK "#735555" -#define COLOR_GOLD "#ffcc33" - // Discord requires colors to be in decimal instead of hexadecimal. #define COLOR_WEBHOOK_DEFAULT 0x8bbbd5 // "#8bbbd5" #define COLOR_WEBHOOK_GOOD 0x2ECC71 // "#2ECC71" diff --git a/code/__defines/construction.dm b/code/__defines/construction.dm index 0ab4103e4d..c6d29a77ef 100644 --- a/code/__defines/construction.dm +++ b/code/__defines/construction.dm @@ -50,7 +50,6 @@ #define PIPING_LAYER_DEFAULT PIPING_LAYER_REGULAR // We offset the layer values of the different pipe types to ensure they look nice -#define PIPES_SCRUBBER_LAYER (PIPES_LAYER - 0.05) #define PIPES_AUX_LAYER (PIPES_LAYER - 0.04) #define PIPES_FUEL_LAYER (PIPES_LAYER - 0.03) #define PIPES_SCRUBBER_LAYER (PIPES_LAYER - 0.02) diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 5f67308094..b512065f61 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -101,7 +101,6 @@ var/list/be_special_flags = list( #define MODE_MONKEY "monkey" #define MODE_RENEGADE "renegade" #define MODE_REVOLUTIONARY "revolutionary" -#define MODE_LOYALIST "loyalist" #define MODE_MALFUNCTION "malf" #define MODE_TRAITOR "traitor" #define MODE_AUTOTRAITOR "autotraitor" @@ -149,4 +148,28 @@ var/list/be_special_flags = list( #define Sp_CHARGES "charges" #define Sp_HOLDVAR "holdervar" -#define CHANGELING_STASIS_COST 20 \ No newline at end of file +#define CHANGELING_STASIS_COST 20 + +//Spell stuff, for Technomancer and Cult. +//cast_method flags +#define CAST_USE 1 // Clicking the spell in your hand. +#define CAST_MELEE 2 // Clicking an atom in melee range. +#define CAST_RANGED 4 // Clicking an atom beyond melee range. +#define CAST_THROW 8 // Throwing the spell and hitting an atom. +#define CAST_COMBINE 16 // Clicking another spell with this spell. +#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. + +//Aspects +#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. +#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. +#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. +#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. +#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. +#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. +#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. +#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. +#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. +#define ASPECT_EMP "emp" //Unused now. +#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. +#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. +#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. \ No newline at end of file diff --git a/code/__defines/holomap.dm b/code/__defines/holomap.dm index b7dc0305ad..53584a5648 100644 --- a/code/__defines/holomap.dm +++ b/code/__defines/holomap.dm @@ -2,8 +2,6 @@ // Constants and standard colors for the holomap // -#define WORLD_ICON_SIZE 32 // Size of a standard tile in pixels (world.icon_size) -#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 // Convert from normal icon size of 32 to whatever insane thing this server is using. #define HOLOMAP_ICON 'icons/480x480.dmi' // Icon file to start with when drawing holomaps (to get a 480x480 canvas). #define HOLOMAP_ICON_SIZE 480 // Pixel width & height of the holomap icon. Used for auto-centering etc. #define ui_holomap "CENTER-7, CENTER-7" // Screen location of the holomap "hud" @@ -21,6 +19,7 @@ #define HOLOMAP_EXTRA_STATIONMAP "stationmapformatted" #define HOLOMAP_EXTRA_STATIONMAP_STRATEGIC "stationmapstrategic" #define HOLOMAP_EXTRA_STATIONMAPAREAS "stationareas" +#define HOLOMAP_EXTRA_STATIONMAPSMALL "stationmapsmall" #define HOLOMAP_EXTRA_STATIONMAPSMALL_NORTH "stationmapsmallnorth" #define HOLOMAP_EXTRA_STATIONMAPSMALL_SOUTH "stationmapsmallsouth" #define HOLOMAP_EXTRA_STATIONMAPSMALL_EAST "stationmapsmalleast" @@ -85,7 +84,3 @@ // #define HOLOMAP_MARKER_DISK "diskspawn" // #define HOLOMAP_MARKER_SKIPJACK "skipjack" // #define HOLOMAP_MARKER_SYNDISHUTTLE "syndishuttle" - -#define HOLOMAP_EXTRA_STATIONMAP "stationmapformatted" -#define HOLOMAP_EXTRA_STATIONMAPAREAS "stationareas" -#define HOLOMAP_EXTRA_STATIONMAPSMALL "stationmapsmall" \ No newline at end of file diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm index d7aaed2ce8..c1405b370b 100644 --- a/code/__defines/is_helpers.dm +++ b/code/__defines/is_helpers.dm @@ -57,3 +57,5 @@ //#define isturf(D) istype(D, /turf) //Built in #define isopenspace(A) istype(A, /turf/simulated/open) #define isspace(A) istype(A, /turf/space) + +#define istaurtail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 27250bc9a2..a7dba8be88 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -101,11 +101,9 @@ #define slot_r_ear_str "slot_r_ear" #define slot_belt_str "slot_belt" #define slot_shoes_str "slot_shoes" -#define slot_head_str "slot_head" #define slot_wear_mask_str "slot_wear_mask" #define slot_handcuffed_str "slot_handcuffed" #define slot_legcuffed_str "slot_legcuffed" -#define slot_wear_mask_str "slot_wear_mask" #define slot_wear_id_str "slot_wear_id" #define slot_gloves_str "slot_gloves" #define slot_glasses_str "slot_glasses" diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm index 3dea12295e..ec665c37dd 100644 --- a/code/__defines/materials.dm +++ b/code/__defines/materials.dm @@ -57,9 +57,6 @@ #define MATERIAL_BRITTLE 0x2 #define MATERIAL_PADDING 0x4 -#define DEFAULT_TABLE_MATERIAL "plastic" -#define DEFAULT_WALL_MATERIAL "steel" - #define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass) //Material Container Flags. diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm index 90950d0ca0..b00aef11ba 100644 --- a/code/__defines/math_physics.dm +++ b/code/__defines/math_physics.dm @@ -2,6 +2,7 @@ #define R_IDEAL_GAS_EQUATION 8.31 // kPa*L/(K*mol). #define ONE_ATMOSPHERE 101.325 // kPa. #define IDEAL_GAS_ENTROPY_CONSTANT 1164 // (mol^3 * s^3) / (kg^3 * L). +#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1. #define T0C 273.15 // 0.0 degrees celcius #define T20C 293.15 // 20.0 degrees celcius diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index b853f4e9b5..13d413a22c 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -197,8 +197,6 @@ #define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day -#define WORLD_ICON_SIZE 32 //Needed for the R-UST port -#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port #define MAX_CLIENT_VIEW 34 // Maximum effective value of client.view (According to DM references) // Maploader bounds indices @@ -464,4 +462,6 @@ GLOBAL_LIST_INIT(all_volume_channels, list( #ifndef HTTP_POST_DLL_LOCATION #define HTTP_POST_DLL_LOCATION (world.system_type == MS_WINDOWS ? WINDOWS_HTTP_POST_DLL_LOCATION : UNIX_HTTP_POST_DLL_LOCATION) -#endif \ No newline at end of file +#endif + +#define DOCK_ATTEMPT_TIMEOUT 200 //how long in ticks we wait before assuming the docking controller is broken or blown up. \ No newline at end of file diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index bdfbebb1bc..268b5d3253 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -25,19 +25,18 @@ #define EMP_OXY_DMG 0x100 // EMPs inflict oxy damage // Species allergens -#define MEAT 0x1 // Skrell won't like this. -#define FISH 0x2 // Seperate for completion's sake. Still bad for skrell. -#define FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic. -#define VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently. -#define GRAINS 0x10 // Wheat, oats, etc. -#define BEANS 0x20 // The musical fruit! Includes soy. -#define SEEDS 0x40 // Hope you don't have a nut allergy. -#define DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell. -#define FUNGI 0x100 // Delicious shrooms. -#define COFFEE 0x200 // Mostly here for tajara. -#define GENERIC 0x400 // Catchall for stuff that doesn't fall into the groups above. You shouldn't be allergic to this type, ever. -#define SUGARS 0x800 // For unathi-like reactions -#define EGGS 0x1000 // For Skrell eggs allergy +#define ALLERGEN_MEAT 0x1 // Skrell won't like this. +#define ALLERGEN_FISH 0x2 // Seperate for completion's sake. Still bad for skrell. +#define ALLERGEN_FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic. +#define ALLERGEN_VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently. +#define ALLERGEN_GRAINS 0x10 // Wheat, oats, etc. +#define ALLERGEN_BEANS 0x20 // The musical fruit! Includes soy. +#define ALLERGEN_SEEDS 0x40 // Hope you don't have a nut allergy. +#define ALLERGEN_DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell. +#define ALLERGEN_FUNGI 0x100 // Delicious shrooms. +#define ALLERGEN_COFFEE 0x200 // Mostly here for tajara. +#define ALLERGEN_SUGARS 0x400 // For unathi-like reactions +#define ALLERGEN_EGGS 0x800 // For Skrell eggs allergy // Allergen reactions #define AG_TOX_DMG 0x1 // the classic diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm index 770d58573f..028065ec12 100644 --- a/code/__defines/turfs.dm +++ b/code/__defines/turfs.dm @@ -19,4 +19,8 @@ #define isCardinal(x) (x == NORTH || x == SOUTH || x == EAST || x == WEST) #define isDiagonal(x) (x == NORTHEAST || x == SOUTHEAST || x == NORTHWEST || x == SOUTHWEST) +<<<<<<< HEAD #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) +======= +#define FOOTSTEP_SPRITE_AMT 2 +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/_helpers/_lists.dm b/code/_helpers/_lists.dm index a87307ac80..0d1a46b2ea 100644 --- a/code/_helpers/_lists.dm +++ b/code/_helpers/_lists.dm @@ -79,7 +79,7 @@ return counting_english_list(input, output_icons, determiners, nothing_text, and_text, comma_text, final_comma_text) //Returns list element or null. Should prevent "index out of bounds" error. -proc/listgetindex(var/list/list,index) +/proc/listgetindex(var/list/list,index) if(istype(list) && list.len) if(isnum(index)) if(InRange(index,1,list.len)) @@ -89,13 +89,13 @@ proc/listgetindex(var/list/list,index) return //Return either pick(list) or null if list is not of type /list or is empty -proc/safepick(list/list) +/proc/safepick(list/list) if(!islist(list) || !list.len) return return pick(list) //Checks if the list is empty -proc/isemptylist(list/list) +/proc/isemptylist(list/list) if(!list.len) return 1 return 0 @@ -177,13 +177,13 @@ proc/isemptylist(list/list) ////////////////////////////////////////////////////// //Empties the list by setting the length to 0. Hopefully the elements get garbage collected -proc/clearlist(list/list) +/proc/clearlist(list/list) if(istype(list)) list.len = 0 return //Removes any null entries from the list -proc/listclearnulls(list/list) +/proc/listclearnulls(list/list) if(istype(list)) while(null in list) list -= null @@ -611,7 +611,7 @@ This actually tests if they have the same entries and values. min = mid+1 /* -proc/dd_sortedObjectList(list/incoming) +/proc/dd_sortedObjectList(list/incoming) /* Use binary search to order by dd_SortValue(). This works by going to the half-point of the list, seeing if the node in @@ -669,7 +669,7 @@ proc/dd_sortedObjectList(list/incoming) return sorted_list */ -proc/dd_sortedtextlist(list/incoming, case_sensitive = 0) +/proc/dd_sortedtextlist(list/incoming, case_sensitive = 0) // Returns a new list with the text values sorted. // Use binary search to order by sortValue. // This works by going to the half-point of the list, seeing if the node in question is higher or lower cost, @@ -728,7 +728,7 @@ proc/dd_sortedtextlist(list/incoming, case_sensitive = 0) return sorted_text -proc/dd_sortedTextList(list/incoming) +/proc/dd_sortedTextList(list/incoming) var/case_sensitive = 1 return dd_sortedtextlist(incoming, case_sensitive) diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 3bd4e20fe1..c7631479f8 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -309,39 +309,35 @@ return list("mobs" = mobs, "objs" = objs) -#define SIGN(X) ((X<0)?-1:1) - -proc - inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) - var/turf/T - if(X1==X2) - if(Y1==Y2) - return 1 //Light cannot be blocked on same tile - else - var/s = SIGN(Y2-Y1) - Y1+=s - while(Y1!=Y2) - T=locate(X1,Y1,Z) - if(T.opacity) - return 0 - Y1+=s +/proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) + var/turf/T + if(X1==X2) + if(Y1==Y2) + return 1 //Light cannot be blocked on same tile else - var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - var/signX = SIGN(X2-X1) - var/signY = SIGN(Y2-Y1) - if(X1 transparent, gray -> translucent white, white -> solid white - proc/BecomeAlphaMask() - SwapColor(null, "#000000ff") // don't let transparent become gray - MapColors(0,0,0,0.3, 0,0,0,0.59, 0,0,0,0.11, 0,0,0,0, 1,1,1,0) +// Change a grayscale icon into a white icon where the original color becomes the alpha +// I.e., black -> transparent, gray -> translucent white, white -> solid white +/icon/proc/BecomeAlphaMask() + SwapColor(null, "#000000ff") // don't let transparent become gray + MapColors(0,0,0,0.3, 0,0,0,0.59, 0,0,0,0.11, 0,0,0,0, 1,1,1,0) - proc/UseAlphaMask(mask) - Opaque() - AddAlphaMask(mask) +/icon/proc/UseAlphaMask(mask) + Opaque() + AddAlphaMask(mask) - proc/AddAlphaMask(mask) - var/icon/M = new(mask) - M.Blend("#ffffff", ICON_SUBTRACT) - // apply mask - Blend(M, ICON_ADD) +/icon/proc/AddAlphaMask(mask) + var/icon/M = new(mask) + M.Blend("#ffffff", ICON_SUBTRACT) + // apply mask + Blend(M, ICON_ADD) /* HSV format is represented as "#hhhssvv" or "#hhhssvvaa" @@ -317,7 +316,7 @@ icon Higher value means brighter color */ -proc/ReadRGB(rgb) +/proc/ReadRGB(rgb) if(!rgb) return // interpret the HSV or HSVA value @@ -367,6 +366,7 @@ proc/ReadRGB(rgb) . = list(r, g, b) if(usealpha) . += alpha +<<<<<<< HEAD proc/RGBdec2hex(var/list/values) var/string = "" while(values.len) @@ -375,6 +375,9 @@ proc/RGBdec2hex(var/list/values) return "#[string]" proc/ReadHSV(hsv) +======= +/proc/ReadHSV(hsv) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(!hsv) return // interpret the HSV or HSVA value @@ -413,7 +416,7 @@ proc/ReadHSV(hsv) . = list(hue, sat, val) if(usealpha) . += alpha -proc/HSVtoRGB(hsv) +/proc/HSVtoRGB(hsv) if(!hsv) return "#000000" var/list/HSV = ReadHSV(hsv) if(!HSV) return "#000000" @@ -441,7 +444,7 @@ proc/HSVtoRGB(hsv) return (HSV.len > 3) ? rgb(r,g,b,HSV[4]) : rgb(r,g,b) -proc/RGBtoHSV(rgb) +/proc/RGBtoHSV(rgb) if(!rgb) return "#0000000" var/list/RGB = ReadRGB(rgb) if(!RGB) return "#0000000" @@ -472,7 +475,7 @@ proc/RGBtoHSV(rgb) return hsv(hue, sat, val, (RGB.len>3 ? RGB[4] : null)) -proc/hsv(hue, sat, val, alpha) +/proc/hsv(hue, sat, val, alpha) if(hue < 0 || hue >= 1536) hue %= 1536 if(hue < 0) hue += 1536 if((hue & 0xFF) == 0xFF) @@ -505,7 +508,7 @@ proc/hsv(hue, sat, val, alpha) amount<0 or amount>1 are allowed */ -proc/BlendHSV(hsv1, hsv2, amount) +/proc/BlendHSV(hsv1, hsv2, amount) var/list/HSV1 = ReadHSV(hsv1) var/list/HSV2 = ReadHSV(hsv2) @@ -559,7 +562,7 @@ proc/BlendHSV(hsv1, hsv2, amount) amount<0 or amount>1 are allowed */ -proc/BlendRGB(rgb1, rgb2, amount) +/proc/BlendRGB(rgb1, rgb2, amount) var/list/RGB1 = ReadRGB(rgb1) var/list/RGB2 = ReadRGB(rgb2) @@ -575,10 +578,10 @@ proc/BlendRGB(rgb1, rgb2, amount) return isnull(alpha) ? rgb(r, g, b) : rgb(r, g, b, alpha) -proc/BlendRGBasHSV(rgb1, rgb2, amount) +/proc/BlendRGBasHSV(rgb1, rgb2, amount) return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount) -proc/HueToAngle(hue) +/proc/HueToAngle(hue) // normalize hsv in case anything is screwy if(hue < 0 || hue >= 1536) hue %= 1536 if(hue < 0) hue += 1536 @@ -586,7 +589,7 @@ proc/HueToAngle(hue) hue -= hue >> 8 return hue / (1530/360) -proc/AngleToHue(angle) +/proc/AngleToHue(angle) // normalize hsv in case anything is screwy if(angle < 0 || angle >= 360) angle -= 360 * round(angle / 360) var/hue = angle * (1530/360) @@ -596,7 +599,7 @@ proc/AngleToHue(angle) // positive angle rotates forward through red->green->blue -proc/RotateHue(hsv, angle) +/proc/RotateHue(hsv, angle) var/list/HSV = ReadHSV(hsv) // normalize hsv in case anything is screwy @@ -618,13 +621,13 @@ proc/RotateHue(hsv, angle) return hsv(HSV[1], HSV[2], HSV[3], (HSV.len > 3 ? HSV[4] : null)) // Convert an rgb color to grayscale -proc/GrayScale(rgb) +/proc/GrayScale(rgb) var/list/RGB = ReadRGB(rgb) var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11 return (RGB.len > 3) ? rgb(gray, gray, gray, RGB[4]) : rgb(gray, gray, gray) // Change grayscale color to black->tone->white range -proc/ColorTone(rgb, tone) +/proc/ColorTone(rgb, tone) var/list/RGB = ReadRGB(rgb) var/list/TONE = ReadRGB(tone) @@ -934,7 +937,7 @@ GLOBAL_LIST_EMPTY(cached_examine_icons) /proc/uncache_examine_icon(var/weakref/WR) GLOB.cached_examine_icons -= WR -proc/adjust_brightness(var/color, var/value) +/proc/adjust_brightness(var/color, var/value) if (!color) return "#FFFFFF" if (!value) return color @@ -944,7 +947,7 @@ proc/adjust_brightness(var/color, var/value) RGB[3] = CLAMP(RGB[3]+value,0,255) return rgb(RGB[1],RGB[2],RGB[3]) -proc/sort_atoms_by_layer(var/list/atoms) +/proc/sort_atoms_by_layer(var/list/atoms) // Comb sort icons based on levels var/list/result = atoms.Copy() var/gap = result.len diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index d4400da8df..684aa40dae 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -1,4 +1,4 @@ -proc/random_hair_style(gender, species = SPECIES_HUMAN) +/proc/random_hair_style(gender, species = SPECIES_HUMAN) var/h_style = "Bald" var/list/valid_hairstyles = list() @@ -17,7 +17,7 @@ proc/random_hair_style(gender, species = SPECIES_HUMAN) return h_style -proc/random_facial_hair_style(gender, species = SPECIES_HUMAN) +/proc/random_facial_hair_style(gender, species = SPECIES_HUMAN) var/f_style = "Shaved" var/list/valid_facialhairstyles = list() @@ -37,14 +37,14 @@ proc/random_facial_hair_style(gender, species = SPECIES_HUMAN) return f_style -proc/sanitize_name(name, species = SPECIES_HUMAN, robot = 0) +/proc/sanitize_name(name, species = SPECIES_HUMAN, robot = 0) var/datum/species/current_species if(species) current_species = GLOB.all_species[species] return current_species ? current_species.sanitize_name(name, robot) : sanitizeName(name, MAX_NAME_LEN, robot) -proc/random_name(gender, species = SPECIES_HUMAN) +/proc/random_name(gender, species = SPECIES_HUMAN) var/datum/species/current_species if(species) @@ -58,7 +58,7 @@ proc/random_name(gender, species = SPECIES_HUMAN) else return current_species.get_random_name(gender) -proc/random_skin_tone() +/proc/random_skin_tone() switch(pick(60;"caucasian", 15;"afroamerican", 10;"african", 10;"latino", 5;"albino")) if("caucasian") . = -10 if("afroamerican") . = -115 @@ -68,7 +68,7 @@ proc/random_skin_tone() else . = rand(-185,34) return min(max( .+rand(-25, 25), -185),34) -proc/skintone2racedescription(tone) +/proc/skintone2racedescription(tone) switch (tone) if(30 to INFINITY) return "albino" if(20 to 30) return "pale" @@ -80,7 +80,7 @@ proc/skintone2racedescription(tone) if(-INFINITY to -65) return "black" else return "unknown" -proc/age2agedescription(age) +/proc/age2agedescription(age) switch(age) if(0 to 1) return "infant" if(1 to 3) return "toddler" diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index afc4c9a463..bfa7256c9f 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -319,7 +319,7 @@ //Used in preferences' SetFlavorText and human's set_flavor verb //Previews a string of len or less length -proc/TextPreview(var/string,var/len=40) +/proc/TextPreview(var/string,var/len=40) if(length(string) <= len) if(!length(string)) return "\[...\]" diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index b75aeb77e3..11c7911159 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -80,7 +80,7 @@ var/next_station_date_change = 1 DAY return time2text(wtime - GLOB.timezoneOffset, format) /* Returns 1 if it is the selected month and day */ -proc/isDay(var/month, var/day) +/proc/isDay(var/month, var/day) if(isnum(month) && isnum(day)) var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 69f705a969..319deaa777 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -596,7 +596,7 @@ Turf and target are seperate in case you want to teleport some distance from a t return max(min(middle, high), low) //returns random gauss number -proc/GaussRand(var/sigma) +/proc/GaussRand(var/sigma) var/x,y,rsq do x=2*rand()-1 @@ -606,7 +606,7 @@ proc/GaussRand(var/sigma) return sigma*y*sqrt(-2*log(rsq)/rsq) //returns random gauss number, rounded to 'roundto' -proc/GaussRandRound(var/sigma,var/roundto) +/proc/GaussRandRound(var/sigma,var/roundto) return round(GaussRand(sigma),roundto) //Will return the contents of an atom recursivly to a depth of 'searchDepth' @@ -867,7 +867,7 @@ proc/GaussRandRound(var/sigma,var/roundto) refined_trg -= B continue moving -proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) +/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) return null @@ -1015,16 +1015,16 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) -proc/get_cardinal_dir(atom/A, atom/B) +/proc/get_cardinal_dir(atom/A, atom/B) var/dx = abs(B.x - A.x) var/dy = abs(B.y - A.y) return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) //chances are 1:value. anyprob(1) will always return true -proc/anyprob(value) +/proc/anyprob(value) return (rand(1,value)==value) -proc/view_or_range(distance = world.view , center = usr , type) +/proc/view_or_range(distance = world.view , center = usr , type) switch(type) if("view") . = view(distance,center) @@ -1032,7 +1032,7 @@ proc/view_or_range(distance = world.view , center = usr , type) . = range(distance,center) return -proc/oview_or_orange(distance = world.view , center = usr , type) +/proc/oview_or_orange(distance = world.view , center = usr , type) switch(type) if("view") . = oview(distance,center) @@ -1040,7 +1040,7 @@ proc/oview_or_orange(distance = world.view , center = usr , type) . = orange(distance,center) return -proc/get_mob_with_client_list() +/proc/get_mob_with_client_list() var/list/mobs = list() for(var/mob/M in mob_list) if (M.client) @@ -1097,7 +1097,7 @@ var/global/list/common_tools = list( return TRUE return -proc/is_hot(obj/item/W as obj) +/proc/is_hot(obj/item/W as obj) switch(W.type) if(/obj/item/weapon/weldingtool) var/obj/item/weapon/weldingtool/WT = W @@ -1487,8 +1487,6 @@ var/mob/dview/dview_mob = new /proc/pass() return -#define NAMEOF(datum, X) (#X || ##datum.##X) - /proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) if (value == FALSE) //nothing should be calling us with a number, so this is safe value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text diff --git a/code/_macros.dm b/code/_macros.dm index 18a8ddf825..d122d9045f 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -40,5 +40,6 @@ #define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } -#define isitem(A) istype(A, /obj/item) -#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) +#define WORLD_ICON_SIZE 32 //Needed for the R-UST port + +#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 4a1eb20d11..bdde739d83 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -191,7 +191,7 @@ var/list/global_huds = list( var/list/minihuds = list() -datum/hud/New(mob/owner) +/datum/hud/New(mob/owner) mymob = owner instantiate() ..() diff --git a/code/_onclick/hud/skybox.dm b/code/_onclick/hud/skybox.dm index efd1179891..268e4e6518 100644 --- a/code/_onclick/hud/skybox.dm +++ b/code/_onclick/hud/skybox.dm @@ -62,6 +62,5 @@ client.update_skybox() client.skybox?.scale_to_view(client.view) -#undef SKYBOX_BORDER #undef SKYBOX_PIXELS #undef SKYBOX_TURFS diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index bf1b337e77..48accdb7fa 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -4,14 +4,14 @@ These are the default click code call sequences used when clicking on stuff with Atoms: -mob/ClickOn() calls the item's resolve_attackby() proc. +/mob/ClickOn() calls the item's resolve_attackby() proc. item/resolve_attackby() calls the target atom's attackby() proc. Mobs: -mob/living/attackby() after checking for surgery, calls the item's attack() proc. +/mob/living/attackby() after checking for surgery, calls the item's attack() proc. item/attack() generates attack logs, sets click cooldown and calls the mob's attacked_with_item() proc. If you override this, consider whether you need to set a click cooldown, play attack animations, and generate logs yourself. -mob/attacked_with_item() should then do mob-type specific stuff (like determining hit/miss, handling shields, etc) and then possibly call the item's apply_hit_effect() proc to actually apply the effects of being hit. +/mob/attacked_with_item() should then do mob-type specific stuff (like determining hit/miss, handling shields, etc) and then possibly call the item's apply_hit_effect() proc to actually apply the effects of being hit. Item Hit Effects: diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm index a1cc369303..39b1210a0a 100644 --- a/code/controllers/autotransfer.dm +++ b/code/controllers/autotransfer.dm @@ -1,20 +1,24 @@ var/datum/controller/transfer_controller/transfer_controller -datum/controller/transfer_controller +/datum/controller/transfer_controller var/timerbuffer = 0 //buffer for time check var/currenttick = 0 +<<<<<<< HEAD var/shift_hard_end = 0 //VOREStation Edit var/shift_last_vote = 0 //VOREStation Edit datum/controller/transfer_controller/New() +======= +/datum/controller/transfer_controller/New() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) timerbuffer = config.vote_autotransfer_initial shift_hard_end = config.vote_autotransfer_initial + (config.vote_autotransfer_interval * 0) //VOREStation Edit //Change this "1" to how many extend votes you want there to be. shift_last_vote = shift_hard_end - config.vote_autotransfer_interval //VOREStation Edit START_PROCESSING(SSprocessing, src) -datum/controller/transfer_controller/Destroy() +/datum/controller/transfer_controller/Destroy() STOP_PROCESSING(SSprocessing, src) -datum/controller/transfer_controller/process() +/datum/controller/transfer_controller/process() currenttick = currenttick + 1 //VOREStation Edit START if (round_duration_in_ds >= shift_last_vote - 2 MINUTES) diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index c1d87d7ef3..a2393818ff 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -192,11 +192,14 @@ var/list/ANTAG_FREQS = list(SYND_FREQ, RAID_FREQ) //Department channels, arranged lexically var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ) +<<<<<<< HEAD var/list/OFFMAP_FREQS = list(TALON_FREQ) //VOREStation Add #define TRANSMISSION_WIRE 0 #define TRANSMISSION_RADIO 1 +======= +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /proc/frequency_span_class(var/frequency) // Antags! if (frequency in ANTAG_FREQS) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 2695a39373..bcea4490de 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -13,10 +13,10 @@ var/global/last_tick_duration = 0 var/global/pipe_processing_killed = 0 -datum/controller/game_controller +/datum/controller/game_controller var/list/shuttle_list // For debugging and VV -datum/controller/game_controller/New() +/datum/controller/game_controller/New() //There can be only one master_controller. Out with the old and in with the new. if(master_controller != src) log_debug("Rebuilding Master Controller") @@ -33,7 +33,7 @@ datum/controller/game_controller/New() if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() -datum/controller/game_controller/proc/setup() +/datum/controller/game_controller/proc/setup() setup_objects() // setupgenetics() Moved to SSatoms @@ -48,7 +48,7 @@ datum/controller/game_controller/proc/setup() // #define CHECK_SLEEP_MASTER if(++initialized_objects > 500) { initialized_objects=0;sleep(world.tick_lag); } // #endif -datum/controller/game_controller/proc/setup_objects() +/datum/controller/game_controller/proc/setup_objects() // Set up antagonists. populate_antag_type_list() diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index f851e3edf2..fec8cc1468 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -86,6 +86,29 @@ SUBSYSTEM_DEF(lighting) queue.Cut(1, i+1) +<<<<<<< HEAD /datum/controller/subsystem/lighting/Recover() subsystem_initialized = SSlighting.subsystem_initialized ..() +======= + DUAL_TICK_CHECK + +/datum/controller/subsystem/lighting/stat_entry(msg_prefix) + var/list/msg = list(msg_prefix) + msg += "T:{" + msg += "S [total_lighting_sources] | " + msg += "C [total_lighting_corners] | " + msg += "O [total_lighting_overlays]" + msg += "}" + msg += "C:{" + msg += "S [round(cost_lights, 1)] | " + msg += "C [round(cost_corners, 1)] | " + msg += "O [round(cost_overlays, 1)]" + msg += "}" + ..(msg.Join()) + +#undef DUAL_TICK_CHECK +#undef SSLIGHTING_STAGE_LIGHTS +#undef SSLIGHTING_STAGE_CORNERS +#undef SSLIGHTING_STAGE_OVERLAYS +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/controllers/subsystems/machines.dm b/code/controllers/subsystems/machines.dm index 29d6ecce56..68f0ebfff7 100644 --- a/code/controllers/subsystems/machines.dm +++ b/code/controllers/subsystems/machines.dm @@ -175,5 +175,4 @@ SUBSYSTEM_DEF(machines) #undef SSMACHINES_PIPENETS #undef SSMACHINES_MACHINERY -#undef SSMACHINES_POWER #undef SSMACHINES_POWER_OBJECTS diff --git a/code/datums/category.dm b/code/datums/category.dm index 45b2df5996..624183fe98 100644 --- a/code/datums/category.dm +++ b/code/datums/category.dm @@ -58,7 +58,7 @@ collection = null return ..() -datum/category_group/dd_SortValue() +/datum/category_group/dd_SortValue() return name @@ -77,5 +77,5 @@ datum/category_group/dd_SortValue() category = null return ..() -datum/category_item/dd_SortValue() +/datum/category_item/dd_SortValue() return name diff --git a/code/datums/computerfiles.dm b/code/datums/computerfiles.dm deleted file mode 100644 index 14cd7e3861..0000000000 --- a/code/datums/computerfiles.dm +++ /dev/null @@ -1,7 +0,0 @@ -datum - computer - var/name - folder - var/list/datum/computer/contents = list() - - file \ No newline at end of file diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index 424f113a9c..bc3661470e 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -6,62 +6,62 @@ /datum/events var/list/events - New() - ..() - events = new +/datum/events/New() + ..() + events = new - proc/addEventType(event_type as text) - if(!(event_type in events) || !islist(events[event_type])) - events[event_type] = list() - return 1 - return - - - // Arguments: event_type as text, proc_holder as datum, proc_name as text - // Returns: New event, null on error. - proc/addEvent(event_type as text, proc_holder, proc_name as text) - if(!event_type || !proc_holder || !proc_name) - return - addEventType(event_type) - var/list/event = events[event_type] - var/datum/event/E = new /datum/event(proc_holder,proc_name) - event += E - return E - - // Arguments: event_type as text, any number of additional arguments to pass to event handler - // Returns: null - proc/fireEvent() - //to_world("Events in [args[1]] called") - var/list/event = listgetindex(events,args[1]) - if(istype(event)) - spawn(-1) - for(var/datum/event/E in event) - if(!E.Fire(arglist(args.Copy(2)))) - clearEvent(args[1],E) - return - - // Arguments: event_type as text, E as /datum/event - // Returns: 1 if event cleared, null on error - proc/clearEvent(event_type as text, datum/event/E) - if(!event_type || !E) - return - var/list/event = listgetindex(events,event_type) - event -= E +/datum/events/proc/addEventType(event_type as text) + if(!(event_type in events) || !islist(events[event_type])) + events[event_type] = list() return 1 + return + + +// Arguments: event_type as text, proc_holder as datum, proc_name as text +// Returns: New event, null on error. +/datum/events/proc/addEvent(event_type as text, proc_holder, proc_name as text) + if(!event_type || !proc_holder || !proc_name) + return + addEventType(event_type) + var/list/event = events[event_type] + var/datum/event/E = new /datum/event(proc_holder,proc_name) + event += E + return E + +// Arguments: event_type as text, any number of additional arguments to pass to event handler +// Returns: null +/datum/events/proc/fireEvent() + //to_world("Events in [args[1]] called") + var/list/event = listgetindex(events,args[1]) + if(istype(event)) + spawn(-1) + for(var/datum/event/E in event) + if(!E.Fire(arglist(args.Copy(2)))) + clearEvent(args[1],E) + return + +// Arguments: event_type as text, E as /datum/event +// Returns: 1 if event cleared, null on error +/datum/events/proc/clearEvent(event_type as text, datum/event/E) + if(!event_type || !E) + return + var/list/event = listgetindex(events,event_type) + event -= E + return 1 /datum/event var/listener var/proc_name - New(tlistener,tprocname) - listener = tlistener - proc_name = tprocname - return ..() +/datum/event/New(tlistener,tprocname) + listener = tlistener + proc_name = tprocname + return ..() - proc/Fire() - //to_world("Event fired") - if(listener) - call(listener,proc_name)(arglist(args)) - return 1 - return \ No newline at end of file +/datum/event/proc/Fire() + //to_world("Event fired") + if(listener) + call(listener,proc_name)(arglist(args)) + return 1 + return \ No newline at end of file diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 7cfac614e6..12d1fee625 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -53,7 +53,7 @@ GLOBAL_DATUM(revdata, /datum/getrev) continue . += "#[tm.number][details]" -client/verb/showrevinfo() +/client/verb/showrevinfo() set category = "OOC" set name = "Show Server Revision" set desc = "Check the current server code revision" diff --git a/code/datums/helper_datums/topic_input.dm b/code/datums/helper_datums/topic_input.dm index 17dd3f1266..809a6c4bc5 100644 --- a/code/datums/helper_datums/topic_input.dm +++ b/code/datums/helper_datums/topic_input.dm @@ -2,59 +2,59 @@ var/href var/list/href_list - New(thref,list/thref_list) - href = thref - href_list = thref_list.Copy() - return +/datum/topic_input/New(thref,list/thref_list) + href = thref + href_list = thref_list.Copy() + return - proc/get(i) - return listgetindex(href_list,i) +/datum/topic_input/proc/get(i) + return listgetindex(href_list,i) - proc/getAndLocate(i) - var/t = get(i) - if(t) - t = locate(t) - return t || null +/datum/topic_input/proc/getAndLocate(i) + var/t = get(i) + if(t) + t = locate(t) + return t || null - proc/getNum(i) - var/t = get(i) - if(t) - t = text2num(t) - return isnum(t) ? t : null +/datum/topic_input/proc/getNum(i) + var/t = get(i) + if(t) + t = text2num(t) + return isnum(t) ? t : null - proc/getObj(i) - var/t = getAndLocate(i) - return isobj(t) ? t : null +/datum/topic_input/proc/getObj(i) + var/t = getAndLocate(i) + return isobj(t) ? t : null - proc/getMob(i) - var/t = getAndLocate(i) - return ismob(t) ? t : null +/datum/topic_input/proc/getMob(i) + var/t = getAndLocate(i) + return ismob(t) ? t : null - proc/getTurf(i) - var/t = getAndLocate(i) - return isturf(t) ? t : null +/datum/topic_input/proc/getTurf(i) + var/t = getAndLocate(i) + return isturf(t) ? t : null - proc/getAtom(i) - return getType(i,/atom) +/datum/topic_input/proc/getAtom(i) + return getType(i,/atom) - proc/getArea(i) - var/t = getAndLocate(i) - return isarea(t) ? t : null +/datum/topic_input/proc/getArea(i) + var/t = getAndLocate(i) + return isarea(t) ? t : null - proc/getStr(i)//params should always be text, but... - var/t = get(i) - return istext(t) ? t : null +/datum/topic_input/proc/getStr(i)//params should always be text, but... + var/t = get(i) + return istext(t) ? t : null - proc/getType(i,type) - var/t = getAndLocate(i) - return istype(t,type) ? t : null +/datum/topic_input/proc/getType(i,type) + var/t = getAndLocate(i) + return istype(t,type) ? t : null - proc/getPath(i) - var/t = get(i) - if(t) - t = text2path(t) - return ispath(t) ? t : null +/datum/topic_input/proc/getPath(i) + var/t = get(i) + if(t) + t = text2path(t) + return ispath(t) ? t : null - proc/getList(i) - var/t = getAndLocate(i) - return islist(t) ? t : null \ No newline at end of file +/datum/topic_input/proc/getList(i) + var/t = getAndLocate(i) + return islist(t) ? t : null \ No newline at end of file diff --git a/code/datums/managed_browsers/feedback_form.dm b/code/datums/managed_browsers/feedback_form.dm index bc5c456aec..00755c7624 100644 --- a/code/datums/managed_browsers/feedback_form.dm +++ b/code/datums/managed_browsers/feedback_form.dm @@ -4,7 +4,7 @@ /client/can_vv_get(var_name) return var_name != NAMEOF(src, feedback_form) // No snooping. -GENERAL_PROTECT_DATUM(datum/managed_browser/feedback_form) +GENERAL_PROTECT_DATUM(/datum/managed_browser/feedback_form) // A fairly simple object to hold information about a player's feedback as it's being written. // Having this be it's own object instead of being baked into /mob/new_player allows for it to be used diff --git a/code/datums/supplypacks/costumes.dm b/code/datums/supplypacks/costumes.dm index 9afd0fd60f..4af40491d3 100644 --- a/code/datums/supplypacks/costumes.dm +++ b/code/datums/supplypacks/costumes.dm @@ -109,7 +109,7 @@ containertype = /obj/structure/closet/crate/gilthari containername = "Formal suit crate" -datum/supply_pack/costumes/witch +/datum/supply_pack/costumes/witch name = "Witch costume" containername = "Witch costume" containertype = /obj/structure/closet/crate/nanothreads diff --git a/code/datums/underwear/underwear.dm b/code/datums/underwear/underwear.dm index f418f3e8d1..e3bf9d37ea 100644 --- a/code/datums/underwear/underwear.dm +++ b/code/datums/underwear/underwear.dm @@ -12,7 +12,7 @@ var/display_name // For displaying in text var/gender = NEUTER -datum/category_group/underwear/dd_SortValue() +/datum/category_group/underwear/dd_SortValue() return sort_order /datum/category_group/underwear/top diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm index f7236ddbb0..e075021c52 100644 --- a/code/datums/uplink/uplink_categories.dm +++ b/code/datums/uplink/uplink_categories.dm @@ -6,7 +6,7 @@ ..() items = list() -datum/uplink_category/ammunition +/datum/uplink_category/ammunition name = "Ammunition" /datum/uplink_category/services diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index e02e604984..7156f807bd 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -95,7 +95,7 @@ var/datum/uplink/uplink = new() log_and_message_admins("\the [M] bought \a [src] through the uplink") M.mind.purchase_log[src] += 1 -datum/uplink_item/dd_SortValue() +/datum/uplink_item/dd_SortValue() return item_cost /******************************** diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 18f889ffae..72b808165a 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -4,16 +4,16 @@ anchored = 1 density = 1 - attackby(obj/item/weapon/W as obj, mob/user as mob) - return attack_hand(user) +/obj/structure/signpost/attackby(obj/item/weapon/W as obj, mob/user as mob) + return attack_hand(user) - attack_hand(mob/user as mob) - switch(alert("Travel back to ss13?",,"Yes","No")) - if("Yes") - if(user.z != src.z) return - user.forceMove(pick(latejoin)) - if("No") - return +/obj/structure/signpost/attack_hand(mob/user as mob) + switch(alert("Travel back to ss13?",,"Yes","No")) + if("Yes") + if(user.z != src.z) return + user.forceMove(pick(latejoin)) + if("No") + return /obj/effect/mark var/mark = "" @@ -99,9 +99,9 @@ drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - user.drop_item() - src.throw_at(target, throw_range, throw_speed, user) +/obj/item/weapon/beach_ball/afterattack(atom/target as mob|obj|turf|area, mob/user as mob) + user.drop_item() + src.throw_at(target, throw_range, throw_speed, user) /obj/effect/spawner name = "object spawner" diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 3ce268d375..c29ffef73f 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -37,69 +37,69 @@ length to avoid portals or something i guess?? Not that they're counted right no // Also added 'exclude' turf to avoid travelling over; defaults to null -PriorityQueue +/PriorityQueue var/list/queue var/comparison_function - New(compare) - queue = list() - comparison_function = compare +/PriorityQueue/New(compare) + queue = list() + comparison_function = compare - proc/IsEmpty() - return !queue.len +/PriorityQueue/proc/IsEmpty() + return !queue.len - proc/Enqueue(var/data) - queue.Add(data) - var/index = queue.len +/PriorityQueue/proc/Enqueue(var/data) + queue.Add(data) + var/index = queue.len - //From what I can tell, this automagically sorts the added data into the correct location. - while(index > 2 && call(comparison_function)(queue[index / 2], queue[index]) > 0) - queue.Swap(index, index / 2) - index /= 2 + //From what I can tell, this automagically sorts the added data into the correct location. + while(index > 2 && call(comparison_function)(queue[index / 2], queue[index]) > 0) + queue.Swap(index, index / 2) + index /= 2 - proc/Dequeue() - if(!queue.len) - return 0 - return Remove(1) +/PriorityQueue/proc/Dequeue() + if(!queue.len) + return 0 + return Remove(1) - proc/Remove(var/index) - if(index > queue.len) - return 0 +/PriorityQueue/proc/Remove(var/index) + if(index > queue.len) + return 0 - var/thing = queue[index] - queue.Swap(index, queue.len) - queue.Cut(queue.len) - if(index < queue.len) - FixQueue(index) - return thing + var/thing = queue[index] + queue.Swap(index, queue.len) + queue.Cut(queue.len) + if(index < queue.len) + FixQueue(index) + return thing - proc/FixQueue(var/index) - var/child = 2 * index - var/item = queue[index] +/PriorityQueue/proc/FixQueue(var/index) + var/child = 2 * index + var/item = queue[index] - while(child <= queue.len) - if(child < queue.len && call(comparison_function)(queue[child], queue[child + 1]) > 0) - child++ - if(call(comparison_function)(item, queue[child]) > 0) - queue[index] = queue[child] - index = child - else - break - child = 2 * index - queue[index] = item + while(child <= queue.len) + if(child < queue.len && call(comparison_function)(queue[child], queue[child + 1]) > 0) + child++ + if(call(comparison_function)(item, queue[child]) > 0) + queue[index] = queue[child] + index = child + else + break + child = 2 * index + queue[index] = item - proc/List() - return queue.Copy() +/PriorityQueue/proc/List() + return queue.Copy() - proc/Length() - return queue.len +/PriorityQueue/proc/Length() + return queue.len - proc/RemoveItem(data) - var/index = queue.Find(data) - if(index) - return Remove(index) +/PriorityQueue/proc/RemoveItem(data) + var/index = queue.Find(data) + if(index) + return Remove(index) -PathNode +/PathNode var/datum/position var/PathNode/previous_node @@ -109,21 +109,21 @@ PathNode var/cost var/nodes_traversed - New(_position, _previous_node, _known_cost, _cost, _nodes_traversed) - position = _position - previous_node = _previous_node +/PathNode/New(_position, _previous_node, _known_cost, _cost, _nodes_traversed) + position = _position + previous_node = _previous_node - known_cost = _known_cost - cost = _cost - estimated_cost = cost + known_cost + known_cost = _known_cost + cost = _cost + estimated_cost = cost + known_cost - best_estimated_cost = estimated_cost - nodes_traversed = _nodes_traversed + best_estimated_cost = estimated_cost + nodes_traversed = _nodes_traversed -proc/PathWeightCompare(PathNode/a, PathNode/b) +/proc/PathWeightCompare(PathNode/a, PathNode/b) return a.estimated_cost - b.estimated_cost -proc/AStar(var/start, var/end, var/adjacent, var/dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude) +/proc/AStar(var/start, var/end, var/adjacent, var/dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude) var/PriorityQueue/open = new /PriorityQueue(/proc/PathWeightCompare) var/list/closed = list() var/list/path diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 568eb0f743..01cf2b574e 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -85,6 +85,7 @@ if(!istype(M,/mob/new_player) && !isdeaf(M)) to_chat(M, command) +<<<<<<< HEAD /datum/announcement/priority/Message(var/message as text, var/message_title as text, var/list/zlevels) global_announcer.autosay("[message_title]: [message]", announcer ? announcer : ANNOUNCER_NAME, channel = "Common", zlevels = zlevels) @@ -95,6 +96,13 @@ global_announcer.autosay("[message_title]: [message]", ANNOUNCER_NAME, channel = "Common", zlevels = zlevels) /datum/announcement/proc/NewsCast(var/message as text, var/message_title as text) +======= +/datum/announcement/priority/security/Message(message as text, message_title as text) + to_world("[message_title]") + to_world("[message]") + +/datum/announcement/proc/NewsCast(message as text, message_title as text) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(!newscast) return @@ -107,12 +115,19 @@ announce_newscaster_news(news) /datum/announcement/proc/PlaySound(var/message_sound, var/list/zlevels) +<<<<<<< HEAD +======= + if(!message_sound) + return + +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) for(var/mob/M in player_list) if(zlevels && !(M.z in zlevels)) continue if(!istype(M,/mob/new_player) && !isdeaf(M)) M << 'sound/AI/preamble.ogg' +<<<<<<< HEAD if(!message_sound) return @@ -125,6 +140,17 @@ /datum/announcement/proc/Sound(var/message_sound, var/list/zlevels) PlaySound(message_sound, zlevels) +======= +/datum/announcement/proc/Sound(var/message_sound, var/list/zlevels) + PlaySound(message_sound, zlevels) + +/datum/announcement/priority/Sound(var/message_sound) + if(message_sound) + world << message_sound + +/datum/announcement/priority/command/Sound(var/message_sound) + PlaySound(message_sound) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /datum/announcement/proc/Log(message as text, message_title as text) if(log) diff --git a/code/defines/procs/dbcore.dm b/code/defines/procs/dbcore.dm index 35470e8c59..e0f8ab94af 100644 --- a/code/defines/procs/dbcore.dm +++ b/code/defines/procs/dbcore.dm @@ -38,7 +38,7 @@ var/DB_SERVER = "" // This is the location of your MySQL server (localhost is US var/DB_PORT = 3306 // This is the port your MySQL server is running on (3306 is the default) */ -DBConnection +/DBConnection var/_db_con // This variable contains a reference to the actual database connection. var/dbi // This variable is a string containing the DBI MySQL requires. var/user // This variable contains the username data. @@ -48,14 +48,14 @@ DBConnection var/server = "" var/port = 3306 -DBConnection/New(dbi_handler,username,password_handler,cursor_handler) +/DBConnection/New(dbi_handler,username,password_handler,cursor_handler) src.dbi = dbi_handler src.user = username src.password = password_handler src.default_cursor = cursor_handler _db_con = _dm_db_new_con() -DBConnection/proc/Connect(dbi_handler=src.dbi,user_handler=src.user,password_handler=src.password,cursor_handler) +/DBConnection/proc/Connect(dbi_handler=src.dbi,user_handler=src.user,password_handler=src.password,cursor_handler) if(!config.sql_enabled) return 0 if(!src) return 0 @@ -63,24 +63,24 @@ DBConnection/proc/Connect(dbi_handler=src.dbi,user_handler=src.user,password_han if(!cursor_handler) cursor_handler = Default_Cursor return _dm_db_connect(_db_con,dbi_handler,user_handler,password_handler,cursor_handler,null) -DBConnection/proc/Disconnect() return _dm_db_close(_db_con) +/DBConnection/proc/Disconnect() return _dm_db_close(_db_con) -DBConnection/proc/IsConnected() +/DBConnection/proc/IsConnected() if(!config.sql_enabled) return 0 var/success = _dm_db_is_connected(_db_con) return success -DBConnection/proc/Quote(str) return _dm_db_quote(_db_con,str) +/DBConnection/proc/Quote(str) return _dm_db_quote(_db_con,str) -DBConnection/proc/ErrorMsg() return _dm_db_error_msg(_db_con) -DBConnection/proc/SelectDB(database_name,dbi) +/DBConnection/proc/ErrorMsg() return _dm_db_error_msg(_db_con) +/DBConnection/proc/SelectDB(database_name,dbi) if(IsConnected()) Disconnect() //return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[DB_SERVER]:[DB_PORT]"]",user,password) return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[sqladdress]:[sqlport]"]",user,password) -DBConnection/proc/NewQuery(sql_query,cursor_handler=src.default_cursor) return new/DBQuery(sql_query,src,cursor_handler) +/DBConnection/proc/NewQuery(sql_query,cursor_handler=src.default_cursor) return new/DBQuery(sql_query,src,cursor_handler) -DBQuery/New(sql_query,DBConnection/connection_handler,cursor_handler) +/DBQuery/New(sql_query,DBConnection/connection_handler,cursor_handler) if(sql_query) src.sql = sql_query if(connection_handler) src.db_connection = connection_handler if(cursor_handler) src.default_cursor = cursor_handler @@ -88,7 +88,7 @@ DBQuery/New(sql_query,DBConnection/connection_handler,cursor_handler) return ..() -DBQuery +/DBQuery var/sql // The sql query being executed. var/default_cursor var/list/columns //list of DB Columns populated by Columns() @@ -98,26 +98,26 @@ DBQuery var/DBConnection/db_connection var/_db_query -DBQuery/proc/Connect(DBConnection/connection_handler) src.db_connection = connection_handler +/DBQuery/proc/Connect(DBConnection/connection_handler) src.db_connection = connection_handler -DBQuery/proc/Execute(sql_query=src.sql,cursor_handler=default_cursor) +/DBQuery/proc/Execute(sql_query=src.sql,cursor_handler=default_cursor) Close() return _dm_db_execute(_db_query,sql_query,db_connection._db_con,cursor_handler,null) -DBQuery/proc/NextRow() return _dm_db_next_row(_db_query,item,conversions) +/DBQuery/proc/NextRow() return _dm_db_next_row(_db_query,item,conversions) -DBQuery/proc/RowsAffected() return _dm_db_rows_affected(_db_query) +/DBQuery/proc/RowsAffected() return _dm_db_rows_affected(_db_query) -DBQuery/proc/RowCount() return _dm_db_row_count(_db_query) +/DBQuery/proc/RowCount() return _dm_db_row_count(_db_query) -DBQuery/proc/ErrorMsg() return _dm_db_error_msg(_db_query) +/DBQuery/proc/ErrorMsg() return _dm_db_error_msg(_db_query) -DBQuery/proc/Columns() +/DBQuery/proc/Columns() if(!columns) columns = _dm_db_columns(_db_query,/DBColumn) return columns -DBQuery/proc/GetRowData() +/DBQuery/proc/GetRowData() var/list/columns = Columns() var/list/results if(columns.len) @@ -128,23 +128,23 @@ DBQuery/proc/GetRowData() results[C] = src.item[(cur_col.position+1)] return results -DBQuery/proc/Close() +/DBQuery/proc/Close() item.len = 0 columns = null conversions = null return _dm_db_close(_db_query) -DBQuery/proc/Quote(str) +/DBQuery/proc/Quote(str) return db_connection.Quote(str) -DBQuery/proc/SetConversion(column,conversion) +/DBQuery/proc/SetConversion(column,conversion) if(istext(column)) column = columns.Find(column) if(!conversions) conversions = new/list(column) else if(conversions.len < column) conversions.len = column conversions[column] = conversion -DBColumn +/DBColumn var/name var/table var/position //1-based index into item data @@ -153,7 +153,7 @@ DBColumn var/length var/max_length -DBColumn/New(name_handler,table_handler,position_handler,type_handler,flag_handler,length_handler,max_length_handler) +/DBColumn/New(name_handler,table_handler,position_handler,type_handler,flag_handler,length_handler,max_length_handler) src.name = name_handler src.table = table_handler src.position = position_handler @@ -164,7 +164,7 @@ DBColumn/New(name_handler,table_handler,position_handler,type_handler,flag_handl return ..() -DBColumn/proc/SqlTypeName(type_handler=src.sql_type) +/DBColumn/proc/SqlTypeName(type_handler=src.sql_type) switch(type_handler) if(TINYINT) return "TINYINT" if(SMALLINT) return "SMALLINT" diff --git a/code/defines/procs/sd_Alert.dm b/code/defines/procs/sd_Alert.dm deleted file mode 100644 index e10416f112..0000000000 --- a/code/defines/procs/sd_Alert.dm +++ /dev/null @@ -1,168 +0,0 @@ -/* sd_Alert library - by Shadowdarke (shadowdarke@byond.com) - - sd_Alert() is a powerful and flexible alternative to the built in BYOND - alert() proc. sd_Alert offers timed popups, unlimited buttons, custom - appearance, and even the option to popup without stealing keyboard focus - from the map or command line. - - Please see demo.dm for detailed examples. - -FORMAT - sd_Alert(who, message, title, buttons, default, duration, unfocus, \ - size, table, style, tag, select, flags) - -ARGUMENTS - who - the client or mob to display the alert to. - message - text message to display - title - title of the alert box - buttons - list of buttons - Default Value: list("Ok") - default - default button selestion - Default Value: the first button in the list - duration - the number of ticks before this alert expires. If not - set, the alert lasts until a button is clicked. - Default Value: 0 (unlimited) - unfocus - if this value is set, the popup will not steal keyboard - focus from the map or command line. - Default Value: 1 (do not take focus) - size - size of the popup window in px - Default Value: "300x200" - table - optional parameters for the HTML table in the alert - Default Value: "width=100% height=100%" (fill the window) - style - optional style sheet information - tag - lets you specify a certain tag for this sd_Alert so you may manipulate it - externally. (i.e. force the alert to close, change options and redisplay, - reuse the same window, etc.) - select - if set, the buttons will be replaced with a selection box with a number of - lines displayed equal to this value. - Default value: 0 (use buttons) - flags - optional flags effecting the alert display. These flags may be ORed (|) - together for multiple effects. - SD_ALERT_SCROLL = display a scrollbar - SD_ALERT_SELECT_MULTI = forces selection box display (instead of - buttons) allows the user to select multiple - choices. - SD_ALERT_LINKS = display each choice as a plain text link. - Any selection box style overrides this flag. - SD_ALERT_NOVALIDATE = don't validate responses - Default value: SD_ALERT_SCROLL - (button display with scroll bar, validate responses) -RETURNS - The text of the selected button, or null if the alert duration expired - without a button click. - -Version 1 changes (from version 0): -* Added the tag, select, and flags arguments, thanks to several suggestions from Foomer. -* Split the sd_Alert/Alert() proc into New(), Display(), and Response() to allow more - customization by developers. Primarily developers would want to use Display() to change - the display of active tagged windows - -*/ - - -#define SD_ALERT_SCROLL 1 -#define SD_ALERT_SELECT_MULTI 2 -#define SD_ALERT_LINKS 4 -#define SD_ALERT_NOVALIDATE 8 - -proc/sd_Alert(client/who, message, title, buttons = list("Ok"),\ - default, duration = 0, unfocus = 1, size = "300x200", \ - table = "width=100% height=100%", style, tag, select, flags = SD_ALERT_SCROLL) - - if(ismob(who)) - var/mob/M = who - who = M.client - if(!istype(who)) CRASH("sd_Alert: Invalid target:[who] (\ref[who])") - - var/sd_alert/T = locate(tag) - if(T) - if(istype(T)) qdel(T) - else CRASH("sd_Alert: tag \"[tag]\" is already in use by datum '[T]' (type: [T.type])") - T = new(who, tag) - if(duration) - spawn(duration) - if(T) qdel(T) - return - T.Display(message,title,buttons,default,unfocus,size,table,style,select,flags) - . = T.Response() - -sd_alert - var - client/target - response - list/validation - - Destroy() - target << browse(null,"window=\ref[src]") - ..() - - New(who, tag) - ..() - target = who - src.tag = tag - - Topic(href,params[]) - if(usr.client != target) return - response = params["clk"] - - proc/Display(message,title,list/buttons,default,unfocus,size,table,style,select,flags) - if(unfocus) spawn() target << browse(null,null) - if(istext(buttons)) buttons = list(buttons) - if(!default) default = buttons[1] - if(!(flags & SD_ALERT_NOVALIDATE)) validation = buttons.Copy() - - var/html = {"[title][style]\ -
[message]
"} - - if(select || (flags & SD_ALERT_SELECT_MULTI)) // select style choices - html += {"
\ - -
" - else if(flags & SD_ALERT_LINKS) // text link style - for(var/b in buttons) - var/list/L = list() - L["clk"] = b - var/html_string=list2params(L) - var/focus - if(b == default) focus = " ID=fcs" - html += "[html_encode(b)]\ -
" - else // button style choices - for(var/b in buttons) - var/list/L = list() - L["clk"] = b - var/html_string=list2params(L) - var/focus - if(b == default) focus = " ID=fcs" - html += " " - - html += "
" - - target << browse(html,"window=\ref[src];size=[size];can_close=0") - - proc/Response() - var/validated - while(!validated) - while(target && !response) // wait for a response - sleep(2) - - if(response && validation) - if(istype(response, /list)) - var/list/L = response - validation - if(L.len) response = null - else validated = 1 - else if(response in validation) validated = 1 - else response=null - else validated = 1 - spawn(2) qdel(src) - return response diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index 9ea9023de4..23c2025b84 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -1,4 +1,4 @@ -proc/sql_poll_population() +/proc/sql_poll_population() if(!sqllogging) return var/admincount = GLOB.admins.len @@ -16,16 +16,16 @@ proc/sql_poll_population() var/err = query.ErrorMsg() log_game("SQL ERROR during population polling. Error : \[[err]\]\n") -proc/sql_report_round_start() +/proc/sql_report_round_start() // TODO if(!sqllogging) return -proc/sql_report_round_end() +/proc/sql_report_round_end() // TODO if(!sqllogging) return -proc/sql_report_death(var/mob/living/carbon/human/H) +/proc/sql_report_death(var/mob/living/carbon/human/H) if(!sqllogging) return if(!H) @@ -59,7 +59,7 @@ proc/sql_report_death(var/mob/living/carbon/human/H) log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") -proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H) +/proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H) if(!sqllogging) return if(!H) @@ -93,7 +93,7 @@ proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H) log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") -proc/statistic_cycle() +/proc/statistic_cycle() set waitfor = 0 if(!sqllogging) return @@ -102,7 +102,7 @@ proc/statistic_cycle() sleep(6000) //This proc is used for feedback. It is executed at round end. -proc/sql_commit_feedback() +/proc/sql_commit_feedback() if(!blackbox) log_game("Round ended without a blackbox recorder. No feedback was sent to the database.") return diff --git a/code/game/antagonist/_antagonist_setup.dm b/code/game/antagonist/_antagonist_setup.dm index fa99f001f3..6f514b9413 100644 --- a/code/game/antagonist/_antagonist_setup.dm +++ b/code/game/antagonist/_antagonist_setup.dm @@ -14,19 +14,6 @@ - To skip equipping with appropriate gear, supply a positive third argument. */ -// Antagonist datum flags. -#define ANTAG_OVERRIDE_JOB 1 // Assigned job is set to MODE when spawning. -#define ANTAG_OVERRIDE_MOB 2 // Mob is recreated from datum mob_type var when spawning. -#define ANTAG_CLEAR_EQUIPMENT 4 // All preexisting equipment is purged. -#define ANTAG_CHOOSE_NAME 8 // Antagonists are prompted to enter a name. -#define ANTAG_IMPLANT_IMMUNE 16 // Cannot be loyalty implanted. -#define ANTAG_SUSPICIOUS 32 // Shows up on roundstart report. -#define ANTAG_HAS_LEADER 64 // Generates a leader antagonist. -#define ANTAG_HAS_NUKE 128 // Will spawn a nuke at supplied location. -#define ANTAG_RANDSPAWN 256 // Potentially randomly spawns due to events. -#define ANTAG_VOTABLE 512 // Can be voted as an additional antagonist before roundstart. -#define ANTAG_SET_APPEARANCE 1024 // Causes antagonists to use an appearance modifier on spawn. - // Globals. var/global/list/all_antag_types = list() var/global/list/all_antag_spawnpoints = list() diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index ac8efd6582..f362f6b3a8 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -105,7 +105,7 @@ var/datum/antagonist/wizard/wizards for(var/spell/spell_to_remove in src.spell_list) remove_spell(spell_to_remove) -obj/item/clothing +/obj/item/clothing var/wizard_garb = 0 // Does this clothing slot count as wizard garb? (Combines a few checks) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 0dc7d42040..9127b34e66 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1474,29 +1474,29 @@ NOTE: there are two lists of areas in the end of this file: centcom and station dynamic_lighting = 0 ambience = AMBIENCE_SPACE - auxport - name = "\improper Fore Port Solar Array" - icon_state = "panelsA" +/area/solar/auxport + name = "\improper Fore Port Solar Array" + icon_state = "panelsA" - auxstarboard - name = "\improper Fore Starboard Solar Array" - icon_state = "panelsA" +/area/solar/auxstarboard + name = "\improper Fore Starboard Solar Array" + icon_state = "panelsA" - fore - name = "\improper Fore Solar Array" - icon_state = "yellow" +/area/solar/fore + name = "\improper Fore Solar Array" + icon_state = "yellow" - aft - name = "\improper Aft Solar Array" - icon_state = "aft" +/area/solar/aft + name = "\improper Aft Solar Array" + icon_state = "aft" - starboard - name = "\improper Aft Starboard Solar Array" - icon_state = "panelsS" +/area/solar/starboard + name = "\improper Aft Starboard Solar Array" + icon_state = "panelsS" - port - name = "\improper Aft Port Solar Array" - icon_state = "panelsP" +/area/solar/port + name = "\improper Aft Port Solar Array" + icon_state = "panelsP" /area/maintenance/auxsolarport name = "Solar Maintenance - Fore Port" diff --git a/code/game/area/asteroid_areas.dm b/code/game/area/asteroid_areas.dm index 85f3bffd2f..2beaa88613 100644 --- a/code/game/area/asteroid_areas.dm +++ b/code/game/area/asteroid_areas.dm @@ -129,9 +129,9 @@ always_unpowered = 1 dynamic_lighting = 0 - aft - name = "\improper Engineering Outpost Solar Array" - icon_state = "yellow" +/area/outpost/engineering/solarsoutside/aft + name = "\improper Engineering Outpost Solar Array" + icon_state = "yellow" // Engineering Mining Outpost /area/outpost/engineering/mining diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm index b1944cba4a..92bf5c9f8d 100644 --- a/code/game/base_turf.dm +++ b/code/game/base_turf.dm @@ -1,12 +1,12 @@ // Returns the lowest turf available on a given Z-level, defaults to asteroid for Polaris. -proc/get_base_turf(var/z) +/proc/get_base_turf(var/z) if(!using_map.base_turf_by_z["[z]"]) using_map.base_turf_by_z["[z]"] = /turf/space return using_map.base_turf_by_z["[z]"] //An area can override the z-level base turf, so our solar array areas etc. can be space-based. -proc/get_base_turf_by_area(var/turf/T) +/proc/get_base_turf_by_area(var/turf/T) var/area/A = T.loc if(A.base_turf) return A.base_turf diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index ef0af0fab7..93a2895311 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -89,10 +89,6 @@ var/global/list/datum/dna/gene/dna_genes[0] // Used for genes that check for value rather than a binary on/off. #define GENE_ALWAYS_ACTIVATE 1 -// Skip checking if it's already active. -// Used for genes that check for value rather than a binary on/off. -#define GENE_ALWAYS_ACTIVATE 1 - /datum/dna // READ-ONLY, GETS OVERWRITTEN // DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index f3506cba7f..2d3c1a3ac5 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -57,73 +57,73 @@ activation_message="Your mind says 'Hello'." mutation=mHallucination - New() - block=HALLUCINATIONBLOCK +/datum/dna/gene/disability/hallucinate/New() + block=HALLUCINATIONBLOCK /datum/dna/gene/disability/epilepsy name="Epilepsy" activation_message="You get a headache." disability=EPILEPSY - New() - block=HEADACHEBLOCK +/datum/dna/gene/disability/epilepsy/New() + block=HEADACHEBLOCK /datum/dna/gene/disability/cough name="Coughing" activation_message="You start coughing." disability=COUGHING - New() - block=COUGHBLOCK +/datum/dna/gene/disability/cough/New() + block=COUGHBLOCK /datum/dna/gene/disability/clumsy name="Clumsiness" activation_message="You feel lightheaded." mutation=CLUMSY - New() - block=CLUMSYBLOCK +/datum/dna/gene/disability/clumsy/New() + block=CLUMSYBLOCK /datum/dna/gene/disability/tourettes name="Tourettes" activation_message="You twitch." disability=TOURETTES - New() - block=TWITCHBLOCK +/datum/dna/gene/disability/tourettes/New() + block=TWITCHBLOCK /datum/dna/gene/disability/nervousness name="Nervousness" activation_message="You feel nervous." disability=NERVOUS - New() - block=NERVOUSBLOCK +/datum/dna/gene/disability/nervousness/New() + block=NERVOUSBLOCK /datum/dna/gene/disability/blindness name="Blindness" activation_message="You can't seem to see anything." sdisability=BLIND - New() - block=BLINDBLOCK +/datum/dna/gene/disability/blindness/New() + block=BLINDBLOCK /datum/dna/gene/disability/deaf name="Deafness" activation_message="It's kinda quiet." sdisability=DEAF - New() - block=DEAFBLOCK +/datum/dna/gene/disability/deaf/New() + block=DEAFBLOCK - activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.ear_deaf = 1 +/datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.ear_deaf = 1 /datum/dna/gene/disability/nearsighted name="Nearsightedness" activation_message="Your eyes feel weird..." disability=NEARSIGHTED - New() - block=GLASSESBLOCK +/datum/dna/gene/disability/nearsighted/New() + block=GLASSESBLOCK diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index efb934e504..6f91a5d0c8 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -7,180 +7,153 @@ activation_messages=list("You feel no need to breathe.") mutation=mNobreath - New() - block=NOBREATHBLOCK +/datum/dna/gene/basic/nobreath/New() + block=NOBREATHBLOCK /datum/dna/gene/basic/remoteview name="Remote Viewing" activation_messages=list("Your mind expands.") mutation=mRemote - New() - block=REMOTEVIEWBLOCK +/datum/dna/gene/basic/remoteview/New() + block=REMOTEVIEWBLOCK - activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.verbs += /mob/living/carbon/human/proc/remoteobserve +/datum/dna/gene/basic/remoteview/activate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.verbs += /mob/living/carbon/human/proc/remoteobserve /datum/dna/gene/basic/regenerate name="Regenerate" activation_messages=list("You feel better.") mutation=mRegen - New() - block=REGENERATEBLOCK +/datum/dna/gene/basic/regenerate/New() + block=REGENERATEBLOCK /datum/dna/gene/basic/increaserun name="Super Speed" activation_messages=list("Your leg muscles pulsate.") mutation=mRun - New() - block=INCREASERUNBLOCK +/datum/dna/gene/basic/increaserun/New() + block=INCREASERUNBLOCK /datum/dna/gene/basic/remotetalk name="Telepathy" activation_messages=list("You expand your mind outwards.") mutation=mRemotetalk - New() - block=REMOTETALKBLOCK +/datum/dna/gene/basic/remotetalk/New() + block=REMOTETALKBLOCK - activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.verbs += /mob/living/carbon/human/proc/remotesay +/datum/dna/gene/basic/remotetalk/activate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.verbs += /mob/living/carbon/human/proc/remotesay /datum/dna/gene/basic/morph name="Morph" activation_messages=list("Your skin feels strange.") mutation=mMorph - New() - block=MORPHBLOCK +/datum/dna/gene/basic/morph/New() + block=MORPHBLOCK - activate(var/mob/M) - ..(M) - M.verbs += /mob/living/carbon/human/proc/morph - -/* Not used on bay -/datum/dna/gene/basic/heat_resist - name="Heat Resistance" - activation_messages=list("Your skin is icy to the touch.") - mutation=mHeatres - - New() - block=COLDBLOCK - - can_activate(var/mob/M,var/flags) - if(flags & MUTCHK_FORCED) - return !(/datum/dna/gene/basic/cold_resist in M.active_genes) - // Probability check - var/_prob = 15 - if(COLD_RESISTANCE in M.mutations) - _prob=5 - if(probinj(_prob,(flags&MUTCHK_FORCED))) - return 1 - - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "cold[fat]_s" -*/ +/datum/dna/gene/basic/morph/activate(var/mob/M) + ..(M) + M.verbs += /mob/living/carbon/human/proc/morph /datum/dna/gene/basic/cold_resist name="Cold Resistance" activation_messages=list("Your body is filled with warmth.") mutation=COLD_RESISTANCE - New() - block=FIREBLOCK +/datum/dna/gene/basic/cold_resist/New() + block=FIREBLOCK - can_activate(var/mob/M,var/flags) - if(flags & MUTCHK_FORCED) - return 1 - // return !(/datum/dna/gene/basic/heat_resist in M.active_genes) - // Probability check - var/_prob=30 - //if(mHeatres in M.mutations) - // _prob=5 - if(probinj(_prob,(flags&MUTCHK_FORCED))) - return 1 +/datum/dna/gene/basic/cold_resist/can_activate(var/mob/M,var/flags) + if(flags & MUTCHK_FORCED) + return 1 + var/_prob=30 + if(probinj(_prob,(flags&MUTCHK_FORCED))) + return 1 - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "fire[fat]_s" +/datum/dna/gene/basic/cold_resist/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "fire[fat]_s" /datum/dna/gene/basic/noprints name="No Prints" activation_messages=list("Your fingers feel numb.") mutation=mFingerprints - New() - block=NOPRINTSBLOCK +/datum/dna/gene/basic/noprints/New() + block=NOPRINTSBLOCK /datum/dna/gene/basic/noshock name="Shock Immunity" activation_messages=list("Your skin feels strange.") mutation=mShock - New() - block=SHOCKIMMUNITYBLOCK +/datum/dna/gene/basic/noshock/New() + block=SHOCKIMMUNITYBLOCK /datum/dna/gene/basic/midget name="Midget" activation_messages=list("Your skin feels rubbery.") mutation=mSmallsize - New() - block=SMALLSIZEBLOCK +/datum/dna/gene/basic/midget/New() + block=SMALLSIZEBLOCK - can_activate(var/mob/M,var/flags) - // Can't be big and small. - if(HULK in M.mutations) - return 0 - return ..(M,flags) +/datum/dna/gene/basic/midget/can_activate(var/mob/M,var/flags) + // Can't be big and small. + if(HULK in M.mutations) + return 0 + return ..(M,flags) - activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.pass_flags |= 1 +/datum/dna/gene/basic/midget/activate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.pass_flags |= 1 - deactivate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.pass_flags &= ~1 //This may cause issues down the track, but offhand I can't think of any other way for humans to get passtable short of varediting so it should be fine. ~Z +/datum/dna/gene/basic/midget/deactivate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.pass_flags &= ~1 //This may cause issues down the track, but offhand I can't think of any other way for humans to get passtable short of varediting so it should be fine. ~Z /datum/dna/gene/basic/hulk name="Hulk" activation_messages=list("Your muscles hurt.") mutation=HULK - New() - block=HULKBLOCK +/datum/dna/gene/basic/hulk/New() + block=HULKBLOCK - can_activate(var/mob/M,var/flags) - // Can't be big and small. - if(mSmallsize in M.mutations) - return 0 - return ..(M,flags) +/datum/dna/gene/basic/hulk/can_activate(var/mob/M,var/flags) + // Can't be big and small. + if(mSmallsize in M.mutations) + return 0 + return ..(M,flags) - OnDrawUnderlays(var/mob/M,var/g,var/fat) - if(fat) - return "hulk_[fat]_s" - else - return "hulk_[g]_s" +/datum/dna/gene/basic/hulk/OnDrawUnderlays(var/mob/M,var/g,var/fat) + if(fat) + return "hulk_[fat]_s" + else + return "hulk_[g]_s" - OnMobLife(var/mob/living/carbon/human/M) - if(!istype(M)) return - if(M.health <= 25) - M.mutations.Remove(HULK) - M.update_mutations() //update our mutation overlays - to_chat(M, "You suddenly feel very weak.") - M.Weaken(3) - M.emote("collapse") +/datum/dna/gene/basic/hulk/OnMobLife(var/mob/living/carbon/human/M) + if(!istype(M)) return + if(M.health <= 25) + M.mutations.Remove(HULK) + M.update_mutations() //update our mutation overlays + to_chat(M, "You suddenly feel very weak.") + M.Weaken(3) + M.emote("collapse") /datum/dna/gene/basic/xray name="X-Ray Vision" activation_messages=list("The walls suddenly disappear.") mutation=XRAY - New() - block=XRAYBLOCK +/datum/dna/gene/basic/xray/New() + block=XRAYBLOCK /datum/dna/gene/basic/tk name="Telekenesis" @@ -188,7 +161,7 @@ mutation=TK activation_prob=15 - New() - block=TELEBLOCK - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "telekinesishead[fat]_s" +/datum/dna/gene/basic/tk/New() + block=TELEBLOCK +/datum/dna/gene/basic/tk/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "telekinesishead[fat]_s" diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index b03b986bca..f6d6695b19 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -160,7 +160,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E //STINGS// //They get a pretty header because there's just so fucking many of them ;_; ////////// -turf/proc/AdjacentTurfsRangedSting() +/turf/proc/AdjacentTurfsRangedSting() //Yes this is snowflakey, but I couldn't get it to work any other way.. -Luke var/list/allowed = list( /obj/structure/table, diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm index aea5270f95..48394146b5 100644 --- a/code/game/gamemodes/cult/construct_spells.dm +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -1,29 +1,6 @@ -//cast_method flags, needs to be up to date with Technomancer's. They were, for some reason, not working outside it. -#define CAST_USE 1 // Clicking the spell in your hand. -#define CAST_MELEE 2 // Clicking an atom in melee range. -#define CAST_RANGED 4 // Clicking an atom beyond melee range. -#define CAST_THROW 8 // Throwing the spell and hitting an atom. -#define CAST_COMBINE 16 // Clicking another spell with this spell. -#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. - -//Aspects -#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. -#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. -#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. -#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. -#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. -#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. -#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. -#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. -#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. -#define ASPECT_EMP "emp" //Unused now. -#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. -#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. -#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. - //////////////////////////////Construct Spells///////////////////////// -proc/findNullRod(var/atom/target) +/proc/findNullRod(var/atom/target) if(istype(target,/obj/item/weapon/nullrod)) return 1 else if(target.contents) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 07440ae5f5..4b095d2cd1 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -65,117 +65,116 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," // self other technology - Communication rune //was other hear blood // join hide technology - stun rune. Rune color: bright pink. - New() - ..() - blood_image = image(loc = src) - blood_image.override = 1 - for(var/mob/living/silicon/ai/AI in player_list) - if(AI.client) - AI.client.images += blood_image - rune_list.Add(src) +/obj/effect/rune/Initialize() + . = ..() + blood_image = image(loc = src) + blood_image.override = 1 + for(var/mob/living/silicon/ai/AI in player_list) + if(AI.client) + AI.client.images += blood_image + rune_list.Add(src) - Destroy() - for(var/mob/living/silicon/ai/AI in player_list) - if(AI.client) - AI.client.images -= blood_image - qdel(blood_image) - blood_image = null - rune_list.Remove(src) - ..() +/obj/effect/rune/Destroy() + for(var/mob/living/silicon/ai/AI in player_list) + if(AI.client) + AI.client.images -= blood_image + qdel(blood_image) + blood_image = null + rune_list.Remove(src) + ..() - examine(mob/user) - . = ..() - if(iscultist(user)) - . += "This spell circle reads: [word1] [word2] [word3]." +/obj/effect/rune/examine(mob/user) + . = ..() + if(iscultist(user)) + . += "This spell circle reads: [word1] [word2] [word3]." - attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/book/tome) && iscultist(user)) - to_chat(user, "You retrace your steps, carefully undoing the lines of the rune.") - qdel(src) - return - else if(istype(I, /obj/item/weapon/nullrod)) - to_chat(user, "You disrupt the vile magic with the deadening field of the null rod!") - qdel(src) - return +/obj/effect/rune/attackby(I as obj, user as mob) + if(istype(I, /obj/item/weapon/book/tome) && iscultist(user)) + to_chat(user, "You retrace your steps, carefully undoing the lines of the rune.") + qdel(src) return + else if(istype(I, /obj/item/weapon/nullrod)) + to_chat(user, "You disrupt the vile magic with the deadening field of the null rod!") + qdel(src) + return + return - attack_hand(mob/living/user as mob) - if(!iscultist(user)) - to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.") - return - if(user.is_muzzled()) - to_chat(user, "You are unable to speak the words of the rune.") - return - if(!word1 || !word2 || !word3 || prob(user.getBrainLoss())) - return fizzle() +/obj/effect/rune/attack_hand(mob/living/user as mob) + if(!iscultist(user)) + to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.") + return + if(user.is_muzzled()) + to_chat(user, "You are unable to speak the words of the rune.") + return + if(!word1 || !word2 || !word3 || prob(user.getBrainLoss())) + return fizzle() // if(!src.visibility) // src.visibility=1 - if(word1 == cultwords["travel"] && word2 == cultwords["self"]) - return teleport(src.word3) - if(word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"]) - return tomesummon() - if(word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"]) - return armor() - if(word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"]) - return convert() - if(word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"]) - return tearreality() - if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"]) - return emp(src.loc,5) - if(word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"]) - return drain() - if(word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"]) - return seer() - if(word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"]) - return raise() - if(word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"]) - return obscure(4) - if(word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"]) - return ajourney() - if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["travel"]) - return manifest() - if(word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"]) - return talisman() - if(word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"]) - return sacrifice() - if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"]) - return revealrunes(src) - if(word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"]) - return wall() - if(word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"]) - return freedom() - if(word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"]) - return cultsummon() - if(word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"]) - return deafen() - if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"]) - return blind() - if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"]) - return bloodboil() - if(word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"]) - return communicate() - if(word1 == cultwords["travel"] && word2 == cultwords["other"]) - return itemport(src.word3) - if(word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"]) - return runestun() - else - return fizzle() + if(word1 == cultwords["travel"] && word2 == cultwords["self"]) + return teleport(src.word3) + if(word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"]) + return tomesummon() + if(word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"]) + return armor() + if(word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"]) + return convert() + if(word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"]) + return tearreality() + if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"]) + return emp(src.loc,5) + if(word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"]) + return drain() + if(word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"]) + return seer() + if(word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"]) + return raise() + if(word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"]) + return obscure(4) + if(word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"]) + return ajourney() + if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["travel"]) + return manifest() + if(word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"]) + return talisman() + if(word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"]) + return sacrifice() + if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"]) + return revealrunes(src) + if(word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"]) + return wall() + if(word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"]) + return freedom() + if(word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"]) + return cultsummon() + if(word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"]) + return deafen() + if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"]) + return blind() + if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"]) + return bloodboil() + if(word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"]) + return communicate() + if(word1 == cultwords["travel"] && word2 == cultwords["other"]) + return itemport(src.word3) + if(word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"]) + return runestun() + else + return fizzle() - proc - fizzle() - if(istype(src,/obj/effect/rune)) - usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) - else - usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) - for (var/mob/V in viewers(src)) - V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) - return +/obj/effect/rune/proc/fizzle() + if(istype(src,/obj/effect/rune)) + usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) + else + usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) + for (var/mob/V in viewers(src)) + V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) + return - check_icon() - icon = get_uristrune_cult(word1, word2, word3) +/obj/effect/rune/proc/check_icon() + icon = get_uristrune_cult(word1, word2, word3) /obj/item/weapon/book/tome name = "arcane tome" @@ -289,149 +288,149 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," "} - New() - ..() - if(!cultwords["travel"]) - runerandom() - for(var/V in cultwords) - words[cultwords[V]] = V +/obj/item/weapon/book/tome/Initialize() + . = ..() + if(!cultwords["travel"]) + runerandom() + for(var/V in cultwords) + words[cultwords[V]] = V - attack(mob/living/M as mob, mob/living/user as mob) - add_attack_logs(user,M,"Hit with [name]") +/obj/item/weapon/book/tome/attack(mob/living/M as mob, mob/living/user as mob) + add_attack_logs(user,M,"Hit with [name]") - if(istype(M,/mob/observer/dead)) - var/mob/observer/dead/D = M - D.manifest(user) - return - if(!istype(M)) - return - if(!iscultist(user)) - return ..() - if(iscultist(M)) - return - M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit - for(var/mob/O in viewers(M, null)) - O.show_message("\The [user] beats \the [M] with \the [src]!", 1) - to_chat(M, "You feel searing heat inside!") + if(istype(M,/mob/observer/dead)) + var/mob/observer/dead/D = M + D.manifest(user) + return + if(!istype(M)) + return + if(!iscultist(user)) + return ..() + if(iscultist(M)) + return + M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit + for(var/mob/O in viewers(M, null)) + O.show_message("\The [user] beats \the [M] with \the [src]!", 1) + to_chat(M, "You feel searing heat inside!") - attack_self(mob/living/user as mob) - usr = user - if(!usr.canmove || usr.stat || usr.restrained()) +/obj/item/weapon/book/tome/attack_self(mob/living/user as mob) + usr = user + if(!usr.canmove || usr.stat || usr.restrained()) + return + + if(!cultwords["travel"]) + runerandom() + if(iscultist(user)) + var/C = 0 + for(var/obj/effect/rune/N in rune_list) + C++ + if (!istype(user.loc,/turf)) + to_chat(user, "You do not have enough space to write a proper rune.") return - if(!cultwords["travel"]) - runerandom() - if(iscultist(user)) - var/C = 0 - for(var/obj/effect/rune/N in rune_list) - C++ - if (!istype(user.loc,/turf)) - to_chat(user, "You do not have enough space to write a proper rune.") - return - - if (C>=26 + runedec + cult.current_antagonists.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist - alert("The cloth of reality can't take that much of a strain. Remove some runes first!") - return - else - switch(alert("You open the tome",,"Read it","Scribe a rune", "Cancel")) - if("Cancel") - return - if("Read it") - if(usr.get_active_hand() != src) - return - user << browse("[tomedat]", "window=Arcane Tome") - return - if(usr.get_active_hand() != src) - return - - var/list/dictionary = list ( - "convert" = list("join","blood","self"), - "wall" = list("destroy","travel","self"), - "blood boil" = list("destroy","see","blood"), - "blood drain" = list("travel","blood","self"), - "raise dead" = list("blood","join","hell"), - "summon narsie" = list("hell","join","self"), - "communicate" = list("self","other","technology"), - "emp" = list("destroy","see","technology"), - "manifest" = list("blood","see","travel"), - "summon tome" = list("see","blood","hell"), - "see invisible" = list("see","hell","join"), - "hide" = list("hide","see","blood"), - "reveal" = list("blood","see","hide"), - "astral journey" = list("hell","travel","self"), - "imbue" = list("hell","technology","join"), - "sacrifice" = list("hell","blood","join"), - "summon cultist" = list("join","other","self"), - "free cultist" = list("travel","technology","other"), - "deafen" = list("hide","other","see"), - "blind" = list("destroy","see","other"), - "stun" = list("join","hide","technology"), - "armor" = list("hell","destroy","other"), - "teleport" = list("travel","self"), - "teleport other" = list("travel","other") - ) - - var/list/english = list() - - var/list/scribewords = list("none") - - for (var/entry in words) - if (words[entry] != entry) - english += list(words[entry] = entry) - - for (var/entry in dictionary) - var/list/required = dictionary[entry] - if (length(english&required) == required.len) - scribewords += entry - - var/chosen_rune = null - - if(usr) - chosen_rune = input ("Choose a rune to scribe.") in scribewords - if (!chosen_rune) - return - if (chosen_rune == "none") - to_chat(user, "You decide against scribing a rune, perhaps you should take this time to study your notes.") - return - if (chosen_rune == "teleport") - dictionary[chosen_rune] += input ("Choose a destination word") in english - if (chosen_rune == "teleport other") - dictionary[chosen_rune] += input ("Choose a destination word") in english - - if(usr.get_active_hand() != src) - return - - for (var/mob/V in viewers(src)) - V.show_message("\The [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2) - to_chat(user, "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world.") - user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage - if(do_after(user, 50)) - var/area/A = get_area(user) - log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") - if(usr.get_active_hand() != src) - return - var/mob/living/carbon/human/H = user - var/obj/effect/rune/R = new /obj/effect/rune(user.loc) - to_chat(user, "You finish drawing the arcane markings of the Geometer.") - var/list/required = dictionary[chosen_rune] - R.word1 = english[required[1]] - R.word2 = english[required[2]] - R.word3 = english[required[3]] - R.check_icon() - R.blood_DNA = list() - R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + if (C>=26 + runedec + cult.current_antagonists.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist + alert("The cloth of reality can't take that much of a strain. Remove some runes first!") return else - to_chat(user, "The book seems full of illegible scribbles. Is this a joke?") + switch(alert("You open the tome",,"Read it","Scribe a rune", "Cancel")) + if("Cancel") + return + if("Read it") + if(usr.get_active_hand() != src) + return + user << browse("[tomedat]", "window=Arcane Tome") + return + if(usr.get_active_hand() != src) return - examine(mob/user) - . = ..() - if(!iscultist(user)) - . += "An old, dusty tome with frayed edges and a sinister looking cover." - else - . += "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." + var/list/dictionary = list ( + "convert" = list("join","blood","self"), + "wall" = list("destroy","travel","self"), + "blood boil" = list("destroy","see","blood"), + "blood drain" = list("travel","blood","self"), + "raise dead" = list("blood","join","hell"), + "summon narsie" = list("hell","join","self"), + "communicate" = list("self","other","technology"), + "emp" = list("destroy","see","technology"), + "manifest" = list("blood","see","travel"), + "summon tome" = list("see","blood","hell"), + "see invisible" = list("see","hell","join"), + "hide" = list("hide","see","blood"), + "reveal" = list("blood","see","hide"), + "astral journey" = list("hell","travel","self"), + "imbue" = list("hell","technology","join"), + "sacrifice" = list("hell","blood","join"), + "summon cultist" = list("join","other","self"), + "free cultist" = list("travel","technology","other"), + "deafen" = list("hide","other","see"), + "blind" = list("destroy","see","other"), + "stun" = list("join","hide","technology"), + "armor" = list("hell","destroy","other"), + "teleport" = list("travel","self"), + "teleport other" = list("travel","other") + ) + + var/list/english = list() + + var/list/scribewords = list("none") + + for (var/entry in words) + if (words[entry] != entry) + english += list(words[entry] = entry) + + for (var/entry in dictionary) + var/list/required = dictionary[entry] + if (length(english&required) == required.len) + scribewords += entry + + var/chosen_rune = null + + if(usr) + chosen_rune = input ("Choose a rune to scribe.") in scribewords + if (!chosen_rune) + return + if (chosen_rune == "none") + to_chat(user, "You decide against scribing a rune, perhaps you should take this time to study your notes.") + return + if (chosen_rune == "teleport") + dictionary[chosen_rune] += input ("Choose a destination word") in english + if (chosen_rune == "teleport other") + dictionary[chosen_rune] += input ("Choose a destination word") in english + + if(usr.get_active_hand() != src) + return + + for (var/mob/V in viewers(src)) + V.show_message("\The [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2) + to_chat(user, "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world.") + user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage + if(do_after(user, 50)) + var/area/A = get_area(user) + log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") + if(usr.get_active_hand() != src) + return + var/mob/living/carbon/human/H = user + var/obj/effect/rune/R = new /obj/effect/rune(user.loc) + to_chat(user, "You finish drawing the arcane markings of the Geometer.") + var/list/required = dictionary[chosen_rune] + R.word1 = english[required[1]] + R.word2 = english[required[2]] + R.word3 = english[required[3]] + R.check_icon() + R.blood_DNA = list() + R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + return + else + to_chat(user, "The book seems full of illegible scribbles. Is this a joke?") + return + +/obj/item/weapon/book/tome/examine(mob/user) + . = ..() + if(!iscultist(user)) + . += "An old, dusty tome with frayed edges and a sinister looking cover." + else + . += "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." /obj/item/weapon/book/tome/cultify() return @@ -439,174 +438,174 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," /obj/item/weapon/book/tome/imbued //admin tome, spawns working runes without waiting w_class = ITEMSIZE_SMALL var/cultistsonly = 1 - attack_self(mob/user as mob) - if(src.cultistsonly && !iscultist(usr)) - return - if(!cultwords["travel"]) - runerandom() - if(user) - var/r - if (!istype(user.loc,/turf)) - to_chat(user, "You do not have enough space to write a proper rune.") - var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") - r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. - var/obj/effect/rune/R = new /obj/effect/rune - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - R.blood_DNA = list() - R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type - var/area/A = get_area(user) - log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") - switch(r) - if("teleport") - var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - var/beacon - if(usr) - beacon = input("Select the last rune", "Rune Scribing") in words - R.word1=cultwords["travel"] - R.word2=cultwords["self"] - R.word3=beacon - R.loc = user.loc - R.check_icon() - if("itemport") - var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - var/beacon - if(usr) - beacon = input("Select the last rune", "Rune Scribing") in words - R.word1=cultwords["travel"] - R.word2=cultwords["other"] - R.word3=beacon - R.loc = user.loc - R.check_icon() - if("tome") - R.word1=cultwords["see"] - R.word2=cultwords["blood"] - R.word3=cultwords["hell"] - R.loc = user.loc - R.check_icon() - if("armor") - R.word1=cultwords["hell"] - R.word2=cultwords["destroy"] - R.word3=cultwords["other"] - R.loc = user.loc - R.check_icon() - if("convert") - R.word1=cultwords["join"] - R.word2=cultwords["blood"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("tear in reality") - R.word1=cultwords["hell"] - R.word2=cultwords["join"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("emp") - R.word1=cultwords["destroy"] - R.word2=cultwords["see"] - R.word3=cultwords["technology"] - R.loc = user.loc - R.check_icon() - if("drain") - R.word1=cultwords["travel"] - R.word2=cultwords["blood"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("seer") - R.word1=cultwords["see"] - R.word2=cultwords["hell"] - R.word3=cultwords["join"] - R.loc = user.loc - R.check_icon() - if("raise") - R.word1=cultwords["blood"] - R.word2=cultwords["join"] - R.word3=cultwords["hell"] - R.loc = user.loc - R.check_icon() - if("obscure") - R.word1=cultwords["hide"] - R.word2=cultwords["see"] - R.word3=cultwords["blood"] - R.loc = user.loc - R.check_icon() - if("astral journey") - R.word1=cultwords["hell"] - R.word2=cultwords["travel"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("manifest") - R.word1=cultwords["blood"] - R.word2=cultwords["see"] - R.word3=cultwords["travel"] - R.loc = user.loc - R.check_icon() - if("imbue talisman") - R.word1=cultwords["hell"] - R.word2=cultwords["technology"] - R.word3=cultwords["join"] - R.loc = user.loc - R.check_icon() - if("sacrifice") - R.word1=cultwords["hell"] - R.word2=cultwords["blood"] - R.word3=cultwords["join"] - R.loc = user.loc - R.check_icon() - if("reveal") - R.word1=cultwords["blood"] - R.word2=cultwords["see"] - R.word3=cultwords["hide"] - R.loc = user.loc - R.check_icon() - if("wall") - R.word1=cultwords["destroy"] - R.word2=cultwords["travel"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("freedom") - R.word1=cultwords["travel"] - R.word2=cultwords["technology"] - R.word3=cultwords["other"] - R.loc = user.loc - R.check_icon() - if("cultsummon") - R.word1=cultwords["join"] - R.word2=cultwords["other"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("deafen") - R.word1=cultwords["hide"] - R.word2=cultwords["other"] - R.word3=cultwords["see"] - R.loc = user.loc - R.check_icon() - if("blind") - R.word1=cultwords["destroy"] - R.word2=cultwords["see"] - R.word3=cultwords["other"] - R.loc = user.loc - R.check_icon() - if("bloodboil") - R.word1=cultwords["destroy"] - R.word2=cultwords["see"] - R.word3=cultwords["blood"] - R.loc = user.loc - R.check_icon() - if("communicate") - R.word1=cultwords["self"] - R.word2=cultwords["other"] - R.word3=cultwords["technology"] - R.loc = user.loc - R.check_icon() - if("stun") - R.word1=cultwords["join"] - R.word2=cultwords["hide"] - R.word3=cultwords["technology"] - R.loc = user.loc - R.check_icon() +/obj/item/weapon/book/tome/imbued/attack_self(mob/user as mob) + if(src.cultistsonly && !iscultist(usr)) + return + if(!cultwords["travel"]) + runerandom() + if(user) + var/r + if (!istype(user.loc,/turf)) + to_chat(user, "You do not have enough space to write a proper rune.") + var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") + r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. + var/obj/effect/rune/R = new /obj/effect/rune + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + R.blood_DNA = list() + R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + var/area/A = get_area(user) + log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") + switch(r) + if("teleport") + var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") + var/beacon + if(usr) + beacon = input("Select the last rune", "Rune Scribing") in words + R.word1=cultwords["travel"] + R.word2=cultwords["self"] + R.word3=beacon + R.loc = user.loc + R.check_icon() + if("itemport") + var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") + var/beacon + if(usr) + beacon = input("Select the last rune", "Rune Scribing") in words + R.word1=cultwords["travel"] + R.word2=cultwords["other"] + R.word3=beacon + R.loc = user.loc + R.check_icon() + if("tome") + R.word1=cultwords["see"] + R.word2=cultwords["blood"] + R.word3=cultwords["hell"] + R.loc = user.loc + R.check_icon() + if("armor") + R.word1=cultwords["hell"] + R.word2=cultwords["destroy"] + R.word3=cultwords["other"] + R.loc = user.loc + R.check_icon() + if("convert") + R.word1=cultwords["join"] + R.word2=cultwords["blood"] + R.word3=cultwords["self"] + R.loc = user.loc + R.check_icon() + if("tear in reality") + R.word1=cultwords["hell"] + R.word2=cultwords["join"] + R.word3=cultwords["self"] + R.loc = user.loc + R.check_icon() + if("emp") + R.word1=cultwords["destroy"] + R.word2=cultwords["see"] + R.word3=cultwords["technology"] + R.loc = user.loc + R.check_icon() + if("drain") + R.word1=cultwords["travel"] + R.word2=cultwords["blood"] + R.word3=cultwords["self"] + R.loc = user.loc + R.check_icon() + if("seer") + R.word1=cultwords["see"] + R.word2=cultwords["hell"] + R.word3=cultwords["join"] + R.loc = user.loc + R.check_icon() + if("raise") + R.word1=cultwords["blood"] + R.word2=cultwords["join"] + R.word3=cultwords["hell"] + R.loc = user.loc + R.check_icon() + if("obscure") + R.word1=cultwords["hide"] + R.word2=cultwords["see"] + R.word3=cultwords["blood"] + R.loc = user.loc + R.check_icon() + if("astral journey") + R.word1=cultwords["hell"] + R.word2=cultwords["travel"] + R.word3=cultwords["self"] + R.loc = user.loc + R.check_icon() + if("manifest") + R.word1=cultwords["blood"] + R.word2=cultwords["see"] + R.word3=cultwords["travel"] + R.loc = user.loc + R.check_icon() + if("imbue talisman") + R.word1=cultwords["hell"] + R.word2=cultwords["technology"] + R.word3=cultwords["join"] + R.loc = user.loc + R.check_icon() + if("sacrifice") + R.word1=cultwords["hell"] + R.word2=cultwords["blood"] + R.word3=cultwords["join"] + R.loc = user.loc + R.check_icon() + if("reveal") + R.word1=cultwords["blood"] + R.word2=cultwords["see"] + R.word3=cultwords["hide"] + R.loc = user.loc + R.check_icon() + if("wall") + R.word1=cultwords["destroy"] + R.word2=cultwords["travel"] + R.word3=cultwords["self"] + R.loc = user.loc + R.check_icon() + if("freedom") + R.word1=cultwords["travel"] + R.word2=cultwords["technology"] + R.word3=cultwords["other"] + R.loc = user.loc + R.check_icon() + if("cultsummon") + R.word1=cultwords["join"] + R.word2=cultwords["other"] + R.word3=cultwords["self"] + R.loc = user.loc + R.check_icon() + if("deafen") + R.word1=cultwords["hide"] + R.word2=cultwords["other"] + R.word3=cultwords["see"] + R.loc = user.loc + R.check_icon() + if("blind") + R.word1=cultwords["destroy"] + R.word2=cultwords["see"] + R.word3=cultwords["other"] + R.loc = user.loc + R.check_icon() + if("bloodboil") + R.word1=cultwords["destroy"] + R.word2=cultwords["see"] + R.word3=cultwords["blood"] + R.loc = user.loc + R.check_icon() + if("communicate") + R.word1=cultwords["self"] + R.word2=cultwords["other"] + R.word3=cultwords["technology"] + R.loc = user.loc + R.check_icon() + if("stun") + R.word1=cultwords["join"] + R.word2=cultwords["hide"] + R.word3=cultwords["technology"] + R.loc = user.loc + R.check_icon() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 44f743f122..7526cecad5 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -3,8 +3,6 @@ var/list/sacrificed = list() /obj/effect/rune/cultify() return -/obj/effect/rune - /* * Use as a general guideline for this and related files: * * ... - when something non-trivial or an error happens, so something similar to "Sparks come out of the machine!" @@ -14,285 +12,278 @@ var/list/sacrificed = list() /////////////////////////////////////////FIRST RUNE - proc - teleport(var/key) - var/mob/living/user = usr - var/allrunesloc[] - allrunesloc = new/list() - var/index = 0 - // var/tempnum = 0 - for(var/obj/effect/rune/R in rune_list) - if(R == src) - continue - if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && isPlayerLevel(R.z)) - index++ - allrunesloc.len = index - allrunesloc[index] = R.loc - if(index >= 5) - to_chat(user, "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric.") - if (istype(user, /mob/living)) - user.take_overall_damage(5, 0) - qdel(src) - if(allrunesloc && index != 0) - if(istype(src,/obj/effect/rune)) - user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting - else - user.whisper("Sas[pick("'","`")]so c'arta forbici!") - user.visible_message("[user] disappears in a flash of red light!", \ - "You feel as your body gets dragged through the dimension of Nar-Sie!", \ - "You hear a sickening crunch and sloshing of viscera.") - user.loc = allrunesloc[rand(1,index)] - return - if(istype(src,/obj/effect/rune)) - return fizzle() //Use friggin manuals, Dorf, your list was of zero length. - else - call(/obj/effect/rune/proc/fizzle)() - return +/obj/effect/rune/proc/teleport(var/key) + var/mob/living/user = usr + var/allrunesloc[] + allrunesloc = new/list() + var/index = 0 + for(var/obj/effect/rune/R in rune_list) + if(R == src) + continue + if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && isPlayerLevel(R.z)) + index++ + allrunesloc.len = index + allrunesloc[index] = R.loc + if(index >= 5) + to_chat(user, "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric.") + if (istype(user, /mob/living)) + user.take_overall_damage(5, 0) + qdel(src) + if(allrunesloc && index != 0) + if(istype(src,/obj/effect/rune)) + user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting + else + user.whisper("Sas[pick("'","`")]so c'arta forbici!") + user.visible_message("[user] disappears in a flash of red light!", \ + "You feel as your body gets dragged through the dimension of Nar-Sie!", \ + "You hear a sickening crunch and sloshing of viscera.") + user.loc = allrunesloc[rand(1,index)] + return + if(istype(src,/obj/effect/rune)) + return fizzle() //Use friggin manuals, Dorf, your list was of zero length. + else + call(/obj/effect/rune/proc/fizzle)() + return - itemport(var/key) -// var/allrunesloc[] -// allrunesloc = new/list() -// var/index = 0 - // var/tempnum = 0 - var/culcount = 0 - var/runecount = 0 - var/obj/effect/rune/IP = null - var/mob/living/user = usr - for(var/obj/effect/rune/R in rune_list) - if(R == src) - continue - if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key) - IP = R - runecount++ - if(runecount >= 2) - to_chat(user, "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric.") - if (istype(user, /mob/living)) - user.take_overall_damage(5, 0) - qdel(src) - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - culcount++ - if(culcount>=3) - user.say("Sas[pick("'","`")]so c'arta forbici tarem!") - user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \ - "You feel air moving from the rune - like as it was swapped with somewhere else.", \ - "You smell ozone.") - for(var/obj/O in src.loc) - if(!O.anchored) - O.loc = IP.loc - for(var/mob/M in src.loc) - M.loc = IP.loc - return +/obj/effect/rune/proc/itemport(var/key) + var/culcount = 0 + var/runecount = 0 + var/obj/effect/rune/IP = null + var/mob/living/user = usr + for(var/obj/effect/rune/R in rune_list) + if(R == src) + continue + if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key) + IP = R + runecount++ + if(runecount >= 2) + to_chat(user, "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric.") + if (istype(user, /mob/living)) + user.take_overall_damage(5, 0) + qdel(src) + for(var/mob/living/carbon/C in orange(1,src)) + if(iscultist(C) && !C.stat) + culcount++ + if(culcount>=3) + user.say("Sas[pick("'","`")]so c'arta forbici tarem!") + user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \ + "You feel air moving from the rune - like as it was swapped with somewhere else.", \ + "You smell ozone.") + for(var/obj/O in src.loc) + if(!O.anchored) + O.loc = IP.loc + for(var/mob/M in src.loc) + M.loc = IP.loc + return - return fizzle() + return fizzle() /////////////////////////////////////////SECOND RUNE - tomesummon() - if(istype(src,/obj/effect/rune)) - usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - else - usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - usr.visible_message("Rune disappears with a flash of red light, and in its place now a book lies.", \ - "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ - "You hear a pop and smell ozone.") - if(istype(src,/obj/effect/rune)) - new /obj/item/weapon/book/tome(src.loc) - else - new /obj/item/weapon/book/tome(usr.loc) - qdel(src) - return +/obj/effect/rune/proc/tomesummon() + if(istype(src,/obj/effect/rune)) + usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") + else + usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") + usr.visible_message("Rune disappears with a flash of red light, and in its place now a book lies.", \ + "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ + "You hear a pop and smell ozone.") + if(istype(src,/obj/effect/rune)) + new /obj/item/weapon/book/tome(src.loc) + else + new /obj/item/weapon/book/tome(usr.loc) + qdel(src) + return /////////////////////////////////////////THIRD RUNE - convert() - var/mob/attacker = usr - var/mob/living/carbon/target = null - for(var/mob/living/carbon/M in src.loc) - if(!iscultist(M) && M.stat < DEAD && !(M in converting)) - target = M - break +/obj/effect/rune/proc/convert() + var/mob/attacker = usr + var/mob/living/carbon/target = null + for(var/mob/living/carbon/M in src.loc) + if(!iscultist(M) && M.stat < DEAD && !(M in converting)) + target = M + break - if(!target) //didn't find any new targets - if(!converting.len) - fizzle() - else - to_chat(usr, "You sense that the power of the dark one is already working away at them.") - return + if(!target) //didn't find any new targets + if(!converting.len) + fizzle() + else + to_chat(usr, "You sense that the power of the dark one is already working away at them.") + return - usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!") + usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!") - converting |= target - var/list/waiting_for_input = list(target = 0) //need to box this up in order to be able to reset it again from inside spawn, apparently - var/initial_message = 0 - while(target in converting) - if(target.loc != src.loc || target.stat == DEAD) + converting |= target + var/list/waiting_for_input = list(target = 0) //need to box this up in order to be able to reset it again from inside spawn, apparently + var/initial_message = 0 + while(target in converting) + if(target.loc != src.loc || target.stat == DEAD) + converting -= target + if(target.getFireLoss() < 100) + target.hallucination = min(target.hallucination, 500) + return 0 + + target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects + // Resist messages go! + if(initial_message) //don't do this stuff right away, only if they resist or hesitate. + add_attack_logs(attacker,target,"Convert rune") + switch(target.getFireLoss()) + if(0 to 25) + to_chat(target, "Your blood boils as you force yourself to resist the corruption invading every corner of your mind.") + if(25 to 45) + to_chat(target, "Your blood boils and your body burns as the corruption further forces itself into your body and mind.") + if(45 to 75) + to_chat(target, "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.") + target.apply_effect(rand(1,10), STUTTER) + if(75 to 100) + to_chat(target, "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.") + //broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky + //hallucination is reduced when the step off as well, provided they haven't hit the last stage... + + //5000 is waaaay too much, in practice. + target.hallucination = min(target.hallucination + 100, 500) + target.apply_effect(10, STUTTER) + target.adjustBrainLoss(1) + if(100 to INFINITY) + to_chat(target, "Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing.") + //5000 is waaaay too much, in practice. + target.hallucination = min(target.hallucination + 100, 500) + target.apply_effect(15, STUTTER) + target.adjustBrainLoss(1) + + initial_message = 1 + if (!target.can_feel_pain()) + target.visible_message("The markings below \the [target] glow a bloody red.") + else + var/datum/gender/TT = gender_datums[target.get_visible_gender()] + target.visible_message("[target] writhes in pain as the markings below [TT.him] glow a bloody red.", "AAAAAAHHHH!", "You hear an anguished scream.") + + if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate + waiting_for_input[target] = 1 + + if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist"))//putting jobban check here because is_convertable uses mind as argument + //waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though. + to_chat(target, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + to_chat(target, "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.") + + else spawn() + var/choice = alert(target,"Do you want to join the cult?","Submit to Nar'Sie","Resist","Submit") + waiting_for_input[target] = 0 + if(choice == "Submit") //choosing 'Resist' does nothing of course. + cult.add_antagonist(target.mind) converting -= target - if(target.getFireLoss() < 100) - target.hallucination = min(target.hallucination, 500) - return 0 + target.hallucination = 0 //sudden clarity - target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects - // Resist messages go! - if(initial_message) //don't do this stuff right away, only if they resist or hesitate. - add_attack_logs(attacker,target,"Convert rune") - switch(target.getFireLoss()) - if(0 to 25) - to_chat(target, "Your blood boils as you force yourself to resist the corruption invading every corner of your mind.") - if(25 to 45) - to_chat(target, "Your blood boils and your body burns as the corruption further forces itself into your body and mind.") - if(45 to 75) - to_chat(target, "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.") - target.apply_effect(rand(1,10), STUTTER) - if(75 to 100) - to_chat(target, "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.") - //broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky - //hallucination is reduced when the step off as well, provided they haven't hit the last stage... - - //5000 is waaaay too much, in practice. - target.hallucination = min(target.hallucination + 100, 500) - target.apply_effect(10, STUTTER) - target.adjustBrainLoss(1) - if(100 to INFINITY) - to_chat(target, "Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing.") - //5000 is waaaay too much, in practice. - target.hallucination = min(target.hallucination + 100, 500) - target.apply_effect(15, STUTTER) - target.adjustBrainLoss(1) - - initial_message = 1 - if (!target.can_feel_pain()) - target.visible_message("The markings below \the [target] glow a bloody red.") - else - var/datum/gender/TT = gender_datums[target.get_visible_gender()] - target.visible_message("[target] writhes in pain as the markings below [TT.him] glow a bloody red.", "AAAAAAHHHH!", "You hear an anguished scream.") - - if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate - waiting_for_input[target] = 1 - - if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist"))//putting jobban check here because is_convertable uses mind as argument - //waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though. - to_chat(target, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(target, "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.") - - else spawn() - var/choice = alert(target,"Do you want to join the cult?","Submit to Nar'Sie","Resist","Submit") - waiting_for_input[target] = 0 - if(choice == "Submit") //choosing 'Resist' does nothing of course. - cult.add_antagonist(target.mind) - converting -= target - target.hallucination = 0 //sudden clarity - - sleep(100) //proc once every 10 seconds - return 1 + sleep(100) //proc once every 10 seconds + return 1 /////////////////////////////////////////FOURTH RUNE - tearreality() - if(!cult.allow_narsie) - return fizzle() +/obj/effect/rune/proc/tearreality() + if(!cult.allow_narsie) + return fizzle() - var/list/cultists = new() - for(var/mob/M in range(1,src)) - if(iscultist(M) && !M.stat) - M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - if(istype(M, /mob/living/carbon/human/dummy)) //No manifest cheese. - continue - cultists.Add(M) - if(cultists.len >= 9) - if(!narsie_cometh)//so we don't initiate Hell more than one time. - to_world("THE VEIL HAS BEEN SHATTERED!") - world << sound('sound/effects/weather/wind/wind_5_1.ogg') + var/list/cultists = new() + for(var/mob/M in range(1,src)) + if(iscultist(M) && !M.stat) + M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") + if(istype(M, /mob/living/carbon/human/dummy)) //No manifest cheese. + continue + cultists.Add(M) + if(cultists.len >= 9) + if(!narsie_cometh)//so we don't initiate Hell more than one time. + to_world("THE VEIL HAS BEEN SHATTERED!") + world << sound('sound/effects/weather/wind/wind_5_1.ogg') - SetUniversalState(/datum/universal_state/hell) - narsie_cometh = 1 + SetUniversalState(/datum/universal_state/hell) + narsie_cometh = 1 - spawn(10 SECONDS) - if(emergency_shuttle) - emergency_shuttle.call_evac() - emergency_shuttle.launch_time = 0 // Cannot recall + spawn(10 SECONDS) + if(emergency_shuttle) + emergency_shuttle.call_evac() + emergency_shuttle.launch_time = 0 // Cannot recall - log_and_message_admins_many(cultists, "summoned the end of days.") -// new /obj/singularity/narsie/large(src.loc) - return - else - return fizzle() + log_and_message_admins_many(cultists, "summoned the end of days.") + return + else + return fizzle() /////////////////////////////////////////FIFTH RUNE - emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist - log_and_message_admins("activated an EMP rune.") - if(istype(src,/obj/effect/rune)) - usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!") - else - usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!") - playsound(U, 'sound/items/Welder2.ogg', 25, 1) - var/turf/T = get_turf(U) - if(T) - T.hotspot_expose(700,125) - var/rune = src // detaching the proc - in theory - empulse(U, (range_red - 3), (range_red - 2), (range_red - 1), range_red) - qdel(rune) - return +/obj/effect/rune/proc/emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist + log_and_message_admins("activated an EMP rune.") + if(istype(src,/obj/effect/rune)) + usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!") + else + usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!") + playsound(U, 'sound/items/Welder2.ogg', 25, 1) + var/turf/T = get_turf(U) + if(T) + T.hotspot_expose(700,125) + var/rune = src // detaching the proc - in theory + empulse(U, (range_red - 3), (range_red - 2), (range_red - 1), range_red) + qdel(rune) + return /////////////////////////////////////////SIXTH RUNE - drain() - var/drain = 0 - for(var/obj/effect/rune/R in rune_list) - if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"]) - for(var/mob/living/carbon/D in R.loc) - if(D.stat!=2) - add_attack_logs(usr,D,"Blood drain rune") - var/bdrain = rand(1,25) - to_chat(D, "You feel weakened.") - D.take_overall_damage(bdrain, 0) - drain += bdrain - if(!drain) - return fizzle() - usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") - usr.visible_message("Blood flows from the rune into [usr]!", \ - "The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \ - "You hear a liquid flowing.") - var/mob/living/user = usr - if(user.bhunger) - user.bhunger = max(user.bhunger-2*drain,0) - if(drain>=50) - user.visible_message("[user]'s eyes give off eerie red glow!", \ - "...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \ - "You hear a heartbeat.") - user.bhunger += drain - src = user - spawn() - for (,user.bhunger>0,user.bhunger--) - sleep(50) - user.take_overall_damage(3, 0) - return - user.heal_organ_damage(drain%5, 0) - drain-=drain%5 - for (,drain>0,drain-=5) - sleep(2) - user.heal_organ_damage(5, 0) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - for(var/obj/item/organ/I in H.internal_organs) - if(I.damage > 0) - I.damage = max(I.damage - 5, 0) //Heals 5 damage per organ per use - if(I.damage <= 5 && I.organ_tag == O_EYES) - H.sdisabilities &= ~BLIND - for(var/obj/item/organ/E in H.bad_external_organs) - var/obj/item/organ/external/affected = E - if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) - affected.status &= ~ORGAN_BROKEN - for(var/datum/wound/W in affected.wounds) - if(istype(W, /datum/wound/internal_bleeding)) - affected.wounds -= W - affected.update_damages() - return +/obj/effect/rune/proc/drain() + var/drain = 0 + for(var/obj/effect/rune/R in rune_list) + if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"]) + for(var/mob/living/carbon/D in R.loc) + if(D.stat!=2) + add_attack_logs(usr,D,"Blood drain rune") + var/bdrain = rand(1,25) + to_chat(D, "You feel weakened.") + D.take_overall_damage(bdrain, 0) + drain += bdrain + if(!drain) + return fizzle() + usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") + usr.visible_message("Blood flows from the rune into [usr]!", \ + "The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \ + "You hear a liquid flowing.") + var/mob/living/user = usr + if(user.bhunger) + user.bhunger = max(user.bhunger-2*drain,0) + if(drain>=50) + user.visible_message("[user]'s eyes give off eerie red glow!", \ + "...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \ + "You hear a heartbeat.") + user.bhunger += drain + src = user + spawn() + for (,user.bhunger>0,user.bhunger--) + sleep(50) + user.take_overall_damage(3, 0) + return + user.heal_organ_damage(drain%5, 0) + drain-=drain%5 + for (,drain>0,drain-=5) + sleep(2) + user.heal_organ_damage(5, 0) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + for(var/obj/item/organ/I in H.internal_organs) + if(I.damage > 0) + I.damage = max(I.damage - 5, 0) //Heals 5 damage per organ per use + if(I.damage <= 5 && I.organ_tag == O_EYES) + H.sdisabilities &= ~BLIND + for(var/obj/item/organ/E in H.bad_external_organs) + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + for(var/datum/wound/W in affected.wounds) + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() + return @@ -301,104 +292,99 @@ var/list/sacrificed = list() /////////////////////////////////////////SEVENTH RUNE - seer() - if(usr.loc==src.loc) - if(usr.seer==1) - usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.") - to_chat(usr, "The world beyond fades from your vision.") - usr.see_invisible = SEE_INVISIBLE_LIVING - usr.seer = 0 - else if(usr.see_invisible!=SEE_INVISIBLE_LIVING) - to_chat(usr, "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.") - usr.see_invisible = SEE_INVISIBLE_CULT - usr.seer = 0 - else - usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") - to_chat(usr, "The world beyond opens to your eyes.") - usr.see_invisible = SEE_INVISIBLE_CULT - usr.seer = 1 - return - return fizzle() +/obj/effect/rune/proc/seer() + if(usr.loc==src.loc) + if(usr.seer==1) + usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.") + to_chat(usr, "The world beyond fades from your vision.") + usr.see_invisible = SEE_INVISIBLE_LIVING + usr.seer = 0 + else if(usr.see_invisible!=SEE_INVISIBLE_LIVING) + to_chat(usr, "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.") + usr.see_invisible = SEE_INVISIBLE_CULT + usr.seer = 0 + else + usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") + to_chat(usr, "The world beyond opens to your eyes.") + usr.see_invisible = SEE_INVISIBLE_CULT + usr.seer = 1 + return + return fizzle() /////////////////////////////////////////EIGHTH RUNE - raise() - var/mob/living/carbon/human/corpse_to_raise - var/mob/living/carbon/human/body_to_sacrifice +/obj/effect/rune/proc/raise() + var/mob/living/carbon/human/corpse_to_raise + var/mob/living/carbon/human/body_to_sacrifice - var/is_sacrifice_target = 0 - for(var/mob/living/carbon/human/M in src.loc) - if(M.stat == DEAD) - if(cult && M.mind == cult.sacrifice_target) + var/is_sacrifice_target = 0 + for(var/mob/living/carbon/human/M in src.loc) + if(M.stat == DEAD) + if(cult && M.mind == cult.sacrifice_target) + is_sacrifice_target = 1 + else + corpse_to_raise = M + break + + if(!corpse_to_raise) + if(is_sacrifice_target) + to_chat(usr, "The Geometer of blood wants this mortal for himself.") + return fizzle() + + + is_sacrifice_target = 0 + find_sacrifice: + for(var/obj/effect/rune/R in rune_list) + if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"]) + for(var/mob/living/carbon/human/N in R.loc) + if(cult && N.mind && N.mind == cult.sacrifice_target) is_sacrifice_target = 1 else - corpse_to_raise = M - break + if(N.stat!= DEAD) + body_to_sacrifice = N + break find_sacrifice - if(!corpse_to_raise) - if(is_sacrifice_target) - to_chat(usr, "The Geometer of blood wants this mortal for himself.") - return fizzle() + if(!body_to_sacrifice) + if (is_sacrifice_target) + to_chat(usr, "The Geometer of Blood wants that corpse for himself.") + else + to_chat(usr, "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.") + return fizzle() + if(!cult.can_become_antag(corpse_to_raise.mind) || jobban_isbanned(corpse_to_raise, "cultist")) + to_chat(usr, "The Geometer of Blood refuses to touch this one.") + return fizzle() + else if(!corpse_to_raise.client && corpse_to_raise.mind) //Don't force the dead person to come back if they don't want to. + for(var/mob/observer/dead/ghost in player_list) + if(ghost.mind == corpse_to_raise.mind) + to_chat(ghost, "The cultist [usr.real_name] is trying to \ + revive you. Return to your body if you want to be resurrected into the service of Nar'Sie! \ + (Verbs -> Ghost -> Re-enter corpse)") + break - is_sacrifice_target = 0 - find_sacrifice: - for(var/obj/effect/rune/R in rune_list) - if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"]) - for(var/mob/living/carbon/human/N in R.loc) - if(cult && N.mind && N.mind == cult.sacrifice_target) - is_sacrifice_target = 1 - else - if(N.stat!= DEAD) - body_to_sacrifice = N - break find_sacrifice + sleep(10 SECONDS) - if(!body_to_sacrifice) - if (is_sacrifice_target) - to_chat(usr, "The Geometer of Blood wants that corpse for himself.") - else - to_chat(usr, "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.") - return fizzle() + if(corpse_to_raise.client) - if(!cult.can_become_antag(corpse_to_raise.mind) || jobban_isbanned(corpse_to_raise, "cultist")) - to_chat(usr, "The Geometer of Blood refuses to touch this one.") - return fizzle() - else if(!corpse_to_raise.client && corpse_to_raise.mind) //Don't force the dead person to come back if they don't want to. - for(var/mob/observer/dead/ghost in player_list) - if(ghost.mind == corpse_to_raise.mind) - to_chat(ghost, "The cultist [usr.real_name] is trying to \ - revive you. Return to your body if you want to be resurrected into the service of Nar'Sie! \ - (Verbs -> Ghost -> Re-enter corpse)") - break + var/datum/gender/TU = gender_datums[corpse_to_raise.get_visible_gender()] + var/datum/gender/TT = gender_datums[body_to_sacrifice.get_visible_gender()] - sleep(10 SECONDS) + cult.add_antagonist(corpse_to_raise.mind) + corpse_to_raise.revive() - if(corpse_to_raise.client) + usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") + corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as [TU.he] stand[TU.s] up, slowly starting to breathe again.", \ + "Life... I'm alive again...", \ + "You hear a faint, slightly familiar whisper.") + body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from [TT.his] remains!", \ + "You feel as your blood boils, tearing you apart.", \ + "You hear a thousand voices, all crying in pain.") + body_to_sacrifice.gib() - var/datum/gender/TU = gender_datums[corpse_to_raise.get_visible_gender()] - var/datum/gender/TT = gender_datums[body_to_sacrifice.get_visible_gender()] + to_chat(corpse_to_raise, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + to_chat(corpse_to_raise, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - cult.add_antagonist(corpse_to_raise.mind) - corpse_to_raise.revive() - - usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") - corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as [TU.he] stand[TU.s] up, slowly starting to breathe again.", \ - "Life... I'm alive again...", \ - "You hear a faint, slightly familiar whisper.") - body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from [TT.his] remains!", \ - "You feel as your blood boils, tearing you apart.", \ - "You hear a thousand voices, all crying in pain.") - body_to_sacrifice.gib() - -// if(ticker.mode.name == "cult") -// ticker.mode:add_cultist(corpse_to_raise.mind) -// else -// ticker.mode.cult |= corpse_to_raise.mind - - to_chat(corpse_to_raise, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(corpse_to_raise, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - - return + return @@ -406,114 +392,114 @@ var/list/sacrificed = list() /////////////////////////////////////////NINETH RUNE - obscure(var/rad) - var/S=0 - for(var/obj/effect/rune/R in orange(rad,src)) - if(R!=src) - R.invisibility=INVISIBILITY_OBSERVER - S=1 - if(S) - if(istype(src,/obj/effect/rune)) - usr.say("Kla[pick("'","`")]atu barada nikt'o!") - for (var/mob/V in viewers(src)) - V.show_message("The rune turns into gray dust, veiling the surrounding runes.", 3) - qdel(src) - else - usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") - to_chat(usr, "Your talisman turns into gray dust, veiling the surrounding runes.") - for (var/mob/V in orange(1,src)) - if(V!=usr) - V.show_message("Dust emanates from [usr]'s hands for a moment.", 3) +/obj/effect/rune/proc/obscure(var/rad) + var/S=0 + for(var/obj/effect/rune/R in orange(rad,src)) + if(R!=src) + R.invisibility=INVISIBILITY_OBSERVER + S=1 + if(S) + if(istype(src,/obj/effect/rune)) + usr.say("Kla[pick("'","`")]atu barada nikt'o!") + for (var/mob/V in viewers(src)) + V.show_message("The rune turns into gray dust, veiling the surrounding runes.", 3) + qdel(src) + else + usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") + to_chat(usr, "Your talisman turns into gray dust, veiling the surrounding runes.") + for (var/mob/V in orange(1,src)) + if(V!=usr) + V.show_message("Dust emanates from [usr]'s hands for a moment.", 3) - return - if(istype(src,/obj/effect/rune)) - return fizzle() - else - call(/obj/effect/rune/proc/fizzle)() - return + return + if(istype(src,/obj/effect/rune)) + return fizzle() + else + call(/obj/effect/rune/proc/fizzle)() + return /////////////////////////////////////////TENTH RUNE - ajourney() //some bits copypastaed from admin tools - Urist - if(usr.loc==src.loc) - var/mob/living/carbon/human/L = usr - var/datum/gender/TU = gender_datums[L.get_visible_gender()] - usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!") - usr.visible_message("[usr]'s eyes glow blue as [TU.he] freeze[TU.s] in place, absolutely motionless.", \ - "The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \ - "You hear only complete silence for a moment.") - announce_ghost_joinleave(usr.ghostize(1), 1, "You feel that they had to use some [pick("dark", "black", "blood", "forgotten", "forbidden")] magic to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place!") - L.ajourn = 1 - while(L) - if(L.key) - L.ajourn=0 - return - else - L.take_organ_damage(3, 0) - sleep(100) - return fizzle() +/obj/effect/rune/proc/ajourney() //some bits copypastaed from admin tools - Urist + if(usr.loc==src.loc) + var/mob/living/carbon/human/L = usr + var/datum/gender/TU = gender_datums[L.get_visible_gender()] + usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!") + usr.visible_message("[usr]'s eyes glow blue as [TU.he] freeze[TU.s] in place, absolutely motionless.", \ + "The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \ + "You hear only complete silence for a moment.") + announce_ghost_joinleave(usr.ghostize(1), 1, "You feel that they had to use some [pick("dark", "black", "blood", "forgotten", "forbidden")] magic to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place!") + L.ajourn = 1 + while(L) + if(L.key) + L.ajourn=0 + return + else + L.take_organ_damage(3, 0) + sleep(100) + return fizzle() /////////////////////////////////////////ELEVENTH RUNE - manifest() - var/obj/effect/rune/this_rune = src - src = null - if(usr.loc!=this_rune.loc) - return this_rune.fizzle() - var/mob/observer/dead/ghost - for(var/mob/observer/dead/O in this_rune.loc) - if(!O.client) continue - if(!O.MayRespawn()) continue - if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue - if(!(O.client.prefs.be_special & BE_CULTIST)) continue - ghost = O - break - if(!ghost) - return this_rune.fizzle() - if(jobban_isbanned(ghost, "cultist")) - return this_rune.fizzle() +/obj/effect/rune/proc/manifest() + var/obj/effect/rune/this_rune = src + src = null + if(usr.loc!=this_rune.loc) + return this_rune.fizzle() + var/mob/observer/dead/ghost + for(var/mob/observer/dead/O in this_rune.loc) + if(!O.client) continue + if(!O.MayRespawn()) continue + if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue + if(!(O.client.prefs.be_special & BE_CULTIST)) continue + ghost = O + break + if(!ghost) + return this_rune.fizzle() + if(jobban_isbanned(ghost, "cultist")) + return this_rune.fizzle() - usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!") - var/mob/living/carbon/human/dummy/D = new(this_rune.loc) - usr.visible_message("A shape forms in the center of the rune. A shape of... a man.", \ - "A shape forms in the center of the rune. A shape of... a man.", \ - "You hear liquid flowing.") - D.real_name = "Unknown" - var/chose_name = 0 - for(var/obj/item/weapon/paper/P in this_rune.loc) - if(P.info) - D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) ) - chose_name = 1 - break - D.universal_speak = 1 - D.status_flags &= ~GODMODE - D.b_eyes = 200 - D.r_eyes = 200 - D.g_eyes = 200 - D.update_eyes() - D.all_underwear.Cut() - D.key = ghost.key - cult.add_antagonist(D.mind) + usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!") + var/mob/living/carbon/human/dummy/D = new(this_rune.loc) + usr.visible_message("A shape forms in the center of the rune. A shape of... a man.", \ + "A shape forms in the center of the rune. A shape of... a man.", \ + "You hear liquid flowing.") + D.real_name = "Unknown" + var/chose_name = 0 + for(var/obj/item/weapon/paper/P in this_rune.loc) + if(P.info) + D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) ) + chose_name = 1 + break + D.universal_speak = 1 + D.status_flags &= ~GODMODE + D.b_eyes = 200 + D.r_eyes = 200 + D.g_eyes = 200 + D.update_eyes() + D.all_underwear.Cut() + D.key = ghost.key + cult.add_antagonist(D.mind) - if(!chose_name) - D.real_name = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged") - D.real_name += " " - D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith") + if(!chose_name) + D.real_name = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged") + D.real_name += " " + D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith") - log_and_message_admins("used a manifest rune.") - var/mob/living/user = usr - while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) - user.take_organ_damage(1, 0) - sleep(30) - if(D) - D.visible_message("[D] slowly dissipates into dust and bones.", \ - "You feel pain, as bonds formed between your soul and this homunculus break.", \ - "You hear faint rustle.") - D.dust() - return + log_and_message_admins("used a manifest rune.") + var/mob/living/user = usr + while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) + user.take_organ_damage(1, 0) + sleep(30) + if(D) + D.visible_message("[D] slowly dissipates into dust and bones.", \ + "You feel pain, as bonds formed between your soul and this homunculus break.", \ + "You hear faint rustle.") + D.dust() + return @@ -521,617 +507,617 @@ var/list/sacrificed = list() /////////////////////////////////////////TWELFTH RUNE - talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm - var/obj/item/weapon/paper/newtalisman - var/unsuitable_newtalisman = 0 - for(var/obj/item/weapon/paper/P in src.loc) - if(!P.info) - newtalisman = P - break - else - unsuitable_newtalisman = 1 - if (!newtalisman) - if (unsuitable_newtalisman) - to_chat(usr, "The blank is tainted. It is unsuitable.") - return fizzle() +/obj/effect/rune/proc/talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm + var/obj/item/weapon/paper/newtalisman + var/unsuitable_newtalisman = 0 + for(var/obj/item/weapon/paper/P in src.loc) + if(!P.info) + newtalisman = P + break + else + unsuitable_newtalisman = 1 + if (!newtalisman) + if (unsuitable_newtalisman) + to_chat(usr, "The blank is tainted. It is unsuitable.") + return fizzle() - var/obj/effect/rune/imbued_from - var/obj/item/weapon/paper/talisman/T - for(var/obj/effect/rune/R in orange(1,src)) - if(R==src) - continue - if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport - T = new(src.loc) - T.imbue = "[R.word3]" - T.info = "[R.word3]" - imbued_from = R - break - if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome - T = new(src.loc) - T.imbue = "newtome" - imbued_from = R - break - if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp - T = new(src.loc) - T.imbue = "emp" - imbued_from = R - break - if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal - T = new(src.loc) - T.imbue = "conceal" - imbued_from = R - break - if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor - T = new(src.loc) - T.imbue = "armor" - imbued_from = R - break - if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal - T = new(src.loc) - T.imbue = "revealrunes" - imbued_from = R - break - if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen - T = new(src.loc) - T.imbue = "deafen" - imbued_from = R - break - if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind - T = new(src.loc) - T.imbue = "blind" - imbued_from = R - break - if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicat - T = new(src.loc) - T.imbue = "communicate" - imbued_from = R - break - if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //communicat - T = new(src.loc) - T.imbue = "runestun" - imbued_from = R - break - if (imbued_from) - for (var/mob/V in viewers(src)) - V.show_message("The runes turn into dust, which then forms into an arcane image on the paper.", 3) - usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!") - qdel(imbued_from) - qdel(newtalisman) - else - return fizzle() + var/obj/effect/rune/imbued_from + var/obj/item/weapon/paper/talisman/T + for(var/obj/effect/rune/R in orange(1,src)) + if(R==src) + continue + if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport + T = new(src.loc) + T.imbue = "[R.word3]" + T.info = "[R.word3]" + imbued_from = R + break + if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome + T = new(src.loc) + T.imbue = "newtome" + imbued_from = R + break + if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp + T = new(src.loc) + T.imbue = "emp" + imbued_from = R + break + if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal + T = new(src.loc) + T.imbue = "conceal" + imbued_from = R + break + if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor + T = new(src.loc) + T.imbue = "armor" + imbued_from = R + break + if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal + T = new(src.loc) + T.imbue = "revealrunes" + imbued_from = R + break + if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen + T = new(src.loc) + T.imbue = "deafen" + imbued_from = R + break + if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind + T = new(src.loc) + T.imbue = "blind" + imbued_from = R + break + if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicat + T = new(src.loc) + T.imbue = "communicate" + imbued_from = R + break + if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //communicat + T = new(src.loc) + T.imbue = "runestun" + imbued_from = R + break + if (imbued_from) + for (var/mob/V in viewers(src)) + V.show_message("The runes turn into dust, which then forms into an arcane image on the paper.", 3) + usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!") + qdel(imbued_from) + qdel(newtalisman) + else + return fizzle() /////////////////////////////////////////THIRTEENTH RUNE - mend() - var/mob/living/user = usr - var/datum/gender/TU = gender_datums[usr.get_visible_gender()] - src = null - user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") - user.take_overall_damage(200, 0) - runedec+=10 - user.visible_message("\The [user] keels over dead, [TU.his] blood glowing blue as it escapes [TU.his] body and dissipates into thin air.", \ - "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ - "You hear faint rustle.") - for(,user.stat==2) - sleep(600) - if (!user) - return - runedec-=10 +/obj/effect/rune/proc/mend() + var/mob/living/user = usr + var/datum/gender/TU = gender_datums[usr.get_visible_gender()] + src = null + user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") + user.take_overall_damage(200, 0) + runedec+=10 + user.visible_message("\The [user] keels over dead, [TU.his] blood glowing blue as it escapes [TU.his] body and dissipates into thin air.", \ + "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ + "You hear faint rustle.") + for(,user.stat==2) + sleep(600) + if (!user) return + runedec-=10 + return /////////////////////////////////////////FOURTEETH RUNE - // returns 0 if the rune is not used. returns 1 if the rune is used. - communicate() - . = 1 // Default output is 1. If the rune is deleted it will return 1 - var/input = input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own - if(!input) - if (istype(src)) - fizzle() - return 0 - else - return 0 +// returns 0 if the rune is not used. returns 1 if the rune is used. +/obj/effect/rune/proc/communicate() + . = 1 // Default output is 1. If the rune is deleted it will return 1 + var/input = input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own + if(!input) + if (istype(src)) + fizzle() + return 0 + else + return 0 - if(istype(src,/obj/effect/rune)) - usr.say("O bidai nabora se[pick("'","`")]sma!") - else - usr.whisper("O bidai nabora se[pick("'","`")]sma!") + if(istype(src,/obj/effect/rune)) + usr.say("O bidai nabora se[pick("'","`")]sma!") + else + usr.whisper("O bidai nabora se[pick("'","`")]sma!") - input = sanitize(input) - log_and_message_admins("used a communicate rune to say '[input]'") - for(var/datum/mind/H in cult.current_antagonists) - if (H.current) - to_chat(H.current, "[input]") - for(var/mob/observer/dead/O in player_list) - to_chat(O, "[input]") - qdel(src) - return 1 + input = sanitize(input) + log_and_message_admins("used a communicate rune to say '[input]'") + for(var/datum/mind/H in cult.current_antagonists) + if (H.current) + to_chat(H.current, "[input]") + for(var/mob/observer/dead/O in player_list) + to_chat(O, "[input]") + qdel(src) + return 1 /////////////////////////////////////////FIFTEENTH RUNE - sacrifice() - var/list/mob/living/carbon/human/cultsinrange = list() - var/list/mob/living/carbon/human/victims = list() - for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice - if(ishuman(V)) - if(!(iscultist(V))) - victims += V//Checks for cult status and mob type - for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards - if(istype(I,/obj/item/organ/internal/brain)) - var/obj/item/organ/internal/brain/B = I - victims += B.brainmob - else if(istype(I,/obj/item/device/mmi)) - var/obj/item/device/mmi/B = I - victims += B.brainmob - else if(istype(I,/obj/item/device/aicard)) - for(var/mob/living/silicon/ai/A in I) - victims += A - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - cultsinrange += C - C.say("Barhah hra zar[pick("'","`")]garis!") +/obj/effect/rune/proc/sacrifice() + var/list/mob/living/carbon/human/cultsinrange = list() + var/list/mob/living/carbon/human/victims = list() + for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice + if(ishuman(V)) + if(!(iscultist(V))) + victims += V//Checks for cult status and mob type + for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards + if(istype(I,/obj/item/organ/internal/brain)) + var/obj/item/organ/internal/brain/B = I + victims += B.brainmob + else if(istype(I,/obj/item/device/mmi)) + var/obj/item/device/mmi/B = I + victims += B.brainmob + else if(istype(I,/obj/item/device/aicard)) + for(var/mob/living/silicon/ai/A in I) + victims += A + for(var/mob/living/carbon/C in orange(1,src)) + if(iscultist(C) && !C.stat) + cultsinrange += C + C.say("Barhah hra zar[pick("'","`")]garis!") - for(var/mob/H in victims) + for(var/mob/H in victims) - var/worth = 0 - if(istype(H,/mob/living/carbon/human)) - var/mob/living/carbon/human/lamb = H - if(lamb.species.rarity_value > 3) - worth = 1 + var/worth = 0 + if(istype(H,/mob/living/carbon/human)) + var/mob/living/carbon/human/lamb = H + if(lamb.species.rarity_value > 3) + worth = 1 - if (ticker.mode.name == "cult") - if(H.mind == cult.sacrifice_target) - if(cultsinrange.len >= 3) - sacrificed += H.mind - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - to_chat(usr, "The Geometer of Blood accepts this sacrifice, your objective is now complete.") - else - to_chat(usr, "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") + if (ticker.mode.name == "cult") + if(H.mind == cult.sacrifice_target) + if(cultsinrange.len >= 3) + sacrificed += H.mind + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining else - if(cultsinrange.len >= 3) - if(H.stat !=2) - if(prob(80) || worth) - to_chat(usr, "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.") - cult.grant_runeword(usr) - else - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - to_chat(usr, "However, this soul was not enough to gain His favor.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(prob(40) || worth) - to_chat(usr, "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.") - cult.grant_runeword(usr) - else - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(H.stat !=2) - to_chat(usr, "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") - else - if(prob(40)) - - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - cult.grant_runeword(usr) - else - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() + H.gib() + to_chat(usr, "The Geometer of Blood accepts this sacrifice, your objective is now complete.") else - if(cultsinrange.len >= 3) - if(H.stat !=2) - if(prob(80)) - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - cult.grant_runeword(usr) - else - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - to_chat(usr, "However, this soul was not enough to gain His favor.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() + to_chat(usr, "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") + else + if(cultsinrange.len >= 3) + if(H.stat !=2) + if(prob(80) || worth) + to_chat(usr, "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.") + cult.grant_runeword(usr) else - if(prob(40)) - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - cult.grant_runeword(usr) - else - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + to_chat(usr, "However, this soul was not enough to gain His favor.") + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining + else + H.gib() else - if(H.stat !=2) - to_chat(usr, "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") + if(prob(40) || worth) + to_chat(usr, "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice.") + cult.grant_runeword(usr) else - if(prob(40)) - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - cult.grant_runeword(usr) - else - to_chat(usr, "The Geometer of Blood accepts this sacrifice.") - to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining + else + H.gib() + else + if(H.stat !=2) + to_chat(usr, "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") + else + if(prob(40)) + + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + cult.grant_runeword(usr) + else + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining + else + H.gib() + else + if(cultsinrange.len >= 3) + if(H.stat !=2) + if(prob(80)) + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + cult.grant_runeword(usr) + else + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + to_chat(usr, "However, this soul was not enough to gain His favor.") + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining + else + H.gib() + else + if(prob(40)) + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + cult.grant_runeword(usr) + else + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining + else + H.gib() + else + if(H.stat !=2) + to_chat(usr, "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") + else + if(prob(40)) + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + cult.grant_runeword(usr) + else + to_chat(usr, "The Geometer of Blood accepts this sacrifice.") + to_chat(usr, "However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) + H.dust()//To prevent the MMI from remaining + else + H.gib() /////////////////////////////////////////SIXTEENTH RUNE - revealrunes(var/obj/W as obj) - var/go=0 - var/rad - var/S=0 - if(istype(W,/obj/effect/rune)) - rad = 6 - go = 1 - if (istype(W,/obj/item/weapon/paper/talisman)) - rad = 4 - go = 1 - if (istype(W,/obj/item/weapon/nullrod)) - rad = 1 - go = 1 - if(go) - for(var/obj/effect/rune/R in orange(rad,src)) - if(R!=src) - R:visibility=15 - S=1 - if(S) - if(istype(W,/obj/item/weapon/nullrod)) - to_chat(usr, "Arcane markings suddenly glow from underneath a thin layer of dust!") - return - if(istype(W,/obj/effect/rune)) - usr.say("Nikt[pick("'","`")]o barada kla'atu!") - for (var/mob/V in viewers(src)) - V.show_message("The rune turns into red dust, reveaing the surrounding runes.", 3) - qdel(src) - return - if(istype(W,/obj/item/weapon/paper/talisman)) - usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") - to_chat(usr, "Your talisman turns into red dust, revealing the surrounding runes.") - for (var/mob/V in orange(1,usr.loc)) - if(V!=usr) - V.show_message("Red dust emanates from [usr]'s hands for a moment.", 3) - return - return - if(istype(W,/obj/effect/rune)) - return fizzle() - if(istype(W,/obj/item/weapon/paper/talisman)) - call(/obj/effect/rune/proc/fizzle)() - return +/obj/effect/rune/proc/revealrunes(var/obj/W as obj) + var/go=0 + var/rad + var/S=0 + if(istype(W,/obj/effect/rune)) + rad = 6 + go = 1 + if (istype(W,/obj/item/weapon/paper/talisman)) + rad = 4 + go = 1 + if (istype(W,/obj/item/weapon/nullrod)) + rad = 1 + go = 1 + if(go) + for(var/obj/effect/rune/R in orange(rad,src)) + if(R!=src) + R:visibility=15 + S=1 + if(S) + if(istype(W,/obj/item/weapon/nullrod)) + to_chat(usr, "Arcane markings suddenly glow from underneath a thin layer of dust!") + return + if(istype(W,/obj/effect/rune)) + usr.say("Nikt[pick("'","`")]o barada kla'atu!") + for (var/mob/V in viewers(src)) + V.show_message("The rune turns into red dust, reveaing the surrounding runes.", 3) + qdel(src) + return + if(istype(W,/obj/item/weapon/paper/talisman)) + usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") + to_chat(usr, "Your talisman turns into red dust, revealing the surrounding runes.") + for (var/mob/V in orange(1,usr.loc)) + if(V!=usr) + V.show_message("Red dust emanates from [usr]'s hands for a moment.", 3) + return + return + if(istype(W,/obj/effect/rune)) + return fizzle() + if(istype(W,/obj/item/weapon/paper/talisman)) + call(/obj/effect/rune/proc/fizzle)() + return /////////////////////////////////////////SEVENTEENTH RUNE - wall() - usr.say("Khari[pick("'","`")]d! Eske'te tannin!") - src.density = !src.density - var/mob/living/user = usr - user.take_organ_damage(2, 0) - if(src.density) - to_chat(usr, "Your blood flows into the rune, and you feel that the very space over the rune thickens.") - else - to_chat(usr, "Your blood flows into the rune, and you feel as the rune releases its grasp on space.") - return +/obj/effect/rune/proc/wall() + usr.say("Khari[pick("'","`")]d! Eske'te tannin!") + src.density = !src.density + var/mob/living/user = usr + user.take_organ_damage(2, 0) + if(src.density) + to_chat(usr, "Your blood flows into the rune, and you feel that the very space over the rune thickens.") + else + to_chat(usr, "Your blood flows into the rune, and you feel as the rune releases its grasp on space.") + return /////////////////////////////////////////EIGHTTEENTH RUNE - freedom() - var/mob/living/user = usr - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in cult.current_antagonists) - if (istype(H.current,/mob/living/carbon)) - cultists+=H.current - var/list/mob/living/carbon/users = new - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - users+=C - var/dam = round(15 / users.len) - if(users.len>=3) - var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users) - if(!cultist) - return fizzle() - if (cultist == user) //just to be sure. - return - if(!(cultist.buckled || \ - cultist.handcuffed || \ - istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \ - (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \ - (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \ - (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \ - )) - to_chat(user, "The [cultist] is already free.") - return - cultist.buckled = null - if (cultist.handcuffed) - cultist.drop_from_inventory(cultist.handcuffed) - if (cultist.legcuffed) - cultist.drop_from_inventory(cultist.legcuffed) - if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle)) - cultist.drop_from_inventory(cultist.wear_mask) - if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) - cultist.loc:welded = 0 - if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) - cultist.loc:locked = 0 - if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) - cultist.loc:locked = 0 - for(var/mob/living/carbon/C in users) - user.take_overall_damage(dam, 0) - C.say("Khari[pick("'","`")]d! Gual'te nikka!") - qdel(src) +/obj/effect/rune/proc/freedom() + var/mob/living/user = usr + var/list/mob/living/carbon/cultists = new + for(var/datum/mind/H in cult.current_antagonists) + if (istype(H.current,/mob/living/carbon)) + cultists+=H.current + var/list/mob/living/carbon/users = new + for(var/mob/living/carbon/C in orange(1,src)) + if(iscultist(C) && !C.stat) + users+=C + var/dam = round(15 / users.len) + if(users.len>=3) + var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users) + if(!cultist) return fizzle() + if (cultist == user) //just to be sure. + return + if(!(cultist.buckled || \ + cultist.handcuffed || \ + istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \ + (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \ + (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \ + (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \ + )) + to_chat(user, "The [cultist] is already free.") + return + cultist.buckled = null + if (cultist.handcuffed) + cultist.drop_from_inventory(cultist.handcuffed) + if (cultist.legcuffed) + cultist.drop_from_inventory(cultist.legcuffed) + if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle)) + cultist.drop_from_inventory(cultist.wear_mask) + if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) + cultist.loc:welded = 0 + if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) + cultist.loc:locked = 0 + if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) + cultist.loc:locked = 0 + for(var/mob/living/carbon/C in users) + user.take_overall_damage(dam, 0) + C.say("Khari[pick("'","`")]d! Gual'te nikka!") + qdel(src) + return fizzle() /////////////////////////////////////////NINETEENTH RUNE - cultsummon() - var/mob/living/user = usr - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in cult.current_antagonists) - if (istype(H.current,/mob/living/carbon)) - cultists+=H.current - var/list/mob/living/carbon/users = new - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - users += C - if(users.len>=3) - var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user) - if(!cultist) - return fizzle() - if (cultist == user) //just to be sure. - return - if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) - var/datum/gender/TU = gender_datums[cultist.get_visible_gender()] - to_chat(user, "You cannot summon \the [cultist], for [TU.his] shackles of blood are strong.") - return fizzle() - cultist.loc = src.loc - cultist.lying = 1 - cultist.regenerate_icons() - - var/dam = round(25 / (users.len/2)) //More people around the rune less damage everyone takes. Minimum is 3 cultists - - for(var/mob/living/carbon/human/C in users) - if(iscultist(C) && !C.stat) - C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!") - C.take_overall_damage(dam, 0) - if(users.len <= 4) // You did the minimum, this is going to hurt more and we're going to stun you. - C.apply_effect(rand(3,6), STUN) - C.apply_effect(1, WEAKEN) - user.visible_message("Rune disappears with a flash of red light, and in its place now a body lies.", \ - "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ - "You hear a pop and smell ozone.") - qdel(src) +/obj/effect/rune/proc/cultsummon() + var/mob/living/user = usr + var/list/mob/living/carbon/cultists = new + for(var/datum/mind/H in cult.current_antagonists) + if (istype(H.current,/mob/living/carbon)) + cultists+=H.current + var/list/mob/living/carbon/users = new + for(var/mob/living/carbon/C in orange(1,src)) + if(iscultist(C) && !C.stat) + users += C + if(users.len>=3) + var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user) + if(!cultist) return fizzle() + if (cultist == user) //just to be sure. + return + if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) + var/datum/gender/TU = gender_datums[cultist.get_visible_gender()] + to_chat(user, "You cannot summon \the [cultist], for [TU.his] shackles of blood are strong.") + return fizzle() + cultist.loc = src.loc + cultist.lying = 1 + cultist.regenerate_icons() + + var/dam = round(25 / (users.len/2)) //More people around the rune less damage everyone takes. Minimum is 3 cultists + + for(var/mob/living/carbon/human/C in users) + if(iscultist(C) && !C.stat) + C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!") + C.take_overall_damage(dam, 0) + if(users.len <= 4) // You did the minimum, this is going to hurt more and we're going to stun you. + C.apply_effect(rand(3,6), STUN) + C.apply_effect(1, WEAKEN) + user.visible_message("Rune disappears with a flash of red light, and in its place now a body lies.", \ + "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ + "You hear a pop and smell ozone.") + qdel(src) + return fizzle() /////////////////////////////////////////TWENTIETH RUNES - deafen() - if(istype(src,/obj/effect/rune)) - var/list/affected = new() - for(var/mob/living/carbon/C in range(7,src)) - if (iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.ear_deaf += 50 - C.show_message("The world around you suddenly becomes quiet.", 3) - affected += C - if(prob(1)) - C.sdisabilities |= DEAF - if(affected.len) - usr.say("Sti[pick("'","`")] kaliedir!") - to_chat(usr, "The world becomes quiet as the deafening rune dissipates into fine dust.") - add_attack_logs(usr,affected,"Deafen rune") - qdel(src) - else - return fizzle() - else - var/list/affected = new() - for(var/mob/living/carbon/C in range(7,usr)) - if (iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.ear_deaf += 30 - //talismans is weaker. - C.show_message("The world around you suddenly becomes quiet.", 3) - affected += C - if(affected.len) - usr.whisper("Sti[pick("'","`")] kaliedir!") - to_chat(usr, "Your talisman turns into gray dust, deafening everyone around.") - add_attack_logs(usr, affected, "Deafen rune") - for (var/mob/V in orange(1,src)) - if(!(iscultist(V))) - V.show_message("Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) - return +/obj/effect/rune/proc/deafen() + if(istype(src,/obj/effect/rune)) + var/list/affected = new() + for(var/mob/living/carbon/C in range(7,src)) + if (iscultist(C)) + continue + var/obj/item/weapon/nullrod/N = locate() in C + if(N) + continue + C.ear_deaf += 50 + C.show_message("The world around you suddenly becomes quiet.", 3) + affected += C + if(prob(1)) + C.sdisabilities |= DEAF + if(affected.len) + usr.say("Sti[pick("'","`")] kaliedir!") + to_chat(usr, "The world becomes quiet as the deafening rune dissipates into fine dust.") + add_attack_logs(usr,affected,"Deafen rune") + qdel(src) + else + return fizzle() + else + var/list/affected = new() + for(var/mob/living/carbon/C in range(7,usr)) + if (iscultist(C)) + continue + var/obj/item/weapon/nullrod/N = locate() in C + if(N) + continue + C.ear_deaf += 30 + //talismans is weaker. + C.show_message("The world around you suddenly becomes quiet.", 3) + affected += C + if(affected.len) + usr.whisper("Sti[pick("'","`")] kaliedir!") + to_chat(usr, "Your talisman turns into gray dust, deafening everyone around.") + add_attack_logs(usr, affected, "Deafen rune") + for (var/mob/V in orange(1,src)) + if(!(iscultist(V))) + V.show_message("Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) + return - blind() - if(istype(src,/obj/effect/rune)) - var/list/affected = new() - for(var/mob/living/carbon/C in viewers(src)) - if (iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.eye_blurry += 50 - C.Blind(20) - if(prob(5)) - C.disabilities |= NEARSIGHTED - if(prob(10)) - C.sdisabilities |= BLIND - C.show_message("Suddenly you see a red flash that blinds you.", 3) - affected += C - if(affected.len) - usr.say("Sti[pick("'","`")] kaliesin!") - to_chat(usr, "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.") - add_attack_logs(usr, affected, "Blindness rune") - qdel(src) - else - return fizzle() - else - var/list/affected = new() - for(var/mob/living/carbon/C in view(2,usr)) - if (iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.eye_blurry += 30 - C.Blind(10) - //talismans is weaker. - affected += C - C.show_message("You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) - if(affected.len) - usr.whisper("Sti[pick("'","`")] kaliesin!") - to_chat(usr, "Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.") - add_attack_logs(usr, affected, "Blindness rune") - return +/obj/effect/rune/proc/blind() + if(istype(src,/obj/effect/rune)) + var/list/affected = new() + for(var/mob/living/carbon/C in viewers(src)) + if (iscultist(C)) + continue + var/obj/item/weapon/nullrod/N = locate() in C + if(N) + continue + C.eye_blurry += 50 + C.Blind(20) + if(prob(5)) + C.disabilities |= NEARSIGHTED + if(prob(10)) + C.sdisabilities |= BLIND + C.show_message("Suddenly you see a red flash that blinds you.", 3) + affected += C + if(affected.len) + usr.say("Sti[pick("'","`")] kaliesin!") + to_chat(usr, "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.") + add_attack_logs(usr, affected, "Blindness rune") + qdel(src) + else + return fizzle() + else + var/list/affected = new() + for(var/mob/living/carbon/C in view(2,usr)) + if (iscultist(C)) + continue + var/obj/item/weapon/nullrod/N = locate() in C + if(N) + continue + C.eye_blurry += 30 + C.Blind(10) + //talismans is weaker. + affected += C + C.show_message("You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) + if(affected.len) + usr.whisper("Sti[pick("'","`")] kaliesin!") + to_chat(usr, "Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.") + add_attack_logs(usr, affected, "Blindness rune") + return - bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy. +/obj/effect/rune/proc/bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy. /* - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if (istype(H.current,/mob/living/carbon)) - cultists+=H.current + var/list/mob/living/carbon/cultists = new + for(var/datum/mind/H in ticker.mode.cult) + if (istype(H.current,/mob/living/carbon)) + cultists+=H.current */ - var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood. - var/list/victims = new + var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood. + var/list/victims = new // var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood. - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - cultists+=C - if(cultists.len>=3) - for(var/mob/living/carbon/M in viewers(usr)) - if(iscultist(M)) - continue - var/obj/item/weapon/nullrod/N = locate() in M - if(N) - continue - M.take_overall_damage(51,51) - to_chat(M, "Your blood boils!") - victims += M - if(prob(5)) - spawn(5) - M.gib() - for(var/obj/effect/rune/R in view(src)) - if(prob(10)) - explosion(R.loc, -1, 0, 1, 5) - for(var/mob/living/carbon/human/C in orange(1,src)) - if(iscultist(C) && !C.stat) - C.say("Dedo ol[pick("'","`")]btoh!") - C.take_overall_damage(15, 0) - add_attack_logs(usr, victims, "Blood boil rune") - qdel(src) - else - return fizzle() - return + for(var/mob/living/carbon/C in orange(1,src)) + if(iscultist(C) && !C.stat) + cultists+=C + if(cultists.len>=3) + for(var/mob/living/carbon/M in viewers(usr)) + if(iscultist(M)) + continue + var/obj/item/weapon/nullrod/N = locate() in M + if(N) + continue + M.take_overall_damage(51,51) + to_chat(M, "Your blood boils!") + victims += M + if(prob(5)) + spawn(5) + M.gib() + for(var/obj/effect/rune/R in view(src)) + if(prob(10)) + explosion(R.loc, -1, 0, 1, 5) + for(var/mob/living/carbon/human/C in orange(1,src)) + if(iscultist(C) && !C.stat) + C.say("Dedo ol[pick("'","`")]btoh!") + C.take_overall_damage(15, 0) + add_attack_logs(usr, victims, "Blood boil rune") + qdel(src) + else + return fizzle() + return // WIP rune, I'll wait for Rastaf0 to add limited blood. - burningblood() - var/culcount = 0 - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - culcount++ - if(culcount >= 5) - for(var/obj/effect/rune/R in rune_list) - if(R.blood_DNA == src.blood_DNA) - for(var/mob/living/M in orange(2,R)) - M.take_overall_damage(0,15) - if (R.invisibility>M.see_invisible) - to_chat(M, "Aargh it burns!") - else - to_chat(M, "Rune suddenly ignites, burning you!") - var/turf/T = get_turf(R) - T.hotspot_expose(700,125) - for(var/obj/effect/decal/cleanable/blood/B in world) - if(B.blood_DNA == src.blood_DNA) - for(var/mob/living/M in orange(1,B)) - M.take_overall_damage(0,5) - to_chat(M, "Blood suddenly ignites, burning you!") - var/turf/T = get_turf(B) - T.hotspot_expose(700,125) - qdel(B) - qdel(src) +/obj/effect/rune/proc/burningblood() + var/culcount = 0 + for(var/mob/living/carbon/C in orange(1,src)) + if(iscultist(C) && !C.stat) + culcount++ + if(culcount >= 5) + for(var/obj/effect/rune/R in rune_list) + if(R.blood_DNA == src.blood_DNA) + for(var/mob/living/M in orange(2,R)) + M.take_overall_damage(0,15) + if (R.invisibility>M.see_invisible) + to_chat(M, "Aargh it burns!") + else + to_chat(M, "Rune suddenly ignites, burning you!") + var/turf/T = get_turf(R) + T.hotspot_expose(700,125) + for(var/obj/effect/decal/cleanable/blood/B in world) + if(B.blood_DNA == src.blood_DNA) + for(var/mob/living/M in orange(1,B)) + M.take_overall_damage(0,5) + to_chat(M, "Blood suddenly ignites, burning you!") + var/turf/T = get_turf(B) + T.hotspot_expose(700,125) + qdel(B) + qdel(src) ////////// Rune 24 (counting burningblood, which kinda doesnt work yet.) - runestun(var/mob/living/T as mob) - if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. - usr.say("Fuu ma[pick("'","`")]jin!") - for(var/mob/living/L in viewers(src)) - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.flash_eyes() - if(C.stuttering < 1 && (!(HULK in C.mutations))) - C.stuttering = 1 - C.Weaken(1) - C.Stun(1) - C.show_message("The rune explodes in a bright flash.", 3) - add_attack_logs(usr,C,"Stun rune") +/obj/effect/rune/proc/runestun(var/mob/living/T as mob) + if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. + usr.say("Fuu ma[pick("'","`")]jin!") + for(var/mob/living/L in viewers(src)) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.flash_eyes() + if(C.stuttering < 1 && (!(HULK in C.mutations))) + C.stuttering = 1 + C.Weaken(1) + C.Stun(1) + C.show_message("The rune explodes in a bright flash.", 3) + add_attack_logs(usr,C,"Stun rune") - else if(issilicon(L)) - var/mob/living/silicon/S = L - S.Weaken(5) - S.show_message("BZZZT... The rune has exploded in a bright flash.", 3) - add_attack_logs(usr,S,"Stun rune") - qdel(src) - else ///When invoked as talisman, stun and mute the target mob. - usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") - var/obj/item/weapon/nullrod/N = locate() in T - if(N) - for(var/mob/O in viewers(T, null)) - O.show_message(text("[] invokes a talisman at [], but they are unaffected!", usr, T), 1) - else - for(var/mob/O in viewers(T, null)) - O.show_message(text("[] invokes a talisman at []", usr, T), 1) + else if(issilicon(L)) + var/mob/living/silicon/S = L + S.Weaken(5) + S.show_message("BZZZT... The rune has exploded in a bright flash.", 3) + add_attack_logs(usr,S,"Stun rune") + qdel(src) + else ///When invoked as talisman, stun and mute the target mob. + usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") + var/obj/item/weapon/nullrod/N = locate() in T + if(N) + for(var/mob/O in viewers(T, null)) + O.show_message(text("[] invokes a talisman at [], but they are unaffected!", usr, T), 1) + else + for(var/mob/O in viewers(T, null)) + O.show_message(text("[] invokes a talisman at []", usr, T), 1) - if(issilicon(T)) - T.Weaken(15) - add_attack_logs(usr,T,"Stun rune") - else if(iscarbon(T)) - var/mob/living/carbon/C = T - C.flash_eyes() - if (!(HULK in C.mutations)) - C.silent += 15 - C.Weaken(25) - C.Stun(25) - add_attack_logs(usr,C,"Stun rune") - return + if(issilicon(T)) + T.Weaken(15) + add_attack_logs(usr,T,"Stun rune") + else if(iscarbon(T)) + var/mob/living/carbon/C = T + C.flash_eyes() + if (!(HULK in C.mutations)) + C.silent += 15 + C.Weaken(25) + C.Stun(25) + add_attack_logs(usr,C,"Stun rune") + return /////////////////////////////////////////TWENTY-FIFTH RUNE - armor() - var/mob/living/carbon/human/user = usr - if(istype(src,/obj/effect/rune)) - usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") - else - usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") - usr.visible_message("The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \ - "You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.") +/obj/effect/rune/proc/armor() + var/mob/living/carbon/human/user = usr + if(istype(src,/obj/effect/rune)) + usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") + else + usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") + usr.visible_message("The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \ + "You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.") - user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) - user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) - user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes) - user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) - //the above update their overlay icons cache but do not call update_icons() - //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache - user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor + user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) + user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) + user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes) + user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) + //the above update their overlay icons cache but do not call update_icons() + //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache + user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor - qdel(src) - return + qdel(src) + return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 304bb2b2a6..02923522dc 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -4,113 +4,113 @@ var/uses = 0 info = "



" - attack_self(mob/living/user as mob) - if(iscultist(user)) - var/delete = 1 - // who the hell thought this was a good idea :( - switch(imbue) - if("newtome") - call(/obj/effect/rune/proc/tomesummon)() - if("armor") - call(/obj/effect/rune/proc/armor)() - if("emp") - call(/obj/effect/rune/proc/emp)(usr.loc,3) - if("conceal") - call(/obj/effect/rune/proc/obscure)(2) - if("revealrunes") - call(/obj/effect/rune/proc/revealrunes)(src) - if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - call(/obj/effect/rune/proc/teleport)(imbue) - if("communicate") - //If the user cancels the talisman this var will be set to 0 - delete = call(/obj/effect/rune/proc/communicate)() - if("deafen") - call(/obj/effect/rune/proc/deafen)() - if("blind") - call(/obj/effect/rune/proc/blind)() - if("runestun") - to_chat(user, "To use this talisman, attack your target directly.") - return - if("supply") - supply() - user.take_organ_damage(5, 0) - if(src && src.imbue!="supply" && src.imbue!="runestun") - if(delete) - qdel(src) - return - else - to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") - return - - - attack(mob/living/carbon/T as mob, mob/living/user as mob) - if(iscultist(user)) - if(imbue == "runestun") - user.take_organ_damage(5, 0) - call(/obj/effect/rune/proc/runestun)(T) +/obj/item/weapon/paper/talisman/attack_self(mob/living/user as mob) + if(iscultist(user)) + var/delete = 1 + // who the hell thought this was a good idea :( + switch(imbue) + if("newtome") + call(/obj/effect/rune/proc/tomesummon)() + if("armor") + call(/obj/effect/rune/proc/armor)() + if("emp") + call(/obj/effect/rune/proc/emp)(usr.loc,3) + if("conceal") + call(/obj/effect/rune/proc/obscure)(2) + if("revealrunes") + call(/obj/effect/rune/proc/revealrunes)(src) + if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") + call(/obj/effect/rune/proc/teleport)(imbue) + if("communicate") + //If the user cancels the talisman this var will be set to 0 + delete = call(/obj/effect/rune/proc/communicate)() + if("deafen") + call(/obj/effect/rune/proc/deafen)() + if("blind") + call(/obj/effect/rune/proc/blind)() + if("runestun") + to_chat(user, "To use this talisman, attack your target directly.") + return + if("supply") + supply() + user.take_organ_damage(5, 0) + if(src && src.imbue!="supply" && src.imbue!="runestun") + if(delete) qdel(src) - else - ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? - else - ..() + return + else + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") + return - proc/supply(var/key) - if (!src.uses) +/obj/item/weapon/paper/talisman/attack(mob/living/carbon/T as mob, mob/living/user as mob) + if(iscultist(user)) + if(imbue == "runestun") + user.take_organ_damage(5, 0) + call(/obj/effect/rune/proc/runestun)(T) qdel(src) - return + else + ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? + else + ..() - var/dat = "There are [src.uses] bloody runes on the parchment.
" - dat += "Please choose the chant to be imbued into the fabric of reality.
" - dat += "
" - dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon a new arcane tome.
" - dat += "Sas'so c'arta forbici! - Allows you to move to a rune with the same last word.
" - dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" - dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
" - dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
" - dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
" - dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
" - dat += "Kal om neth - Summons a soul stone
" - dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" - usr << browse(dat, "window=id_com;size=350x200") + +/obj/item/weapon/paper/talisman/proc/supply(var/key) + if (!src.uses) + qdel(src) return + var/dat = "There are [src.uses] bloody runes on the parchment.
" + dat += "Please choose the chant to be imbued into the fabric of reality.
" + dat += "
" + dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon a new arcane tome.
" + dat += "Sas'so c'arta forbici! - Allows you to move to a rune with the same last word.
" + dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" + dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
" + dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
" + dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
" + dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
" + dat += "Kal om neth - Summons a soul stone
" + dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" + usr << browse(dat, "window=id_com;size=350x200") + return - Topic(href, href_list) - if(!src) return - if (usr.stat || usr.restrained() || !in_range(src, usr)) return - if (href_list["rune"]) - switch(href_list["rune"]) - if("newtome") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "newtome" - if("teleport") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]" - T.info = "[T.imbue]" - if("emp") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "emp" - if("conceal") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "conceal" - if("communicate") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "communicate" - if("runestun") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "runestun" - if("armor") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "armor" - if("soulstone") - new /obj/item/device/soulstone(get_turf(usr)) - if("construct") - new /obj/structure/constructshell/cult(get_turf(usr)) - src.uses-- - supply() - return +/obj/item/weapon/paper/talisman/Topic(href, href_list) + if(!src) return + if (usr.stat || usr.restrained() || !in_range(src, usr)) return + + if (href_list["rune"]) + switch(href_list["rune"]) + if("newtome") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "newtome" + if("teleport") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]" + T.info = "[T.imbue]" + if("emp") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "emp" + if("conceal") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "conceal" + if("communicate") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "communicate" + if("runestun") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "runestun" + if("armor") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "armor" + if("soulstone") + new /obj/item/device/soulstone(get_turf(usr)) + if("construct") + new /obj/structure/constructshell/cult(get_turf(usr)) + src.uses-- + supply() + return /obj/item/weapon/paper/talisman/supply diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index ea40622695..fd6a36e3d4 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -16,34 +16,34 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 density = 1 anchored = 1 - Bump(atom/clong) - if(istype(clong, /turf/simulated/shuttle)) //Skip shuttles without actually deleting the rod - return +/obj/effect/immovablerod/Bump(atom/clong) + if(istype(clong, /turf/simulated/shuttle)) //Skip shuttles without actually deleting the rod + return - else if (istype(clong, /turf) && !istype(clong, /turf/unsimulated)) - if(clong.density) - clong.ex_act(2) - for (var/mob/O in hearers(src, null)) - O.show_message("CLANG", 2) + else if (istype(clong, /turf) && !istype(clong, /turf/unsimulated)) + if(clong.density) + clong.ex_act(2) + for (var/mob/O in hearers(src, null)) + O.show_message("CLANG", 2) - else if (istype(clong, /obj)) - if(clong.density) - clong.ex_act(2) - for (var/mob/O in hearers(src, null)) - O.show_message("CLANG", 2) + else if (istype(clong, /obj)) + if(clong.density) + clong.ex_act(2) + for (var/mob/O in hearers(src, null)) + O.show_message("CLANG", 2) - else if (istype(clong, /mob)) - if(clong.density || prob(10)) - clong.ex_act(2) - else - qdel(src) + else if (istype(clong, /mob)) + if(clong.density || prob(10)) + clong.ex_act(2) + else + qdel(src) - if(clong && prob(25)) - src.loc = clong.loc + if(clong && prob(25)) + src.loc = clong.loc - Destroy() - walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. - return ..() +/obj/effect/immovablerod/Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() /proc/immovablerod() var/startx = 0 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 98a41a2be4..fa3dba92bc 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -469,7 +469,7 @@ var/global/list/additional_antag_types = list() ////////////////////////// //Reports player logouts// ////////////////////////// -proc/display_roundstart_logout_report() +/proc/display_roundstart_logout_report() var/msg = "Roundstart logout report\n\n" for(var/mob/living/L in mob_list) @@ -521,7 +521,7 @@ proc/display_roundstart_logout_report() if(M.client && M.client.holder) to_chat(M,msg) -proc/get_nt_opposed() +/proc/get_nt_opposed() var/list/dudes = list() for(var/mob/living/carbon/human/man in player_list) if(man.client) diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index b185208fbd..4639f57138 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -1453,7 +1453,7 @@ datum return 0 return 1 -datum/objective/silence +/datum/objective/silence explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left." check_completion() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 2834b81cbd..22168e7a12 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,130 +1,129 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 var/global/list/all_objectives = list() -datum/objective +/datum/objective var/datum/mind/owner = null //Who owns the objective. var/explanation_text = "Nothing" //What that person is supposed to do. var/datum/mind/target = null //If they are focused on a particular person. var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. var/completed = 0 //currently only used for custom objectives. - New(var/text) - all_objectives |= src - if(text) - explanation_text = text - ..() +/datum/objective/New(var/text) + all_objectives |= src + if(text) + explanation_text = text + ..() - Destroy() - all_objectives -= src - ..() +/datum/objective/Destroy() + all_objectives -= src + ..() - proc/check_completion() - return completed +/datum/objective/proc/check_completion() + return completed - proc/find_target() - var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2)) - possible_targets += possible_target - if(possible_targets.len > 0) - target = pick(possible_targets) +/datum/objective/proc/find_target() + var/list/possible_targets = list() + for(var/datum/mind/possible_target in ticker.minds) + if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2)) + possible_targets += possible_target + if(possible_targets.len > 0) + target = pick(possible_targets) - proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned. - for(var/datum/mind/possible_target in ticker.minds) - if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) ) - target = possible_target - break +/datum/objective/proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned. + for(var/datum/mind/possible_target in ticker.minds) + if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) ) + target = possible_target + break -datum/objective/assassinate - find_target() - ..() - if(target && target.current) - explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]." - else - explanation_text = "Free Objective" - return target +/datum/objective/assassinate/find_target() + ..() + if(target && target.current) + explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]." + else + explanation_text = "Free Objective" + return target - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - explanation_text = "Assassinate [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - return target +/datum/objective/assassinate/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + explanation_text = "Assassinate [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + return target - check_completion() - if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 +/datum/objective/assassinate/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + return 0 + return 1 -datum/objective/anti_revolution/execute - find_target() - ..() - if(target && target.current) - var/datum/gender/T = gender_datums[target.current.get_visible_gender()] - explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute [T.him]." - else - explanation_text = "Free Objective" - return target +/datum/objective/anti_revolution/execute/find_target() + ..() + if(target && target.current) + var/datum/gender/T = gender_datums[target.current.get_visible_gender()] + explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute [T.him]." + else + explanation_text = "Free Objective" + return target - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - var/datum/gender/T = gender_datums[target.current.get_visible_gender()] - explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute [T.him]." - else - explanation_text = "Free Objective" - return target +/datum/objective/anti_revolution/execute/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + var/datum/gender/T = gender_datums[target.current.get_visible_gender()] + explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute [T.him]." + else + explanation_text = "Free Objective" + return target - check_completion() - if(target && target.current) - if(target.current.stat == DEAD || !ishuman(target.current)) - return 1 - return 0 - return 1 +/datum/objective/anti_revolution/execute/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || !ishuman(target.current)) + return 1 + return 0 + return 1 -datum/objective/anti_revolution/brig +/datum/objective/anti_revolution/brig var/already_completed = 0 - find_target() - ..() - if(target && target.current) - explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example." - else - explanation_text = "Free Objective" - return target +/datum/objective/anti_revolution/brig/find_target() + ..() + if(target && target.current) + explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example." + else + explanation_text = "Free Objective" + return target - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example." - else - explanation_text = "Free Objective" - return target +/datum/objective/anti_revolution/brig/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example." + else + explanation_text = "Free Objective" + return target - check_completion() - if(already_completed) - return 1 +/datum/objective/anti_revolution/brig/check_completion() + if(already_completed) + return 1 - if(target && target.current) - if(target.current.stat == DEAD) - return 0 - if(target.is_brigged(10 * 60 * 10)) - already_completed = 1 - return 1 + if(target && target.current) + if(target.current.stat == DEAD) return 0 + if(target.is_brigged(10 * 60 * 10)) + already_completed = 1 + return 1 return 0 + return 0 +<<<<<<< HEAD datum/objective/anti_revolution/demote find_target() ..() @@ -158,271 +157,305 @@ datum/objective/anti_revolution/demote else return 0 return 1 +======= +/datum/objective/anti_revolution/demote/find_target() + ..() + if(target && target.current) + var/datum/gender/T = gender_datums[target.current.get_visible_gender()] + explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant." + else + explanation_text = "Free Objective" + return target +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) -datum/objective/debrain//I want braaaainssss - find_target() - ..() - if(target && target.current) - explanation_text = "Steal the brain of [target.current.real_name]." - else - explanation_text = "Free Objective" - return target +/datum/objective/anti_revolution/demote/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + var/datum/gender/T = gender_datums[target.current.get_visible_gender()] + explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant." + else + explanation_text = "Free Objective" + return target +/datum/objective/anti_revolution/demote/check_completion() + if(target && target.current && istype(target,/mob/living/carbon/human)) + var/obj/item/weapon/card/id/I = target.current:wear_id + if(istype(I, /obj/item/device/pda)) + var/obj/item/device/pda/P = I + I = P.id - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - explanation_text = "Steal the brain of [target.current.real_name] the [!role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - return target + if(!istype(I)) return 1 - check_completion() - if(!target)//If it's a free objective. + if(I.assignment == "Assistant") return 1 - if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. + else return 0 - if( !target.current || !isbrain(target.current) ) + return 1 + +//I want braaaainssss +/datum/objective/debrain/find_target() + ..() + if(target && target.current) + explanation_text = "Steal the brain of [target.current.real_name]." + else + explanation_text = "Free Objective" + return target + + +/datum/objective/debrain/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + explanation_text = "Steal the brain of [target.current.real_name] the [!role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + return target + +/datum/objective/debrain/check_completion() + if(!target)//If it's a free objective. + return 1 + if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. + return 0 + if( !target.current || !isbrain(target.current) ) + return 0 + var/atom/A = target.current + while(A.loc) //check to see if the brainmob is on our person + A = A.loc + if(A == owner.current) + return 1 + return 0 + + +//The opposite of killing a dude. +/datum/objective/protect/find_target() + ..() + if(target && target.current) + explanation_text = "Protect [target.current.real_name], the [target.assigned_role]." + else + explanation_text = "Free Objective" + return target + + +/datum/objective/protect/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + explanation_text = "Protect [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + return target + +/datum/objective/protect/check_completion() + if(!target) //If it's a free objective. + return 1 + if(target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) return 0 - var/atom/A = target.current - while(A.loc) //check to see if the brainmob is on our person - A = A.loc - if(A == owner.current) - return 1 - return 0 + return 1 + return 0 -datum/objective/protect//The opposite of killing a dude. - find_target() - ..() - if(target && target.current) - explanation_text = "Protect [target.current.real_name], the [target.assigned_role]." - else - explanation_text = "Free Objective" - return target - - - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - explanation_text = "Protect [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - return target - - check_completion() - if(!target) //If it's a free objective. - return 1 - if(target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) - return 0 - return 1 - return 0 - - -datum/objective/hijack +/datum/objective/hijack explanation_text = "Hijack the emergency shuttle by escaping alone." - check_completion() - if(!owner.current || owner.current.stat) - return 0 - if(!emergency_shuttle.returned()) - return 0 - if(issilicon(owner.current)) - return 0 - var/area/shuttle = locate(/area/shuttle/escape/centcom) - var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai) - for(var/mob/living/player in player_list) - if(player.type in protected_mobs) continue - if (player.mind && (player.mind != owner)) - if(player.stat != DEAD) //they're not dead! - if(get_turf(player) in shuttle) - return 0 - return 1 +/datum/objective/hijack/check_completion() + if(!owner.current || owner.current.stat) + return 0 + if(!emergency_shuttle.returned()) + return 0 + if(issilicon(owner.current)) + return 0 + var/area/shuttle = locate(/area/shuttle/escape/centcom) + var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai) + for(var/mob/living/player in player_list) + if(player.type in protected_mobs) continue + if (player.mind && (player.mind != owner)) + if(player.stat != DEAD) //they're not dead! + if(get_turf(player) in shuttle) + return 0 + return 1 -datum/objective/block +/datum/objective/block explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." - check_completion() - if(!istype(owner.current, /mob/living/silicon)) - return 0 - if(!emergency_shuttle.returned()) - return 0 - if(!owner.current) - return 0 - var/area/shuttle = locate(/area/shuttle/escape/centcom) - var/protected_mobs[] = list(/mob/living/silicon/ai, /mob/living/silicon/pai, /mob/living/silicon/robot) - for(var/mob/living/player in player_list) - if(player.type in protected_mobs) continue - if (player.mind) - if (player.stat != 2) - if (get_turf(player) in shuttle) - return 0 - return 1 +/datum/objective/block/check_completion() + if(!istype(owner.current, /mob/living/silicon)) + return 0 + if(!emergency_shuttle.returned()) + return 0 + if(!owner.current) + return 0 + var/area/shuttle = locate(/area/shuttle/escape/centcom) + var/protected_mobs[] = list(/mob/living/silicon/ai, /mob/living/silicon/pai, /mob/living/silicon/robot) + for(var/mob/living/player in player_list) + if(player.type in protected_mobs) continue + if (player.mind) + if (player.stat != 2) + if (get_turf(player) in shuttle) + return 0 + return 1 -datum/objective/silence +/datum/objective/silence explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left." - check_completion() - if(!emergency_shuttle.returned()) - return 0 +/datum/objective/silence/check_completion() + if(!emergency_shuttle.returned()) + return 0 - for(var/mob/living/player in player_list) - if(player == owner.current) - continue - if(player.mind) - if(player.stat != DEAD) - var/turf/T = get_turf(player) - if(!T) continue - switch(T.loc.type) - if(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom) - return 0 - return 1 + for(var/mob/living/player in player_list) + if(player == owner.current) + continue + if(player.mind) + if(player.stat != DEAD) + var/turf/T = get_turf(player) + if(!T) continue + switch(T.loc.type) + if(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom) + return 0 + return 1 -datum/objective/escape +/datum/objective/escape explanation_text = "Escape on the shuttle or an escape pod alive and free." - check_completion() - if(issilicon(owner.current)) - return 0 - if(isbrain(owner.current)) - return 0 - if(!emergency_shuttle.returned()) - return 0 - if(!owner.current || owner.current.stat ==2) - return 0 - var/turf/location = get_turf(owner.current.loc) - if(!location) - return 0 +/datum/objective/escape/check_completion() + if(issilicon(owner.current)) + return 0 + if(isbrain(owner.current)) + return 0 + if(!emergency_shuttle.returned()) + return 0 + if(!owner.current || owner.current.stat ==2) + return 0 + var/turf/location = get_turf(owner.current.loc) + if(!location) + return 0 - if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph - if(istype(owner.current, /mob/living/carbon)) - var/mob/living/carbon/C = owner.current - if (!C.handcuffed) - return 1 - return 0 + if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph + if(istype(owner.current, /mob/living/carbon)) + var/mob/living/carbon/C = owner.current + if (!C.handcuffed) + return 1 + return 0 - var/area/check_area = location.loc - if(istype(check_area, /area/shuttle/escape/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod1/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod2/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod3/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod5/centcom)) - return 1 - else - return 0 + var/area/check_area = location.loc + if(istype(check_area, /area/shuttle/escape/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod1/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod2/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod3/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod5/centcom)) + return 1 + else + return 0 -datum/objective/survive +/datum/objective/survive explanation_text = "Stay alive until the end." - check_completion() - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) - return 0 //Brains no longer win survive objectives. --NEO - if(issilicon(owner.current) && owner.current != owner.original) - return 0 - return 1 +/datum/objective/survive/check_completion() + if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) + return 0 //Brains no longer win survive objectives. --NEO + if(issilicon(owner.current) && owner.current != owner.original) + return 0 + return 1 // Similar to the anti-rev objective, but for traitors -datum/objective/brig +/datum/objective/brig var/already_completed = 0 - find_target() - ..() - if(target && target.current) - explanation_text = "Have [target.current.real_name], the [target.assigned_role] brigged for 10 minutes." - else - explanation_text = "Free Objective" - return target +/datum/objective/brig/find_target() + ..() + if(target && target.current) + explanation_text = "Have [target.current.real_name], the [target.assigned_role] brigged for 10 minutes." + else + explanation_text = "Free Objective" + return target - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - explanation_text = "Have [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] brigged for 10 minutes." - else - explanation_text = "Free Objective" - return target +/datum/objective/brig/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + explanation_text = "Have [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] brigged for 10 minutes." + else + explanation_text = "Free Objective" + return target - check_completion() - if(already_completed) - return 1 +/datum/objective/brig/check_completion() + if(already_completed) + return 1 - if(target && target.current) - if(target.current.stat == DEAD) - return 0 - // Make the actual required time a bit shorter than the official time - if(target.is_brigged(10 * 60 * 5)) - already_completed = 1 - return 1 + if(target && target.current) + if(target.current.stat == DEAD) return 0 + // Make the actual required time a bit shorter than the official time + if(target.is_brigged(10 * 60 * 5)) + already_completed = 1 + return 1 return 0 + return 0 // Harm a crew member, making an example of them -datum/objective/harm +/datum/objective/harm var/already_completed = 0 - find_target() - ..() - if(target && target.current) - explanation_text = "Make an example of [target.current.real_name], the [target.assigned_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it." - else - explanation_text = "Free Objective" - return target +/datum/objective/harm/find_target() + ..() + if(target && target.current) + explanation_text = "Make an example of [target.current.real_name], the [target.assigned_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it." + else + explanation_text = "Free Objective" + return target - find_target_by_role(role, role_type=0) - ..(role, role_type) - if(target && target.current) - explanation_text = "Make an example of [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it." - else - explanation_text = "Free Objective" - return target +/datum/objective/harm/find_target_by_role(role, role_type=0) + ..(role, role_type) + if(target && target.current) + explanation_text = "Make an example of [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it." + else + explanation_text = "Free Objective" + return target - check_completion() - if(already_completed) - return 1 +/datum/objective/harm/check_completion() + if(already_completed) + return 1 - if(target && target.current && istype(target.current, /mob/living/carbon/human)) - if(target.current.stat == DEAD) - return 0 + if(target && target.current && istype(target.current, /mob/living/carbon/human)) + if(target.current.stat == DEAD) + return 0 - var/mob/living/carbon/human/H = target.current - for(var/obj/item/organ/external/E in H.organs) - if(E.status & ORGAN_BROKEN) - return 1 - for(var/limb_tag in H.species.has_limbs) //todo check prefs for robotic limbs and amputations. - var/list/organ_data = H.species.has_limbs[limb_tag] - var/limb_type = organ_data["path"] - var/found - for(var/obj/item/organ/external/E in H.organs) - if(limb_type == E.type) - found = 1 - break - if(!found) - return 1 - - var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD) - if(head.disfigured) + var/mob/living/carbon/human/H = target.current + for(var/obj/item/organ/external/E in H.organs) + if(E.status & ORGAN_BROKEN) return 1 - return 0 + for(var/limb_tag in H.species.has_limbs) //todo check prefs for robotic limbs and amputations. + var/list/organ_data = H.species.has_limbs[limb_tag] + var/limb_type = organ_data["path"] + var/found + for(var/obj/item/organ/external/E in H.organs) + if(limb_type == E.type) + found = 1 + break + if(!found) + return 1 + + var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD) + if(head.disfigured) + return 1 + return 0 -datum/objective/nuclear +/datum/objective/nuclear explanation_text = "Destroy the station with a nuclear device." -datum/objective/steal +/datum/objective/steal var/obj/item/steal_target var/target_name @@ -461,346 +494,337 @@ datum/objective/steal ) - proc/set_target(item_name) - target_name = item_name - steal_target = possible_items[target_name] - if (!steal_target ) - steal_target = possible_items_special[target_name] +/datum/objective/steal/proc/set_target(item_name) + target_name = item_name + steal_target = possible_items[target_name] + if (!steal_target ) + steal_target = possible_items_special[target_name] + explanation_text = "Steal [target_name]." + return steal_target + + +/datum/objective/steal/find_target() + return set_target(pick(possible_items)) + + +/datum/objective/steal/proc/select_target() + var/list/possible_items_all = possible_items+possible_items_special+"custom" + var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all + if (!new_target) return + if (new_target == "custom") + var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) + if (!custom_target) return + var/tmp_obj = new custom_target + var/custom_name = tmp_obj:name + qdel(tmp_obj) + custom_name = sanitize(input("Enter target name:", "Objective target", custom_name) as text|null) + if (!custom_name) return + target_name = custom_name + steal_target = custom_target explanation_text = "Steal [target_name]." - return steal_target + else + set_target(new_target) + return steal_target +/datum/objective/steal/check_completion() + if(!steal_target || !owner.current) return 0 + if(!isliving(owner.current)) return 0 + var/list/all_items = owner.current.get_contents() + switch (target_name) + if("28 moles of phoron (full tank)","10 diamonds","50 gold bars","25 refined uranium bars") + var/target_amount = text2num(target_name)//Non-numbers are ignored. + var/found_amount = 0.0//Always starts as zero. - find_target() - return set_target(pick(possible_items)) + for(var/obj/item/I in all_items) //Check for phoron tanks + if(istype(I, steal_target)) + found_amount += (target_name=="28 moles of phoron (full tank)" ? (I:air_contents:gas["phoron"]) : (I:amount)) + return found_amount>=target_amount + if("50 coins (in bag)") + var/obj/item/weapon/moneybag/B = locate() in all_items - proc/select_target() - var/list/possible_items_all = possible_items+possible_items_special+"custom" - var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all - if (!new_target) return - if (new_target == "custom") - var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) - if (!custom_target) return - var/tmp_obj = new custom_target - var/custom_name = tmp_obj:name - qdel(tmp_obj) - custom_name = sanitize(input("Enter target name:", "Objective target", custom_name) as text|null) - if (!custom_name) return - target_name = custom_name - steal_target = custom_target - explanation_text = "Steal [target_name]." - else - set_target(new_target) - return steal_target + if(B) + var/target = text2num(target_name) + var/found_amount = 0.0 + for(var/obj/item/weapon/coin/C in B) + found_amount++ + return found_amount>=target - check_completion() - if(!steal_target || !owner.current) return 0 - if(!isliving(owner.current)) return 0 - var/list/all_items = owner.current.get_contents() - switch (target_name) - if("28 moles of phoron (full tank)","10 diamonds","50 gold bars","25 refined uranium bars") - var/target_amount = text2num(target_name)//Non-numbers are ignored. - var/found_amount = 0.0//Always starts as zero. + if("a functional AI") - for(var/obj/item/I in all_items) //Check for phoron tanks - if(istype(I, steal_target)) - found_amount += (target_name=="28 moles of phoron (full tank)" ? (I:air_contents:gas["phoron"]) : (I:amount)) - return found_amount>=target_amount - - if("50 coins (in bag)") - var/obj/item/weapon/moneybag/B = locate() in all_items - - if(B) - var/target = text2num(target_name) - var/found_amount = 0.0 - for(var/obj/item/weapon/coin/C in B) - found_amount++ - return found_amount>=target - - if("a functional AI") - - for(var/obj/item/device/aicard/C in all_items) //Check for ai card - for(var/mob/living/silicon/ai/M in C) - if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card. - return 1 - - for(var/mob/living/silicon/ai/ai in mob_list) - var/turf/T = get_turf(ai) - if(istype(T)) - var/area/check_area = get_area(ai) - if(istype(check_area, /area/shuttle/escape/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod1/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod2/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod3/centcom)) - return 1 - if(istype(check_area, /area/shuttle/escape_pod5/centcom)) - return 1 - else - - for(var/obj/I in all_items) //Check for items - if(istype(I, steal_target)) + for(var/obj/item/device/aicard/C in all_items) //Check for ai card + for(var/mob/living/silicon/ai/M in C) + if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card. return 1 + + for(var/mob/living/silicon/ai/ai in mob_list) + var/turf/T = get_turf(ai) + if(istype(T)) + var/area/check_area = get_area(ai) + if(istype(check_area, /area/shuttle/escape/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod1/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod2/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod3/centcom)) + return 1 + if(istype(check_area, /area/shuttle/escape_pod5/centcom)) + return 1 + else + + for(var/obj/I in all_items) //Check for items + if(istype(I, steal_target)) + return 1 + return 0 + + + +/datum/objective/download/proc/gen_amount_goal() + target_amount = rand(10,20) + explanation_text = "Download [target_amount] research levels." + return target_amount + + +/datum/objective/download/check_completion() + if(!ishuman(owner.current)) + return 0 + if(!owner.current || owner.current.stat == 2) return 0 + var/current_amount + var/obj/item/weapon/rig/S + if(istype(owner.current,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner.current + S = H.back + + if(!istype(S) || !S.installed_modules || !S.installed_modules.len) + return 0 + + var/obj/item/rig_module/datajack/stolen_data = locate() in S.installed_modules + if(!istype(stolen_data)) + return 0 + + for(var/datum/tech/current_data in stolen_data.stored_research) + if(current_data.level > 1) + current_amount += (current_data.level-1) + + return (current_amount 1) - current_amount += (current_data.level-1) - - return (current_amount= target_amount)) return 1 - - -/datum/objective/absorb - proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6) - target_amount = rand (lowbound,highbound) - if (ticker) - var/n_p = 1 //autowin - if (ticker.current_state == GAME_STATE_SETTING_UP) - for(var/mob/new_player/P in player_list) - if(P.client && P.ready && P.mind!=owner) - n_p ++ - else if (ticker.current_state == GAME_STATE_PLAYING) - for(var/mob/living/carbon/human/P in player_list) - if(P.client && !(P.mind.changeling) && P.mind!=owner) - n_p ++ - target_amount = min(target_amount, n_p) - - explanation_text = "Absorb [target_amount] compatible genomes." - return target_amount - - check_completion() - if(owner && owner.changeling && owner.changeling.absorbed_dna && (owner.changeling.absorbedcount >= target_amount)) - return 1 - else - return 0 + else + return 0 // Heist objectives. -datum/objective/heist - proc/choose_target() - return +/datum/objective/heist/proc/choose_target() + return -datum/objective/heist/kidnap - choose_target() - var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer") - var/list/possible_targets = list() - var/list/priority_targets = list() +/datum/objective/heist/kidnap/choose_target() + var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer") + var/list/possible_targets = list() + var/list/priority_targets = list() - for(var/datum/mind/possible_target in ticker.minds) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (!possible_target.special_role)) - possible_targets += possible_target - for(var/role in roles) - if(possible_target.assigned_role == role) - priority_targets += possible_target - continue + for(var/datum/mind/possible_target in ticker.minds) + if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (!possible_target.special_role)) + possible_targets += possible_target + for(var/role in roles) + if(possible_target.assigned_role == role) + priority_targets += possible_target + continue - if(priority_targets.len > 0) - target = pick(priority_targets) - else if(possible_targets.len > 0) - target = pick(possible_targets) + if(priority_targets.len > 0) + target = pick(priority_targets) + else if(possible_targets.len > 0) + target = pick(possible_targets) - if(target && target.current) - explanation_text = "We can get a good price for [target.current.real_name], the [target.assigned_role]. Take them alive." - else - explanation_text = "Free Objective" - return target + if(target && target.current) + explanation_text = "We can get a good price for [target.current.real_name], the [target.assigned_role]. Take them alive." + else + explanation_text = "Free Objective" + return target - check_completion() - if(target && target.current) - if (target.current.stat == 2) - return 0 // They're dead. Fail. - //if (!target.current.restrained()) - // return 0 // They're loose. Close but no cigar. - - var/area/skipjack_station/start/A = locate() - for(var/mob/living/carbon/human/M in A) - if(target.current == M) - return 1 //They're restrained on the shuttle. Success. - else - return 0 - -datum/objective/heist/loot - - choose_target() - var/loot = "an object" - switch(rand(1,8)) - if(1) - target = /obj/structure/particle_accelerator - target_amount = 6 - loot = "a complete particle accelerator" - if(2) - target = /obj/machinery/the_singularitygen - target_amount = 1 - loot = "a gravitational generator" - if(3) - target = /obj/machinery/power/emitter - target_amount = 4 - loot = "four emitters" - if(4) - target = /obj/machinery/nuclearbomb - target_amount = 1 - loot = "a nuclear bomb" - if(5) - target = /obj/item/weapon/gun - target_amount = 6 - loot = "six guns" - if(6) - target = /obj/item/weapon/gun/energy - target_amount = 4 - loot = "four energy guns" - if(7) - target = /obj/item/weapon/gun/energy/laser - target_amount = 2 - loot = "two laser guns" - if(8) - target = /obj/item/weapon/gun/energy/ionrifle - target_amount = 1 - loot = "an ion gun" - - explanation_text = "It's a buyer's market out here. Steal [loot] for resale." - - check_completion() - - var/total_amount = 0 - - for(var/obj/O in locate(/area/skipjack_station/start)) - if(istype(O,target)) total_amount++ - for(var/obj/I in O.contents) - if(istype(I,target)) total_amount++ - if(total_amount >= target_amount) return 1 - - for(var/datum/mind/raider in raiders.current_antagonists) - if(raider.current) - for(var/obj/O in raider.current.get_contents()) - if(istype(O,target)) total_amount++ - if(total_amount >= target_amount) return 1 +/datum/objective/heist/kidnap/check_completion() + if(target && target.current) + if (target.current.stat == 2) + return 0 // They're dead. Fail. + //if (!target.current.restrained()) + // return 0 // They're loose. Close but no cigar. + var/area/skipjack_station/start/A = locate() + for(var/mob/living/carbon/human/M in A) + if(target.current == M) + return 1 //They're restrained on the shuttle. Success. + else return 0 -datum/objective/heist/salvage +/datum/objective/heist/loot/choose_target() + var/loot = "an object" + switch(rand(1,8)) + if(1) + target = /obj/structure/particle_accelerator + target_amount = 6 + loot = "a complete particle accelerator" + if(2) + target = /obj/machinery/the_singularitygen + target_amount = 1 + loot = "a gravitational generator" + if(3) + target = /obj/machinery/power/emitter + target_amount = 4 + loot = "four emitters" + if(4) + target = /obj/machinery/nuclearbomb + target_amount = 1 + loot = "a nuclear bomb" + if(5) + target = /obj/item/weapon/gun + target_amount = 6 + loot = "six guns" + if(6) + target = /obj/item/weapon/gun/energy + target_amount = 4 + loot = "four energy guns" + if(7) + target = /obj/item/weapon/gun/energy/laser + target_amount = 2 + loot = "two laser guns" + if(8) + target = /obj/item/weapon/gun/energy/ionrifle + target_amount = 1 + loot = "an ion gun" - choose_target() - switch(rand(1,8)) - if(1) - target = DEFAULT_WALL_MATERIAL - target_amount = 300 - if(2) - target = "glass" - target_amount = 200 - if(3) - target = "plasteel" - target_amount = 100 - if(4) - target = "phoron" - target_amount = 100 - if(5) - target = "silver" - target_amount = 50 - if(6) - target = "gold" - target_amount = 20 - if(7) - target = "uranium" - target_amount = 20 - if(8) - target = "diamond" - target_amount = 20 + explanation_text = "It's a buyer's market out here. Steal [loot] for resale." - explanation_text = "Ransack the station and escape with [target_amount] [target]." - check_completion() +/datum/objective/heist/loot/check_completion() + var/total_amount = 0 - var/total_amount = 0 + for(var/obj/O in locate(/area/skipjack_station/start)) + if(istype(O,target)) total_amount++ + for(var/obj/I in O.contents) + if(istype(I,target)) total_amount++ + if(total_amount >= target_amount) return 1 - for(var/obj/item/O in locate(/area/skipjack_station/start)) + for(var/datum/mind/raider in raiders.current_antagonists) + if(raider.current) + for(var/obj/O in raider.current.get_contents()) + if(istype(O,target)) total_amount++ + if(total_amount >= target_amount) return 1 - var/obj/item/stack/material/S - if(istype(O,/obj/item/stack/material)) - if(O.name == target) - S = O + return 0 + +/datum/objective/heist/salvage/choose_target() + switch(rand(1,8)) + if(1) + target = DEFAULT_WALL_MATERIAL + target_amount = 300 + if(2) + target = "glass" + target_amount = 200 + if(3) + target = "plasteel" + target_amount = 100 + if(4) + target = "phoron" + target_amount = 100 + if(5) + target = "silver" + target_amount = 50 + if(6) + target = "gold" + target_amount = 20 + if(7) + target = "uranium" + target_amount = 20 + if(8) + target = "diamond" + target_amount = 20 + + explanation_text = "Ransack the station and escape with [target_amount] [target]." + +/datum/objective/heist/salvage/check_completion() + + var/total_amount = 0 + + for(var/obj/item/O in locate(/area/skipjack_station/start)) + + var/obj/item/stack/material/S + if(istype(O,/obj/item/stack/material)) + if(O.name == target) + S = O + total_amount += S.get_amount() + for(var/obj/I in O.contents) + if(istype(I,/obj/item/stack/material)) + if(I.name == target) + S = I total_amount += S.get_amount() - for(var/obj/I in O.contents) - if(istype(I,/obj/item/stack/material)) - if(I.name == target) - S = I + + for(var/datum/mind/raider in raiders.current_antagonists) + if(raider.current) + for(var/obj/item/O in raider.current.get_contents()) + if(istype(O,/obj/item/stack/material)) + if(O.name == target) + var/obj/item/stack/material/S = O total_amount += S.get_amount() - for(var/datum/mind/raider in raiders.current_antagonists) - if(raider.current) - for(var/obj/item/O in raider.current.get_contents()) - if(istype(O,/obj/item/stack/material)) - if(O.name == target) - var/obj/item/stack/material/S = O - total_amount += S.get_amount() - - if(total_amount >= target_amount) return 1 - return 0 + if(total_amount >= target_amount) return 1 + return 0 /datum/objective/heist/preserve_crew explanation_text = "Do not leave anyone behind, alive or dead." - check_completion() - if(raiders && raiders.is_raider_crew_safe()) return 1 - return 0 +/datum/objective/heist/preserve_crew/check_completion() + if(raiders && raiders.is_raider_crew_safe()) return 1 + return 0 //Borer objective(s). /datum/objective/borer_survive diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 4f476293dd..cde2f9a2a2 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -29,7 +29,7 @@ mob if(sandbox) sandbox.update() -datum/hSB +/datum/hSB var/owner = null var/admin = 0 proc diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index a9eb862ee9..f8833d13b2 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -1,26 +1,3 @@ -//cast_method flags -#define CAST_USE 1 // Clicking the spell in your hand. -#define CAST_MELEE 2 // Clicking an atom in melee range. -#define CAST_RANGED 4 // Clicking an atom beyond melee range. -#define CAST_THROW 8 // Throwing the spell and hitting an atom. -#define CAST_COMBINE 16 // Clicking another spell with this spell. -#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. - -//Aspects -#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. -#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. -#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. -#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. -#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. -#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. -#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. -#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. -#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. -#define ASPECT_EMP "emp" //Unused now. -#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. -#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. -#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. - /obj/item/weapon/spell name = "glowing particles" desc = "Your hands appear to be glowing brightly." diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index e53fa62935..72eda8b94a 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -229,13 +229,13 @@ /mob/living/silicon/GetIdCard() return idcard -proc/FindNameFromID(var/mob/living/carbon/human/H) +/proc/FindNameFromID(var/mob/living/carbon/human/H) ASSERT(istype(H)) var/obj/item/weapon/card/id/C = H.GetIdCard() if(C) return C.registered_name -proc/get_all_job_icons() //For all existing HUD icons +/proc/get_all_job_icons() //For all existing HUD icons return joblist + list("Prisoner") /obj/proc/GetJobName() //Used in secHUD icon generation diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 5f2fa97e54..ac006c3dd3 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -14,40 +14,38 @@ var/global/datum/controller/occupations/job_master //Cache of icons for job info window var/list/job_icons = list() - proc/SetupOccupations(var/faction = "Station") - occupations = list() - //var/list/all_jobs = typesof(/datum/job) - var/list/all_jobs = list(/datum/job/assistant) | using_map.allowed_jobs - if(!all_jobs.len) - to_world("Error setting up jobs, no job datums found!") - return 0 - for(var/J in all_jobs) - var/datum/job/job = new J() - if(!job) continue - if(job.faction != faction) continue - occupations += job - sortTim(occupations, /proc/cmp_job_datums) +/datum/controller/occupations/proc/SetupOccupations(var/faction = "Station") + occupations = list() + //var/list/all_jobs = typesof(/datum/job) + var/list/all_jobs = list(/datum/job/assistant) | using_map.allowed_jobs + if(!all_jobs.len) + to_world("Error setting up jobs, no job datums found!") + return 0 + for(var/J in all_jobs) + var/datum/job/job = new J() + if(!job) continue + if(job.faction != faction) continue + occupations += job + sortTim(occupations, /proc/cmp_job_datums) - return 1 + return 1 - proc/Debug(var/text) - if(!Debug2) return 0 - job_debug.Add(text) - return 1 +/datum/controller/occupations/proc/Debug(var/text) + if(!Debug2) return 0 + job_debug.Add(text) + return 1 - proc/GetJob(var/rank) - if(!rank) return null - for(var/datum/job/J in occupations) - if(!J) continue - if(J.title == rank) return J - return null - - proc/GetPlayerAltTitle(mob/new_player/player, rank) - return player.client.prefs.GetPlayerAltTitle(GetJob(rank)) +/datum/controller/occupations/proc/GetJob(var/rank) + if(!rank) return null + for(var/datum/job/J in occupations) + if(!J) continue + if(J.title == rank) return J + return null +<<<<<<< HEAD proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0) Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") if(player && player.mind && rank) @@ -79,9 +77,16 @@ var/global/datum/controller/occupations/job_master return 1 Debug("AR has failed, Player: [player], Rank: [rank]") return 0 +======= +/datum/controller/occupations/proc/GetPlayerAltTitle(mob/new_player/player, rank) + return player.client.prefs.GetPlayerAltTitle(GetJob(rank)) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - proc/FreeRole(var/rank) //making additional slot on the fly +/datum/controller/occupations/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0) + Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") + if(player && player.mind && rank) var/datum/job/job = GetJob(rank) +<<<<<<< HEAD if(job && job.total_positions != -1) job.total_positions++ return 1 @@ -121,24 +126,137 @@ var/global/datum/controller/occupations/job_master for(var/datum/job/job in shuffle(occupations)) if(!job) continue +======= + if(!job) + return 0 + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + return 0 + if(jobban_isbanned(player, rank)) + return 0 + if(!job.player_old_enough(player.client)) + return 0 +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) - continue + var/position_limit = job.total_positions + if(!latejoin) + position_limit = job.spawn_positions + if((job.current_positions < position_limit) || position_limit == -1) + Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") + player.mind.assigned_role = rank + player.mind.role_alt_title = GetPlayerAltTitle(player, rank) + unassigned -= player + job.current_positions++ + return 1 + Debug("AR has failed, Player: [player], Rank: [rank]") + return 0 +<<<<<<< HEAD if(istype(job, GetJob(USELESS_JOB))) // We don't want to give him assistant, that's boring! //VOREStation Edit - Visitor not Assistant continue +======= +/datum/controller/occupations/proc/FreeRole(var/rank) //making additional slot on the fly + var/datum/job/job = GetJob(rank) + if(job && job.total_positions != -1) + job.total_positions++ + return 1 + return 0 - if(SSjob.is_job_in_department(job.title, DEPARTMENT_COMMAND)) //If you want a command position, select it! - continue +/datum/controller/occupations/proc/FindOccupationCandidates(datum/job/job, level, flag) + Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]") + var/list/candidates = list() + for(var/mob/new_player/player in unassigned) + if(jobban_isbanned(player, job.title)) + Debug("FOC isbanned failed, Player: [player]") + continue + if(!job.player_old_enough(player.client)) + Debug("FOC player not old enough, Player: [player]") + continue + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + Debug("FOC character not old enough, Player: [player]") + continue + if(flag && !(player.client.prefs.be_special & flag)) + Debug("FOC flag failed, Player: [player], Flag: [flag], ") + continue + if(player.client.prefs.GetJobDepartment(job, level) & job.flag) + Debug("FOC pass, Player: [player], Level:[level]") + candidates += player + return candidates - if(jobban_isbanned(player, job.title)) - Debug("GRJ isbanned failed, Player: [player], Job: [job.title]") - continue +/datum/controller/occupations/proc/GiveRandomJob(var/mob/new_player/player) + Debug("GRJ Giving random job, Player: [player]") + for(var/datum/job/job in shuffle(occupations)) + if(!job) + continue - if(!job.player_old_enough(player.client)) - Debug("GRJ player not old enough, Player: [player]") - continue + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + continue + if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring! + continue + + if(SSjob.is_job_in_department(job.title, DEPARTMENT_COMMAND)) //If you want a command position, select it! + continue + + if(jobban_isbanned(player, job.title)) + Debug("GRJ isbanned failed, Player: [player], Job: [job.title]") + continue + + if(!job.player_old_enough(player.client)) + Debug("GRJ player not old enough, Player: [player]") + continue + + if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) + Debug("GRJ Random job given, Player: [player], Job: [job]") + AssignRole(player, job.title) + unassigned -= player + break + +/datum/controller/occupations/proc/ResetOccupations() + for(var/mob/new_player/player in player_list) + if((player) && (player.mind)) + player.mind.assigned_role = null + player.mind.special_role = null + SetupOccupations() + unassigned = list() + return + + +///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check +/datum/controller/occupations/proc/FillHeadPosition() + for(var/level = 1 to 3) + for(var/command_position in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) + var/datum/job/job = GetJob(command_position) + if(!job) continue + var/list/candidates = FindOccupationCandidates(job, level) + if(!candidates.len) continue +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + + // Build a weighted list, weight by age. + var/list/weightedCandidates = list() + for(var/mob/V in candidates) + // Log-out during round-start? What a bad boy, no head position for you! + if(!V.client) continue + var/age = V.client.prefs.age + + if(age < job.minimum_character_age) // Nope. + continue + + switch(age) + if(job.minimum_character_age to (job.minimum_character_age+10)) + weightedCandidates[V] = 3 // Still a bit young. + if((job.minimum_character_age+10) to (job.ideal_character_age-10)) + weightedCandidates[V] = 6 // Better. + if((job.ideal_character_age-10) to (job.ideal_character_age+10)) + weightedCandidates[V] = 10 // Great. + if((job.ideal_character_age+10) to (job.ideal_character_age+20)) + weightedCandidates[V] = 6 // Still good. + if((job.ideal_character_age+20) to INFINITY) + weightedCandidates[V] = 3 // Geezer. + else + // If there's ABSOLUTELY NOBODY ELSE + if(candidates.len == 1) weightedCandidates[V] = 1 + +<<<<<<< HEAD //VOREStation Code Start if(!job.player_has_enough_playtime(player.client)) Debug("GRJ player not enough playtime, Player: [player]") @@ -153,99 +271,55 @@ var/global/datum/controller/occupations/job_master AssignRole(player, job.title) unassigned -= player break +======= +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - proc/ResetOccupations() - for(var/mob/new_player/player in player_list) - if((player) && (player.mind)) - player.mind.assigned_role = null - player.mind.special_role = null - SetupOccupations() - unassigned = list() - return + var/mob/new_player/candidate = pickweight(weightedCandidates) + if(AssignRole(candidate, command_position)) + return 1 + return 0 - ///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check - proc/FillHeadPosition() - for(var/level = 1 to 3) - for(var/command_position in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) - var/datum/job/job = GetJob(command_position) - if(!job) continue - var/list/candidates = FindOccupationCandidates(job, level) - if(!candidates.len) continue - - // Build a weighted list, weight by age. - var/list/weightedCandidates = list() - for(var/mob/V in candidates) - // Log-out during round-start? What a bad boy, no head position for you! - if(!V.client) continue - var/age = V.client.prefs.age - - if(age < job.minimum_character_age) // Nope. - continue - - switch(age) - if(job.minimum_character_age to (job.minimum_character_age+10)) - weightedCandidates[V] = 3 // Still a bit young. - if((job.minimum_character_age+10) to (job.ideal_character_age-10)) - weightedCandidates[V] = 6 // Better. - if((job.ideal_character_age-10) to (job.ideal_character_age+10)) - weightedCandidates[V] = 10 // Great. - if((job.ideal_character_age+10) to (job.ideal_character_age+20)) - weightedCandidates[V] = 6 // Still good. - if((job.ideal_character_age+20) to INFINITY) - weightedCandidates[V] = 3 // Geezer. - else - // If there's ABSOLUTELY NOBODY ELSE - if(candidates.len == 1) weightedCandidates[V] = 1 - - - var/mob/new_player/candidate = pickweight(weightedCandidates) - if(AssignRole(candidate, command_position)) - return 1 - return 0 - - - ///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level - proc/CheckHeadPositions(var/level) - for(var/command_position in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) - var/datum/job/job = GetJob(command_position) - if(!job) continue - var/list/candidates = FindOccupationCandidates(job, level) - if(!candidates.len) continue - var/mob/new_player/candidate = pick(candidates) - AssignRole(candidate, command_position) - return +///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level +/datum/controller/occupations/proc/CheckHeadPositions(var/level) + for(var/command_position in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) + var/datum/job/job = GetJob(command_position) + if(!job) continue + var/list/candidates = FindOccupationCandidates(job, level) + if(!candidates.len) continue + var/mob/new_player/candidate = pick(candidates) + AssignRole(candidate, command_position) + return /** Proc DivideOccupations * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ - proc/DivideOccupations() - //Setup new player list and get the jobs list - Debug("Running DO") - SetupOccupations() +/datum/controller/occupations/proc/DivideOccupations() + //Setup new player list and get the jobs list + Debug("Running DO") + SetupOccupations() - //Holder for Triumvirate is stored in the ticker, this just processes it - if(ticker && ticker.triai) - for(var/datum/job/A in occupations) - if(A.title == "AI") - A.spawn_positions = 3 - break + //Holder for Triumvirate is stored in the ticker, this just processes it + if(ticker && ticker.triai) + for(var/datum/job/A in occupations) + if(A.title == "AI") + A.spawn_positions = 3 + break - //Get the players who are ready - for(var/mob/new_player/player in player_list) - if(player.ready && player.mind && !player.mind.assigned_role) - unassigned += player + //Get the players who are ready + for(var/mob/new_player/player in player_list) + if(player.ready && player.mind && !player.mind.assigned_role) + unassigned += player - Debug("DO, Len: [unassigned.len]") - if(unassigned.len == 0) return 0 + Debug("DO, Len: [unassigned.len]") + if(unassigned.len == 0) return 0 - //Shuffle players and jobs - unassigned = shuffle(unassigned) - - HandleFeedbackGathering() + //Shuffle players and jobs + unassigned = shuffle(unassigned) +<<<<<<< HEAD //People who wants to be assistants, sure, go on. Debug("DO, Running Assistant Check 1") var/datum/job/assist = new DEFAULT_JOB_TYPE () @@ -256,43 +330,54 @@ var/global/datum/controller/occupations/job_master AssignRole(player, USELESS_JOB) //VOREStation Edit - Visitor not Assistant assistant_candidates -= player Debug("DO, AC1 end") +======= + HandleFeedbackGathering() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - //Select one head - Debug("DO, Running Head Check") - FillHeadPosition() - Debug("DO, Head Check end") + //People who wants to be assistants, sure, go on. + Debug("DO, Running Assistant Check 1") + var/datum/job/assist = new DEFAULT_JOB_TYPE () + var/list/assistant_candidates = FindOccupationCandidates(assist, 3) + Debug("AC1, Candidates: [assistant_candidates.len]") + for(var/mob/new_player/player in assistant_candidates) + Debug("AC1 pass, Player: [player]") + AssignRole(player, "Assistant") + assistant_candidates -= player + Debug("DO, AC1 end") - //Other jobs are now checked - Debug("DO, Running Standard Check") + //Select one head + Debug("DO, Running Head Check") + FillHeadPosition() + Debug("DO, Head Check end") + + //Other jobs are now checked + Debug("DO, Running Standard Check") - // New job giving system by Donkie - // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all. - // Hopefully this will add more randomness and fairness to job giving. + // New job giving system by Donkie + // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all. + // Hopefully this will add more randomness and fairness to job giving. - // Loop through all levels from high to low - var/list/shuffledoccupations = shuffle(occupations) - // var/list/disabled_jobs = ticker.mode.disabled_jobs // So we can use .Find down below without a colon. - for(var/level = 1 to 3) - //Check the head jobs first each level - CheckHeadPositions(level) + // Loop through all levels from high to low + var/list/shuffledoccupations = shuffle(occupations) + // var/list/disabled_jobs = ticker.mode.disabled_jobs // So we can use .Find down below without a colon. + for(var/level = 1 to 3) + //Check the head jobs first each level + CheckHeadPositions(level) - // Loop through all unassigned players - for(var/mob/new_player/player in unassigned) + // Loop through all unassigned players + for(var/mob/new_player/player in unassigned) - // Loop through all jobs - for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY - if(!job || ticker.mode.disabled_jobs.Find(job.title) ) - continue + // Loop through all jobs + for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY + if(!job || ticker.mode.disabled_jobs.Find(job.title) ) + continue - if(jobban_isbanned(player, job.title)) - Debug("DO isbanned failed, Player: [player], Job:[job.title]") - continue - - if(!job.player_old_enough(player.client)) - Debug("DO player not old enough, Player: [player], Job:[job.title]") - continue + if(jobban_isbanned(player, job.title)) + Debug("DO isbanned failed, Player: [player], Job:[job.title]") + continue +<<<<<<< HEAD //VOREStation Add if(!job.player_has_enough_playtime(player.client)) Debug("DO player not enough playtime, Player: [player]") @@ -301,91 +386,142 @@ var/global/datum/controller/occupations/job_master // If the player wants that job on this level, then try give it to him. if(player.client.prefs.GetJobDepartment(job, level) & job.flag) - - // If the job isn't filled - if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) - Debug("DO pass, Player: [player], Level:[level], Job:[job.title]") - AssignRole(player, job.title) - unassigned -= player - break - - // Hand out random jobs to the people who didn't get any in the last check - // Also makes sure that they got their preference correct - for(var/mob/new_player/player in unassigned) - if(player.client.prefs.alternate_option == GET_RANDOM_JOB) - GiveRandomJob(player) - /* - Old job system - for(var/level = 1 to 3) - for(var/datum/job/job in occupations) - Debug("Checking job: [job]") - if(!job) +======= + if(!job.player_old_enough(player.client)) + Debug("DO player not old enough, Player: [player], Job:[job.title]") continue - if(!unassigned.len) - break - if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) - continue - var/list/candidates = FindOccupationCandidates(job, level) - while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)) - var/mob/new_player/candidate = pick(candidates) - Debug("Selcted: [candidate], for: [job.title]") - AssignRole(candidate, job.title) - candidates -= candidate*/ +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - Debug("DO, Standard Check end") + // If the player wants that job on this level, then try give it to him. + if(player.client.prefs.GetJobDepartment(job, level) & job.flag) - Debug("DO, Running AC2") + // If the job isn't filled + if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) + Debug("DO pass, Player: [player], Level:[level], Job:[job.title]") + AssignRole(player, job.title) + unassigned -= player + break + // Hand out random jobs to the people who didn't get any in the last check + // Also makes sure that they got their preference correct + for(var/mob/new_player/player in unassigned) + if(player.client.prefs.alternate_option == GET_RANDOM_JOB) + GiveRandomJob(player) + /* + Old job system + for(var/level = 1 to 3) + for(var/datum/job/job in occupations) + Debug("Checking job: [job]") + if(!job) + continue + if(!unassigned.len) + break + if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) + continue + var/list/candidates = FindOccupationCandidates(job, level) + while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)) + var/mob/new_player/candidate = pick(candidates) + Debug("Selcted: [candidate], for: [job.title]") + AssignRole(candidate, job.title) + candidates -= candidate*/ + + Debug("DO, Standard Check end") + + Debug("DO, Running AC2") + + // For those who wanted to be assistant if their preferences were filled, here you go. + for(var/mob/new_player/player in unassigned) + if(player.client.prefs.alternate_option == BE_ASSISTANT) + Debug("AC2 Assistant located, Player: [player]") + AssignRole(player, "Assistant") + +<<<<<<< HEAD // For those who wanted to be assistant if their preferences were filled, here you go. for(var/mob/new_player/player in unassigned) if(player.client.prefs.alternate_option == BE_ASSISTANT) Debug("AC2 Assistant located, Player: [player]") AssignRole(player, USELESS_JOB) //VOREStation Edit - Visitor not Assistant - - //For ones returning to lobby - for(var/mob/new_player/player in unassigned) - if(player.client.prefs.alternate_option == RETURN_TO_LOBBY) - player.ready = 0 - player.new_player_panel_proc() - unassigned -= player - return 1 +======= + //For ones returning to lobby + for(var/mob/new_player/player in unassigned) + if(player.client.prefs.alternate_option == RETURN_TO_LOBBY) + player.ready = 0 + player.new_player_panel_proc() + unassigned -= player + return 1 - proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) - if(!H) return null +/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + if(!H) return null - var/datum/job/job = GetJob(rank) - var/list/spawn_in_storage = list() + var/datum/job/job = GetJob(rank) + var/list/spawn_in_storage = list() - if(!joined_late) - var/obj/S = null - var/list/possible_spawns = list() - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if(sloc.name != rank) continue - if(locate(/mob/living) in sloc.loc) continue - possible_spawns.Add(sloc) - if(possible_spawns.len) - S = pick(possible_spawns) - if(!S) - S = locate("start*[rank]") // use old stype - if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf)) - H.forceMove(S.loc) + if(!joined_late) + var/obj/S = null + var/list/possible_spawns = list() + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if(sloc.name != rank) continue + if(locate(/mob/living) in sloc.loc) continue + possible_spawns.Add(sloc) + if(possible_spawns.len) + S = pick(possible_spawns) + if(!S) + S = locate("start*[rank]") // use old stype + if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf)) + H.forceMove(S.loc) + else + var/list/spawn_props = LateSpawn(H.client, rank) + var/turf/T = spawn_props["turf"] + if(!T) + to_chat(H, "You were unable to be spawned at your chosen late-join spawnpoint. Please verify your job/spawn point combination makes sense, and try another one.") + return else - var/list/spawn_props = LateSpawn(H.client, rank) - var/turf/T = spawn_props["turf"] - if(!T) - to_chat(H, "You were unable to be spawned at your chosen late-join spawnpoint. Please verify your job/spawn point combination makes sense, and try another one.") - return + H.forceMove(T) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + + // Moving wheelchair if they have one + if(H.buckled && istype(H.buckled, /obj/structure/bed/chair/wheelchair)) + H.buckled.forceMove(H.loc) + H.buckled.set_dir(H.dir) + + if(job) + + //Equip custom gear loadout. + var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage. + var/list/custom_equip_leftovers = list() + if(H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON)) + for(var/thing in H.client.prefs.gear) + var/datum/gear/G = gear_datums[thing] + if(!G) //Not a real gear datum (maybe removed, as this is loaded from their savefile) + continue + + var/permitted + // Check if it is restricted to certain roles + if(G.allowed_roles) + for(var/job_name in G.allowed_roles) + if(job.title == job_name) + permitted = 1 else - H.forceMove(T) + permitted = 1 - // Moving wheelchair if they have one - if(H.buckled && istype(H.buckled, /obj/structure/bed/chair/wheelchair)) - H.buckled.forceMove(H.loc) - H.buckled.set_dir(H.dir) + // Check if they're whitelisted for this gear (in alien whitelist? seriously?) + if(G.whitelisted && !is_alien_whitelisted(H, GLOB.all_species[G.whitelisted])) + permitted = 0 - if(job) + // If they aren't, tell them + if(!permitted) + to_chat(H, "Your current species, job or whitelist status does not permit you to spawn with [thing]!") + continue + // Implants get special treatment + if(G.slot == "implant") + var/obj/item/weapon/implant/I = G.spawn_item(H, H.client.prefs.gear[G.display_name]) + I.invisibility = 100 + I.implant_loadout(H) + continue + +<<<<<<< HEAD //Equip custom gear loadout. var/list/custom_equip_slots = list() var/list/custom_equip_leftovers = list() @@ -431,29 +567,94 @@ var/global/datum/controller/occupations/job_master custom_equip_slots.Add(G.slot) else custom_equip_leftovers.Add(thing) - else - spawn_in_storage += thing - - // Set up their account - job.setup_account(H) - - // Equip job items. - job.equip(H, H.mind ? H.mind.role_alt_title : "") - - // Stick their fingerprints on literally everything - job.apply_fingerprints(H) - - // Only non-silicons get post-job-equip equipment - if(!(job.mob_type & JOB_SILICON)) - H.equip_post_job() - - // If some custom items could not be equipped before, try again now. - for(var/thing in custom_equip_leftovers) - var/datum/gear/G = gear_datums[thing] - if(G.slot in custom_equip_slots) - spawn_in_storage += thing - else +======= + // Try desperately (and sorta poorly) to equip the item. Now with increased desperation! + if(G.slot && !(G.slot in custom_equip_slots)) var/metadata = H.client.prefs.gear[G.display_name] + if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) + custom_equip_leftovers += thing + else if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot)) + to_chat(H, "Equipping you with \the [thing]!") + if(G.slot != slot_tie) + custom_equip_slots.Add(G.slot) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + else + custom_equip_leftovers.Add(thing) + else + spawn_in_storage += thing + + // Set up their account + job.setup_account(H) + + // Equip job items. + job.equip(H, H.mind ? H.mind.role_alt_title : "") + + // Stick their fingerprints on literally everything + job.apply_fingerprints(H) + + // Only non-silicons get post-job-equip equipment + if(!(job.mob_type & JOB_SILICON)) + H.equip_post_job() + + // If some custom items could not be equipped before, try again now. + for(var/thing in custom_equip_leftovers) + var/datum/gear/G = gear_datums[thing] + if(G.slot in custom_equip_slots) + spawn_in_storage += thing + else + var/metadata = H.client.prefs.gear[G.display_name] + if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot)) + to_chat(H, "Equipping you with \the [thing]!") + custom_equip_slots.Add(G.slot) + else + spawn_in_storage += thing + else + to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.") + + H.job = rank + log_game("JOINED [key_name(H)] as \"[rank]\"") + + // If they're head, give them the account info for their department + if(H.mind && job.department_accounts) + var/remembered_info = "" + for(var/D in job.department_accounts) + var/datum/money_account/department_account = department_accounts[D] + if(department_account) + remembered_info += "Department account number ([D]): #[department_account.account_number]
" + remembered_info += "Department account pin ([D]): [department_account.remote_access_pin]
" + remembered_info += "Department account funds ([D]): $[department_account.money]
" + + H.mind.store_memory(remembered_info) + + var/alt_title = null + if(H.mind) + H.mind.assigned_role = rank + alt_title = H.mind.role_alt_title + + // If we're a silicon, we may be done at this point + if(job.mob_type & JOB_SILICON_ROBOT) + return H.Robotize() + if(job.mob_type & JOB_SILICON_AI) + return H + + // TWEET PEEP + if(rank == "Site Manager") + var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP) ? null : sound('sound/misc/boatswain.ogg', volume=20) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Site Manager"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z) + + //Deferred item spawning. + if(spawn_in_storage && spawn_in_storage.len) + var/obj/item/weapon/storage/B + for(var/obj/item/weapon/storage/S in H.contents) + B = S + break + + if(!isnull(B)) + for(var/thing in spawn_in_storage) + to_chat(H, "Placing \the [thing] in your [B.name]!") + var/datum/gear/G = gear_datums[thing] + var/metadata = H.client.prefs.gear[G.display_name] +<<<<<<< HEAD if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot)) to_chat(H, "Equipping you with \the [thing]!") custom_equip_slots.Add(G.slot) @@ -579,38 +780,114 @@ var/global/datum/controller/occupations/job_master proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist if(!config.load_jobs_from_txt) return 0 - - var/list/jobEntries = file2list(jobsfile) - - for(var/job in jobEntries) - if(!job) - continue - - job = trim(job) - if (!length(job)) - continue - - var/pos = findtext(job, "=") - var/name = null - var/value = null - - if(pos) - name = copytext(job, 1, pos) - value = copytext(job, pos + 1) +======= + G.spawn_item(B, metadata) else - continue + to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.") - if(name && value) - var/datum/job/J = GetJob(name) - if(!J) continue - J.total_positions = text2num(value) - J.spawn_positions = text2num(value) - if(J.mob_type & JOB_SILICON) - J.total_positions = 0 + if(istype(H)) //give humans wheelchairs, if they need them. + var/obj/item/organ/external/l_foot = H.get_organ("l_foot") + var/obj/item/organ/external/r_foot = H.get_organ("r_foot") + var/obj/item/weapon/storage/S = locate() in H.contents + var/obj/item/wheelchair/R + if(S) + R = locate() in S.contents + if(!l_foot || !r_foot || R) + var/wheelchair_type = R?.unfolded_type || /obj/structure/bed/chair/wheelchair + var/obj/structure/bed/chair/wheelchair/W = new wheelchair_type(H.loc) + W.buckle_mob(H) + H.update_canmove() + W.set_dir(H.dir) + W.add_fingerprint(H) + if(R) + W.color = R.color + qdel(R) - return 1 + to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].") + + if(job.supervisors) + to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") + if(job.has_headset) + H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear) + to_chat(H, "To speak on your department's radio channel use :h. For the use of other channels, examine your headset.") + + if(job.req_admin_notify) + to_chat(H, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.") + + // EMAIL GENERATION + // Email addresses will be created under this domain name. Mostly for the looks. + var/domain = "freemail.nt" + if(using_map && LAZYLEN(using_map.usable_email_tlds)) + domain = using_map.usable_email_tlds[1] + var/sanitized_name = sanitize(replacetext(replacetext(lowertext(H.real_name), " ", "."), "'", "")) + var/complete_login = "[sanitized_name]@[domain]" + + // It is VERY unlikely that we'll have two players, in the same round, with the same name and branch, but still, this is here. + // If such conflict is encountered, a random number will be appended to the email address. If this fails too, no email account will be created. + if(ntnet_global.does_email_exist(complete_login)) + complete_login = "[sanitized_name][random_id(/datum/computer_file/data/email_account/, 100, 999)]@[domain]" + + // If even fallback login generation failed, just don't give them an email. The chance of this happening is astronomically low. + if(ntnet_global.does_email_exist(complete_login)) + to_chat(H, "You were not assigned an email address.") + H.mind.store_memory("You were not assigned an email address.") + else + var/datum/computer_file/data/email_account/EA = new/datum/computer_file/data/email_account() + EA.password = GenerateKey() + EA.login = complete_login + to_chat(H, "Your email account address is [EA.login] and the password is [EA.password]. This information has also been placed into your notes.") + H.mind.store_memory("Your email account address is [EA.login] and the password is [EA.password].") + // END EMAIL GENERATION + + //Gives glasses to the vision impaired + if(H.disabilities & NEARSIGHTED) + var/equipped = H.equip_to_slot_or_del(new /obj/item/clothing/glasses/regular(H), slot_glasses) + if(equipped != 1) + var/obj/item/clothing/glasses/G = H.glasses + G.prescription = 1 + + BITSET(H.hud_updateflag, ID_HUD) + BITSET(H.hud_updateflag, IMPLOYAL_HUD) + BITSET(H.hud_updateflag, SPECIALROLE_HUD) + return H + +/datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist + if(!config.load_jobs_from_txt) + return 0 +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + + var/list/jobEntries = file2list(jobsfile) + + for(var/job in jobEntries) + if(!job) + continue + + job = trim(job) + if (!length(job)) + continue + + var/pos = findtext(job, "=") + var/name = null + var/value = null + + if(pos) + name = copytext(job, 1, pos) + value = copytext(job, pos + 1) + else + continue + + if(name && value) + var/datum/job/J = GetJob(name) + if(!J) continue + J.total_positions = text2num(value) + J.spawn_positions = text2num(value) + if(J.mob_type & JOB_SILICON) + J.total_positions = 0 + + return 1 +<<<<<<< HEAD proc/HandleFeedbackGathering() for(var/datum/job/job in occupations) var/tmp_str = "|[job.title]|" @@ -645,6 +922,37 @@ var/global/datum/controller/occupations/job_master tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-" feedback_add_details("job_preferences",tmp_str) +======= +/datum/controller/occupations/proc/HandleFeedbackGathering() + for(var/datum/job/job in occupations) + var/tmp_str = "|[job.title]|" + + var/level1 = 0 //high + var/level2 = 0 //medium + var/level3 = 0 //low + var/level4 = 0 //never + var/level5 = 0 //banned + var/level6 = 0 //account too young + for(var/mob/new_player/player in player_list) + if(!(player.ready && player.mind && !player.mind.assigned_role)) + continue //This player is not ready + if(jobban_isbanned(player, job.title)) + level5++ + continue + if(!job.player_old_enough(player.client)) + level6++ + continue + if(player.client.prefs.GetJobDepartment(job, 1) & job.flag) + level1++ + else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag) + level2++ + else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag) + level3++ + else level4++ //not selected + + tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-" + feedback_add_details("job_preferences",tmp_str) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /datum/controller/occupations/proc/LateSpawn(var/client/C, var/rank) diff --git a/code/game/json.dm b/code/game/json.dm index 2fd5282795..2a2bd78933 100644 --- a/code/game/json.dm +++ b/code/game/json.dm @@ -2,7 +2,7 @@ var/jsonpath = "/home/bay12/public_html" var/dmepath = "/home/bay12/git/baystation12.dme" var/makejson = 1 //temp -proc/makejson() +/proc/makejson() if(!makejson) return @@ -82,19 +82,19 @@ proc/makejson() message_admins("Done") world.Reboot("Switching to [newmap]") -obj/mapinfo +/obj/mapinfo invisibility = 101 var/mapname = "thismap" var/decks = 4 -proc/GetMapInfo() +/proc/GetMapInfo() // var/obj/mapinfo/M = locate() // Just removing these to try and fix the occasional JSON -> WORLD issue. // to_world(M.name) // to_world(M.mapname) -client/proc/ChangeMap(var/X as text) +/client/proc/ChangeMap(var/X as text) set name = "Change Map" set category = "Admin" switchmap(X,X) -proc/send2adminirc(channel,msg) +/proc/send2adminirc(channel,msg) world << channel << " "<< msg shell("python nudge.py '[channel]' [msg]") \ No newline at end of file diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 2d87fcd45a..29d9ed5562 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -69,7 +69,7 @@ if(frequency) set_frequency(frequency) -obj/machinery/air_sensor/Destroy() +/obj/machinery/air_sensor/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) . = ..() @@ -85,7 +85,7 @@ obj/machinery/air_sensor/Destroy() var/datum/radio_frequency/radio_connection circuit = /obj/item/weapon/circuitboard/air_management -obj/machinery/computer/general_air_control/Destroy() +/obj/machinery/computer/general_air_control/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) ..() diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 44f50a4644..d30ec8a07e 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -215,7 +215,7 @@ return L -mob/living/proc/near_camera() +/mob/living/proc/near_camera() if (!isturf(loc)) return 0 else if(!cameranet.checkVis(src)) @@ -263,16 +263,16 @@ mob/living/proc/near_camera() if(T && (T.z in using_map.station_levels) && hassensorlevel(src, SUIT_SENSOR_TRACKING)) return TRACKING_POSSIBLE -mob/living/proc/tracking_initiated() +/mob/living/proc/tracking_initiated() -mob/living/silicon/robot/tracking_initiated() +/mob/living/silicon/robot/tracking_initiated() tracking_entities++ if(tracking_entities == 1 && has_zeroth_law()) to_chat(src, "Internal camera is currently being accessed.") -mob/living/proc/tracking_cancelled() +/mob/living/proc/tracking_cancelled() -mob/living/silicon/robot/tracking_initiated() +/mob/living/silicon/robot/tracking_initiated() tracking_entities-- if(!tracking_entities && has_zeroth_law()) to_chat(src, "Internal camera is no longer being accessed.") diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 6993fa6e0f..53da61382e 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -499,30 +499,30 @@ name = "data disk - 'God Emperor of Mankind'" read_only = 1 - New() - initializeDisk() - buf.types=DNA2_BUF_UE|DNA2_BUF_UI - //data = "066000033000000000AF00330660FF4DB002690" - //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff - buf.dna.real_name="God Emperor of Mankind" - buf.dna.unique_enzymes = md5(buf.dna.real_name) - buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x033,0x066,0x0FF,0x4DB,0x002,0x690) - //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff - buf.dna.UpdateUI() +/obj/item/weapon/disk/data/demo/New() + initializeDisk() + buf.types=DNA2_BUF_UE|DNA2_BUF_UI + //data = "066000033000000000AF00330660FF4DB002690" + //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff + buf.dna.real_name="God Emperor of Mankind" + buf.dna.unique_enzymes = md5(buf.dna.real_name) + buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x033,0x066,0x0FF,0x4DB,0x002,0x690) + //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff + buf.dna.UpdateUI() /obj/item/weapon/disk/data/monkey name = "data disk - 'Mr. Muggles'" read_only = 1 - New() - ..() - initializeDisk() - buf.types=DNA2_BUF_SE - var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) - for(var/i=new_SE.len;i<=DNA_SE_LENGTH;i++) - new_SE += rand(1,1024) - buf.dna.SE=new_SE - buf.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) +/obj/item/weapon/disk/data/monkey/New() + ..() + initializeDisk() + buf.types=DNA2_BUF_SE + var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) + for(var/i=new_SE.len;i<=DNA_SE_LENGTH;i++) + new_SE += rand(1,1024) + buf.dna.SE=new_SE + buf.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) /obj/item/weapon/disk/data/New() ..() diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 1d58a61df1..1a81f9db91 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -23,190 +23,190 @@ var/prison_shuttle_timeleft = 0 var/allowedtocall = 0 var/prison_break = 0 - attack_ai(var/mob/user as mob) - return src.attack_hand(user) +/obj/machinery/computer/prison_shuttle/attack_ai(var/mob/user as mob) + return src.attack_hand(user) - attack_hand(var/mob/user as mob) - if(!src.allowed(user) && (!hacked)) - to_chat(user, "Access Denied.") +/obj/machinery/computer/prison_shuttle/attack_hand(var/mob/user as mob) + if(!src.allowed(user) && (!hacked)) + to_chat(user, "Access Denied.") + return + if(prison_break) + to_chat(user, "Unable to locate shuttle.") + return + if(..()) + return + user.set_machine(src) + post_signal("prison") + var/dat + if (src.temp) + dat = src.temp + else + dat += {"
Prison Shuttle
+ \nLocation: [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "Moving to station ([prison_shuttle_timeleft] Secs.)":prison_shuttle_at_station ? "Station":"Dock"]
+ [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "\n*Shuttle already called*
\n
":prison_shuttle_at_station ? "\nSend to Dock
\n
":"\nSend to station
\n
"] + \nClose"} + + user << browse(dat, "window=computer;size=575x450") + onclose(user, "computer") + return + + +/obj/machinery/computer/prison_shuttle/Topic(href, href_list) + if(..()) + return + + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.set_machine(src) + + if (href_list["sendtodock"]) + if (!prison_can_move()) + to_chat(usr, "The prison shuttle is unable to leave.") return - if(prison_break) - to_chat(user, "Unable to locate shuttle.") - return - if(..()) - return - user.set_machine(src) + if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") - var/dat - if (src.temp) - dat = src.temp - else - dat += {"
Prison Shuttle
- \nLocation: [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "Moving to station ([prison_shuttle_timeleft] Secs.)":prison_shuttle_at_station ? "Station":"Dock"]
- [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "\n*Shuttle already called*
\n
":prison_shuttle_at_station ? "\nSend to Dock
\n
":"\nSend to station
\n
"] - \nClose"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") - return - - - Topic(href, href_list) - if(..()) - return - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if (href_list["sendtodock"]) - if (!prison_can_move()) - to_chat(usr, "The prison shuttle is unable to leave.") - return - if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - post_signal("prison") - to_chat(usr, "The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") - src.temp += "Shuttle sent.

OK" - src.updateUsrDialog() - prison_shuttle_moving_to_prison = 1 - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - - else if (href_list["sendtostation"]) - if (!prison_can_move()) - to_chat(usr, "The prison shuttle is unable to leave.") - return - if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - post_signal("prison") - to_chat(usr, "The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") - src.temp += "Shuttle sent.

OK" - src.updateUsrDialog() - prison_shuttle_moving_to_station = 1 - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - - else if (href_list["mainmenu"]) - src.temp = null - - src.add_fingerprint(usr) + to_chat(usr, "The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") + src.temp += "Shuttle sent.

OK" src.updateUsrDialog() - return + prison_shuttle_moving_to_prison = 1 + prison_shuttle_time = world.timeofday + PRISON_MOVETIME + spawn(0) + prison_process() + + else if (href_list["sendtostation"]) + if (!prison_can_move()) + to_chat(usr, "The prison shuttle is unable to leave.") + return + if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return + post_signal("prison") + to_chat(usr, "The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") + src.temp += "Shuttle sent.

OK" + src.updateUsrDialog() + prison_shuttle_moving_to_station = 1 + prison_shuttle_time = world.timeofday + PRISON_MOVETIME + spawn(0) + prison_process() + + else if (href_list["mainmenu"]) + src.temp = null + + src.add_fingerprint(usr) + src.updateUsrDialog() + return - proc/prison_can_move() - if(prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return 0 - else return 1 +/obj/machinery/computer/prison_shuttle/proc/prison_can_move() + if(prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return 0 + else return 1 - proc/prison_break() - switch(prison_break) - if (0) - if(!prison_shuttle_at_station || prison_shuttle_moving_to_prison) return +/obj/machinery/computer/prison_shuttle/proc/prison_break() + switch(prison_break) + if (0) + if(!prison_shuttle_at_station || prison_shuttle_moving_to_prison) return - prison_shuttle_moving_to_prison = 1 - prison_shuttle_at_station = prison_shuttle_at_station + prison_shuttle_moving_to_prison = 1 + prison_shuttle_at_station = prison_shuttle_at_station - if (!prison_shuttle_moving_to_prison || !prison_shuttle_moving_to_station) - prison_shuttle_time = world.timeofday + PRISON_MOVETIME - spawn(0) - prison_process() - prison_break = 1 - if(1) - prison_break = 0 + if (!prison_shuttle_moving_to_prison || !prison_shuttle_moving_to_station) + prison_shuttle_time = world.timeofday + PRISON_MOVETIME + spawn(0) + prison_process() + prison_break = 1 + if(1) + prison_break = 0 - proc/post_signal(var/command) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1311) - if(!frequency) return - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = TRANSMISSION_RADIO - status_signal.data["command"] = command - frequency.post_signal(src, status_signal) - return +/obj/machinery/computer/prison_shuttle/proc/post_signal(var/command) + var/datum/radio_frequency/frequency = radio_controller.return_frequency(1311) + if(!frequency) return + var/datum/signal/status_signal = new + status_signal.source = src + status_signal.transmission_method = TRANSMISSION_RADIO + status_signal.data["command"] = command + frequency.post_signal(src, status_signal) + return - proc/prison_process() - while(prison_shuttle_time - world.timeofday > 0) - var/ticksleft = prison_shuttle_time - world.timeofday +/obj/machinery/computer/prison_shuttle/proc/prison_process() + while(prison_shuttle_time - world.timeofday > 0) + var/ticksleft = prison_shuttle_time - world.timeofday - if(ticksleft > 1e5) - prison_shuttle_time = world.timeofday + 10 // midnight rollover + if(ticksleft > 1e5) + prison_shuttle_time = world.timeofday + 10 // midnight rollover - prison_shuttle_timeleft = (ticksleft / 10) - sleep(5) - prison_shuttle_moving_to_station = 0 - prison_shuttle_moving_to_prison = 0 + prison_shuttle_timeleft = (ticksleft / 10) + sleep(5) + prison_shuttle_moving_to_station = 0 + prison_shuttle_moving_to_prison = 0 - switch(prison_shuttle_at_station) + switch(prison_shuttle_at_station) - if(0) - prison_shuttle_at_station = 1 - if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return + if(0) + prison_shuttle_at_station = 1 + if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - if (!prison_can_move()) - to_chat(usr, "The prison shuttle is unable to leave.") - return + if (!prison_can_move()) + to_chat(usr, "The prison shuttle is unable to leave.") + return - var/area/start_location = locate(/area/shuttle/prison/prison) - var/area/end_location = locate(/area/shuttle/prison/station) + var/area/start_location = locate(/area/shuttle/prison/prison) + var/area/end_location = locate(/area/shuttle/prison/station) - var/list/dstturfs = list() - var/throwy = world.maxy + var/list/dstturfs = list() + var/throwy = world.maxy - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) - start_location.move_contents_to(end_location) + for(var/turf/T in end_location) + dstturfs += T + if(T.y < throwy) + throwy = T.y + // hey you, get out of the way! + for(var/turf/T in dstturfs) + // find the turf to move things to + var/turf/D = locate(T.x, throwy - 1, 1) + //var/turf/E = get_step(D, SOUTH) + for(var/atom/movable/AM as mob|obj in T) + AM.Move(D) + if(istype(T, /turf/simulated)) + qdel(T) + start_location.move_contents_to(end_location) - if(1) - prison_shuttle_at_station = 0 - if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return + if(1) + prison_shuttle_at_station = 0 + if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return - if (!prison_can_move()) - to_chat(usr, "The prison shuttle is unable to leave.") - return + if (!prison_can_move()) + to_chat(usr, "The prison shuttle is unable to leave.") + return - var/area/start_location = locate(/area/shuttle/prison/station) - var/area/end_location = locate(/area/shuttle/prison/prison) + var/area/start_location = locate(/area/shuttle/prison/station) + var/area/end_location = locate(/area/shuttle/prison/prison) - var/list/dstturfs = list() - var/throwy = world.maxy + var/list/dstturfs = list() + var/throwy = world.maxy - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y + for(var/turf/T in end_location) + dstturfs += T + if(T.y < throwy) + throwy = T.y - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) + // hey you, get out of the way! + for(var/turf/T in dstturfs) + // find the turf to move things to + var/turf/D = locate(T.x, throwy - 1, 1) + //var/turf/E = get_step(D, SOUTH) + for(var/atom/movable/AM as mob|obj in T) + AM.Move(D) + if(istype(T, /turf/simulated)) + qdel(T) - for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... - bug.gib() + for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... + bug.gib() - for(var/mob/living/simple_mob/pest in end_location) // And for the other kind of bug... - pest.gib() + for(var/mob/living/simple_mob/pest in end_location) // And for the other kind of bug... + pest.gib() - start_location.move_contents_to(end_location) - return + start_location.move_contents_to(end_location) + return /obj/machinery/computer/prison_shuttle/emag_act(var/charges, var/mob/user) if(!hacked) diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 1ffe2d6570..d3de10cba1 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -8,64 +8,64 @@ var/list/authorized = list( ) - attackby(var/obj/item/weapon/card/W as obj, var/mob/user as mob) - if(stat & (BROKEN|NOPOWER)) return - if ((!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location() || !( user ))) return - if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (istype(W, /obj/item/device/pda)) - var/obj/item/device/pda/pda = W - W = pda.id - if (!W:access) //no access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return +/obj/machinery/computer/shuttle/attackby(var/obj/item/weapon/card/W as obj, var/mob/user as mob) + if(stat & (BROKEN|NOPOWER)) return + if ((!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location() || !( user ))) return + if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) + if (istype(W, /obj/item/device/pda)) + var/obj/item/device/pda/pda = W + W = pda.id + if (!W:access) //no access + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return - var/list/cardaccess = W:access - if(!istype(cardaccess, /list) || !cardaccess.len) //no access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return + var/list/cardaccess = W:access + if(!istype(cardaccess, /list) || !cardaccess.len) //no access + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return - if(!(access_heads in W:access)) //doesn't have this access - to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return 0 + if(!(access_heads in W:access)) //doesn't have this access + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return 0 - var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") - if(emergency_shuttle.location() && user.get_active_hand() != W) - return 0 - switch(choice) - if("Authorize") - src.authorized -= W:registered_name - src.authorized += W:registered_name - if (src.auth_need - src.authorized.len > 0) - message_admins("[key_name_admin(user)] has authorized early shuttle launch") - log_game("[user.ckey] has authorized early shuttle launch") - to_world("Alert: [src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early") - else - message_admins("[key_name_admin(user)] has launched the shuttle") - log_game("[user.ckey] has launched the shuttle early") - to_world("Alert: Shuttle launch time shortened to 10 seconds!") - emergency_shuttle.set_launch_countdown(10) - //src.authorized = null - qdel(src.authorized) - src.authorized = list( ) - - if("Repeal") - src.authorized -= W:registered_name + var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") + if(emergency_shuttle.location() && user.get_active_hand() != W) + return 0 + switch(choice) + if("Authorize") + src.authorized -= W:registered_name + src.authorized += W:registered_name + if (src.auth_need - src.authorized.len > 0) + message_admins("[key_name_admin(user)] has authorized early shuttle launch") + log_game("[user.ckey] has authorized early shuttle launch") to_world("Alert: [src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early") - - if("Abort") - to_world("All authorizations to shortening time for shuttle launch have been revoked!") - src.authorized.len = 0 + else + message_admins("[key_name_admin(user)] has launched the shuttle") + log_game("[user.ckey] has launched the shuttle early") + to_world("Alert: Shuttle launch time shortened to 10 seconds!") + emergency_shuttle.set_launch_countdown(10) + //src.authorized = null + qdel(src.authorized) src.authorized = list( ) - else if (istype(W, /obj/item/weapon/card/emag) && !emagged) - var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel") + if("Repeal") + src.authorized -= W:registered_name + to_world("Alert: [src.auth_need - src.authorized.len] authorizations needed until shuttle is launched early") - if(!emagged && !emergency_shuttle.location() && user.get_active_hand() == W) - switch(choice) - if("Launch") - to_world("Alert: Shuttle launch time shortened to 10 seconds!") - emergency_shuttle.set_launch_countdown(10) - emagged = 1 - if("Cancel") - return - return + if("Abort") + to_world("All authorizations to shortening time for shuttle launch have been revoked!") + src.authorized.len = 0 + src.authorized = list( ) + + else if (istype(W, /obj/item/weapon/card/emag) && !emagged) + var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel") + + if(!emagged && !emergency_shuttle.location() && user.get_active_hand() == W) + switch(choice) + if("Launch") + to_world("Alert: Shuttle launch time shortened to 10 seconds!") + emergency_shuttle.set_launch_countdown(10) + emagged = 1 + if("Cancel") + return + return diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 4fa8a41901..8cf5cc7823 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -1,20 +1,25 @@ #define AIRLOCK_CONTROL_RANGE 22 // This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access) -obj/machinery/door/airlock +/obj/machinery/door/airlock var/id_tag var/frequency var/shockedby = list() var/datum/radio_frequency/radio_connection var/cur_command = null //the command the door is currently attempting to complete +<<<<<<< HEAD obj/machinery/door/airlock/process() if (..() == PROCESS_KILL && !cur_command) . = PROCESS_KILL +======= +/obj/machinery/door/airlock/process() + ..() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if (arePowerSystemsOn()) execute_current_command() -obj/machinery/door/airlock/receive_signal(datum/signal/signal) +/obj/machinery/door/airlock/receive_signal(datum/signal/signal) if (!arePowerSystemsOn()) return //no power if(!signal || signal.encryption) return @@ -27,7 +32,7 @@ obj/machinery/door/airlock/receive_signal(datum/signal/signal) START_MACHINE_PROCESSING(src) -obj/machinery/door/airlock/proc/execute_current_command() +/obj/machinery/door/airlock/proc/execute_current_command() if(operating) return //emagged or busy doing something else @@ -39,7 +44,7 @@ obj/machinery/door/airlock/proc/execute_current_command() if (command_completed(cur_command)) cur_command = null -obj/machinery/door/airlock/proc/do_command(var/command) +/obj/machinery/door/airlock/proc/do_command(var/command) switch(command) if("open") open() @@ -70,7 +75,7 @@ obj/machinery/door/airlock/proc/do_command(var/command) send_status() -obj/machinery/door/airlock/proc/command_completed(var/command) +/obj/machinery/door/airlock/proc/command_completed(var/command) switch(command) if("open") return (!density) @@ -92,7 +97,7 @@ obj/machinery/door/airlock/proc/command_completed(var/command) return 1 //Unknown command. Just assume it's completed. -obj/machinery/door/airlock/proc/send_status(var/bumped = 0) +/obj/machinery/door/airlock/proc/send_status(var/bumped = 0) if(radio_connection) var/datum/signal/signal = new signal.transmission_method = TRANSMISSION_RADIO //radio signal @@ -108,17 +113,17 @@ obj/machinery/door/airlock/proc/send_status(var/bumped = 0) radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK) -obj/machinery/door/airlock/open(surpress_send) +/obj/machinery/door/airlock/open(surpress_send) . = ..() if(!surpress_send) send_status() -obj/machinery/door/airlock/close(surpress_send) +/obj/machinery/door/airlock/close(surpress_send) . = ..() if(!surpress_send) send_status() -obj/machinery/door/airlock/Bumped(atom/AM) +/obj/machinery/door/airlock/Bumped(atom/AM) ..(AM) if(istype(AM, /obj/mecha)) var/obj/mecha/mecha = AM @@ -126,26 +131,26 @@ obj/machinery/door/airlock/Bumped(atom/AM) send_status(1) return -obj/machinery/door/airlock/proc/set_frequency(new_frequency) +/obj/machinery/door/airlock/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) if(new_frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) -obj/machinery/door/airlock/Initialize() +/obj/machinery/door/airlock/Initialize() . = ..() if(frequency) set_frequency(frequency) update_icon() -obj/machinery/door/airlock/Destroy() +/obj/machinery/door/airlock/Destroy() if(frequency && radio_controller) radio_controller.remove_object(src,frequency) return ..() -obj/machinery/airlock_sensor +/obj/machinery/airlock_sensor icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_sensor_off" layer = ABOVE_WINDOW_LAYER @@ -166,7 +171,7 @@ obj/machinery/airlock_sensor var/alert = 0 var/previousPressure -obj/machinery/airlock_sensor/update_icon() +/obj/machinery/airlock_sensor/update_icon() if(on) if(alert) icon_state = "airlock_sensor_alert" @@ -175,7 +180,7 @@ obj/machinery/airlock_sensor/update_icon() else icon_state = "airlock_sensor_off" -obj/machinery/airlock_sensor/attack_hand(mob/user) +/obj/machinery/airlock_sensor/attack_hand(mob/user) var/datum/signal/signal = new signal.transmission_method = TRANSMISSION_RADIO //radio signal signal.data["tag"] = master_tag @@ -184,7 +189,7 @@ obj/machinery/airlock_sensor/attack_hand(mob/user) radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK) flick("airlock_sensor_cycle", src) -obj/machinery/airlock_sensor/process() +/obj/machinery/airlock_sensor/process() if(on) var/datum/gas_mixture/air_sample = return_air() var/pressure = round(air_sample.return_pressure(),0.1) @@ -204,34 +209,34 @@ obj/machinery/airlock_sensor/process() update_icon() -obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) +/obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) -obj/machinery/airlock_sensor/Initialize() +/obj/machinery/airlock_sensor/Initialize() . = ..() set_frequency(frequency) -obj/machinery/airlock_sensor/Destroy() +/obj/machinery/airlock_sensor/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) return ..() -obj/machinery/airlock_sensor/airlock_interior +/obj/machinery/airlock_sensor/airlock_interior command = "cycle_interior" -obj/machinery/airlock_sensor/airlock_exterior +/obj/machinery/airlock_sensor/airlock_exterior command = "cycle_exterior" // Return the air from the turf in "front" of us (Used in shuttles, so it can be in the shuttle area but sense outside it) -obj/machinery/airlock_sensor/airlock_exterior/shuttle/return_air() +/obj/machinery/airlock_sensor/airlock_exterior/shuttle/return_air() var/turf/T = get_step(src, dir) if(isnull(T)) return ..() return T.return_air() -obj/machinery/access_button +/obj/machinery/access_button icon = 'icons/obj/airlock_machines.dmi' icon_state = "access_button_standby" layer = ABOVE_WINDOW_LAYER @@ -249,20 +254,20 @@ obj/machinery/access_button var/on = 1 -obj/machinery/access_button/update_icon() +/obj/machinery/access_button/update_icon() if(on) icon_state = "access_button_standby" else icon_state = "access_button_off" -obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob) +/obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob) //Swiping ID on the access button if (istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda)) attack_hand(user) return ..() -obj/machinery/access_button/attack_hand(mob/user) +/obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) if(!allowed(user)) to_chat(user, "Access Denied") @@ -277,25 +282,25 @@ obj/machinery/access_button/attack_hand(mob/user) flick("access_button_cycle", src) -obj/machinery/access_button/proc/set_frequency(new_frequency) +/obj/machinery/access_button/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) -obj/machinery/access_button/Initialize() +/obj/machinery/access_button/Initialize() . = ..() set_frequency(frequency) -obj/machinery/access_button/Destroy() +/obj/machinery/access_button/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) return ..() -obj/machinery/access_button/airlock_interior +/obj/machinery/access_button/airlock_interior frequency = 1379 command = "cycle_interior" -obj/machinery/access_button/airlock_exterior +/obj/machinery/access_button/airlock_exterior frequency = 1379 command = "cycle_exterior" diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 2d399b81aa..c1e3f49718 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -306,7 +306,7 @@ // SUBTYPE: Regular // Your classical blast door, found almost everywhere. -obj/machinery/door/blast/regular +/obj/machinery/door/blast/regular icon_state_open = "pdoor0" icon_state_opening = "pdoorc0" icon_state_closed = "pdoor1" @@ -314,7 +314,7 @@ obj/machinery/door/blast/regular icon_state = "pdoor1" maxhealth = 600 -obj/machinery/door/blast/regular/open +/obj/machinery/door/blast/regular/open icon_state = "pdoor0" density = 0 opacity = 0 @@ -331,7 +331,7 @@ obj/machinery/door/blast/regular/open // SUBTYPE: Transparent // Not technically a blast door but operates like one. Allows air and light. -obj/machinery/door/blast/gate +/obj/machinery/door/blast/gate name = "thick gate" icon_state_open = "tshutter0" icon_state_opening = "tshutterc0" @@ -344,7 +344,7 @@ obj/machinery/door/blast/gate opacity = 0 istransparent = 1 -obj/machinery/door/blast/gate/open +/obj/machinery/door/blast/gate/open icon_state = "tshutter0" density = 0 diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm index aa857d5065..ab1de73c60 100644 --- a/code/game/machinery/doors/firedoor_assembly.dm +++ b/code/game/machinery/doors/firedoor_assembly.dm @@ -1,4 +1,4 @@ -obj/structure/firedoor_assembly +/obj/structure/firedoor_assembly name = "\improper emergency shutter assembly" desc = "It can save lives." icon = 'icons/obj/doors/DoorHazard.dmi' @@ -9,7 +9,7 @@ obj/structure/firedoor_assembly var/wired = 0 var/glass = FALSE -obj/structure/firedoor_assembly/update_icon() +/obj/structure/firedoor_assembly/update_icon() if(glass) icon = 'icons/obj/doors/DoorHazardGlass.dmi' else @@ -19,7 +19,7 @@ obj/structure/firedoor_assembly/update_icon() else icon_state = "door_construction" -obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob) +/obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob) if(istype(C, /obj/item/stack/cable_coil) && !wired && anchored) var/obj/item/stack/cable_coil/cable = C if (cable.get_amount() < 1) diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index 96a7e15aa0..879b532b08 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -2,7 +2,7 @@ /obj/machinery/embedded_controller/radio/airlock // Setup parameters only radio_filter = RADIO_AIRLOCK - program = /datum/computer/file/embedded_program/airlock + program = /datum/embedded_program/airlock var/tag_exterior_door var/tag_interior_door var/tag_airpump diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm index 080fa7d357..ce7219e57f 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm @@ -1,31 +1,31 @@ /* * NOTE - This file defines both these datums: Yes, you read that right. Its confusing. Lets try and break it down. - * /datum/computer/file/embedded_program/docking/airlock + * /datum/embedded_program/docking/airlock * - A docking controller for an airlock based docking port - * /datum/computer/file/embedded_program/airlock/docking + * /datum/embedded_program/airlock/docking * - An extension to the normal airlock program allows disabling of the regular airlock functions when docking */ //a docking port based on an airlock /obj/machinery/embedded_controller/radio/airlock/docking_port name = "docking port controller" - var/datum/computer/file/embedded_program/airlock/docking/airlock_program - var/datum/computer/file/embedded_program/docking/airlock/docking_program + var/datum/embedded_program/airlock/docking/airlock_program + var/datum/embedded_program/docking/airlock/docking_program var/display_name // For mappers to override docking_program.display_name (how would it show up on docking monitoring program) tag_secure = 1 valid_actions = list("cycle_ext", "cycle_int", "force_ext", "force_int", "abort", "toggle_override") /obj/machinery/embedded_controller/radio/airlock/docking_port/Initialize() . = ..() - airlock_program = new/datum/computer/file/embedded_program/airlock/docking(src) - docking_program = new/datum/computer/file/embedded_program/docking/airlock(src, airlock_program) + airlock_program = new/datum/embedded_program/airlock/docking(src) + docking_program = new/datum/embedded_program/docking/airlock(src, airlock_program) program = docking_program if(display_name) docking_program.display_name = display_name /obj/machinery/embedded_controller/radio/airlock/docking_port/attackby(obj/item/W, mob/user) if(istype(W,/obj/item/device/multitool)) //give them part of code, would take few tries to get full - var/datum/computer/file/embedded_program/docking/airlock/docking_program = program + var/datum/embedded_program/docking/airlock/docking_program = program var/code = docking_program.docking_codes if(!code) code = "N/A" @@ -36,8 +36,8 @@ ..() /obj/machinery/embedded_controller/radio/airlock/docking_port/tgui_data(mob/user) - var/datum/computer/file/embedded_program/docking/airlock/docking_program = program - var/datum/computer/file/embedded_program/airlock/docking/airlock_program = docking_program.airlock_program + var/datum/embedded_program/docking/airlock/docking_program = program + var/datum/embedded_program/airlock/docking/airlock_program = docking_program.airlock_program . = list( "chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]), @@ -55,15 +55,15 @@ /////////////////////////////////////////////////////////////////////////////// //A docking controller for an airlock based docking port // -/datum/computer/file/embedded_program/docking/airlock - var/datum/computer/file/embedded_program/airlock/docking/airlock_program +/datum/embedded_program/docking/airlock + var/datum/embedded_program/airlock/docking/airlock_program -/datum/computer/file/embedded_program/docking/airlock/New(var/obj/machinery/embedded_controller/M, var/datum/computer/file/embedded_program/airlock/docking/A) +/datum/embedded_program/docking/airlock/New(var/obj/machinery/embedded_controller/M, var/datum/embedded_program/airlock/docking/A) ..(M) airlock_program = A airlock_program.master_prog = src -/datum/computer/file/embedded_program/docking/airlock/receive_user_command(command) +/datum/embedded_program/docking/airlock/receive_user_command(command) if (command == "toggle_override") if (override_enabled) disable_override() @@ -74,35 +74,35 @@ . = ..(command) . = airlock_program.receive_user_command(command) || . //pass along to subprograms; bypass shortcircuit -/datum/computer/file/embedded_program/docking/airlock/process() +/datum/embedded_program/docking/airlock/process() airlock_program.process() ..() -/datum/computer/file/embedded_program/docking/airlock/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/docking/airlock/receive_signal(datum/signal/signal, receive_method, receive_param) airlock_program.receive_signal(signal, receive_method, receive_param) //pass along to subprograms ..(signal, receive_method, receive_param) //tell the docking port to start getting ready for docking - e.g. pressurize -/datum/computer/file/embedded_program/docking/airlock/prepare_for_docking() +/datum/embedded_program/docking/airlock/prepare_for_docking() airlock_program.begin_dock_cycle() //are we ready for docking? -/datum/computer/file/embedded_program/docking/airlock/ready_for_docking() +/datum/embedded_program/docking/airlock/ready_for_docking() return airlock_program.done_cycling() //we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/airlock/finish_docking() +/datum/embedded_program/docking/airlock/finish_docking() airlock_program.enable_mech_regulation() airlock_program.open_doors() //tell the docking port to start getting ready for undocking - e.g. close those doors. -/datum/computer/file/embedded_program/docking/airlock/prepare_for_undocking() +/datum/embedded_program/docking/airlock/prepare_for_undocking() airlock_program.stop_cycling() airlock_program.close_doors() airlock_program.disable_mech_regulation() //are we ready for undocking? -/datum/computer/file/embedded_program/docking/airlock/ready_for_undocking() +/datum/embedded_program/docking/airlock/ready_for_undocking() var/ext_closed = airlock_program.check_exterior_door_secured() var/int_closed = airlock_program.check_interior_door_secured() return (ext_closed || int_closed) @@ -111,37 +111,37 @@ //An airlock controller to be used by the airlock-based docking port controller. //Same as a regular airlock controller but allows disabling of the regular airlock functions when docking // -/datum/computer/file/embedded_program/airlock/docking - var/datum/computer/file/embedded_program/docking/airlock/master_prog +/datum/embedded_program/airlock/docking + var/datum/embedded_program/docking/airlock/master_prog -/datum/computer/file/embedded_program/airlock/docking/Destroy() +/datum/embedded_program/airlock/docking/Destroy() if(master_prog) master_prog.airlock_program = null master_prog = null return ..() -/datum/computer/file/embedded_program/airlock/docking/receive_user_command(command) +/datum/embedded_program/airlock/docking/receive_user_command(command) if (master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled return ..(command) -/datum/computer/file/embedded_program/airlock/docking/proc/open_doors() +/datum/embedded_program/airlock/docking/proc/open_doors() toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open") toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open") -/datum/computer/file/embedded_program/airlock/docking/cycleDoors(var/target) +/datum/embedded_program/airlock/docking/cycleDoors(var/target) if (master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled ..(target) /*** DEBUG VERBS *** -/datum/computer/file/embedded_program/docking/proc/print_state() +/datum/embedded_program/docking/proc/print_state() to_world("id_tag: [id_tag]") to_world("dock_state: [dock_state]") to_world("control_mode: [control_mode]") to_world("tag_target: [tag_target]") to_world("response_sent: [response_sent]") -/datum/computer/file/embedded_program/docking/post_signal(datum/signal/signal, comm_line) +/datum/embedded_program/docking/post_signal(datum/signal/signal, comm_line) to_world("Program [id_tag] sent a message!") print_state() to_world("[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm index be58897622..1cf4e1cb3c 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm @@ -2,7 +2,7 @@ //this is the master controller, that things will try to dock with. /obj/machinery/embedded_controller/radio/docking_port_multi name = "docking port controller" - program = /datum/computer/file/embedded_program/docking/multi + program = /datum/embedded_program/docking/multi var/child_tags_txt var/child_names_txt var/list/child_names = list() @@ -16,7 +16,7 @@ child_names[tags[i]] = names[i] /obj/machinery/embedded_controller/radio/docking_port_multi/tgui_data(mob/user) - var/datum/computer/file/embedded_program/docking/multi/docking_program = program // Cast to proper type + var/datum/embedded_program/docking/multi/docking_program = program // Cast to proper type var/list/airlocks[child_names.len] var/i = 1 @@ -36,14 +36,14 @@ // This is the actual controller that will be commanded by the master defined above /obj/machinery/embedded_controller/radio/airlock/docking_port_multi name = "docking port controller" - program = /datum/computer/file/embedded_program/airlock/multi_docking + program = /datum/embedded_program/airlock/multi_docking var/master_tag //for mapping tag_secure = 1 valid_actions = list("cycle_ext", "cycle_int", "force_ext", "force_int", "abort", "toggle_override") /obj/machinery/embedded_controller/radio/airlock/docking_port_multi/tgui_data(mob/user) - var/datum/computer/file/embedded_program/airlock/multi_docking/airlock_program = program // Cast to proper type + var/datum/embedded_program/airlock/multi_docking/airlock_program = program // Cast to proper type . = list( "chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]), @@ -58,14 +58,14 @@ /*** DEBUG VERBS *** -/datum/computer/file/embedded_program/docking/multi/proc/print_state() +/datum/embedded_program/docking/multi/proc/print_state() to_world("id_tag: [id_tag]") to_world("dock_state: [dock_state]") to_world("control_mode: [control_mode]") to_world("tag_target: [tag_target]") to_world("response_sent: [response_sent]") -/datum/computer/file/embedded_program/docking/multi/post_signal(datum/signal/signal, comm_line) +/datum/embedded_program/docking/multi/post_signal(datum/signal/signal, comm_line) to_world("Program [id_tag] sent a message!") print_state() to_world("[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index dd0d863091..62c80fd59c 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -12,7 +12,7 @@ #define MIN_TARGET_PRESSURE (ONE_ATMOSPHERE * 0.05) // Never try to pump to pure vacuum, its not happening. #define SKIPCYCLE_MARGIN 1 // Skip cycling airlock (just open the doors) if pressures are within this range. -/datum/computer/file/embedded_program/airlock +/datum/embedded_program/airlock var/tag_exterior_door var/tag_interior_door var/tag_airpump @@ -29,7 +29,7 @@ var/tag_pump_out_external var/tag_pump_out_internal -/datum/computer/file/embedded_program/airlock/New(var/obj/machinery/embedded_controller/M) +/datum/embedded_program/airlock/New(var/obj/machinery/embedded_controller/M) ..(M) memory["chamber_sensor_pressure"] = ONE_ATMOSPHERE @@ -62,7 +62,7 @@ signalDoor(tag_exterior_door, "update") //signals connected doors to update their status signalDoor(tag_interior_door, "update") -/datum/computer/file/embedded_program/airlock/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/airlock/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] if(!receive_tag) return @@ -115,7 +115,7 @@ receive_user_command("cycle_int") -/datum/computer/file/embedded_program/airlock/receive_user_command(command) +/datum/embedded_program/airlock/receive_user_command(command) var/shutdown_pump = 0 . = TRUE switch(command) @@ -175,7 +175,7 @@ -/datum/computer/file/embedded_program/airlock/process() +/datum/embedded_program/airlock/process() if(!state) //Idle if(target_state) switch(target_state) @@ -278,49 +278,49 @@ //these are here so that other types don't have to make so many assuptions about our implementation -/datum/computer/file/embedded_program/airlock/proc/begin_cycle_in() +/datum/embedded_program/airlock/proc/begin_cycle_in() state = STATE_IDLE target_state = TARGET_INOPEN memory["purge"] = cycle_to_external_air -/datum/computer/file/embedded_program/airlock/proc/begin_dock_cycle() +/datum/embedded_program/airlock/proc/begin_dock_cycle() state = STATE_IDLE target_state = TARGET_INOPEN -/datum/computer/file/embedded_program/airlock/proc/begin_cycle_out() +/datum/embedded_program/airlock/proc/begin_cycle_out() state = STATE_IDLE target_state = TARGET_OUTOPEN memory["purge"] = cycle_to_external_air -/datum/computer/file/embedded_program/airlock/proc/close_doors() +/datum/embedded_program/airlock/proc/close_doors() toggleDoor(memory["interior_status"], tag_interior_door, 1, "close") toggleDoor(memory["exterior_status"], tag_exterior_door, 1, "close") -/datum/computer/file/embedded_program/airlock/proc/stop_cycling() +/datum/embedded_program/airlock/proc/stop_cycling() state = STATE_IDLE target_state = TARGET_NONE -/datum/computer/file/embedded_program/airlock/proc/done_cycling() +/datum/embedded_program/airlock/proc/done_cycling() return (state == STATE_IDLE && target_state == TARGET_NONE) //are the doors closed and locked? -/datum/computer/file/embedded_program/airlock/proc/check_exterior_door_secured() +/datum/embedded_program/airlock/proc/check_exterior_door_secured() return (memory["exterior_status"]["state"] == "closed" && memory["exterior_status"]["lock"] == "locked") -/datum/computer/file/embedded_program/airlock/proc/check_interior_door_secured() +/datum/embedded_program/airlock/proc/check_interior_door_secured() return (memory["interior_status"]["state"] == "closed" && memory["interior_status"]["lock"] == "locked") -/datum/computer/file/embedded_program/airlock/proc/check_doors_secured() +/datum/embedded_program/airlock/proc/check_doors_secured() var/ext_closed = check_exterior_door_secured() var/int_closed = check_interior_door_secured() return (ext_closed && int_closed) -/datum/computer/file/embedded_program/airlock/proc/signalDoor(var/tag, var/command) +/datum/embedded_program/airlock/proc/signalDoor(var/tag, var/command) var/datum/signal/signal = new signal.data["tag"] = tag signal.data["command"] = command post_signal(signal, RADIO_AIRLOCK) -/datum/computer/file/embedded_program/airlock/proc/signalPump(var/tag, var/power, var/direction, var/pressure) +/datum/embedded_program/airlock/proc/signalPump(var/tag, var/power, var/direction, var/pressure) var/datum/signal/signal = new signal.data = list( "tag" = tag, @@ -332,7 +332,7 @@ post_signal(signal) //this is called to set the appropriate door state at the end of a cycling process, or for the exterior buttons -/datum/computer/file/embedded_program/airlock/proc/cycleDoors(var/target) +/datum/embedded_program/airlock/proc/cycleDoors(var/target) switch(target) if(TARGET_OUTOPEN) toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "close") @@ -348,17 +348,17 @@ signalDoor(tag_exterior_door, command) signalDoor(tag_interior_door, command) -datum/computer/file/embedded_program/airlock/proc/signal_mech_sensor(var/command, var/sensor) +/datum/embedded_program/airlock/proc/signal_mech_sensor(var/command, var/sensor) var/datum/signal/signal = new signal.data["tag"] = sensor signal.data["command"] = command post_signal(signal) -/datum/computer/file/embedded_program/airlock/proc/enable_mech_regulation() +/datum/embedded_program/airlock/proc/enable_mech_regulation() signal_mech_sensor("enable", tag_shuttle_mech_sensor) signal_mech_sensor("enable", tag_airlock_mech_sensor) -/datum/computer/file/embedded_program/airlock/proc/disable_mech_regulation() +/datum/embedded_program/airlock/proc/disable_mech_regulation() signal_mech_sensor("disable", tag_shuttle_mech_sensor) signal_mech_sensor("disable", tag_airlock_mech_sensor) @@ -374,7 +374,7 @@ Only sends a command if it is needed, i.e. if the door is already open, passing an open command to this proc will not send an additional command to open the door again. ----------------------------------------------------------*/ -/datum/computer/file/embedded_program/airlock/proc/toggleDoor(var/list/doorStatus, var/doorTag, var/secure, var/command) +/datum/embedded_program/airlock/proc/toggleDoor(var/list/doorStatus, var/doorTag, var/secure, var/command) var/doorCommand = null if(command == "toggle") diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm index 86876abe28..7adc3ba9d3 100644 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ b/code/game/machinery/embedded_controller/docking_program.dm @@ -61,7 +61,7 @@ */ -/datum/computer/file/embedded_program/docking +/datum/embedded_program/docking var/tag_target //the tag of the docking controller that we are trying to dock with var/dock_state = STATE_UNDOCKED var/control_mode = MODE_NONE @@ -73,18 +73,18 @@ var/docking_codes //would only allow docking when receiving signal with these, if set var/display_name //Override the name shown on docking monitoring program; defaults to area name + coordinates if unset -/datum/computer/file/embedded_program/docking/New() +/datum/embedded_program/docking/New() ..() if(id_tag) if(SSshuttles.docking_registry[id_tag]) crash_with("Docking controller tag [id_tag] had multiple associated programs.") SSshuttles.docking_registry[id_tag] = src -/datum/computer/file/embedded_program/docking/Destroy() +/datum/embedded_program/docking/Destroy() SSshuttles.docking_registry -= id_tag return ..() -/datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id var/command = signal.data["command"] var/recipient = signal.data["recipient"] //the intended recipient of the docking signal @@ -149,7 +149,7 @@ if (receive_tag == tag_target) reset() -/datum/computer/file/embedded_program/docking/process() +/datum/embedded_program/docking/process() switch(dock_state) if (STATE_DOCKING) //waiting for our docking port to be ready for docking if (ready_for_docking()) @@ -198,7 +198,7 @@ control_mode = MODE_NONE -/datum/computer/file/embedded_program/docking/proc/initiate_docking(var/target) +/datum/embedded_program/docking/proc/initiate_docking(var/target) if (dock_state != STATE_UNDOCKED || control_mode == MODE_SERVER) //must be undocked and not serving another request to begin a new docking handshake return @@ -207,7 +207,7 @@ send_docking_command(tag_target, "request_dock") -/datum/computer/file/embedded_program/docking/proc/initiate_undocking() +/datum/embedded_program/docking/proc/initiate_undocking() if (dock_state != STATE_DOCKED || control_mode != MODE_CLIENT) //must be docked and must be client to start undocking return @@ -220,36 +220,36 @@ send_docking_command(tag_target, "request_undock") //tell the docking port to start getting ready for docking - e.g. pressurize -/datum/computer/file/embedded_program/docking/proc/prepare_for_docking() +/datum/embedded_program/docking/proc/prepare_for_docking() return //are we ready for docking? -/datum/computer/file/embedded_program/docking/proc/ready_for_docking() +/datum/embedded_program/docking/proc/ready_for_docking() return 1 //we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/proc/finish_docking() +/datum/embedded_program/docking/proc/finish_docking() return //tell the docking port to start getting ready for undocking - e.g. close those doors. -/datum/computer/file/embedded_program/docking/proc/prepare_for_undocking() +/datum/embedded_program/docking/proc/prepare_for_undocking() return //we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/proc/finish_undocking() +/datum/embedded_program/docking/proc/finish_undocking() return //are we ready for undocking? -/datum/computer/file/embedded_program/docking/proc/ready_for_undocking() +/datum/embedded_program/docking/proc/ready_for_undocking() return 1 -/datum/computer/file/embedded_program/docking/proc/enable_override() +/datum/embedded_program/docking/proc/enable_override() override_enabled = 1 -/datum/computer/file/embedded_program/docking/proc/disable_override() +/datum/embedded_program/docking/proc/disable_override() override_enabled = 0 -/datum/computer/file/embedded_program/docking/proc/reset() +/datum/embedded_program/docking/proc/reset() dock_state = STATE_UNDOCKED broadcast_docking_status() @@ -258,23 +258,23 @@ response_sent = 0 received_confirm = 0 -/datum/computer/file/embedded_program/docking/proc/force_undock() +/datum/embedded_program/docking/proc/force_undock() //to_world("[id_tag]: forcing undock") if (tag_target) send_docking_command(tag_target, "dock_error") reset() -/datum/computer/file/embedded_program/docking/proc/docked() +/datum/embedded_program/docking/proc/docked() return (dock_state == STATE_DOCKED) -/datum/computer/file/embedded_program/docking/proc/undocked() +/datum/embedded_program/docking/proc/undocked() return (dock_state == STATE_UNDOCKED) //returns 1 if we are saftely undocked (and the shuttle can leave) -/datum/computer/file/embedded_program/docking/proc/can_launch() +/datum/embedded_program/docking/proc/can_launch() return undocked() -/datum/computer/file/embedded_program/docking/proc/send_docking_command(var/recipient, var/command) +/datum/embedded_program/docking/proc/send_docking_command(var/recipient, var/command) var/datum/signal/signal = new signal.data["tag"] = id_tag signal.data["command"] = command @@ -282,21 +282,21 @@ signal.data["code"] = docking_codes post_signal(signal) -/datum/computer/file/embedded_program/docking/proc/broadcast_docking_status() +/datum/embedded_program/docking/proc/broadcast_docking_status() var/datum/signal/signal = new signal.data["tag"] = id_tag signal.data["dock_status"] = get_docking_status() post_signal(signal) //this is mostly for NanoUI -/datum/computer/file/embedded_program/docking/proc/get_docking_status() +/datum/embedded_program/docking/proc/get_docking_status() switch (dock_state) if (STATE_UNDOCKED) return "undocked" if (STATE_DOCKING) return "docking" if (STATE_UNDOCKING) return "undocking" if (STATE_DOCKED) return "docked" -/datum/computer/file/embedded_program/docking/proc/get_name() +/datum/embedded_program/docking/proc/get_name() return display_name ? display_name : "[get_area(master)] ([master.x], [master.y])" #undef STATE_UNDOCKED diff --git a/code/game/machinery/embedded_controller/docking_program_multi.dm b/code/game/machinery/embedded_controller/docking_program_multi.dm index a4ad7d2985..b4f22bc244 100644 --- a/code/game/machinery/embedded_controller/docking_program_multi.dm +++ b/code/game/machinery/embedded_controller/docking_program_multi.dm @@ -6,12 +6,12 @@ /* the master program */ -/datum/computer/file/embedded_program/docking/multi +/datum/embedded_program/docking/multi var/list/children_tags var/list/children_ready var/list/children_override -/datum/computer/file/embedded_program/docking/multi/New(var/obj/machinery/embedded_controller/M) +/datum/embedded_program/docking/multi/New(var/obj/machinery/embedded_controller/M) ..(M) if (istype(M,/obj/machinery/embedded_controller/radio/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction @@ -25,11 +25,11 @@ children_ready[child_tag] = 0 children_override[child_tag] = "disabled" -/datum/computer/file/embedded_program/docking/multi/proc/clear_children_ready_status() +/datum/embedded_program/docking/multi/proc/clear_children_ready_status() for (var/child_tag in children_tags) children_ready[child_tag] = 0 -/datum/computer/file/embedded_program/docking/multi/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/docking/multi/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id var/command = signal.data["command"] var/recipient = signal.data["recipient"] //the intended recipient of the docking signal @@ -53,7 +53,7 @@ ..(signal, receive_method, receive_param) -/datum/computer/file/embedded_program/docking/multi/prepare_for_docking() +/datum/embedded_program/docking/multi/prepare_for_docking() //clear children ready status clear_children_ready_status() @@ -61,14 +61,14 @@ for (var/child_tag in children_tags) send_docking_command(child_tag, "prepare_for_docking") -/datum/computer/file/embedded_program/docking/multi/ready_for_docking() +/datum/embedded_program/docking/multi/ready_for_docking() //check children ready status for (var/child_tag in children_tags) if (!children_ready[child_tag]) return 0 return 1 -/datum/computer/file/embedded_program/docking/multi/finish_docking() +/datum/embedded_program/docking/multi/finish_docking() //tell children to finish docking for (var/child_tag in children_tags) send_docking_command(child_tag, "finish_docking") @@ -76,7 +76,7 @@ //clear ready flags clear_children_ready_status() -/datum/computer/file/embedded_program/docking/multi/prepare_for_undocking() +/datum/embedded_program/docking/multi/prepare_for_undocking() //clear children ready status clear_children_ready_status() @@ -84,14 +84,14 @@ for (var/child_tag in children_tags) send_docking_command(child_tag, "prepare_for_undocking") -/datum/computer/file/embedded_program/docking/multi/ready_for_undocking() +/datum/embedded_program/docking/multi/ready_for_undocking() //check children ready status for (var/child_tag in children_tags) if (!children_ready[child_tag]) return 0 return 1 -/datum/computer/file/embedded_program/docking/multi/finish_undocking() +/datum/embedded_program/docking/multi/finish_undocking() //tell children to finish undocking for (var/child_tag in children_tags) send_docking_command(child_tag, "finish_undocking") @@ -106,7 +106,7 @@ the child program technically should be "slave" but eh... I'm too politically correct. */ -/datum/computer/file/embedded_program/airlock/multi_docking +/datum/embedded_program/airlock/multi_docking var/master_tag var/master_status = "undocked" @@ -115,14 +115,14 @@ var/docking_mode = 0 //0 = docking, 1 = undocking var/response_sent = 0 -/datum/computer/file/embedded_program/airlock/multi_docking/New(var/obj/machinery/embedded_controller/M) +/datum/embedded_program/airlock/multi_docking/New(var/obj/machinery/embedded_controller/M) ..(M) if (istype(M, /obj/machinery/embedded_controller/radio/airlock/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction var/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/controller = M src.master_tag = controller.master_tag -/datum/computer/file/embedded_program/airlock/multi_docking/receive_user_command(command) +/datum/embedded_program/airlock/multi_docking/receive_user_command(command) if (command == "toggle_override") if (override_enabled) override_enabled = 0 @@ -135,7 +135,7 @@ if (!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled ..(command) -/datum/computer/file/embedded_program/airlock/multi_docking/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/airlock/multi_docking/receive_signal(datum/signal/signal, receive_method, receive_param) ..() var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id @@ -178,7 +178,7 @@ if ("finish_undocking") docking_enabled = 0 -/datum/computer/file/embedded_program/airlock/multi_docking/process() +/datum/embedded_program/airlock/multi_docking/process() ..() if (docking_enabled && !response_sent) @@ -194,31 +194,31 @@ response_sent = 1 //checks if we are ready for docking -/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_docking() +/datum/embedded_program/airlock/multi_docking/proc/ready_for_docking() return done_cycling() //checks if we are ready for undocking -/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_undocking() +/datum/embedded_program/airlock/multi_docking/proc/ready_for_undocking() var/ext_closed = check_exterior_door_secured() var/int_closed = check_interior_door_secured() return (ext_closed || int_closed) -/datum/computer/file/embedded_program/airlock/multi_docking/proc/open_doors() +/datum/embedded_program/airlock/multi_docking/proc/open_doors() toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open") toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open") -/datum/computer/file/embedded_program/airlock/multi_docking/cycleDoors(var/target) +/datum/embedded_program/airlock/multi_docking/cycleDoors(var/target) if (!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled ..(target) -/datum/computer/file/embedded_program/airlock/multi_docking/proc/send_signal_to_master(var/command) +/datum/embedded_program/airlock/multi_docking/proc/send_signal_to_master(var/command) var/datum/signal/signal = new signal.data["tag"] = id_tag signal.data["command"] = command signal.data["recipient"] = master_tag post_signal(signal) -/datum/computer/file/embedded_program/airlock/multi_docking/proc/broadcast_override_status() +/datum/embedded_program/airlock/multi_docking/proc/broadcast_override_status() var/datum/signal/signal = new signal.data["tag"] = id_tag signal.data["override_status"] = override_enabled? "enabled" : "disabled" diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 58db9782da..196edfd224 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -3,7 +3,7 @@ anchored = 1 use_power = USE_POWER_IDLE idle_power_usage = 10 - var/datum/computer/file/embedded_program/program //the currently executing program + var/datum/embedded_program/program //the currently executing program var/list/valid_actions = list() var/on = 1 diff --git a/code/game/machinery/embedded_controller/embedded_program_base.dm b/code/game/machinery/embedded_controller/embedded_program_base.dm index 48340b0c8b..664d60de81 100644 --- a/code/game/machinery/embedded_controller/embedded_program_base.dm +++ b/code/game/machinery/embedded_controller/embedded_program_base.dm @@ -1,30 +1,30 @@ - -/datum/computer/file/embedded_program +/datum/embedded_program + var/name var/list/memory = list() var/obj/machinery/embedded_controller/master var/id_tag -/datum/computer/file/embedded_program/New(var/obj/machinery/embedded_controller/M) +/datum/embedded_program/New(var/obj/machinery/embedded_controller/M) master = M if (istype(M, /obj/machinery/embedded_controller/radio)) var/obj/machinery/embedded_controller/radio/R = M id_tag = R.id_tag -/datum/computer/file/embedded_program/Destroy() +/datum/embedded_program/Destroy() if(master) master.program = null master = null return ..() // Return TRUE if was a command for us, otherwise return FALSE (so controllers with multiple programs can try each in turn until one accepts) -/datum/computer/file/embedded_program/proc/receive_user_command(command) +/datum/embedded_program/proc/receive_user_command(command) return FALSE -/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) return -/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line) +/datum/embedded_program/proc/post_signal(datum/signal/signal, comm_line) if(master) master.post_signal(signal, comm_line) else diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm index df94c21d5c..741a5f4374 100644 --- a/code/game/machinery/embedded_controller/simple_docking_controller.dm +++ b/code/game/machinery/embedded_controller/simple_docking_controller.dm @@ -1,12 +1,12 @@ //a docking port that uses a single door /obj/machinery/embedded_controller/radio/simple_docking_controller name = "docking hatch controller" - program = /datum/computer/file/embedded_program/docking/simple + program = /datum/embedded_program/docking/simple var/tag_door valid_actions = list("force_door", "toggle_override") /obj/machinery/embedded_controller/radio/simple_docking_controller/tgui_data(mob/user) - var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type + var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type . = list( "docking_status" = docking_program.get_docking_status(), @@ -16,10 +16,10 @@ ) //A docking controller program for a simple door based docking port -/datum/computer/file/embedded_program/docking/simple +/datum/embedded_program/docking/simple var/tag_door -/datum/computer/file/embedded_program/docking/simple/New(var/obj/machinery/embedded_controller/M) +/datum/embedded_program/docking/simple/New(var/obj/machinery/embedded_controller/M) ..(M) memory["door_status"] = list(state = "closed", lock = "locked") //assume closed and locked in case the doors dont report in @@ -32,7 +32,7 @@ signal_door("update") //signals connected doors to update their status -/datum/computer/file/embedded_program/docking/simple/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/docking/simple/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] if(!receive_tag) return @@ -43,7 +43,7 @@ ..(signal, receive_method, receive_param) -/datum/computer/file/embedded_program/docking/simple/receive_user_command(command) +/datum/embedded_program/docking/simple/receive_user_command(command) . = TRUE switch(command) if("force_door") @@ -60,24 +60,24 @@ else . = FALSE -/datum/computer/file/embedded_program/docking/simple/proc/signal_door(var/command) +/datum/embedded_program/docking/simple/proc/signal_door(var/command) var/datum/signal/signal = new signal.data["tag"] = tag_door signal.data["command"] = command post_signal(signal) -///datum/computer/file/embedded_program/docking/simple/proc/signal_mech_sensor(var/command) +///datum/embedded_program/docking/simple/proc/signal_mech_sensor(var/command) // signal_door(command) // return -/datum/computer/file/embedded_program/docking/simple/proc/open_door() +/datum/embedded_program/docking/simple/proc/open_door() if(memory["door_status"]["state"] == "closed") //signal_mech_sensor("enable") signal_door("secure_open") else if(memory["door_status"]["lock"] == "unlocked") signal_door("lock") -/datum/computer/file/embedded_program/docking/simple/proc/close_door() +/datum/embedded_program/docking/simple/proc/close_door() if(memory["door_status"]["state"] == "open") signal_door("secure_close") //signal_mech_sensor("disable") @@ -85,23 +85,23 @@ signal_door("lock") //tell the docking port to start getting ready for docking - e.g. pressurize -/datum/computer/file/embedded_program/docking/simple/prepare_for_docking() +/datum/embedded_program/docking/simple/prepare_for_docking() return //don't need to do anything //are we ready for docking? -/datum/computer/file/embedded_program/docking/simple/ready_for_docking() +/datum/embedded_program/docking/simple/ready_for_docking() return 1 //don't need to do anything //we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/simple/finish_docking() +/datum/embedded_program/docking/simple/finish_docking() open_door() //tell the docking port to start getting ready for undocking - e.g. close those doors. -/datum/computer/file/embedded_program/docking/simple/prepare_for_undocking() +/datum/embedded_program/docking/simple/prepare_for_undocking() close_door() //are we ready for undocking? -/datum/computer/file/embedded_program/docking/simple/ready_for_undocking() +/datum/embedded_program/docking/simple/ready_for_undocking() return (memory["door_status"]["state"] == "closed" && memory["door_status"]["lock"] == "locked") /*** DEBUG VERBS *** diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 06323a4f06..5012ec4052 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD // // Media Player Jukebox // Rewritten by Leshana from existing Polaris code, merging in D2K5 and N3X15 work @@ -7,6 +8,15 @@ #define JUKEMODE_RANDOM 2 // Not shuffle, randomly picks next each time. #define JUKEMODE_REPEAT_SONG 3 // Play the same song over and over #define JUKEMODE_PLAY_ONCE 4 // Play, then stop. +======= +/datum/track + var/title + var/sound + +/datum/track/New(var/title_name, var/audio) + title = title_name + sound = audio +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/media/jukebox name = "space jukebox" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 536da9fd0b..cb83cddd92 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -200,9 +200,8 @@ var/bomb_set extended = 1 return -obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) - var/dat as text - dat += "Nuclear Fission Explosive
\nNuclear Device Wires:
" +/obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) + var/dat = "Nuclear Fission Explosive
\nNuclear Device Wires:
" for(var/wire in wires) dat += text("[wire] Wire: [wires[wire] ? "Mend" : "Cut"] Pulse
") dat += text("
The device is [timing ? "shaking!" : "still"]
") diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 557f9169dd..705914f794 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -317,13 +317,13 @@ return -proc/getr(col) +/proc/getr(col) return hex2num(copytext(col, 2,4)) -proc/getg(col) +/proc/getg(col) return hex2num(copytext(col, 4,6)) -proc/getb(col) +/proc/getb(col) return hex2num(copytext(col, 6)) /mob/proc/clearmap() diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index f7821a4e84..ee0d44ede0 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -1,6 +1,3 @@ -#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) -#define TANK_DEFAULT_RELEASE_PRESSURE ONE_ATMOSPHERE - /obj/machinery/oxygen_pump name = "emergency oxygen pump" icon = 'icons/obj/walllocker.dmi' diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index e8fdc17f0e..c4e3ead84b 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -1,5 +1,5 @@ //not a computer -obj/machinery/scanner +/obj/machinery/scanner name = "identity analyzer" var/outputdir = 0 icon = 'icons/obj/stationobjs.dmi' @@ -8,7 +8,7 @@ obj/machinery/scanner anchored = 1 var/lastuser = null -obj/machinery/scanner/New() +/obj/machinery/scanner/New() if(!outputdir) switch(dir) if(1) @@ -35,7 +35,7 @@ obj/machinery/scanner/New() else icon_state = "scanner_idle" -obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) +/obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) if(stat & NOPOWER) return if(!ishuman(user) || lastuser == user.real_name) diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 75d7542ba1..0ae1785d50 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -6,7 +6,7 @@ density = 1 anchored = 1 -obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob) +/obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob) // Fruits and vegetables. if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown)) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 819774d0e3..c35085382b 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -262,8 +262,7 @@ set_light(0) update() -#undef CHARS_PER_LINE -#undef FOND_SIZE +#undef FONT_SIZE #undef FONT_COLOR #undef FONT_STYLE #undef SCROLL_SPEED diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index b9c616c14e..8d11f99619 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -59,10 +59,10 @@ freq_listening = list(AI_FREQ, SCI_FREQ, MED_FREQ, SUP_FREQ, SRV_FREQ, COMM_FREQ, ENG_FREQ, SEC_FREQ, ENT_FREQ) //Common and other radio frequencies for people to freely use - New() - for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2) - freq_listening |= i - ..() +/obj/machinery/telecomms/receiver/preset_right/New() + for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2) + freq_listening |= i + ..() /obj/machinery/telecomms/receiver/preset_cent id = "CentCom Receiver" diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 7bd16315e4..4565ab1668 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -16,6 +16,7 @@ var/list/viewingcode = list() var/obj/machinery/telecomms/server/SelectedServer circuit = /obj/item/weapon/circuitboard/comm_traffic + req_access = list(access_tcomsat) var/network = "NULL" // the network to probe var/temp = "" // temporary feedback messages @@ -23,190 +24,189 @@ var/storedcode = "" // code stored - proc/update_ide() +/obj/machinery/computer/telecomms/traffic/proc/update_ide() - // loop if there's someone manning the keyboard - while(editingcode) - if(!editingcode.client) - editingcode = null - break + // loop if there's someone manning the keyboard + while(editingcode) + if(!editingcode.client) + editingcode = null + break - // For the typer, the input is enabled. Buffer the typed text + // For the typer, the input is enabled. Buffer the typed text + if(editingcode) + storedcode = "[winget(editingcode, "tcscode", "text")]" + if(editingcode) // double if's to work around a runtime error + winset(editingcode, "tcscode", "is-disabled=false") + + // If the player's not manning the keyboard anymore, adjust everything + if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode))) if(editingcode) - storedcode = "[winget(editingcode, "tcscode", "text")]" - if(editingcode) // double if's to work around a runtime error - winset(editingcode, "tcscode", "is-disabled=false") + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode = null + break - // If the player's not manning the keyboard anymore, adjust everything - if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode))) - if(editingcode) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode = null + // For other people viewing the typer type code, the input is disabled and they can only view the code + // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) + + if(length(viewingcode)) + // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + + for(var/mob/M in viewingcode) + + if( (M.machine == src && (M in view(1, src)) ) || issilicon(M)) + winset(M, "tcscode", "is-disabled=true") + winset(M, "tcscode", "text=\"[showcode]\"") + else + viewingcode.Remove(M) + winshow(M, "Telecomms IDE", 0) // hide the window! + + sleep(5) + + if(length(viewingcode) > 0) + editingcode = pick(viewingcode) + viewingcode.Remove(editingcode) + update_ide() + + + + +/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + user.set_machine(src) + var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]

" + dat += "
\[Edit Code\]" + dat += "
Signal Execution: " + if(SelectedServer.autoruncode) + dat += "ALWAYS" + else + dat += "NEVER" + + + user << browse(dat, "window=traffic_control;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + if(!src.allowed(usr) && !emagged) + to_chat(usr, "ACCESS DENIED.") + return + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T break - // For other people viewing the typer type code, the input is disabled and they can only view the code - // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) + if(href_list["operation"]) + switch(href_list["operation"]) - if(length(viewingcode)) - // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") + if("release") + servers = list() + screen = 0 - for(var/mob/M in viewingcode) + if("mainmenu") + screen = 0 - if( (M.machine == src && (M in view(1, src)) ) || issilicon(M)) - winset(M, "tcscode", "is-disabled=true") - winset(M, "tcscode", "text=\"[showcode]\"") - else - viewingcode.Remove(M) - winshow(M, "Telecomms IDE", 0) // hide the window! - - sleep(5) - - if(length(viewingcode) > 0) - editingcode = pick(viewingcode) - viewingcode.Remove(editingcode) - update_ide() - - - - req_access = list(access_tcomsat) - - attack_hand(mob/user as mob) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else - dat += "
No servers detected. Scan for servers: \[Scan\]" + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - // --- Viewing Server --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]

" - dat += "
\[Edit Code\]" - dat += "
Signal Execution: " - if(SelectedServer.autoruncode) - dat += "ALWAYS" - else - dat += "NEVER" - - - user << browse(dat, "window=traffic_control;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - - Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - if(!src.allowed(usr) && !emagged) - to_chat(usr, "ACCESS DENIED.") - return - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - servers = list() screen = 0 - if("mainmenu") - screen = 0 + if("editcode") + if(editingcode == usr) return + if(usr in viewingcode) return - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if("editcode") - if(editingcode == usr) return - if(usr in viewingcode) return - - if(!editingcode) - lasteditor = usr - editingcode = usr - winshow(editingcode, "Telecomms IDE", 1) // show the IDE - winset(editingcode, "tcscode", "is-disabled=false") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - winset(editingcode, "tcscode", "text=\"[showcode]\"") - spawn() - update_ide() - - else - viewingcode.Add(usr) - winshow(usr, "Telecomms IDE", 1) // show the IDE - winset(usr, "tcscode", "is-disabled=true") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\"", "\\\"") - winset(usr, "tcscode", "text=\"[showcode]\"") - - if("togglerun") - SelectedServer.autoruncode = !(SelectedServer.autoruncode) - - if(href_list["network"]) - - var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text - - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + if(!editingcode) + lasteditor = usr + editingcode = usr + winshow(editingcode, "Telecomms IDE", 1) // show the IDE + winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + winset(editingcode, "tcscode", "text=\"[showcode]\"") + spawn() + update_ide() else + viewingcode.Add(usr) + winshow(usr, "Telecomms IDE", 1) // show the IDE + winset(usr, "tcscode", "is-disabled=true") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\"", "\\\"") + winset(usr, "tcscode", "text=\"[showcode]\"") - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + if("togglerun") + SelectedServer.autoruncode = !(SelectedServer.autoruncode) - updateUsrDialog() - return + if(href_list["network"]) + + var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text + + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return /obj/machinery/computer/telecomms/traffic/emag_act(var/remaining_charges, var/mob/user) if(!emagged) diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm index a283247996..cc29ed2a8b 100644 --- a/code/game/magic/archived_book.dm +++ b/code/game/magic/archived_book.dm @@ -7,11 +7,11 @@ var/global/datum/book_manager/book_mgr = new() -datum/book_manager/proc/path(id) +/datum/book_manager/proc/path(id) if(isnum(id)) // kill any path exploits return "[BOOK_PATH][id].sav" -datum/book_manager/proc/getall() +/datum/book_manager/proc/getall() var/list/paths = flist(BOOK_PATH) var/list/books = new() @@ -21,7 +21,7 @@ datum/book_manager/proc/getall() return books -datum/book_manager/proc/freeid() +/datum/book_manager/proc/freeid() var/list/paths = flist(BOOK_PATH) var/id = paths.len + 101 @@ -59,10 +59,10 @@ datum/book_manager/proc/freeid() log_admin("[usr.key] has deleted the book [isbn]") // delete a book -datum/book_manager/proc/remove(var/id) +/datum/book_manager/proc/remove(var/id) fdel(path(id)) -datum/archived_book +/datum/archived_book var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned var/title // The real name of the book. var/category // The category/genre of the book @@ -74,7 +74,7 @@ datum/archived_book var/list/icon/photos // in-game photos used // loads the book corresponding by the specified id -datum/archived_book/New(var/path) +/datum/archived_book/New(var/path) if(isnull(path)) return @@ -107,7 +107,7 @@ datum/archived_book/New(var/path) return -datum/archived_book/proc/save() +/datum/archived_book/proc/save() var/savefile/F = new(book_mgr.path(id)) F["version"] << BOOK_VERSION_MAX diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index bd0015b523..cacaf0d75a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -2825,16 +2825,8 @@ /obj/mecha/proc/start_process(process) current_processes |= process -///////////////////////////////////////////////// -//////// Mecha process() subcomponents //////// -///////////////////////////////////////////////// - -// Handles the internal alarms for a mech. -// Called every 16 iterations (80 deciseconds). - ///////////// - /obj/mecha/cloak() . = ..() if(occupant && occupant.client && cloaked_selfimage) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 0b438e5632..0440e32634 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -8,7 +8,63 @@ circuit = /obj/item/weapon/circuitboard/mecha_control var/list/located = list() var/screen = 0 +<<<<<<< HEAD var/list/stored_data +======= + var/stored_data + +/obj/machinery/computer/mecha/attack_ai(var/mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/computer/mecha/attack_hand(var/mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "[src.name]" + if(screen == 0) + dat += "

Tracking beacons data

" + for(var/obj/item/mecha_parts/mecha_tracking/TR in world) + var/answer = TR.get_mecha_info() + if(answer) + dat += {"
[answer]
+ Send message
+ Show exosuit log | (EMP pulse)
"} + + if(screen==1) + dat += "

Log contents

" + dat += "Return
" + dat += "[stored_data]" + + dat += "(Refresh)
" + dat += "" + + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + return + +/obj/machinery/computer/mecha/Topic(href, href_list) + if(..()) + return + var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list) + if(href_list["send_message"]) + var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("send_message") + var/message = sanitize(input(usr,"Input message","Transmit message") as text) + var/obj/mecha/M = MT.in_mecha() + if(message && M) + M.occupant_message(message) + return + if(href_list["shock"]) + var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("shock") + MT.shock() + if(href_list["get_log"]) + var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("get_log") + stored_data = MT.get_mecha_log() + screen = 1 + if(href_list["return"]) + screen = 0 + src.updateUsrDialog() + return +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) @@ -77,6 +133,7 @@ icon_state = "motion2" origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) +<<<<<<< HEAD /obj/item/mecha_parts/mecha_tracking/tgui_data(mob/user) var/list/data = ..() if(!in_mecha()) @@ -102,6 +159,25 @@ data["cargoMax"] = RM.cargo_capacity return data +======= +/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() + if(!in_mecha()) + return 0 + var/obj/mecha/M = src.loc + var/cell_charge = M.get_charge() + var/answer = {"Name: [M.name]
+ Integrity: [M.health/initial(M.health)*100]%
+ Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]
+ Airtank: [M.return_pressure()]kPa
+ Pilot: [M.occupant||"None"]
+ Location: [get_area(M)||"Unknown"]
+ Active equipment: [M.selected||"None"]"} + if(istype(M, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/RM = M + answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" + + return answer +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/mecha_parts/mecha_tracking/emp_act() qdel(src) @@ -112,8 +188,13 @@ return /obj/item/mecha_parts/mecha_tracking/proc/in_mecha() +<<<<<<< HEAD if(istype(loc, /obj/mecha)) return loc +======= + if(istype(src.loc, /obj/mecha)) + return src.loc +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) return 0 /obj/item/mecha_parts/mecha_tracking/proc/shock() @@ -123,14 +204,22 @@ qdel(src) /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() +<<<<<<< HEAD if(!in_mecha()) return list() var/obj/mecha/M = loc return M.get_log_tgui() +======= + if(!src.in_mecha()) + return 0 + var/obj/mecha/M = src.loc + return M.get_log_html() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/weapon/storage/box/mechabeacons name = "Exosuit Tracking Beacons" +<<<<<<< HEAD /obj/item/weapon/storage/box/mechabeacons/New() ..() @@ -141,3 +230,6 @@ new /obj/item/mecha_parts/mecha_tracking(src) new /obj/item/mecha_parts/mecha_tracking(src) new /obj/item/mecha_parts/mecha_tracking(src) +======= + starts_with = list(/obj/item/mecha_parts/mecha_tracking = 7) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 74cb1e169c..e24bd04460 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -17,22 +17,22 @@ icon_state = "backbone" var/datum/construction/construct - attackby(obj/item/W as obj, mob/user as mob) - if(!construct || !construct.action(W, user)) - ..() - return +/obj/item/mecha_parts/chassis/attackby(obj/item/W as obj, mob/user as mob) + if(!construct || !construct.action(W, user)) + ..() + return - attack_hand() - return +/obj/item/mecha_parts/chassis/attack_hand() + return /////////// Ripley /obj/item/mecha_parts/chassis/ripley name = "Ripley Chassis" - New() - ..() - construct = new /datum/construction/mecha/ripley_chassis(src) +/obj/item/mecha_parts/chassis/ripley/New() + ..() + construct = new /datum/construction/mecha/ripley_chassis(src) /obj/item/mecha_parts/part/ripley_torso name="Ripley Torso" @@ -69,9 +69,9 @@ /obj/item/mecha_parts/chassis/gygax name = "Gygax Chassis" - New() - ..() - construct = new /datum/construction/mecha/gygax_chassis(src) +/obj/item/mecha_parts/chassis/gygax/New() + ..() + construct = new /datum/construction/mecha/gygax_chassis(src) /obj/item/mecha_parts/part/gygax_torso name="Gygax Torso" @@ -117,18 +117,18 @@ /obj/item/mecha_parts/chassis/serenity name = "Serenity Chassis" - New() - ..() - construct = new /datum/construction/mecha/serenity_chassis(src) +/obj/item/mecha_parts/chassis/serenity/New() + ..() + construct = new /datum/construction/mecha/serenity_chassis(src) //////////// Durand /obj/item/mecha_parts/chassis/durand name = "Durand Chassis" - New() - ..() - construct = new /datum/construction/mecha/durand_chassis(src) +/obj/item/mecha_parts/chassis/durand/New() + ..() + construct = new /datum/construction/mecha/durand_chassis(src) /obj/item/mecha_parts/part/durand_torso name="Durand Torso" @@ -172,9 +172,9 @@ /obj/item/mecha_parts/chassis/firefighter name = "Firefighter Chassis" - New() - ..() - construct = new /datum/construction/mecha/firefighter_chassis(src) +/obj/item/mecha_parts/chassis/firefighter/New() + ..() + construct = new /datum/construction/mecha/firefighter_chassis(src) /* /obj/item/mecha_parts/part/firefighter_torso name="Ripley-on-Fire Torso" @@ -203,9 +203,9 @@ name = "Phazon Chassis" origin_tech = list(TECH_MATERIAL = 7) - New() - ..() - construct = new /datum/construction/mecha/phazon_chassis(src) +/obj/item/mecha_parts/chassis/phazon/New() + ..() + construct = new /datum/construction/mecha/phazon_chassis(src) /obj/item/mecha_parts/part/phazon_torso name="Phazon Torso" @@ -255,9 +255,9 @@ /obj/item/mecha_parts/chassis/odysseus name = "Odysseus Chassis" - New() - ..() - construct = new /datum/construction/mecha/odysseus_chassis(src) +/obj/item/mecha_parts/chassis/odysseus/New() + ..() + construct = new /datum/construction/mecha/odysseus_chassis(src) /obj/item/mecha_parts/part/odysseus_head name="Odysseus Head" @@ -307,9 +307,9 @@ name = "Janus Chassis" origin_tech = list(TECH_MATERIAL = 7) - New() - ..() - construct = new /datum/construction/mecha/janus_chassis(src) +/obj/item/mecha_parts/chassis/janus/New() + ..() + construct = new /datum/construction/mecha/janus_chassis(src) /obj/item/mecha_parts/part/janus_torso name="Imperion Torso" diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 9894784e15..7ca1e753fb 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -15,10 +15,10 @@ var/list/crowbar_salvage var/salvage_num = 5 - New() - ..() - crowbar_salvage = new - return +/obj/effect/decal/mecha_wreckage/New() + ..() + crowbar_salvage = new + return /obj/effect/decal/mecha_wreckage/ex_act(severity) if(severity < 2) @@ -80,20 +80,20 @@ name = "Gygax wreckage" icon_state = "gygax-broken" - New() - ..() - var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_head, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg) - for(var/i=0;i<2;i++) - if(!isemptylist(parts) && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - return +/obj/effect/decal/mecha_wreckage/gygax/New() + ..() + var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso, + /obj/item/mecha_parts/part/gygax_head, + /obj/item/mecha_parts/part/gygax_left_arm, + /obj/item/mecha_parts/part/gygax_right_arm, + /obj/item/mecha_parts/part/gygax_left_leg, + /obj/item/mecha_parts/part/gygax_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return /obj/effect/decal/mecha_wreckage/gygax/dark name = "Dark Gygax wreckage" @@ -128,38 +128,38 @@ name = "Ripley wreckage" icon_state = "ripley-broken" - New() - ..() - var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg) - for(var/i=0;i<2;i++) - if(!isemptylist(parts) && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - return +/obj/effect/decal/mecha_wreckage/ripley/New() + ..() + var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return /obj/effect/decal/mecha_wreckage/ripley/firefighter name = "Firefighter wreckage" icon_state = "firefighter-broken" - New() - ..() - var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg, - /obj/item/clothing/suit/fire) - for(var/i=0;i<2;i++) - if(!isemptylist(parts) && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - return +/obj/effect/decal/mecha_wreckage/ripley/firefighter/New() + ..() + var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg, + /obj/item/clothing/suit/fire) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return /obj/effect/decal/mecha_wreckage/ripley/deathripley name = "Death-Ripley wreckage" @@ -169,21 +169,21 @@ name = "Durand wreckage" icon_state = "durand-broken" - New() - ..() - var/list/parts = list( - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_head, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg) - for(var/i=0;i<2;i++) - if(!isemptylist(parts) && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - return +/obj/effect/decal/mecha_wreckage/durand/New() + ..() + var/list/parts = list( + /obj/item/mecha_parts/part/durand_torso, + /obj/item/mecha_parts/part/durand_head, + /obj/item/mecha_parts/part/durand_left_arm, + /obj/item/mecha_parts/part/durand_right_arm, + /obj/item/mecha_parts/part/durand_left_leg, + /obj/item/mecha_parts/part/durand_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return /obj/effect/decal/mecha_wreckage/phazon name = "Phazon wreckage" @@ -194,21 +194,21 @@ name = "Odysseus wreckage" icon_state = "odysseus-broken" - New() - ..() - var/list/parts = list( - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg) - for(var/i=0;i<2;i++) - if(!isemptylist(parts) && prob(40)) - var/part = pick(parts) - welder_salvage += part - parts -= part - return +/obj/effect/decal/mecha_wreckage/odysseus/New() + ..() + var/list/parts = list( + /obj/item/mecha_parts/part/odysseus_torso, + /obj/item/mecha_parts/part/odysseus_head, + /obj/item/mecha_parts/part/odysseus_left_arm, + /obj/item/mecha_parts/part/odysseus_right_arm, + /obj/item/mecha_parts/part/odysseus_left_leg, + /obj/item/mecha_parts/part/odysseus_right_leg) + for(var/i=0;i<2;i++) + if(!isemptylist(parts) && prob(40)) + var/part = pick(parts) + welder_salvage += part + parts -= part + return /obj/effect/decal/mecha_wreckage/odysseus/murdysseus icon_state = "murdysseus-broken" diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 7c2e274644..5f980bfb3c 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -24,10 +24,9 @@ /obj/effect/decal/cleanable/greenglow - New() - ..() - spawn(1200)// 2 minutes - qdel(src) +/obj/effect/decal/cleanable/greenglow/New() + ..() + QDEL_IN(src, 2 MINUTES) /obj/effect/decal/cleanable/dirt name = "dirt" diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index a650980779..40b773ca83 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -24,10 +24,10 @@ var/global/list/image/fluidtrack_cache=list() var/crusty=0 var/image/overlay - New(_direction,_color,_wet) - src.direction=_direction - src.basecolor=_color - src.wet=_wet +/datum/fluidtrack/New(_direction,_color,_wet) + src.direction=_direction + src.basecolor=_color + src.wet=_wet /obj/effect/decal/cleanable/blood/tracks/reveal_blood() if(!fluorescent) @@ -72,6 +72,7 @@ var/global/list/image/fluidtrack_cache=list() * @param goingdir Direction tracks are going to (or 0). * @param bloodcolor Color of the blood when wet. */ +<<<<<<< HEAD proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808") var/updated=0 // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. @@ -152,6 +153,88 @@ var/global/list/image/fluidtrack_cache=list() stack[stack_idx]=track add_overlay(I) updatedtracks=0 // Clear our memory of updated tracks. +======= +/obj/effect/decal/cleanable/blood/tracks/proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808") + var/updated=0 + // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. + var/realgoing=goingdir<<4 + + // Current bit + var/b=0 + + // When tracks will start to dry out + var/t=world.time + TRACKS_CRUSTIFY_TIME + + var/datum/fluidtrack/track + + // Process 4 bits + for(var/bi=0;bi<4;bi++) + b=1<>4 + + if(track.overlay) + track.overlay=null + var/image/I = image(icon, icon_state=state, dir=num2dir(truedir)) + I.color = track.basecolor + + track.fresh=0 + track.overlay=I + stack[stack_idx]=track + overlays += I + updatedtracks=0 // Clear our memory of updated tracks. +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/effect/decal/cleanable/blood/tracks/footprints name = "wet footprints" diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 8ae1fd4bb0..133cdb5f22 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -5,26 +5,31 @@ plane = DIRTY_PLANE anchored = 1 - New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune") - ..() - loc = location +/obj/effect/decal/cleanable/crayon/New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune") + ..() + loc = location - name = type - desc = "A [type] drawn in crayon." + name = type + desc = "A [type] drawn in crayon." - switch(type) - if("rune") - type = "rune[rand(1,6)]" - if("graffiti") - type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") + switch(type) + if("rune") + type = "rune[rand(1,6)]" + if("graffiti") + type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") - var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1) - var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1) + var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1) + var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1) - mainOverlay.Blend(main,ICON_ADD) - shadeOverlay.Blend(shade,ICON_ADD) + mainOverlay.Blend(main,ICON_ADD) + shadeOverlay.Blend(shade,ICON_ADD) +<<<<<<< HEAD add_overlay(mainOverlay) add_overlay(shadeOverlay) +======= + overlays += mainOverlay + overlays += shadeOverlay +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - add_hiddenprint(usr) \ No newline at end of file + add_hiddenprint(usr) \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index f18eb727eb..1a9f116789 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -23,22 +23,22 @@ would spawn and follow the beaker, even if it is carried or thrown. var/atom/holder var/setup = 0 - proc/set_up(n = 3, c = 0, turf/loc) - if(n > 10) - n = 10 - number = n - cardinals = c - location = loc - setup = 1 +/datum/effect/effect/system/proc/set_up(n = 3, c = 0, turf/loc) + if(n > 10) + n = 10 + number = n + cardinals = c + location = loc + setup = 1 - proc/attach(atom/atom) - holder = atom +/datum/effect/effect/system/proc/attach(atom/atom) + holder = atom - proc/start() +/datum/effect/effect/system/proc/start() - Destroy() - holder = null - return ..() +/datum/effect/effect/system/Destroy() + holder = null + return ..() ///////////////////////////////////////////// // GENERIC STEAM SPREAD SYSTEM @@ -61,32 +61,30 @@ steam.start() -- spawns the effect icon_state = "extinguish" density = 0 -/datum/effect/effect/system/steam_spread +/datum/effect/effect/system/steam_spread/set_up(n = 3, c = 0, turf/loc) + if(n > 10) + n = 10 + number = n + cardinals = c + location = loc - set_up(n = 3, c = 0, turf/loc) - if(n > 10) - n = 10 - number = n - cardinals = c - location = loc - - start() - var/i = 0 - for(i=0, i 10) - n = 10 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) +/datum/effect/effect/system/spark_spread/set_up(n = 3, c = 0, loca) + if(n > 10) + n = 10 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) - start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location) - src.total_sparks++ - var/direction - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location) + src.total_sparks++ + var/direction + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, iThe solution violently explodes.
") + for(var/mob/M in viewers(1, location)) + if (prob (50 * amount)) + to_chat(M, "The explosion knocks you down.") + M.Weaken(rand(1,5)) return + else + var/devst = -1 + var/heavy = -1 + var/light = -1 + var/flash = -1 - start() - if (amount <= 2) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() - s.set_up(2, 1, location) - s.start() + // Clamp all values to fractions of max_explosion_range, following the same pattern as for tank transfer bombs + if (round(amount/12) > 0) + devst = devst + amount/12 - for(var/mob/M in viewers(5, location)) - to_chat(M, "The solution violently explodes.") - for(var/mob/M in viewers(1, location)) - if (prob (50 * amount)) - to_chat(M, "The explosion knocks you down.") - M.Weaken(rand(1,5)) - return - else - var/devst = -1 - var/heavy = -1 - var/light = -1 - var/flash = -1 + if (round(amount/6) > 0) + heavy = heavy + amount/6 - // Clamp all values to fractions of max_explosion_range, following the same pattern as for tank transfer bombs - if (round(amount/12) > 0) - devst = devst + amount/12 + if (round(amount/3) > 0) + light = light + amount/3 - if (round(amount/6) > 0) - heavy = heavy + amount/6 + if (flashing && flashing_factor) + flash = (amount/4) * flashing_factor - if (round(amount/3) > 0) - light = light + amount/3 + for(var/mob/M in viewers(8, location)) + to_chat(M, "The solution violently explodes.") - if (flashing && flashing_factor) - flash = (amount/4) * flashing_factor - - for(var/mob/M in viewers(8, location)) - to_chat(M, "The solution violently explodes.") - - explosion( - location, - round(min(devst, BOMBCAP_DVSTN_RADIUS)), - round(min(heavy, BOMBCAP_HEAVY_RADIUS)), - round(min(light, BOMBCAP_LIGHT_RADIUS)), - round(min(flash, BOMBCAP_FLASH_RADIUS)) - ) + explosion( + location, + round(min(devst, BOMBCAP_DVSTN_RADIUS)), + round(min(heavy, BOMBCAP_HEAVY_RADIUS)), + round(min(light, BOMBCAP_LIGHT_RADIUS)), + round(min(flash, BOMBCAP_FLASH_RADIUS)) + ) diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index e33da567f3..717bcac74e 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -9,47 +9,47 @@ var/fleshcolor //Used for gibbed humans. var/bloodcolor //Used for gibbed humans. - New(location, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor) - ..() +/obj/effect/gibspawner/New(location, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor) + ..() - if(fleshcolor) src.fleshcolor = fleshcolor - if(bloodcolor) src.bloodcolor = bloodcolor - Gib(loc,MobDNA) + if(fleshcolor) src.fleshcolor = fleshcolor + if(bloodcolor) src.bloodcolor = bloodcolor + Gib(loc,MobDNA) - proc/Gib(atom/location, var/datum/dna/MobDNA = null) - if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) - to_world("Gib list length mismatch!") - return +/obj/effect/gibspawner/proc/Gib(atom/location, var/datum/dna/MobDNA = null) + if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) + to_world("Gib list length mismatch!") + return - var/obj/effect/decal/cleanable/blood/gibs/gib = null + var/obj/effect/decal/cleanable/blood/gibs/gib = null - if(sparks) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() - s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo - s.start() + if(sparks) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo + s.start() - for(var/i = 1, i<= gibtypes.len, i++) - if(gibamounts[i]) - for(var/j = 1, j<= gibamounts[i], j++) - var/gibType = gibtypes[i] - gib = new gibType(location) + for(var/i = 1, i<= gibtypes.len, i++) + if(gibamounts[i]) + for(var/j = 1, j<= gibamounts[i], j++) + var/gibType = gibtypes[i] + gib = new gibType(location) - // Apply human species colouration to masks. - if(fleshcolor) - gib.fleshcolor = fleshcolor - if(bloodcolor) - gib.basecolor = bloodcolor + // Apply human species colouration to masks. + if(fleshcolor) + gib.fleshcolor = fleshcolor + if(bloodcolor) + gib.basecolor = bloodcolor - gib.update_icon() + gib.update_icon() - gib.blood_DNA = list() - if(MobDNA) - gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type - else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey - gib.blood_DNA["Non-human DNA"] = "A+" - if(istype(location,/turf/)) - var/list/directions = gibdirections[i] - if(directions.len) - gib.streak(directions) + gib.blood_DNA = list() + if(MobDNA) + gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type + else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey + gib.blood_DNA["Non-human DNA"] = "A+" + if(istype(location,/turf/)) + var/list/directions = gibdirections[i] + if(directions.len) + gib.streak(directions) - qdel(src) + qdel(src) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 991366362a..5a5f043ebd 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -8,9 +8,10 @@ icon='icons/effects/beam.dmi' icon_state="b_beam" var/tmp/atom/BeamSource - New() - ..() - spawn(10) qdel(src) + +/obj/effect/overlay/beam/New() + ..() + spawn(10) qdel(src) /obj/effect/overlay/palmtree_r name = "Palm tree" diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index b145b77ed2..af84a15d42 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -1,27 +1,26 @@ -/obj/effect/gibspawner - generic - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) - gibamounts = list(2,2,1) +/obj/effect/gibspawner/generic + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) + gibamounts = list(2,2,1) - New() - gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) - ..() +/obj/effect/gibspawner/generic/New() + gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) + ..() - human - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) - gibamounts = list(1,1,1,1,1,1,1) +/obj/effect/gibspawner/human + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) + gibamounts = list(1,1,1,1,1,1,1) - New() - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list()) - gibamounts[6] = pick(0,1,2) - ..() +/obj/effect/gibspawner/human/New() + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list()) + gibamounts[6] = pick(0,1,2) + ..() - robot - sparks = 1 - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb) - gibamounts = list(1,1,1,1,1,1) +/obj/effect/gibspawner/robot + sparks = 1 + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb) + gibamounts = list(1,1,1,1,1,1) - New() - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs) - gibamounts[6] = pick(0,1,2) - ..() \ No newline at end of file +/obj/effect/gibspawner/robot/New() + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs) + gibamounts[6] = pick(0,1,2) + ..() \ No newline at end of file diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index a3c3c242c2..17d9a17123 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -35,57 +35,57 @@ var/nostop = 0 // if 1: will only be stopped by teleporters var/list/affecting = list() - Trigger(var/atom/A) - if(!A || !istype(A, /atom/movable)) +/obj/effect/step_trigger/thrower/Trigger(var/atom/A) + if(!A || !istype(A, /atom/movable)) + return + var/atom/movable/AM = A + var/curtiles = 0 + var/stopthrow = 0 + for(var/obj/effect/step_trigger/thrower/T in orange(2, src)) + if(AM in T.affecting) return - var/atom/movable/AM = A - var/curtiles = 0 - var/stopthrow = 0 - for(var/obj/effect/step_trigger/thrower/T in orange(2, src)) - if(AM in T.affecting) - return - if(ismob(AM)) - var/mob/M = AM - if(immobilize) - M.canmove = 0 + if(ismob(AM)) + var/mob/M = AM + if(immobilize) + M.canmove = 0 - affecting.Add(AM) - while(AM && !stopthrow) - if(tiles) - if(curtiles >= tiles) - break - if(AM.z != src.z) + affecting.Add(AM) + while(AM && !stopthrow) + if(tiles) + if(curtiles >= tiles) break + if(AM.z != src.z) + break - curtiles++ + curtiles++ - sleep(speed) + sleep(speed) - // Calculate if we should stop the process - if(!nostop) - for(var/obj/effect/step_trigger/T in get_step(AM, direction)) - if(T.stopper && T != src) - stopthrow = 1 - else - for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction)) - if(T.stopper) - stopthrow = 1 + // Calculate if we should stop the process + if(!nostop) + for(var/obj/effect/step_trigger/T in get_step(AM, direction)) + if(T.stopper && T != src) + stopthrow = 1 + else + for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction)) + if(T.stopper) + stopthrow = 1 - if(AM) - var/predir = AM.dir - step(AM, direction) - if(!facedir) - AM.set_dir(predir) + if(AM) + var/predir = AM.dir + step(AM, direction) + if(!facedir) + AM.set_dir(predir) - affecting.Remove(AM) + affecting.Remove(AM) - if(ismob(AM)) - var/mob/M = AM - if(immobilize) - M.canmove = 1 + if(ismob(AM)) + var/mob/M = AM + if(immobilize) + M.canmove = 1 /* Stops things thrown by a thrower, doesn't do anything */ @@ -156,11 +156,11 @@ var/teleport_y_offset = 0 var/teleport_z_offset = 0 - Trigger(var/atom/movable/A) - if(teleport_x && teleport_y && teleport_z) - if(teleport_x_offset && teleport_y_offset && teleport_z_offset) - var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset)) - A.forceMove(T) +/obj/effect/step_trigger/teleporter/random/Trigger(var/atom/movable/A) + if(teleport_x && teleport_y && teleport_z) + if(teleport_x_offset && teleport_y_offset && teleport_z_offset) + var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset)) + A.forceMove(T) /* Teleporter that sends objects stepping on it to a specific landmark. */ diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 3d97946bd4..3c5afc9715 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -4,7 +4,7 @@ // #define EMPDEBUG 10 -proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_range, log=0) +/proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_range, log=0) if(!epicenter) return if(!istype(epicenter, /turf)) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index ac09fc6570..659db0ca01 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,6 +1,6 @@ //TODO: Flash range does nothing currently -proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, z_transfer = UP|DOWN, shaped) +/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, z_transfer = UP|DOWN, shaped) var/multi_z_scalar = config.multi_z_explosion_scalar spawn(0) var/start = world.timeofday @@ -107,6 +107,6 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa defer_powernet_rebuild = 0 return 1 -proc/secondaryexplosion(turf/epicenter, range) +/proc/secondaryexplosion(turf/epicenter, range) for(var/turf/tile in range(range, epicenter)) tile.ex_act(2) diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 191fb01d47..400820f49f 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -13,7 +13,7 @@ var/list/explosion_turfs = list() var/explosion_in_progress = 0 -proc/explosion_rec(turf/epicenter, power) +/proc/explosion_rec(turf/epicenter, power) var/loopbreak = 0 while(explosion_in_progress) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index ca026e138b..f066b6047c 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -7,26 +7,17 @@ icon_state = "bodybag_folded" w_class = ITEMSIZE_SMALL - attack_self(mob/user) - var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) - R.add_fingerprint(user) - qdel(src) +/obj/item/bodybag/attack_self(mob/user) + var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) + R.add_fingerprint(user) + qdel(src) /obj/item/weapon/storage/box/bodybags name = "body bags" desc = "This box contains body bags." icon_state = "bodybags" - New() - ..() - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - + starts_with = list(/obj/item/bodybag = 7) /obj/structure/closet/body_bag name = "body bag" diff --git a/code/game/objects/items/devices/communicator/messaging.dm b/code/game/objects/items/devices/communicator/messaging.dm index 263f6d4db3..68b6022ad0 100644 --- a/code/game/objects/items/devices/communicator/messaging.dm +++ b/code/game/objects/items/devices/communicator/messaging.dm @@ -134,7 +134,7 @@ if(choice) var/obj/item/device/communicator/chosen_communicator = choice var/mob/observer/dead/O = src - var/text_message = sanitize(input(src, "What do you want the message to say?")) as message + var/text_message = sanitize(input(src, "What do you want the message to say?") as message) if(text_message && O.exonet) O.exonet.send_message(chosen_communicator.exonet.address, "text", text_message) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index d49de71ae1..cbd9586630 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -28,13 +28,6 @@ GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/device/radio/beacon) src.add_fingerprint(usr) return - -/obj/item/device/radio/beacon/bacon //Probably a better way of doing this, I'm lazy. - proc/digest_delay() - spawn(600) - qdel(src) - - // SINGULO BEACON SPAWNER /obj/item/device/radio/beacon/syndicate diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 6c1afb2c83..06b0e9edce 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -67,10 +67,10 @@ icon_state = "healthhud" icon = 'icons/obj/clothing/glasses.dmi' - New() - ..() - hud = new /obj/item/clothing/glasses/hud/health(src) - return +/obj/item/borg/sight/hud/med/New() + ..() + hud = new /obj/item/clothing/glasses/hud/health(src) + return /obj/item/borg/sight/hud/sec @@ -78,7 +78,7 @@ icon_state = "securityhud" icon = 'icons/obj/clothing/glasses.dmi' - New() - ..() - hud = new /obj/item/clothing/glasses/hud/security(src) - return +/obj/item/borg/sight/hud/sec/New() + ..() + hud = new /obj/item/clothing/glasses/hud/security(src) + return diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index d25e96f078..a406247400 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -9,6 +9,7 @@ var/icon/virtualIcon var/list/bulletholes = list() +<<<<<<< HEAD Destroy() // if a target is deleted and associated with a stake, force stake to forget for(var/obj/structure/target_stake/T in view(3,src)) @@ -62,22 +63,77 @@ to_chat(user, "You take the target out of the stake.") else src.loc = get_turf(user) +======= +/obj/item/target/Destroy() + // if a target is deleted and associated with a stake, force stake to forget + for(var/obj/structure/target_stake/T in view(3,src)) + if(T.pinned_target == src) + T.pinned_target = null + T.density = 1 + break + ..() // delete target + +/obj/item/target/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + // After target moves, check for nearby stakes. If associated, move to target + for(var/obj/structure/target_stake/M in view(3,src)) + if(M.density == 0 && M.pinned_target == src) + M.forceMove(loc) + + // This may seem a little counter-intuitive but I assure you that's for a purpose. + // Stakes are the ones that carry targets, yes, but in the stake code we set + // a stake's density to 0 meaning it can't be pushed anymore. Instead of pushing + // the stake now, we have to push the target. + + + +/obj/item/target/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + overlays.Cut() + to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") + return + + +/obj/item/target/attack_hand(mob/user as mob) + // taking pinned targets off! + var/obj/structure/target_stake/stake + for(var/obj/structure/target_stake/T in view(3,src)) + if(T.pinned_target == src) + stake = T + break + + if(stake) + if(stake.pinned_target) + stake.density = 1 + density = 0 + layer = OBJ_LAYER + + loc = user.loc + if(ishuman(user)) + if(!user.get_active_hand()) + user.put_in_hands(src) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) to_chat(user, "You take the target out of the stake.") + else + src.loc = get_turf(user) + to_chat(user, "You take the target out of the stake.") - stake.pinned_target = null - return + stake.pinned_target = null + return - else - ..() + else + ..() - syndicate - icon_state = "target_s" - desc = "A shooting target that looks like a hostile agent." - hp = 2600 // i guess syndie targets are sturdier? - alien - icon_state = "target_q" - desc = "A shooting target with a threatening silhouette." - hp = 2350 // alium onest too kinda +/obj/item/target/syndicate + icon_state = "target_s" + desc = "A shooting target that looks like a hostile agent." + hp = 2600 // i guess syndie targets are sturdier? +/obj/item/target/alien + icon_state = "target_q" + desc = "A shooting target with a threatening silhouette." + hp = 2350 // alium onest too kinda /obj/item/target/bullet_act(var/obj/item/projectile/Proj) var/p_x = Proj.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!" @@ -160,21 +216,21 @@ var/b2y1 = 0 var/b2y2 = 0 - New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0) - if(!Target) return +/datum/bullethole/New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0) + if(!Target) return - // Randomize the first box - b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4) - b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4) - b1y = pixel_y - if(prob(35)) - b1y += rand(-4,4) + // Randomize the first box + b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4) + b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4) + b1y = pixel_y + if(prob(35)) + b1y += rand(-4,4) - // Randomize the second box - b2x = pixel_x - if(prob(35)) - b2x += rand(-4,4) - b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4) - b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4) + // Randomize the second box + b2x = pixel_x + if(prob(35)) + b2x += rand(-4,4) + b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4) + b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4) - Target.bulletholes.Add(src) + Target.bulletholes.Add(src) diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index 98a689d776..61218364ad 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -164,90 +164,90 @@ var/bullets = 5 drop_sound = 'sound/items/drop/gun.ogg' - examine(mob/user) - . = ..() - if(bullets && get_dist(user, src) <= 2) - . += "It is loaded with [bullets] foam darts!" +/obj/item/toy/crossbow/examine(mob/user) + . = ..() + if(bullets && get_dist(user, src) <= 2) + . += "It is loaded with [bullets] foam darts!" - attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/toy/ammo/crossbow)) - if(bullets <= 4) - user.drop_item() - qdel(I) - bullets++ - to_chat(user, "You load the foam dart into the crossbow.") - else - to_chat(usr, "It's already fully loaded.") +/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/toy/ammo/crossbow)) + if(bullets <= 4) + user.drop_item() + qdel(I) + bullets++ + to_chat(user, "You load the foam dart into the crossbow.") + else + to_chat(usr, "It's already fully loaded.") - afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) - if(!isturf(target.loc) || target == user) return - if(flag) return +/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) + if(!isturf(target.loc) || target == user) return + if(flag) return - if (locate (/obj/structure/table, src.loc)) - return - else if (bullets) - var/turf/trg = get_turf(target) - var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src)) - bullets-- - D.icon_state = "foamdart" - D.name = "foam dart" - playsound(src, 'sound/items/syringeproj.ogg', 50, 1) + if (locate (/obj/structure/table, src.loc)) + return + else if (bullets) + var/turf/trg = get_turf(target) + var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src)) + bullets-- + D.icon_state = "foamdart" + D.name = "foam dart" + playsound(src, 'sound/items/syringeproj.ogg', 50, 1) - for(var/i=0, i<6, i++) - if (D) - if(D.loc == trg) break - step_towards(D,trg) + for(var/i=0, i<6, i++) + if (D) + if(D.loc == trg) break + step_towards(D,trg) - for(var/mob/living/M in D.loc) - if(!istype(M,/mob/living)) continue - if(M == user) continue - for(var/mob/O in viewers(world.view, D)) - O.show_message(text("\The [] was hit by the foam dart!", M), 1) - new /obj/item/toy/ammo/crossbow(M.loc) - qdel(D) - return - - for(var/atom/A in D.loc) - if(A == user) continue - if(A.density) - new /obj/item/toy/ammo/crossbow(A.loc) - qdel(D) - - sleep(1) - - spawn(10) - if(D) - new /obj/item/toy/ammo/crossbow(D.loc) + for(var/mob/living/M in D.loc) + if(!istype(M,/mob/living)) continue + if(M == user) continue + for(var/mob/O in viewers(world.view, D)) + O.show_message(text("\The [] was hit by the foam dart!", M), 1) + new /obj/item/toy/ammo/crossbow(M.loc) qdel(D) + return - return - else if (bullets == 0) - user.Weaken(5) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\The [] realized they were out of ammo and starting scrounging for some!", user), 1) + for(var/atom/A in D.loc) + if(A == user) continue + if(A.density) + new /obj/item/toy/ammo/crossbow(A.loc) + qdel(D) + + sleep(1) + + spawn(10) + if(D) + new /obj/item/toy/ammo/crossbow(D.loc) + qdel(D) + + return + else if (bullets == 0) + user.Weaken(5) + for(var/mob/O in viewers(world.view, user)) + O.show_message(text("\The [] realized they were out of ammo and starting scrounging for some!", user), 1) - attack(mob/M as mob, mob/user as mob) - src.add_fingerprint(user) +/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob) + src.add_fingerprint(user) // ******* Check - if (src.bullets > 0 && M.lying) + if (src.bullets > 0 && M.lying) - for(var/mob/O in viewers(M, null)) - if(O.client) - O.show_message(text("\The [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull", 2) - O.show_message(text("\The [] was hit in the head by the foam dart!", M), 1) + for(var/mob/O in viewers(M, null)) + if(O.client) + O.show_message(text("\The [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull", 2) + O.show_message(text("\The [] was hit in the head by the foam dart!", M), 1) - playsound(src, 'sound/items/syringeproj.ogg', 50, 1) - new /obj/item/toy/ammo/crossbow(M.loc) - src.bullets-- - else if (M.lying && src.bullets == 0) - for(var/mob/O in viewers(M, null)) - if (O.client) O.show_message(text("\The [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "You hear someone fall", 2) - user.Weaken(5) - return + playsound(src, 'sound/items/syringeproj.ogg', 50, 1) + new /obj/item/toy/ammo/crossbow(M.loc) + src.bullets-- + else if (M.lying && src.bullets == 0) + for(var/mob/O in viewers(M, null)) + if (O.client) O.show_message(text("\The [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "You hear someone fall", 2) + user.Weaken(5) + return /obj/item/toy/ammo/crossbow name = "foam dart" @@ -285,21 +285,21 @@ w_class = ITEMSIZE_SMALL attack_verb = list("attacked", "struck", "hit") - attack_self(mob/user as mob) - src.active = !( src.active ) - if (src.active) - to_chat(user, "You extend the plastic blade with a quick flick of your wrist.") - playsound(src, 'sound/weapons/saberon.ogg', 50, 1) - src.item_state = "[icon_state]_blade" - src.w_class = ITEMSIZE_LARGE - else - to_chat(user, "You push the plastic blade back down into the handle.") - playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) - src.item_state = "[icon_state]" - src.w_class = ITEMSIZE_SMALL - update_icon() - src.add_fingerprint(user) - return +/obj/item/toy/sword/attack_self(mob/user as mob) + src.active = !( src.active ) + if (src.active) + to_chat(user, "You extend the plastic blade with a quick flick of your wrist.") + playsound(src, 'sound/weapons/saberon.ogg', 50, 1) + src.item_state = "[icon_state]_blade" + src.w_class = ITEMSIZE_LARGE + else + to_chat(user, "You push the plastic blade back down into the handle.") + playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) + src.item_state = "[icon_state]" + src.w_class = ITEMSIZE_SMALL + update_icon() + src.add_fingerprint(user) + return /obj/item/toy/sword/update_icon() . = ..() @@ -365,15 +365,15 @@ w_class = ITEMSIZE_TINY drop_sound = null - throw_impact(atom/hit_atom) - ..() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("The [src.name] explodes!","You hear a snap!") - playsound(src, 'sound/effects/snap.ogg', 50, 1) - qdel(src) +/obj/item/toy/snappop/throw_impact(atom/hit_atom) + ..() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + new /obj/effect/decal/cleanable/ash(src.loc) + src.visible_message("The [src.name] explodes!","You hear a snap!") + playsound(src, 'sound/effects/snap.ogg', 50, 1) + qdel(src) /obj/item/toy/snappop/Crossed(atom/movable/H as mob|obj) if(H.is_incorporeal()) diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 5f5a2c25a9..7868d2d3ab 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -30,14 +30,14 @@ var/hits = 0 var/time_inflicted = 0 - proc/copy() - var/datum/autopsy_data/W = new() - W.weapon = weapon - W.pretend_weapon = pretend_weapon - W.damage = damage - W.hits = hits - W.time_inflicted = time_inflicted - return W +/datum/autopsy_data/proc/copy() + var/datum/autopsy_data/W = new() + W.weapon = weapon + W.pretend_weapon = pretend_weapon + W.damage = damage + W.hits = hits + W.time_inflicted = time_inflicted + return W /obj/item/weapon/autopsy_scanner/proc/add_data(var/obj/item/organ/external/O) if(!O.autopsy_data.len && !O.trace_chemicals.len) return diff --git a/code/game/objects/items/weapons/chewables.dm b/code/game/objects/items/weapons/chewables.dm index 3f7e3fc1b8..186263897b 100644 --- a/code/game/objects/items/weapons/chewables.dm +++ b/code/game/objects/items/weapons/chewables.dm @@ -25,7 +25,7 @@ if(wrapped) add_overlay("[initial(icon_state)]_wrapper") -obj/item/clothing/mask/chewable/Initialize() +/obj/item/clothing/mask/chewable/Initialize() . = ..() flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 @@ -47,7 +47,7 @@ obj/item/clothing/mask/chewable/Initialize() STOP_PROCESSING(SSprocessing, src) ..() -obj/item/clothing/mask/chewable/Destroy() +/obj/item/clothing/mask/chewable/Destroy() . = ..() STOP_PROCESSING(SSprocessing, src) @@ -135,6 +135,9 @@ obj/item/clothing/mask/chewable/Destroy() throwforce = 2 slot_flags = SLOT_BELT starts_with = list(/obj/item/clothing/mask/chewable/tobacco = 6) + +/obj/item/weapon/storage/chewables/Initialize() + . = ..() make_exact_fit() //Tobacco Tins diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index ab91eca500..15170138d3 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -578,10 +578,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM deactivation_sound = 'sound/items/zippo_off.ogg' /obj/item/weapon/flame/lighter/random - New() - icon_state = "lighter-[pick("r","c","y","g")]" - item_state = icon_state - base_state = icon_state +/obj/item/weapon/flame/lighter/random/New() + icon_state = "lighter-[pick("r","c","y","g")]" + item_state = icon_state + base_state = icon_state /obj/item/weapon/flame/lighter/attack_self(mob/living/user) if(!base_state) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 2f10bfce2c..8049096292 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -2,7 +2,7 @@ #error T_BOARD macro is not defined but we need it! #endif -obj/item/weapon/circuitboard/rdserver +/obj/item/weapon/circuitboard/rdserver name = T_BOARD("R&D server") build_path = /obj/machinery/r_n_d/server/core board_type = new /datum/frame/frame_types/machine @@ -11,7 +11,7 @@ obj/item/weapon/circuitboard/rdserver /obj/item/stack/cable_coil = 2, /obj/item/weapon/stock_parts/scanning_module = 1) -obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob) +/obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob) if(I.is_screwdriver()) playsound(src, I.usesound, 50, 1) user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 3c17549d25..ce63436094 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -141,262 +141,240 @@ desc = "This will make you big and strong, but give you a bad skin condition." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = HULKBLOCK - ..() + +/obj/item/weapon/dnainjector/hulkmut/New() + block = HULKBLOCK + ..() /obj/item/weapon/dnainjector/antihulk name = "\improper DNA injector (Anti-Hulk)" desc = "Cures green skin." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = HULKBLOCK - ..() + +/obj/item/weapon/dnainjector/antihulk/New() + block = HULKBLOCK + ..() /obj/item/weapon/dnainjector/xraymut name = "\improper DNA injector (Xray)" desc = "Finally you can see what the Site Manager does." datatype = DNA2_BUF_SE value = 0xFFF - //block = 8 - New() - block = XRAYBLOCK - ..() + +/obj/item/weapon/dnainjector/xraymut/New() + block = XRAYBLOCK + ..() /obj/item/weapon/dnainjector/antixray name = "\improper DNA injector (Anti-Xray)" desc = "It will make you see harder." datatype = DNA2_BUF_SE value = 0x001 - //block = 8 - New() - block = XRAYBLOCK - ..() + +/obj/item/weapon/dnainjector/antixray/New() + block = XRAYBLOCK + ..() /obj/item/weapon/dnainjector/firemut name = "\improper DNA injector (Fire)" desc = "Gives you fire." datatype = DNA2_BUF_SE value = 0xFFF - //block = 10 - New() - block = FIREBLOCK - ..() + +/obj/item/weapon/dnainjector/firemut/New() + block = FIREBLOCK + ..() /obj/item/weapon/dnainjector/antifire name = "\improper DNA injector (Anti-Fire)" desc = "Cures fire." datatype = DNA2_BUF_SE value = 0x001 - //block = 10 - New() - block = FIREBLOCK - ..() + +/obj/item/weapon/dnainjector/antifire/New() + block = FIREBLOCK + ..() /obj/item/weapon/dnainjector/telemut name = "\improper DNA injector (Tele.)" desc = "Super brain man!" datatype = DNA2_BUF_SE value = 0xFFF - //block = 12 - New() - block = TELEBLOCK - ..() + +/obj/item/weapon/dnainjector/telemut/New() + block = TELEBLOCK + ..() /obj/item/weapon/dnainjector/antitele name = "\improper DNA injector (Anti-Tele.)" desc = "Will make you not able to control your mind." datatype = DNA2_BUF_SE value = 0x001 - //block = 12 - New() - block = TELEBLOCK - ..() + +/obj/item/weapon/dnainjector/antitele/New() + block = TELEBLOCK + ..() /obj/item/weapon/dnainjector/nobreath name = "\improper DNA injector (No Breath)" desc = "Hold your breath and count to infinity." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = NOBREATHBLOCK - ..() + +/obj/item/weapon/dnainjector/nobreath/New() + block = NOBREATHBLOCK + ..() /obj/item/weapon/dnainjector/antinobreath name = "\improper DNA injector (Anti-No Breath)" desc = "Hold your breath and count to 100." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = NOBREATHBLOCK - ..() + +/obj/item/weapon/dnainjector/antinobreath/New() + block = NOBREATHBLOCK + ..() /obj/item/weapon/dnainjector/remoteview name = "\improper DNA injector (Remote View)" desc = "Stare into the distance for a reason." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = REMOTEVIEWBLOCK - ..() + +/obj/item/weapon/dnainjector/remoteview/New() + block = REMOTEVIEWBLOCK + ..() /obj/item/weapon/dnainjector/antiremoteview name = "\improper DNA injector (Anti-Remote View)" desc = "Cures green skin." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = REMOTEVIEWBLOCK - ..() + +/obj/item/weapon/dnainjector/antiremoteview/New() + block = REMOTEVIEWBLOCK + ..() /obj/item/weapon/dnainjector/regenerate name = "\improper DNA injector (Regeneration)" desc = "Healthy but hungry." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = REGENERATEBLOCK - ..() + +/obj/item/weapon/dnainjector/regenerate/New() + block = REGENERATEBLOCK + ..() /obj/item/weapon/dnainjector/antiregenerate name = "\improper DNA injector (Anti-Regeneration)" desc = "Sickly but sated." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = REGENERATEBLOCK - ..() + +/obj/item/weapon/dnainjector/antiregenerate/New() + block = REGENERATEBLOCK + ..() /obj/item/weapon/dnainjector/runfast name = "\improper DNA injector (Increase Run)" desc = "Running Man." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = INCREASERUNBLOCK - ..() + +/obj/item/weapon/dnainjector/runfast/New() + block = INCREASERUNBLOCK + ..() /obj/item/weapon/dnainjector/antirunfast name = "\improper DNA injector (Anti-Increase Run)" desc = "Walking Man." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = INCREASERUNBLOCK - ..() + +/obj/item/weapon/dnainjector/antirunfast/New() + block = INCREASERUNBLOCK + ..() /obj/item/weapon/dnainjector/morph name = "\improper DNA injector (Morph)" desc = "A total makeover." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = MORPHBLOCK - ..() + +/obj/item/weapon/dnainjector/morph/New() + block = MORPHBLOCK + ..() /obj/item/weapon/dnainjector/antimorph name = "\improper DNA injector (Anti-Morph)" desc = "Cures identity crisis." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = MORPHBLOCK - ..() -/* No COLDBLOCK on bay -/obj/item/weapon/dnainjector/cold - name = "\improper DNA injector (Cold)" - desc = "Feels a bit chilly." - datatype = DNA2_BUF_SE - value = 0xFFF - //block = 2 - New() - block = COLDBLOCK - ..() - -/obj/item/weapon/dnainjector/anticold - name = "\improper DNA injector (Anti-Cold)" - desc = "Feels room-temperature." - datatype = DNA2_BUF_SE - value = 0x001 - //block = 2 - New() - block = COLDBLOCK - ..() -*/ +/obj/item/weapon/dnainjector/antimorph/New() + block = MORPHBLOCK + ..() /obj/item/weapon/dnainjector/noprints name = "\improper DNA injector (No Prints)" desc = "Better than a pair of budget insulated gloves." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = NOPRINTSBLOCK - ..() + +/obj/item/weapon/dnainjector/noprints/New() + block = NOPRINTSBLOCK + ..() /obj/item/weapon/dnainjector/antinoprints name = "\improper DNA injector (Anti-No Prints)" desc = "Not quite as good as a pair of budget insulated gloves." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = NOPRINTSBLOCK - ..() + +/obj/item/weapon/dnainjector/antinoprints/New() + block = NOPRINTSBLOCK + ..() /obj/item/weapon/dnainjector/insulation name = "\improper DNA injector (Shock Immunity)" desc = "Better than a pair of real insulated gloves." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = SHOCKIMMUNITYBLOCK - ..() + +/obj/item/weapon/dnainjector/insulation/New() + block = SHOCKIMMUNITYBLOCK + ..() /obj/item/weapon/dnainjector/antiinsulation name = "\improper DNA injector (Anti-Shock Immunity)" desc = "Not quite as good as a pair of real insulated gloves." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = SHOCKIMMUNITYBLOCK - ..() + +/obj/item/weapon/dnainjector/antiinsulation/New() + block = SHOCKIMMUNITYBLOCK + ..() /obj/item/weapon/dnainjector/midgit name = "\improper DNA injector (Small Size)" desc = "Makes you shrink." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = SMALLSIZEBLOCK - ..() + +/obj/item/weapon/dnainjector/midgit/New() + block = SMALLSIZEBLOCK + ..() /obj/item/weapon/dnainjector/antimidgit name = "\improper DNA injector (Anti-Small Size)" desc = "Makes you grow. But not too much." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = SMALLSIZEBLOCK - ..() + +/obj/item/weapon/dnainjector/antimidgit/New() + block = SMALLSIZEBLOCK + ..() ///////////////////////////////////// /obj/item/weapon/dnainjector/antiglasses @@ -404,197 +382,197 @@ desc = "Toss away those glasses!" datatype = DNA2_BUF_SE value = 0x001 - //block = 1 - New() - block = GLASSESBLOCK - ..() + +/obj/item/weapon/dnainjector/antiglasses/New() + block = GLASSESBLOCK + ..() /obj/item/weapon/dnainjector/glassesmut name = "\improper DNA injector (Glasses)" desc = "Will make you need dorkish glasses." datatype = DNA2_BUF_SE value = 0xFFF - //block = 1 - New() - block = GLASSESBLOCK - ..() + +/obj/item/weapon/dnainjector/glassesmut/New() + block = GLASSESBLOCK + ..() /obj/item/weapon/dnainjector/epimut name = "\improper DNA injector (Epi.)" desc = "Shake shake shake the room!" datatype = DNA2_BUF_SE value = 0xFFF - //block = 3 - New() - block = HEADACHEBLOCK - ..() + +/obj/item/weapon/dnainjector/epimut/New() + block = HEADACHEBLOCK + ..() /obj/item/weapon/dnainjector/antiepi name = "\improper DNA injector (Anti-Epi.)" desc = "Will fix you up from shaking the room." datatype = DNA2_BUF_SE value = 0x001 - //block = 3 - New() - block = HEADACHEBLOCK - ..() + +/obj/item/weapon/dnainjector/antiepi/New() + block = HEADACHEBLOCK + ..() /obj/item/weapon/dnainjector/anticough name = "\improper DNA injector (Anti-Cough)" desc = "Will stop that awful noise." datatype = DNA2_BUF_SE value = 0x001 - //block = 5 - New() - block = COUGHBLOCK - ..() + +/obj/item/weapon/dnainjector/anticough/New() + block = COUGHBLOCK + ..() /obj/item/weapon/dnainjector/coughmut name = "\improper DNA injector (Cough)" desc = "Will bring forth a sound of horror from your throat." datatype = DNA2_BUF_SE value = 0xFFF - //block = 5 - New() - block = COUGHBLOCK - ..() + +/obj/item/weapon/dnainjector/coughmut/New() + block = COUGHBLOCK + ..() /obj/item/weapon/dnainjector/clumsymut name = "\improper DNA injector (Clumsy)" desc = "Makes clumsy minions." datatype = DNA2_BUF_SE value = 0xFFF - //block = 6 - New() - block = CLUMSYBLOCK - ..() + +/obj/item/weapon/dnainjector/clumsymut/New() + block = CLUMSYBLOCK + ..() /obj/item/weapon/dnainjector/anticlumsy name = "\improper DNA injector (Anti-Clumy)" desc = "Cleans up confusion." datatype = DNA2_BUF_SE value = 0x001 - //block = 6 - New() - block = CLUMSYBLOCK - ..() + +/obj/item/weapon/dnainjector/anticlumsy/New() + block = CLUMSYBLOCK + ..() /obj/item/weapon/dnainjector/antitour name = "\improper DNA injector (Anti-Tour.)" desc = "Will cure tourrets." datatype = DNA2_BUF_SE value = 0x001 - //block = 7 - New() - block = TWITCHBLOCK - ..() + +/obj/item/weapon/dnainjector/antitour/New() + block = TWITCHBLOCK + ..() /obj/item/weapon/dnainjector/tourmut name = "\improper DNA injector (Tour.)" desc = "Gives you a nasty case off tourrets." datatype = DNA2_BUF_SE value = 0xFFF - //block = 7 - New() - block = TWITCHBLOCK - ..() + +/obj/item/weapon/dnainjector/tourmut/New() + block = TWITCHBLOCK + ..() /obj/item/weapon/dnainjector/stuttmut name = "\improper DNA injector (Stutt.)" desc = "Makes you s-s-stuttterrr" datatype = DNA2_BUF_SE value = 0xFFF - //block = 9 - New() - block = NERVOUSBLOCK - ..() + +/obj/item/weapon/dnainjector/stuttmut/New() + block = NERVOUSBLOCK + ..() /obj/item/weapon/dnainjector/antistutt name = "\improper DNA injector (Anti-Stutt.)" desc = "Fixes that speaking impairment." datatype = DNA2_BUF_SE value = 0x001 - //block = 9 - New() - block = NERVOUSBLOCK - ..() + +/obj/item/weapon/dnainjector/antistutt/New() + block = NERVOUSBLOCK + ..() /obj/item/weapon/dnainjector/blindmut name = "\improper DNA injector (Blind)" desc = "Makes you not see anything." datatype = DNA2_BUF_SE value = 0xFFF - //block = 11 - New() - block = BLINDBLOCK - ..() + +/obj/item/weapon/dnainjector/blindmut/New() + block = BLINDBLOCK + ..() /obj/item/weapon/dnainjector/antiblind name = "\improper DNA injector (Anti-Blind)" desc = "ITS A MIRACLE!!!" datatype = DNA2_BUF_SE value = 0x001 - //block = 11 - New() - block = BLINDBLOCK - ..() + +/obj/item/weapon/dnainjector/antiblind/New() + block = BLINDBLOCK + ..() /obj/item/weapon/dnainjector/deafmut name = "\improper DNA injector (Deaf)" desc = "Sorry, what did you say?" datatype = DNA2_BUF_SE value = 0xFFF - //block = 13 - New() - block = DEAFBLOCK - ..() + +/obj/item/weapon/dnainjector/deafmut/New() + block = DEAFBLOCK + ..() /obj/item/weapon/dnainjector/antideaf name = "\improper DNA injector (Anti-Deaf)" desc = "Will make you hear once more." datatype = DNA2_BUF_SE value = 0x001 - //block = 13 - New() - block = DEAFBLOCK - ..() + +/obj/item/weapon/dnainjector/antideaf/New() + block = DEAFBLOCK + ..() /obj/item/weapon/dnainjector/hallucination name = "\improper DNA injector (Halluctination)" desc = "What you see isn't always what you get." datatype = DNA2_BUF_SE value = 0xFFF - //block = 2 - New() - block = HALLUCINATIONBLOCK - ..() + +/obj/item/weapon/dnainjector/hallucination/New() + block = HALLUCINATIONBLOCK + ..() /obj/item/weapon/dnainjector/antihallucination name = "\improper DNA injector (Anti-Hallucination)" desc = "What you see is what you get." datatype = DNA2_BUF_SE value = 0x001 - //block = 2 - New() - block = HALLUCINATIONBLOCK - ..() + +/obj/item/weapon/dnainjector/antihallucination/New() + block = HALLUCINATIONBLOCK + ..() /obj/item/weapon/dnainjector/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." datatype = DNA2_BUF_SE value = 0xFFF - //block = 14 - New() - block = MONKEYBLOCK - ..() + +/obj/item/weapon/dnainjector/h2m/New() + block = MONKEYBLOCK + ..() /obj/item/weapon/dnainjector/m2h name = "\improper DNA injector (Monkey > Human)" desc = "Will make you...less hairy." datatype = DNA2_BUF_SE value = 0x001 - //block = 14 - New() - block = MONKEYBLOCK - ..() + +/obj/item/weapon/dnainjector/m2h/New() + block = MONKEYBLOCK + ..() diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index e1464bd124..8538980b9c 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -19,152 +19,144 @@ var/mob/living/carbon/occupant = null var/injecting = 0 - proc - go_out() - put_mob(mob/living/carbon/M as mob) - implant(var/mob/M) - add_implants() +/obj/machinery/implantchair/New() + ..() + add_implants() - New() - ..() - add_implants() +/obj/machinery/implantchair/attack_hand(mob/user as mob) + user.set_machine(src) + var/health_text = "" + if(src.occupant) + if(src.occupant.health <= -100) + health_text = "Dead" + else if(src.occupant.health < 0) + health_text = "[round(src.occupant.health,0.1)]" + else + health_text = "[round(src.occupant.health,0.1)]" + + var/dat ="Implanter Status
" + + dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
" + dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
" + if(src.occupant) + dat += "[src.ready ? "Implant" : "Recharging"]
" + user.set_machine(src) + user << browse(dat, "window=implant") + onclose(user, "implant") - attack_hand(mob/user as mob) - user.set_machine(src) - var/health_text = "" - if(src.occupant) - if(src.occupant.health <= -100) - health_text = "Dead" - else if(src.occupant.health < 0) - health_text = "[round(src.occupant.health,0.1)]" - else - health_text = "[round(src.occupant.health,0.1)]" - - var/dat ="Implanter Status
" - - dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
" - dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
" - if(src.occupant) - dat += "[src.ready ? "Implant" : "Recharging"]
" - user.set_machine(src) - user << browse(dat, "window=implant") - onclose(user, "implant") - - - Topic(href, href_list) - if((get_dist(src, usr) <= 1) || istype(usr, /mob/living/silicon/ai)) - if(href_list["implant"]) - if(src.occupant) - injecting = 1 - go_out() - ready = 0 - spawn(injection_cooldown) - ready = 1 - - if(href_list["replenish"]) +/obj/machinery/implantchair/Topic(href, href_list) + if((get_dist(src, usr) <= 1) || istype(usr, /mob/living/silicon/ai)) + if(href_list["implant"]) + if(src.occupant) + injecting = 1 + go_out() ready = 0 - spawn(replenish_cooldown) - add_implants() + spawn(injection_cooldown) ready = 1 - src.updateUsrDialog() - src.add_fingerprint(usr) - return + if(href_list["replenish"]) + ready = 0 + spawn(replenish_cooldown) + add_implants() + ready = 1 - - attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) - if(istype(G, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/grab = G - if(!ismob(grab.affecting)) - return - if(grab.affecting.has_buckled_mobs()) - to_chat(user, span("warning", "\The [grab.affecting] has other entities attached to them. Remove them first.")) - return - var/mob/M = grab.affecting - if(put_mob(M)) - qdel(G) src.updateUsrDialog() - return - - - go_out(var/mob/M) - if(!( src.occupant )) - return - if(M == occupant) // so that the guy inside can't eject himself -Agouri - return - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - if(injecting) - implant(src.occupant) - injecting = 0 - src.occupant = null - icon_state = "implantchair" - return - - - put_mob(mob/living/carbon/M as mob) - if(!iscarbon(M)) - to_chat(usr, "\The [src] cannot hold this!") - return - if(src.occupant) - to_chat(usr, "\The [src] is already occupied!") - return - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.stop_pulling() - M.loc = src - src.occupant = M src.add_fingerprint(usr) - icon_state = "implantchair_on" - return 1 - - - implant(var/mob/M) - if (!istype(M, /mob/living/carbon)) - return - if(!implant_list.len) return - for(var/obj/item/weapon/implant/loyalty/imp in implant_list) - if(!imp) continue - if(istype(imp, /obj/item/weapon/implant/loyalty)) - for (var/mob/O in viewers(M, null)) - O.show_message("\The [M] has been implanted by \the [src].", 1) - - if(imp.handle_implant(M, BP_TORSO)) - imp.post_implant(M) - - implant_list -= imp - break return - add_implants() - for(var/i=0, i\The [src] cannot hold this!") + return + if(src.occupant) + to_chat(usr, "\The [src] is already occupied!") + return + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.stop_pulling() + M.loc = src + src.occupant = M + src.add_fingerprint(usr) + icon_state = "implantchair_on" + return 1 + + +/obj/machinery/implantchair/proc/implant(var/mob/M) + if (!istype(M, /mob/living/carbon)) + return + if(!implant_list.len) return + for(var/obj/item/weapon/implant/loyalty/imp in implant_list) + if(!imp) continue + if(istype(imp, /obj/item/weapon/implant/loyalty)) + for (var/mob/O in viewers(M, null)) + O.show_message("\The [M] has been implanted by \the [src].", 1) + + if(imp.handle_implant(M, BP_TORSO)) + imp.post_implant(M) + + implant_list -= imp + break + return + + +/obj/machinery/implantchair/proc/add_implants() + for(var/i=0, i- + - [case.imp:id] + + + +
"} else - return ..() + dat += "The implant casing is empty." + else + dat += "Please insert an implant casing!" + user << browse(dat, "window=implantpad") + onclose(user, "implantpad") + return + + +/obj/item/weapon/implantpad/Topic(href, href_list) + ..() + if (usr.stat) return + if ((usr.contents.Find(src)) || ((in_range(src, usr) && istype(src.loc, /turf)))) + usr.set_machine(src) + if (href_list["tracking_id"]) + var/obj/item/weapon/implant/tracking/T = src.case.imp + T.id += text2num(href_list["tracking_id"]) + T.id = min(1000, T.id) + T.id = max(1, T.id) - - attackby(obj/item/weapon/implantcase/C as obj, mob/user as mob) - ..() - if(istype(C, /obj/item/weapon/implantcase)) - if(!( src.case )) - user.drop_item() - C.loc = src - src.case = C + if (istype(src.loc, /mob)) + attack_self(src.loc) else - return - src.update() - return - - - attack_self(mob/user as mob) - user.set_machine(src) - var/dat = "Implant Mini-Computer:
" - if (src.case) - if(src.case.imp) - if(istype(src.case.imp, /obj/item/weapon/implant)) - dat += src.case.imp.get_data() - if(istype(src.case.imp, /obj/item/weapon/implant/tracking)) - dat += {"ID (1-100): - - - - [case.imp:id] - + - +
"} - else - dat += "The implant casing is empty." - else - dat += "Please insert an implant casing!" - user << browse(dat, "window=implantpad") - onclose(user, "implantpad") - return - - - Topic(href, href_list) - ..() - if (usr.stat) - return - if ((usr.contents.Find(src)) || ((in_range(src, usr) && istype(src.loc, /turf)))) - usr.set_machine(src) - if (href_list["tracking_id"]) - var/obj/item/weapon/implant/tracking/T = src.case.imp - T.id += text2num(href_list["tracking_id"]) - T.id = min(1000, T.id) - T.id = max(1, T.id) - - if (istype(src.loc, /mob)) - attack_self(src.loc) - else - for(var/mob/M in viewers(1, src)) - if (M.client) - src.attack_self(M) - src.add_fingerprint(usr) - else - usr << browse(null, "window=implantpad") - return + for(var/mob/M in viewers(1, src)) + if (M.client) + src.attack_self(M) + src.add_fingerprint(usr) + else + usr << browse(null, "window=implantpad") return + return diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index 8ba5f20695..93526c2ac0 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -1,4 +1,4 @@ -obj/item/weapon/chainsaw +/obj/item/weapon/chainsaw name = "chainsaw" desc = "Vroom vroom." icon_state = "chainsaw0" @@ -12,7 +12,7 @@ obj/item/weapon/chainsaw var/active_force = 55 var/inactive_force = 10 -obj/item/weapon/chainsaw/New() +/obj/item/weapon/chainsaw/New() var/datum/reagents/R = new/datum/reagents(max_fuel) reagents = R R.my_atom = src @@ -20,13 +20,13 @@ obj/item/weapon/chainsaw/New() START_PROCESSING(SSobj, src) ..() -obj/item/weapon/chainsaw/Destroy() +/obj/item/weapon/chainsaw/Destroy() STOP_PROCESSING(SSobj, src) if(reagents) qdel(reagents) ..() -obj/item/weapon/chainsaw/proc/turnOn(mob/user as mob) +/obj/item/weapon/chainsaw/proc/turnOn(mob/user as mob) if(on) return visible_message("You start pulling the string on \the [src].", "[usr] starts pulling the string on the [src].") @@ -49,7 +49,7 @@ obj/item/weapon/chainsaw/proc/turnOn(mob/user as mob) else to_chat(user, "You fumble with the string.") -obj/item/weapon/chainsaw/proc/turnOff(mob/user as mob) +/obj/item/weapon/chainsaw/proc/turnOff(mob/user as mob) if(!on) return to_chat(user, "You switch the gas nozzle on the chainsaw, turning it off.") attack_verb = list("bluntly hit", "beat", "knocked") @@ -60,13 +60,13 @@ obj/item/weapon/chainsaw/proc/turnOff(mob/user as mob) on = 0 update_icon() -obj/item/weapon/chainsaw/attack_self(mob/user as mob) +/obj/item/weapon/chainsaw/attack_self(mob/user as mob) if(!on) turnOn(user) else turnOff(user) -obj/item/weapon/chainsaw/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) +/obj/item/weapon/chainsaw/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) if(!proximity) return ..() if(on) @@ -98,7 +98,7 @@ obj/item/weapon/chainsaw/afterattack(atom/A as mob|obj|turf|area, mob/user as mo else to_chat(user, "Don't move while you're refilling the chainsaw.") -obj/item/weapon/chainsaw/process() +/obj/item/weapon/chainsaw/process() if(!on) return if(on) @@ -109,20 +109,20 @@ obj/item/weapon/chainsaw/process() to_chat(usr, "\The [src] sputters to a stop!") turnOff() -obj/item/weapon/chainsaw/proc/get_fuel() +/obj/item/weapon/chainsaw/proc/get_fuel() return reagents.get_reagent_amount("fuel") -obj/item/weapon/chainsaw/examine(mob/user) +/obj/item/weapon/chainsaw/examine(mob/user) . = ..() if(max_fuel && get_dist(user, src) == 0) . += "The [src] feels like it contains roughtly [get_fuel()] units of fuel left." -obj/item/weapon/chainsaw/suicide_act(mob/user) +/obj/item/weapon/chainsaw/suicide_act(mob/user) var/datum/gender/TU = gender_datums[user.get_visible_gender()] to_chat(viewers(user), "[user] is lying down and pulling the chainsaw into [TU.him], it looks like [TU.he] [TU.is] trying to commit suicide!") return(BRUTELOSS) -obj/item/weapon/chainsaw/update_icon() +/obj/item/weapon/chainsaw/update_icon() if(on) icon_state = "chainsaw1" item_state = "chainsaw1" diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 8e1699c800..a52202e33b 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -18,53 +18,53 @@ var/global/list/cached_icons = list() flags = OPENCONTAINER var/paint_type = "red" - afterattack(turf/simulated/target, mob/user, proximity) - if(!proximity) return - if(istype(target) && reagents.total_volume > 5) - user.visible_message("\The [target] has been splashed with something by [user]!") - reagents.trans_to_turf(target, 5) - else - return ..() +/obj/item/weapon/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity) + if(!proximity) return + if(istype(target) && reagents.total_volume > 5) + user.visible_message("\The [target] has been splashed with something by [user]!") + reagents.trans_to_turf(target, 5) + else + return ..() - New() - if(paint_type && length(paint_type) > 0) - name = paint_type + " " + name - ..() - reagents.add_reagent("water", volume*3/5) - reagents.add_reagent("plasticide", volume/5) - if(paint_type == "white") //why don't white crayons exist - reagents.add_reagent("aluminum", volume/5) - else if (paint_type == "black") - reagents.add_reagent("carbon", volume/5) - else - reagents.add_reagent("marker_ink_[paint_type]", volume/5) - reagents.handle_reactions() +/obj/item/weapon/reagent_containers/glass/paint/New() + if(paint_type && length(paint_type) > 0) + name = paint_type + " " + name + ..() + reagents.add_reagent("water", volume*3/5) + reagents.add_reagent("plasticide", volume/5) + if(paint_type == "white") //why don't white crayons exist + reagents.add_reagent("aluminum", volume/5) + else if (paint_type == "black") + reagents.add_reagent("carbon", volume/5) + else + reagents.add_reagent("marker_ink_[paint_type]", volume/5) + reagents.handle_reactions() - red - icon_state = "paint_red" - paint_type = "red" +/obj/item/weapon/reagent_containers/glass/paint/red + icon_state = "paint_red" + paint_type = "red" - yellow - icon_state = "paint_yellow" - paint_type = "yellow" +/obj/item/weapon/reagent_containers/glass/paint/yellow + icon_state = "paint_yellow" + paint_type = "yellow" - green - icon_state = "paint_green" - paint_type = "green" +/obj/item/weapon/reagent_containers/glass/paint/green + icon_state = "paint_green" + paint_type = "green" - blue - icon_state = "paint_blue" - paint_type = "blue" +/obj/item/weapon/reagent_containers/glass/paint/blue + icon_state = "paint_blue" + paint_type = "blue" - purple - icon_state = "paint_violet" - paint_type = "purple" +/obj/item/weapon/reagent_containers/glass/paint/purple + icon_state = "paint_violet" + paint_type = "purple" - black - icon_state = "paint_black" - paint_type = "black" +/obj/item/weapon/reagent_containers/glass/paint/black + icon_state = "paint_black" + paint_type = "black" - white - icon_state = "paint_white" - paint_type = "white" +/obj/item/weapon/reagent_containers/glass/paint/white + icon_state = "paint_white" + paint_type = "white" diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index b10caa3610..b3fbc758b3 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -17,44 +17,44 @@ var/icon_broken = "lockbox+b" - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id)) - if(src.broken) - to_chat(user, "It appears to be broken.") +/obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/card/id)) + if(src.broken) + to_chat(user, "It appears to be broken.") + return + if(src.allowed(user)) + src.locked = !( src.locked ) + if(src.locked) + src.icon_state = src.icon_locked + to_chat(user, "You lock \the [src]!") + close_all() return - if(src.allowed(user)) - src.locked = !( src.locked ) - if(src.locked) - src.icon_state = src.icon_locked - to_chat(user, "You lock \the [src]!") - close_all() - return - else - src.icon_state = src.icon_closed - to_chat(user, "You unlock \the [src]!") - return else - to_chat(user, "Access Denied") - else if(istype(W, /obj/item/weapon/melee/energy/blade)) - if(emag_act(INFINITY, user, W, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, src.loc) - spark_system.start() - playsound(src, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src, "sparks", 50, 1) - if(!locked) - ..() + src.icon_state = src.icon_closed + to_chat(user, "You unlock \the [src]!") + return else - to_chat(user, "It's locked!") - return + to_chat(user, "Access Denied") + else if(istype(W, /obj/item/weapon/melee/energy/blade)) + if(emag_act(INFINITY, user, W, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src, "sparks", 50, 1) + if(!locked) + ..() + else + to_chat(user, "It's locked!") + return - show_to(mob/user as mob) - if(locked) - to_chat(user, "It's locked!") - else - ..() - return +/obj/item/weapon/storage/lockbox/show_to(mob/user as mob) + if(locked) + to_chat(user, "It's locked!") + else + ..() + return /obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") if(!broken) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 66e23467d5..9f3f4335c8 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -269,11 +269,11 @@ var/obj/item/sample_object var/number - New(obj/item/sample as obj) - if(!istype(sample)) - qdel(src) - sample_object = sample - number = 1 +/datum/numbered_display/New(obj/item/sample as obj) + if(!istype(sample)) + qdel(src) + sample_object = sample + number = 1 //This proc determins the size of the inventory to be displayed. Please touch it only if you know what you're doing. /obj/item/weapon/storage/proc/orient2hud(mob/user as mob) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 22cac7c7f1..368b0de98c 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -84,11 +84,11 @@ attack_verb = list("drilled") drop_sound = 'sound/items/drop/accessory.ogg' - suicide_act(mob/user) - var/datum/gender/TU = gender_datums[user.get_visible_gender()] - to_chat(viewers(user),pick("\The [user] is pressing \the [src] to [TU.his] temple and activating it! It looks like [TU.hes] trying to commit suicide.", - "\The [user] is pressing \the [src] to [TU.his] chest and activating it! It looks like [TU.hes] trying to commit suicide.")) - return (BRUTELOSS) +/obj/item/weapon/surgical/surgicaldrill/suicide_act(mob/user) + var/datum/gender/TU = gender_datums[user.get_visible_gender()] + to_chat(viewers(user),pick("\The [user] is pressing \the [src] to [TU.his] temple and activating it! It looks like [TU.hes] trying to commit suicide.", + "\The [user] is pressing \the [src] to [TU.his] chest and activating it! It looks like [TU.hes] trying to commit suicide.")) + return (BRUTELOSS) /* * Scalpel @@ -110,12 +110,12 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") drop_sound = 'sound/items/drop/knife.ogg' - suicide_act(mob/user) - var/datum/gender/TU = gender_datums[user.get_visible_gender()] - to_chat(viewers(user),pick("\The [user] is slitting [TU.his] wrists with the [src.name]! It looks like [TU.hes] trying to commit suicide.", \ - "\The [user] is slitting [TU.his] throat with the [src.name]! It looks like [TU.hes] trying to commit suicide.", \ - "\The [user] is slitting [TU.his] stomach open with the [src.name]! It looks like [TU.hes] trying to commit seppuku.")) - return (BRUTELOSS) +/obj/item/weapon/surgical/scalpel/suicide_act(mob/user) + var/datum/gender/TU = gender_datums[user.get_visible_gender()] + to_chat(viewers(user),pick("\The [user] is slitting [TU.his] wrists with the [src.name]! It looks like [TU.hes] trying to commit suicide.", \ + "\The [user] is slitting [TU.his] throat with the [src.name]! It looks like [TU.hes] trying to commit suicide.", \ + "\The [user] is slitting [TU.his] stomach open with the [src.name]! It looks like [TU.hes] trying to commit seppuku.")) + return (BRUTELOSS) /* * Researchable Scalpels diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index bd6f384280..69e795cb6b 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,5 +1,3 @@ -#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) -#define TANK_DEFAULT_RELEASE_PRESSURE 21 #define TANK_IDEAL_PRESSURE 1015 //Arbitrary. var/list/global/tank_gauge_cache = list() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 98332cca42..be45bfa822 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -12,10 +12,10 @@ drop_sound = 'sound/items/drop/sword.ogg' pickup_sound = 'sound/items/pickup/sword.ogg' - suicide_act(mob/user) - var/datum/gender/T = gender_datums[user.get_visible_gender()] - to_chat(viewers(user),"[user] is impaling [T.himself] with the [src.name]! It looks like [T.he] [T.is] trying to commit suicide.") - return (BRUTELOSS|FIRELOSS) +/obj/item/weapon/nullrod/suicide_act(mob/user) + var/datum/gender/T = gender_datums[user.get_visible_gender()] + to_chat(viewers(user),"[user] is impaling [T.himself] with the [src.name]! It looks like [T.he] [T.is] trying to commit suicide.") + return (BRUTELOSS|FIRELOSS) /obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod. diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 17ea6845e3..18a07462fc 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -224,10 +224,11 @@ destroyed = 1 icon_state = "grille-b" density = 0 - New() - ..() - health = rand(-5, -1) //In the destroyed but not utterly threshold. - healthcheck() //Send this to healthcheck just in case we want to do something else with it. + +/obj/structure/grille/broken/New() + ..() + health = rand(-5, -1) //In the destroyed but not utterly threshold. + healthcheck() //Send this to healthcheck just in case we want to do something else with it. /obj/structure/grille/cult name = "cult grille" diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 3e58a93850..8a6377d0fe 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -247,9 +247,9 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall_torn" - attack_self(mob/user) - to_chat(user, "The inflatable wall is too torn to be inflated!") - add_fingerprint(user) +/obj/item/inflatable/torn/attack_self(mob/user) + to_chat(user, "The inflatable wall is too torn to be inflated!") + add_fingerprint(user) /obj/item/inflatable/door/torn name = "torn inflatable door" @@ -257,9 +257,9 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door_torn" - attack_self(mob/user) - to_chat(user, "The inflatable door is too torn to be inflated!") - add_fingerprint(user) +/obj/item/inflatable/door/torn/attack_self(mob/user) + to_chat(user, "The inflatable door is too torn to be inflated!") + add_fingerprint(user) /obj/item/weapon/storage/briefcase/inflatable name = "inflatable barrier box" @@ -268,13 +268,4 @@ w_class = ITEMSIZE_NORMAL max_storage_space = ITEMSIZE_COST_NORMAL * 7 can_hold = list(/obj/item/inflatable) - - New() - ..() - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) + starts_with = list(/obj/item/inflatable/door = 3, /obj/item/inflatable = 4) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index a9815a4070..22af69d08b 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -163,7 +163,7 @@ FLOOR SAFES return -obj/structure/safe/ex_act(severity) +/obj/structure/safe/ex_act(severity) return //FLOOR SAFES diff --git a/code/game/objects/structures/salvageable.dm b/code/game/objects/structures/salvageable.dm index 201b203acc..18fe7ad080 100644 --- a/code/game/objects/structures/salvageable.dm +++ b/code/game/objects/structures/salvageable.dm @@ -80,7 +80,7 @@ /obj/item/weapon/stock_parts/capacitor/adv = 30, /obj/item/weapon/computer_hardware/network_card/advanced = 20 ) -obj/structure/salvageable/computer/Initialize() +/obj/structure/salvageable/computer/Initialize() . = ..() icon_state = "computer[rand(0,7)]" @@ -136,7 +136,7 @@ obj/structure/salvageable/computer/Initialize() /obj/item/stack/material/silver{amount = 10} = 30 ) -obj/structure/salvageable/implant_container/Initialize() +/obj/structure/salvageable/implant_container/Initialize() . = ..() icon_state = "implant_container[rand(0,1)]" @@ -164,7 +164,7 @@ obj/structure/salvageable/implant_container/Initialize() /obj/item/weapon/computer_hardware/network_card/advanced = 20 ) -obj/structure/salvageable/data/Initialize() +/obj/structure/salvageable/data/Initialize() . = ..() icon_state = "data[rand(0,1)]" @@ -194,7 +194,7 @@ obj/structure/salvageable/data/Initialize() /obj/item/weapon/computer_hardware/network_card/advanced = 20 ) -obj/structure/salvageable/server/Initialize() +/obj/structure/salvageable/server/Initialize() . = ..() icon_state = "server[rand(0,1)]" @@ -219,7 +219,7 @@ obj/structure/salvageable/server/Initialize() /obj/item/weapon/computer_hardware/hard_drive/advanced = 40 ) -obj/structure/salvageable/personal/Initialize() +/obj/structure/salvageable/personal/Initialize() . = ..() icon_state = "personal[rand(0,12)]" new /obj/structure/table/reinforced (loc) @@ -234,7 +234,7 @@ obj/structure/salvageable/personal/Initialize() /obj/item/weapon/computer_hardware/hard_drive/cluster = 50 ) -obj/structure/salvageable/bliss/Initialize() +/obj/structure/salvageable/bliss/Initialize() . = ..() icon_state = "bliss[rand(0,1)]" diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index ca1f311073..6053d26ea2 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -56,7 +56,7 @@ // When destroyed by explosions, properly handle contents. -obj/structure/ex_act(severity) +/obj/structure/ex_act(severity) switch(severity) if(1.0) for(var/atom/movable/AM in contents) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 400b997dc5..57734b929c 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -9,7 +9,7 @@ */ -obj/structure/windoor_assembly +/obj/structure/windoor_assembly name = "windoor assembly" icon = 'icons/obj/doors/windoor.dmi' icon_state = "l_windoor_assembly01" @@ -27,12 +27,12 @@ obj/structure/windoor_assembly var/state = "01" //How far the door assembly has progressed in terms of sprites var/step = null //How far the door assembly has progressed in terms of steps -obj/structure/windoor_assembly/secure +/obj/structure/windoor_assembly/secure name = "secure windoor assembly" secure = "secure_" icon_state = "l_secure_windoor_assembly01" -obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0) +/obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0) ..() if(constructed) state = "01" @@ -46,7 +46,7 @@ obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0) update_nearby_tiles(need_rebuild=1) -obj/structure/windoor_assembly/Destroy() +/obj/structure/windoor_assembly/Destroy() density = 0 update_nearby_tiles() ..() diff --git a/code/game/periodic_news.dm b/code/game/periodic_news.dm index b3c9c9d69f..a3d89313c5 100644 --- a/code/game/periodic_news.dm +++ b/code/game/periodic_news.dm @@ -2,131 +2,120 @@ // Uses BYOND's type system to put everything into a nice format /datum/news_announcement - var - round_time // time of the round at which this should be announced, in seconds - message // body of the message - author = "NanoTrasen Editor" - can_be_redacted = 0 - message_type = "Story" - channel_name = null + var/round_time // time of the round at which this should be announced, in seconds + var/message // body of the message + var/author = "NanoTrasen Editor" + var/can_be_redacted = 0 + var/message_type = "Story" + var/channel_name = null - New() // I'm sorry... - ..() - channel_name = "The [using_map.starsys_name] Times" +/datum/news_announcement/New() // I'm sorry... + ..() + channel_name = "The [using_map.starsys_name] Times" - revolution_inciting_event +/datum/news_announcement/revolution_inciting_event/paycuts_suspicion + round_time = 60*10 + message = {"Reports have leaked that NanoTrasen is planning to put paycuts into + effect on many of its Research Stations in Tau Ceti. Apparently these research + stations haven't been able to yield the expected revenue, and thus adjustments + have to be made."} + author = "Unauthorized" - paycuts_suspicion - round_time = 60*10 - message = {"Reports have leaked that NanoTrasen is planning to put paycuts into - effect on many of its Research Stations in Tau Ceti. Apparently these research - stations haven't been able to yield the expected revenue, and thus adjustments - have to be made."} - author = "Unauthorized" +/datum/news_announcement/revolution_inciting_event/paycuts_confirmation + round_time = 60*40 + message = {"Earlier rumours about paycuts on Research Stations in the Tau Ceti system have + been confirmed. Shockingly, however, the cuts will only affect lower tier + personnel. Heads of Staff will, according to our sources, not be affected."} + author = "Unauthorized" - paycuts_confirmation - round_time = 60*40 - message = {"Earlier rumours about paycuts on Research Stations in the Tau Ceti system have - been confirmed. Shockingly, however, the cuts will only affect lower tier - personnel. Heads of Staff will, according to our sources, not be affected."} - author = "Unauthorized" +/datum/news_announcement/revolution_inciting_event/human_experiments + round_time = 60*90 + message = {"Unbelievable reports about human experimentation have reached our ears. According + to a refugee from one of the Tau Ceti Research Stations, their station, in order + to increase revenue, has refactored several of their facilities to perform experiments + on live humans, including virology research, genetic manipulation, and \"feeding them + to the slimes to see what happens\". Allegedly, these test subjects were neither + humanified monkeys nor volunteers, but rather unqualified staff that were forced into + the experiments, and reported to have died in a \"work accident\" by NanoTrasen."} + author = "Unauthorized" - human_experiments - round_time = 60*90 - message = {"Unbelievable reports about human experimentation have reached our ears. According - to a refugee from one of the Tau Ceti Research Stations, their station, in order - to increase revenue, has refactored several of their facilities to perform experiments - on live humans, including virology research, genetic manipulation, and \"feeding them - to the slimes to see what happens\". Allegedly, these test subjects were neither - humanified monkeys nor volunteers, but rather unqualified staff that were forced into - the experiments, and reported to have died in a \"work accident\" by NanoTrasen."} - author = "Unauthorized" +/datum/news_announcement/bluespace_research/announcement + round_time = 60*20 + message = {"The new field of research trying to explain several interesting spacetime oddities, + also known as \"Bluespace Research\", has reached new heights. Of the several + hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped + to experiment with and research Bluespace effects. Rumours have it some of these + stations even sport functional \"travel gates\" that can instantly move a whole research + team to an alternate reality."} - bluespace_research - - announcement - round_time = 60*20 - message = {"The new field of research trying to explain several interesting spacetime oddities, - also known as \"Bluespace Research\", has reached new heights. Of the several - hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped - to experiment with and research Bluespace effects. Rumours have it some of these - stations even sport functional \"travel gates\" that can instantly move a whole research - team to an alternate reality."} - - random_junk - - cheesy_honkers +/datum/news_announcement/random_junk/cheesy_honkers author = "Assistant Editor Carl Ritz" channel_name = "The Gibson Gazette" message = {"Do cheesy honkers increase risk of having a miscarriage? Several health administrations say so!"} round_time = 60 * 15 - net_block - author = "Assistant Editor Carl Ritz" - channel_name = "The Gibson Gazette" - message = {"Several corporations banding together to block access to 'wetskrell.nt', site administrators - claiming violation of net laws."} - round_time = 60 * 50 +/datum/news_announcement/random_junk/net_block + author = "Assistant Editor Carl Ritz" + channel_name = "The Gibson Gazette" + message = {"Several corporations banding together to block access to 'wetskrell.nt', site administrators + claiming violation of net laws."} + round_time = 60 * 50 - found_ssd - author = "Doctor Eric Hanfield" +/datum/news_announcement/random_junk/found_ssd + author = "Doctor Eric Hanfield" - message = {"Several people have been found unconscious at their terminals. It is thought that it was due - to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage - reveals that many of them were playing games instead of working and their pay has been docked - accordingly."} - round_time = 60 * 90 + message = {"Several people have been found unconscious at their terminals. It is thought that it was due + to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage + reveals that many of them were playing games instead of working and their pay has been docked + accordingly."} + round_time = 60 * 90 - lotus_tree +/datum/news_announcement/lotus_tree/explosions + author = "Reporter Leland H. Howards" - explosions - author = "Reporter Leland H. Howards" + message = {"The newly-christened civillian transport Lotus Tree suffered two very large explosions near the + bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of + the explosions remain unknown, but there is speculation that it might have something to do with + the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L + announced that they were officially acknowledging inter-species marriage and providing couples + with marriage tax-benefits."} + round_time = 60 * 30 - message = {"The newly-christened civillian transport Lotus Tree suffered two very large explosions near the - bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of - the explosions remain unknown, but there is speculation that it might have something to do with - the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L - announced that they were officially acknowledging inter-species marriage and providing couples - with marriage tax-benefits."} - round_time = 60 * 30 +/datum/news_announcement/food_riots/breaking_news + author = "Reporter Ro'kii Ar-Raqis" + message = {"Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae + Lupus system. This comes only hours after NanoTrasen officials announced they will no longer trade with the + colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to + continue. NanoTrasen officials have not given any details about said factions. More on that at the top of + the hour."} + round_time = 60 * 10 - food_riots - - breaking_news - author = "Reporter Ro'kii Ar-Raqis" - message = {"Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae - Lupus system. This comes only hours after NanoTrasen officials announced they will no longer trade with the - colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to - continue. NanoTrasen officials have not given any details about said factions. More on that at the top of - the hour."} - round_time = 60 * 10 - - more - author = "Reporter Ro'kii Ar-Raqis" - message = {"More on the Refuge food riots: The Refuge Council has condemned NanoTrasen's withdrawal from - the colony, claiming \"there has been no increase in anti-NanoTrasen activity\", and \"\[the only] reason - NanoTrasen withdrew was because the \[Tenebrae Lupus] system's Phoron deposits have been completely mined out. - We have little to trade with them now\". NanoTrasen officials have denied these allegations, calling them - \"further proof\" of the colony's anti-NanoTrasen stance. Meanwhile, Refuge Security has been unable to quell - the riots. More on this at 6."} - round_time = 60 * 60 +/datum/news_announcement/food_riots/more + author = "Reporter Ro'kii Ar-Raqis" + message = {"More on the Refuge food riots: The Refuge Council has condemned NanoTrasen's withdrawal from + the colony, claiming \"there has been no increase in anti-NanoTrasen activity\", and \"\[the only] reason + NanoTrasen withdrew was because the \[Tenebrae Lupus] system's Phoron deposits have been completely mined out. + We have little to trade with them now\". NanoTrasen officials have denied these allegations, calling them + \"further proof\" of the colony's anti-NanoTrasen stance. Meanwhile, Refuge Security has been unable to quell + the riots. More on this at 6."} + round_time = 60 * 60 var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots) -proc/process_newscaster() +/proc/process_newscaster() check_for_newscaster_updates(ticker.mode.newscaster_announcements) var/global/tmp/announced_news_types = list() -proc/check_for_newscaster_updates(type) +/proc/check_for_newscaster_updates(type) for(var/subtype in typesof(type)-type) var/datum/news_announcement/news = new subtype() if(news.round_time * 10 <= world.time && !(subtype in announced_news_types)) announced_news_types += subtype announce_newscaster_news(news) -proc/announce_newscaster_news(datum/news_announcement/news) +/proc/announce_newscaster_news(datum/news_announcement/news) var/datum/feed_channel/sendto for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == news.channel_name) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index a16d155268..108f7a747e 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -41,7 +41,7 @@ var/silent_ert = 0 log_admin("[key_name(usr)] used Dispatch Response Team.") trigger_armed_response_team(1) -client/verb/JoinResponseTeam() +/client/verb/JoinResponseTeam() set name = "Join Response Team" set category = "IC" @@ -65,7 +65,7 @@ client/verb/JoinResponseTeam() to_chat(usr, "You need to be an observer or new player to use this.") // returns a number of dead players in % -proc/percentage_dead() +/proc/percentage_dead() var/total = 0 var/deadcount = 0 for(var/mob/living/carbon/human/H in mob_list) @@ -77,7 +77,7 @@ proc/percentage_dead() else return round(100 * deadcount / total) // counts the number of antagonists in % -proc/percentage_antagonists() +/proc/percentage_antagonists() var/total = 0 var/antagonists = 0 for(var/mob/living/carbon/human/H in mob_list) @@ -90,7 +90,7 @@ proc/percentage_antagonists() // Increments the ERT chance automatically, so that the later it is in the round, // the more likely an ERT is to be able to be called. -proc/increment_ert_chance() +/proc/increment_ert_chance() while(send_emergency_team == 0) // There is no ERT at the time. if(get_security_level() == "green") ert_base_chance += 1 @@ -109,7 +109,7 @@ proc/increment_ert_chance() sleep(600 * 3) // Minute * Number of Minutes -proc/trigger_armed_response_team(var/force = 0) +/proc/trigger_armed_response_team(var/force = 0) if(!can_call_ert && !force) return if(send_emergency_team) diff --git a/code/game/trader_visit.dm b/code/game/trader_visit.dm index 31889dfff7..a788be683e 100644 --- a/code/game/trader_visit.dm +++ b/code/game/trader_visit.dm @@ -34,7 +34,7 @@ var/can_call_traders = 1 log_admin("[key_name(usr)] used Dispatch Beruang Trader Ship.") trigger_trader_visit() -client/verb/JoinTraders() +/client/verb/JoinTraders() set name = "Join Trader Visit" set category = "IC" @@ -54,7 +54,7 @@ client/verb/JoinTraders() else to_chat(usr, "You need to be an observer or new player to use this.") -proc/trigger_trader_visit() +/proc/trigger_trader_visit() if(!can_call_traders) return if(send_beruang) diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 4fa51f76bc..62705f8b67 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -422,8 +422,6 @@ icon_state = "snowyplayingdrift" initial_flooring = /decl/flooring/snow/plating/drift -#define FOOTSTEP_SPRITE_AMT 2 - // TODO: Move foortprints to a datum-component signal so they can actually be applied to other turf types, like sand, or mud /turf/simulated/floor/snow/Entered(atom/A) if(isliving(A)) diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index e5c4391e64..71c25b0755 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -14,9 +14,9 @@ var/image/turf_image var/list/decals - New(var/location = null, var/turf/simulated/shuttle/turf) - ..(null) - my_turf = turf +/obj/landed_holder/New(var/location = null, var/turf/simulated/shuttle/turf) + ..(null) + my_turf = turf /obj/landed_holder/proc/land_on(var/turf/T) //Gather destination information diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 2268315f96..c3d1f1aa31 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -1,6 +1,3 @@ -#define ZONE_BLOCKED 2 -#define AIR_BLOCKED 1 - //Interactions /turf/simulated/wall/proc/toggle_open(var/mob/user) @@ -37,9 +34,6 @@ can_open = WALL_CAN_OPEN update_icon() -#undef ZONE_BLOCKED -#undef AIR_BLOCKED - /turf/simulated/wall/proc/update_air() if(!air_master) return diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 9a5c0c4b48..eaef2357b8 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -195,7 +195,7 @@ var/list/shoreline_icon_cache = list() desc = "This water smells pretty acrid." var/poisonlevel = 10 -turf/simulated/floor/water/contaminated/Entered(atom/movable/AM, atom/oldloc) +/turf/simulated/floor/water/contaminated/Entered(atom/movable/AM, atom/oldloc) ..() if(istype(AM, /mob/living)) var/mob/living/L = AM diff --git a/code/game/turfs/snow/snow.dm b/code/game/turfs/snow/snow.dm index a8ccd5b63b..465f1cb183 100644 --- a/code/game/turfs/snow/snow.dm +++ b/code/game/turfs/snow/snow.dm @@ -11,8 +11,6 @@ temperature = TN60C var/list/crossed_dirs = list() -#define FOOTSTEP_SPRITE_AMT 2 - /turf/snow/Entered(atom/A) if(ismob(A)) var/mdir = "[A.dir]" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index db8947b056..c6a2728108 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -95,7 +95,7 @@ step(user.pulling, get_dir(user.pulling.loc, src)) return 1 -turf/attackby(obj/item/weapon/W as obj, mob/user as mob) +/turf/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = W if(S.use_to_pickup && S.collection_mode) diff --git a/code/game/world.dm b/code/game/world.dm index 2895a191db..98ad8d05a8 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -571,7 +571,7 @@ var/failed_old_db_connections = 0 to_world_log("Feedback database connection established.") return 1 -proc/setup_database_connection() +/proc/setup_database_connection() if(failed_db_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to conenct anymore. return 0 @@ -596,7 +596,7 @@ proc/setup_database_connection() return . //This proc ensures that the connection to the feedback database (global variable dbcon) is established -proc/establish_db_connection() +/proc/establish_db_connection() if(failed_db_connections > FAILED_DB_CONNECTION_CUTOFF) return 0 @@ -616,7 +616,7 @@ proc/establish_db_connection() return 1 //These two procs are for the old database, while it's being phased out. See the tgstation.sql file in the SQL folder for more information. -proc/setup_old_database_connection() +/proc/setup_old_database_connection() if(failed_old_db_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to conenct anymore. return 0 @@ -641,7 +641,7 @@ proc/setup_old_database_connection() return . //This proc ensures that the connection to the feedback database (global variable dbcon) is established -proc/establish_old_db_connection() +/proc/establish_old_db_connection() if(failed_old_db_connections > FAILED_DB_CONNECTION_CUTOFF) return 0 diff --git a/code/js/byjax.dm b/code/js/byjax.dm index c776b8ac77..bf9d778989 100644 --- a/code/js/byjax.dm +++ b/code/js/byjax.dm @@ -34,7 +34,7 @@ callback_args - arguments for callback function Be sure to include required js functions in your page, or it'll raise an exception. */ -proc/send_byjax(receiver, control_id, target_element, new_content=null, callback=null, list/callback_args=null) +/proc/send_byjax(receiver, control_id, target_element, new_content=null, callback=null, list/callback_args=null) if(receiver && target_element && control_id) // && winexists(receiver, control_id)) var/list/argums = list(target_element, new_content) if(callback) diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 9edad6c4d0..a32ddc578d 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -1,6 +1,6 @@ //Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional. -datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/banip = null, var/bancid = null) +/datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/banip = null, var/bancid = null) if(!check_rights(R_MOD,0) && !check_rights(R_BAN)) return @@ -88,7 +88,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") +/datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") if(!check_rights(R_BAN)) return @@ -152,7 +152,7 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") DB_ban_unban_by_id(ban_id) -datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) +/datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) if(!check_rights(R_BAN)) return @@ -208,7 +208,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) to_chat(usr, "Cancelled") return -datum/admins/proc/DB_ban_unban_by_id(var/id) +/datum/admins/proc/DB_ban_unban_by_id(var/id) if(!check_rights(R_BAN)) return diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index e28c4fd570..ae48fa934b 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -1,6 +1,6 @@ #ifndef OVERRIDE_BAN_SYSTEM //Blocks an attempt to connect before even creating our client datum thing. -world/IsBanned(key,address,computer_id) +/world/IsBanned(key,address,computer_id) if(ckey(key) in admin_datums) return ..() @@ -81,5 +81,4 @@ world/IsBanned(key,address,computer_id) message_admins("[key] has logged in with a blank ip in the ban check.") return ..() //default pager ban stuff #endif -#undef OVERRIDE_BAN_SYSTEM diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 9676143751..482044e4af 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -20,7 +20,7 @@ var/global/floorIsLava = 0 var/msg = rendered to_chat(C,msg) -proc/admin_notice(var/message, var/rights) +/proc/admin_notice(var/message, var/rights) for(var/mob/M in mob_list) if(check_rights(rights, 0, M)) to_chat(M,message) @@ -1576,7 +1576,7 @@ var/datum/announcement/minor/admin_min_announcer = new P.adminbrowse() -datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies in +/datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies in /datum/admins/proc/faxCallback(var/obj/item/weapon/paper/admin/P, var/obj/machinery/photocopier/faxmachine/destination) var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index 4c5b1b481e..fb85a7db1c 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -3,11 +3,11 @@ /mob/var/attack_log = list( ) /mob/var/dialogue_log = list( ) -proc/log_and_message_admins(var/message as text, var/mob/user = usr) +/proc/log_and_message_admins(var/message as text, var/mob/user = usr) log_admin(user ? "[key_name(user)] [message]" : "EVENT [message]") message_admins(user ? "[key_name_admin(user)] [message]" : "EVENT [message]") -proc/log_and_message_admins_many(var/list/mob/users, var/message) +/proc/log_and_message_admins_many(var/list/mob/users, var/message) if(!users || !users.len) return @@ -18,7 +18,7 @@ proc/log_and_message_admins_many(var/list/mob/users, var/message) log_admin("[english_list(user_keys)] [message]") message_admins("[english_list(user_keys)] [message]") /* Old procs -proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message) +/proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message) if(victim) victim.attack_log += text("\[[time_stamp()]\] [key_name(attacker)] - [victim_message]") if(attacker) @@ -26,14 +26,14 @@ proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, va msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [attacker? uppertext(attacker.a_intent) : "N/A"]) (JMP)") -proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message) +/proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message) if(!victims || !victims.len) return for(var/mob/victim in victims) admin_attack_log(attacker, victim, attacker_message, victim_message, admin_message) -proc/admin_inject_log(mob/attacker, mob/victim, obj/item/weapon, reagents, amount_transferred, violent=0) +/proc/admin_inject_log(mob/attacker, mob/victim, obj/item/weapon, reagents, amount_transferred, violent=0) if(violent) violent = "violently " else diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index 40a96cb100..6a6a5d241e 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -3,7 +3,7 @@ // they can only be read by admins and moderators. // a single admin report -datum/admin_report/var +/datum//admin_report/var ID // the ID of the report body // the content of the report author // key of the author @@ -13,7 +13,7 @@ datum/admin_report/var offender_key // store the key of the offender offender_cid // store the cid of the offender -datum/report_topic_handler +/datum//report_topic_handler Topic(href,href_list) ..() var/client/C = locate(href_list["client"]) @@ -31,7 +31,7 @@ world/New() report_topic_handler = new // add a new news datums -proc/make_report(body, author, okey, cid) +/proc/make_report(body, author, okey, cid) var/savefile/Reports = new("data/reports.sav") var/list/reports var/lastID @@ -57,7 +57,7 @@ proc/make_report(body, author, okey, cid) Reports["lastID"] << lastID // load the reports from disk -proc/load_reports() +/proc/load_reports() var/savefile/Reports = new("data/reports.sav") var/list/reports @@ -68,7 +68,7 @@ proc/load_reports() return reports // check if there are any unhandled reports -client/proc/unhandled_reports() +/client/proc/unhandled_reports() if(!src.holder) return 0 var/list/reports = load_reports() @@ -80,7 +80,7 @@ client/proc/unhandled_reports() return 0 // checks if the player has an unhandled report against him -client/proc/is_reported() +/client/proc/is_reported() var/list/reports = load_reports() for(var/datum/admin_report/N in reports) if(!N.done) @@ -90,7 +90,7 @@ client/proc/is_reported() return 0 // display only the reports that haven't been handled -client/proc/display_admin_reports() +/client/proc/display_admin_reports() set category = "Admin" set name = "Display Admin Reports" if(!src.holder) return @@ -118,7 +118,7 @@ client/proc/display_admin_reports() usr << browse(output, "window=news;size=600x400") -client/proc/Report(mob/M as mob in world) +/client/proc/Report(mob/M as mob in world) set category = "Admin" if(!src.holder) return @@ -136,7 +136,7 @@ client/proc/Report(mob/M as mob in world) spawn(1) display_admin_reports() -client/proc/mark_report_done(ID as num) +/client/proc/mark_report_done(ID as num) if(!src.holder || src.holder.level < 0) return @@ -157,7 +157,7 @@ client/proc/mark_report_done(ID as num) Reports["reports"] << reports -client/proc/edit_report(ID as num) +/client/proc/edit_report(ID as num) if(!src.holder || src.holder.level < 0) to_chat(src, "You tried to modify the news, but you're not an admin!") return diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 90a5c26e54..cff69baffc 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -60,7 +60,7 @@ if rights_required == 0, then it simply checks if they are an admin. if it doesn't return 1 and show_msg=1 it will prints a message explaining why the check has failed generally it would be used like so: -proc/admin_proc() +/proc/admin_proc() if(!check_rights(R_ADMIN)) return to_world("you have enough rights!") diff --git a/code/modules/admin/player_notes.dm b/code/modules/admin/player_notes.dm index 882205d467..a029f116d6 100644 --- a/code/modules/admin/player_notes.dm +++ b/code/modules/admin/player_notes.dm @@ -4,11 +4,11 @@ /* #define NOTESFILE "data/player_notes.sav" //where the player notes are saved -datum/admins/proc/notes_show(var/ckey) +/datum/admins/proc/notes_show(var/ckey) usr << browse("Player Notes[notes_gethtml(ckey)]","window=player_notes;size=700x400") -datum/admins/proc/notes_gethtml(var/ckey) +/datum/admins/proc/notes_gethtml(var/ckey) var/savefile/notesfile = new(NOTESFILE) if(!notesfile) return "Error: Cannot access [NOTESFILE]" if(ckey) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f8387fb973..32babac135 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1979,13 +1979,13 @@ PlayerNotesFilter() return -mob/living/proc/can_centcom_reply() +/mob/living/proc/can_centcom_reply() return 0 -mob/living/carbon/human/can_centcom_reply() +/mob/living/carbon/human/can_centcom_reply() return istype(l_ear, /obj/item/device/radio/headset) || istype(r_ear, /obj/item/device/radio/headset) -mob/living/silicon/ai/can_centcom_reply() +/mob/living/silicon/ai/can_centcom_reply() return common_radio != null && !check_unable(2) /atom/proc/extra_admin_link() diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 7f9e02b769..fa623f5aaa 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -66,115 +66,117 @@ /obj/effect/bmode/builddir icon_state = "build" screen_loc = "NORTH,WEST" - Click() - switch(dir) - if(NORTH) - set_dir(EAST) - if(EAST) - set_dir(SOUTH) - if(SOUTH) - set_dir(WEST) - if(WEST) - set_dir(NORTHWEST) - if(NORTHWEST) - set_dir(NORTH) - return 1 + +/obj/effect/bmode/builddir/Click() + switch(dir) + if(NORTH) + set_dir(EAST) + if(EAST) + set_dir(SOUTH) + if(SOUTH) + set_dir(WEST) + if(WEST) + set_dir(NORTHWEST) + if(NORTHWEST) + set_dir(NORTH) + return 1 /obj/effect/bmode/buildhelp icon = 'icons/misc/buildmode.dmi' icon_state = "buildhelp" screen_loc = "NORTH,WEST+1" - Click() - switch(master.cl.buildmode) - if(BUILDMODE_BASIC) - to_chat(usr, "***********************************************************
\ - Left Mouse Button = Construct / Upgrade
\ - Right Mouse Button = Deconstruct / Delete / Downgrade
\ - Left Mouse Button + ctrl = R-Window
\ - Left Mouse Button + alt = Airlock

\ - Use the button in the upper left corner to
\ - change the direction of built objects.
\ - ***********************************************************
") +/obj/effect/bmode/buildhelp/Click() + switch(master.cl.buildmode) - if(BUILDMODE_ADVANCED) - to_chat(usr, "***********************************************************
\ - Right Mouse Button on buildmode button = Set object type
\ - Middle Mouse Button on buildmode button= On/Off object type saying
\ - Middle Mouse Button on turf/obj = Capture object type
\ - Left Mouse Button on turf/obj = Place objects
\ - Right Mouse Button = Delete objects
\ - Mouse Button + ctrl = Copy object type

\ - Use the button in the upper left corner to
\ - change the direction of built objects.
\ - ***********************************************************
") + if(BUILDMODE_BASIC) + to_chat(usr, "***********************************************************
\ + Left Mouse Button = Construct / Upgrade
\ + Right Mouse Button = Deconstruct / Delete / Downgrade
\ + Left Mouse Button + ctrl = R-Window
\ + Left Mouse Button + alt = Airlock

\ + Use the button in the upper left corner to
\ + change the direction of built objects.
\ + ***********************************************************
") - if(BUILDMODE_EDIT) - to_chat(usr, "***********************************************************
\ - Right Mouse Button on buildmode button = Select var(type) & value
\ - Left Mouse Button on turf/obj/mob = Set var(type) & value
\ - Right Mouse Button on turf/obj/mob = Reset var's value
\ - ***********************************************************
") + if(BUILDMODE_ADVANCED) + to_chat(usr, "***********************************************************
\ + Right Mouse Button on buildmode button = Set object type
\ + Middle Mouse Button on buildmode button= On/Off object type saying
\ + Middle Mouse Button on turf/obj = Capture object type
\ + Left Mouse Button on turf/obj = Place objects
\ + Right Mouse Button = Delete objects
\ + Mouse Button + ctrl = Copy object type

\ + Use the button in the upper left corner to
\ + change the direction of built objects.
\ + ***********************************************************
") - if(BUILDMODE_THROW) - to_chat(usr, "***********************************************************
\ - Left Mouse Button on turf/obj/mob = Select
\ - Right Mouse Button on turf/obj/mob = Throw
\ - ***********************************************************
") + if(BUILDMODE_EDIT) + to_chat(usr, "***********************************************************
\ + Right Mouse Button on buildmode button = Select var(type) & value
\ + Left Mouse Button on turf/obj/mob = Set var(type) & value
\ + Right Mouse Button on turf/obj/mob = Reset var's value
\ + ***********************************************************
") - if(BUILDMODE_ROOM) - to_chat(usr, "***********************************************************
\ - Left Mouse Button on turf = Select as point A
\ - Right Mouse Button on turf = Select as point B
\ - Right Mouse Button on buildmode button = Change floor/wall type
\ - ***********************************************************
") + if(BUILDMODE_THROW) + to_chat(usr, "***********************************************************
\ + Left Mouse Button on turf/obj/mob = Select
\ + Right Mouse Button on turf/obj/mob = Throw
\ + ***********************************************************
") - if(BUILDMODE_LADDER) - to_chat(usr, "***********************************************************
\ - Left Mouse Button on turf = Set as upper ladder loc
\ - Right Mouse Button on turf = Set as lower ladder loc
\ - ***********************************************************
") + if(BUILDMODE_ROOM) + to_chat(usr, "***********************************************************
\ + Left Mouse Button on turf = Select as point A
\ + Right Mouse Button on turf = Select as point B
\ + Right Mouse Button on buildmode button = Change floor/wall type
\ + ***********************************************************
") - if(BUILDMODE_CONTENTS) - to_chat(usr, "***********************************************************
\ - Left Mouse Button on turf/obj/mob = Select
\ - Right Mouse Button on turf/obj/mob = Move into selection
\ - ***********************************************************
") + if(BUILDMODE_LADDER) + to_chat(usr, "***********************************************************
\ + Left Mouse Button on turf = Set as upper ladder loc
\ + Right Mouse Button on turf = Set as lower ladder loc
\ + ***********************************************************
") - if(BUILDMODE_LIGHTS) - to_chat(usr, "***********************************************************
\ - Left Mouse Button on turf/obj/mob = Make it glow
\ - Right Mouse Button on turf/obj/mob = Reset glowing
\ - Right Mouse Button on buildmode button = Change glow properties
\ - ***********************************************************
") + if(BUILDMODE_CONTENTS) + to_chat(usr, "***********************************************************
\ + Left Mouse Button on turf/obj/mob = Select
\ + Right Mouse Button on turf/obj/mob = Move into selection
\ + ***********************************************************
") - if(BUILDMODE_AI) - to_chat(usr, "***********************************************************
\ - Left Mouse Button drag box = Select only mobs in box
\ - Left Mouse Button drag box + shift = Select additional mobs in area
\ - Left Mouse Button on non-mob = Deselect all mobs
\ - Left Mouse Button on AI mob = Select/Deselect mob
\ - Left Mouse Button + alt on AI mob = Toggle hostility on mob
\ - Left Mouse Button + shift on AI mob = Toggle AI (also resets)
\ - Left Mouse Button + ctrl on AI mob = Copy mob faction
\ - Right Mouse Button + ctrl on any mob = Paste mob faction copied with Left Mouse Button + shift
\ - Right Mouse Button on enemy mob = Command selected mobs to attack mob
\ - Right Mouse Button on allied mob = Command selected mobs to follow mob
\ - Right Mouse Button + shift on any mob = Command selected mobs to follow mob regardless of faction
\ - Note: The following also reset the mob's home position:
\ - Right Mouse Button on tile = Command selected mobs to move to tile (will cancel if enemies are seen)
\ - Right Mouse Button + shift on tile = Command selected mobs to reposition to tile (will not be inturrupted by enemies)
\ - Right Mouse Button + alt on obj/turfs = Command selected mobs to attack obj/turf
\ - ***********************************************************
") - return 1 + if(BUILDMODE_LIGHTS) + to_chat(usr, "***********************************************************
\ + Left Mouse Button on turf/obj/mob = Make it glow
\ + Right Mouse Button on turf/obj/mob = Reset glowing
\ + Right Mouse Button on buildmode button = Change glow properties
\ + ***********************************************************
") + + if(BUILDMODE_AI) + to_chat(usr, "***********************************************************
\ + Left Mouse Button drag box = Select only mobs in box
\ + Left Mouse Button drag box + shift = Select additional mobs in area
\ + Left Mouse Button on non-mob = Deselect all mobs
\ + Left Mouse Button on AI mob = Select/Deselect mob
\ + Left Mouse Button + alt on AI mob = Toggle hostility on mob
\ + Left Mouse Button + shift on AI mob = Toggle AI (also resets)
\ + Left Mouse Button + ctrl on AI mob = Copy mob faction
\ + Right Mouse Button + ctrl on any mob = Paste mob faction copied with Left Mouse Button + shift
\ + Right Mouse Button on enemy mob = Command selected mobs to attack mob
\ + Right Mouse Button on allied mob = Command selected mobs to follow mob
\ + Right Mouse Button + shift on any mob = Command selected mobs to follow mob regardless of faction
\ + Note: The following also reset the mob's home position:
\ + Right Mouse Button on tile = Command selected mobs to move to tile (will cancel if enemies are seen)
\ + Right Mouse Button + shift on tile = Command selected mobs to reposition to tile (will not be inturrupted by enemies)
\ + Right Mouse Button + alt on obj/turfs = Command selected mobs to attack obj/turf
\ + ***********************************************************
") + return 1 /obj/effect/bmode/buildquit icon_state = "buildquit" screen_loc = "NORTH,WEST+3" - Click() - togglebuildmode(master.cl.mob) - return 1 +/obj/effect/bmode/buildquit/Click() + togglebuildmode(master.cl.mob) + return 1 /obj/effect/bmode/buildholder density = 0 diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm index df28238177..ab84316054 100644 --- a/code/modules/admin/verbs/lightning_strike.dm +++ b/code/modules/admin/verbs/lightning_strike.dm @@ -95,6 +95,5 @@ C.ear_deaf += 10 to_chat(L, span("danger", "Lightning struck nearby, and the thunderclap is deafening!")) -#undef GROUNDING_ROD_RANGE #undef LIGHTNING_ZAP_RANGE #undef LIGHTNING_POWER diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index e317da1d40..ec25ff1dda 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -28,9 +28,9 @@ GLOBAL_LIST_BOILERPLATE(all_debugging_effects, /obj/effect/debugging) icon = 'icons/480x480.dmi' icon_state = "25percent" - New() - src.pixel_x = -224 - src.pixel_y = -224 +/obj/effect/debugging/camera_range/New() + src.pixel_x = -224 + src.pixel_y = -224 /obj/effect/debugging/marker icon = 'icons/turf/areas.dmi' diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 60f1640cdd..7df6891ce7 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -76,7 +76,7 @@ var/list/sounds_cache = list() M << 'bananaphone.ogg' -client/proc/space_asshole() +/client/proc/space_asshole() set category = "Fun" set name = "Space Asshole" @@ -87,7 +87,7 @@ client/proc/space_asshole() M << 'sound/music/space_asshole.ogg' -client/proc/honk_theme() +/client/proc/honk_theme() set category = "Fun" set name = "Honk" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 26e3001129..01f024b542 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -161,7 +161,7 @@ feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) +/proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(automute) if(!config.automute_on) return diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm index 30de8cc560..e5a958873d 100644 --- a/code/modules/alarm/alarm.dm +++ b/code/modules/alarm/alarm.dm @@ -135,5 +135,3 @@ /mob/living/silicon/robot/syndicate/get_alarm_cameras() return list() - -#undef ALARM_LOSS_DELAY diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm index b22114649d..ef19bb0c49 100644 --- a/code/modules/awaymissions/exile.dm +++ b/code/modules/awaymissions/exile.dm @@ -15,12 +15,12 @@ name = "exile" desc = "Prevents you from returning from away missions" - get_data() - var/dat = {" +/obj/item/weapon/implant/exile/get_data() + var/dat = {" Implant Specifications:
Name: [using_map.company_name] Employee Exile Implant
Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant
"} - return dat + return dat /obj/item/weapon/implantcase/exile name = "Glass Case- 'Exile'" @@ -29,23 +29,13 @@ icon_state = "implantcase-r" - New() - src.imp = new /obj/item/weapon/implant/exile( src ) - ..() - return +/obj/item/weapon/implantcase/exile/New() + src.imp = new /obj/item/weapon/implant/exile( src ) + ..() + return /obj/structure/closet/secure_closet/exile name = "Exile Implants" req_access = list(access_hos) - - New() - ..() - sleep(2) - new /obj/item/weapon/implanter/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - return \ No newline at end of file + starts_with = list(/obj/item/weapon/implanter/exile = 1, /obj/item/weapon/implantcase/exile = 5) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index c08ee1fa06..de22b807de 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -51,7 +51,7 @@ density = 1 */ //VOREStation Removal End -obj/machinery/gateway/centerstation/process() +/obj/machinery/gateway/centerstation/process() if(stat & (NOPOWER)) if(active) toggleoff() return diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index ee065d41d7..51f4e858e2 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -1,5 +1,10 @@ +<<<<<<< HEAD proc/createRandomZlevel() if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing +======= +/proc/createRandomZlevel() + if(awaydestinations.len) //crude, but it saves another var! +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) return var/list/potentialRandomZlevels = list() diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index bd9e604fe4..ad116e9013 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -403,7 +403,6 @@ var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `erro_connection_log`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');") query_accesslog.Execute() -#undef TOPIC_SPAM_DELAY #undef UPLOAD_LIMIT #undef MIN_CLIENT_VERSION @@ -433,17 +432,17 @@ //Precache the client with all other assets slowly, so as to not block other browse() calls addtimer(CALLBACK(GLOBAL_PROC, /proc/getFilesSlow, src, SSassets.preload, FALSE), 5 SECONDS) -mob/proc/MayRespawn() +/mob/proc/MayRespawn() return 0 -client/proc/MayRespawn() +/client/proc/MayRespawn() if(mob) return mob.MayRespawn() // Something went wrong, client is usually kicked or transfered to a new mob at this point return 0 -client/verb/character_setup() +/client/verb/character_setup() set name = "Character Setup" set category = "Preferences" if(prefs) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 0dfb61c8e5..b63077c0c6 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -1,8 +1,8 @@ -datum/preferences +/datum/preferences var/biological_gender = MALE var/identifying_gender = MALE -datum/preferences/proc/set_biological_gender(var/gender) +/datum/preferences/proc/set_biological_gender(var/gender) biological_gender = gender identifying_gender = gender @@ -140,7 +140,11 @@ datum/preferences/proc/set_biological_gender(var/gender) return TOPIC_REFRESH else if(href_list["metadata"]) +<<<<<<< HEAD var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message, extra = 0) //VOREStation Edit +======= + var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata) as message|null) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(new_metadata && CanUseTopic(user)) pref.metadata = new_metadata return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 07adef1ae4..a1771a67ee 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -98,7 +98,7 @@ display_name = "trenchcoat, grey" path = /obj/item/clothing/suit/storage/trench/grey -datum/gear/suit/duster +/datum/gear/suit/duster display_name = "cowboy duster" path = /obj/item/clothing/suit/storage/duster diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index da4bae455b..f18b4f649a 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -1,8 +1,3 @@ -//used for pref.alternate_option -#define GET_RANDOM_JOB 0 -#define BE_ASSISTANT 1 -#define RETURN_TO_LOBBY 2 - /datum/category_item/player_setup_item/occupation name = "Occupation" sort_order = 1 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 3d31c9e08f..cece75e07c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2,7 +2,7 @@ var/list/preferences_datums = list() -datum/preferences +/datum/preferences //doohickeys for savefiles var/path var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index e990ee1793..06f7aa5e06 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -15,25 +15,25 @@ var/list/spawntypes = list() var/announce_channel = "Common" var/allowed_mob_types = JOB_SILICON|JOB_CARBON - proc/check_job_spawning(job) - if(restrict_job && !(job in restrict_job)) - return 0 +/datum/spawnpoint/proc/check_job_spawning(job) + if(restrict_job && !(job in restrict_job)) + return 0 - if(disallow_job && (job in disallow_job)) - return 0 + if(disallow_job && (job in disallow_job)) + return 0 - var/datum/job/J = SSjob.get_job(job) - if(!J) // Couldn't find, admin shenanigans? Allow it - return 1 - - if(J.offmap_spawn && !(job in restrict_job)) - return 0 - - if(!(J.mob_type & allowed_mob_types)) - return 0 - + var/datum/job/J = SSjob.get_job(job) + if(!J) // Couldn't find, admin shenanigans? Allow it return 1 + if(J.offmap_spawn && !(job in restrict_job)) + return 0 + + if(!(J.mob_type & allowed_mob_types)) + return 0 + + return 1 + /datum/spawnpoint/proc/get_spawn_position() return get_turf(pick(turfs)) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c57c261322..b5ec162af7 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -1092,3 +1093,1048 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() +======= +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + /* + Sprites used when the clothing item is refit. This is done by setting icon_override. + For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. + Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), + while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). + */ + var/list/sprite_sheets_refit = null + var/ear_protection = 0 + var/blood_sprite_state + + var/index //null by default, if set, will change which dmi it uses + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + +/obj/item/clothing/update_icon() + overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_PROMETHEAN) //skrell/humans can wear each other's suits + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + sprite_sheets[target_species] = sprite_sheets_refit[target_species] + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_PROMETHEAN) //skrell helmets fit humans too + + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + sprite_sheets[target_species] = sprite_sheets_refit[target_species] + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/ears.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/obj/clothing/gloves.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/gloves.dmi', + SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/obj/clothing/rings.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/obj/clothing/hats.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + var/light_overlay = "helmet_light" + var/light_applied + var/brightness_on + var/on = 0 + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(brightness_on) + if(!isturf(user.loc)) + to_chat(user, "You cannot turn the light on while in this [user.loc]") + return + on = !on + to_chat(user, "You [on ? "enable" : "disable"] the helmet light.") + update_flashlight(user) + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + if(on && !light_applied) + set_light(brightness_on) + light_applied = 1 + else if(!on && light_applied) + set_light(0) + light_applied = 0 + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? "_[body_type]" : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets,body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/obj/clothing/masks.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/masks.dmi', + SPECIES_VOX = 'icons/mob/species/vox/masks.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/mask.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/mask.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/obj/clothing/shoes.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/shoes.dmi', + SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + overlays -= image(icon, "[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + overlays += image(icon, "[icon_state]_knife") + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/obj/clothing/suits.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/set_clothing_index() + ..() + + if(index && !icon_override) + icon = new /icon("icons/obj/clothing/suits_[index].dmi") + item_icons = list( + slot_l_hand_str = new /icon("icons/mob/items/lefthand_suits_[index].dmi"), + slot_r_hand_str = new /icon("icons/mob/items/righthand_suits_[index].dmi"), + ) + + return 1 + + return 0 + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + + set_clothing_index() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if((taurized && !istaurtail(H.tail_style)) || (!taurized && istaurtail(H.tail_style))) + taurize(user) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) + if(istaurtail(Taur.tail_style)) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/obj/clothing/uniforms.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/uniform.dmi', + SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/mob/uniform_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + if(!item_state_slots) + item_state_slots = list() + item_state_slots[slot_w_uniform_str] = worn_state + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d_s" in cached_icon_states(icon)) || ("[worn_state]_s" in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/set_clothing_index() + ..() + + if(index && !icon_override) + icon = new /icon("icons/obj/clothing/uniforms_[index].dmi") + + item_icons = list( + slot_l_hand_str = new /icon("icons/mob/items/lefthand_uniforms_[index].dmi"), + slot_r_hand_str = new /icon("icons/mob/items/righthand_uniforms_[index].dmi"), + ) + + rolled_down_icon = new /icon("icons/mob/uniform_rolled_down_[index].dmi") + rolled_down_sleeves_icon = new /icon("icons/mob/uniform_sleeves_rolled_[index].dmi") + return 1 + + return 0 + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)]) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(item_icons && item_icons[slot_w_uniform_str]) + under_icon = item_icons[slot_w_uniform_str] + else if ("[worn_state]_s" in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]_s" in cached_icon_states(under_icon))) || ("[worn_state]_d_s" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)]) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(item_icons && item_icons[slot_w_uniform_str]) + under_icon = item_icons[slot_w_uniform_str] + else if ("[worn_state]_s" in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else if(index) + under_icon = new /icon("[INV_W_UNIFORM_DEF_ICON]_[index].dmi") + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]_s" in cached_icon_states(under_icon))) || ("[worn_state]_r_s" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if("[worn_state]_s" in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + item_state_slots[slot_w_uniform_str] = "[worn_state]" + else + item_state_slots[slot_w_uniform_str] = "[worn_state]_d" + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + item_state_slots[slot_w_uniform_str] = "[worn_state]" + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if("[worn_state]_s" in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + item_state_slots[slot_w_uniform_str] = "[worn_state]" + else + item_state_slots[slot_w_uniform_str] = "[worn_state]_r" + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + item_state_slots[slot_w_uniform_str] = "[worn_state]" + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 49cf22bd9b..6bfd3248ac 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -500,19 +500,19 @@ BLIND // can't see anything enables_planes = list(VIS_FULLBRIGHT, VIS_CLOAKED) flash_protection = FLASH_PROTECTION_REDUCED - emp_act(severity) - if(istype(src.loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = src.loc - to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") - if(M.glasses == src) - M.Blind(3) - M.eye_blurry = 5 - // Don't cure being nearsighted - if(!(M.disabilities & NEARSIGHTED)) - M.disabilities |= NEARSIGHTED - spawn(100) - M.disabilities &= ~NEARSIGHTED - ..() +/obj/item/clothing/glasses/thermal/emp_act(severity) + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") + if(M.glasses == src) + M.Blind(3) + M.eye_blurry = 5 + // Don't cure being nearsighted + if(!(M.disabilities & NEARSIGHTED)) + M.disabilities |= NEARSIGHTED + spawn(100) + M.disabilities &= ~NEARSIGHTED + ..() /obj/item/clothing/glasses/thermal/New() ..() diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index a9cec00a5f..aa0f8055f5 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -91,7 +91,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE -obj/item/clothing/gloves/fingerless +/obj/item/clothing/gloves/fingerless desc = "A pair of gloves that don't actually cover the fingers." name = "fingerless gloves" icon_state = "fingerlessgloves" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index dbb5f6d939..f2465ab58c 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -184,13 +184,13 @@ siemens_coefficient = 1.5 item_icons = list() - update_icon(var/mob/living/carbon/human/user) - if(!istype(user)) return - var/icon/ears = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty") - ears.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) +/obj/item/clothing/head/kitty/update_icon(var/mob/living/carbon/human/user) + if(!istype(user)) return + var/icon/ears = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty") + ears.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") - ears.Blend(earbit, ICON_OVERLAY) + var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") + ears.Blend(earbit, ICON_OVERLAY) /obj/item/clothing/head/richard name = "chicken mask" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 996b2a9761..07b934e5ee 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -48,7 +48,7 @@ wizard_garb = 1 -obj/item/clothing/shoes/sandal/clogs +/obj/item/clothing/shoes/sandal/clogs name = "plastic clogs" desc = "A pair of plastic clog shoes." icon_state = "clogs" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 0184b70aef..eb75c00eef 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -263,13 +263,13 @@ body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDETIE|HIDEHOLSTER -obj/item/clothing/suit/kimono +/obj/item/clothing/suit/kimono name = "kimono" desc = "A traditional Japanese kimono." icon_state = "kimono" addblends = "kimono_a" -obj/item/clothing/suit/kamishimo +/obj/item/clothing/suit/kamishimo name = "kamishimo" desc = "Traditional Japanese menswear." icon_state = "kamishimo" diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 115e7c14e5..b962e88e67 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -31,53 +31,55 @@ /obj/item/clothing/suit/storage/toggle flags_inv = HIDEHOLSTER var/open = 0 //0 is closed, 1 is open, -1 means it won't be able to toggle - verb/toggle() - set name = "Toggle Coat Buttons" - set category = "Object" - set src in usr - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user - open = 0 - icon_state = initial(icon_state) - flags_inv = HIDETIE|HIDEHOLSTER - to_chat(usr, "You button up the coat.") - else if(open == 0) - open = 1 - icon_state = "[icon_state]_open" - flags_inv = HIDEHOLSTER - to_chat(usr, "You unbutton the coat.") - else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed - to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") - return - update_clothing_icon() //so our overlays update +/obj/item/clothing/suit/storage/toggle/verb/toggle() + set name = "Toggle Coat Buttons" + set category = "Object" + set src in usr + if(!usr.canmove || usr.stat || usr.restrained()) + return 0 + + if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user + open = 0 + icon_state = initial(icon_state) + flags_inv = HIDETIE|HIDEHOLSTER + to_chat(usr, "You button up the coat.") + else if(open == 0) + open = 1 + icon_state = "[icon_state]_open" + flags_inv = HIDEHOLSTER + to_chat(usr, "You unbutton the coat.") + else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed + to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") + return + update_clothing_icon() //so our overlays update /obj/item/clothing/suit/storage/hooded/toggle flags_inv = HIDEHOLSTER var/open = 0 //0 is closed, 1 is open, -1 means it won't be able to toggle - verb/toggle() - set name = "Toggle Coat Buttons" - set category = "Object" - set src in usr - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user - open = 0 - icon_state = initial(icon_state) - flags_inv = HIDETIE|HIDEHOLSTER - to_chat(usr, "You button up the coat.") - else if(open == 0) - open = 1 - icon_state = "[icon_state]_open" - flags_inv = HIDEHOLSTER - to_chat(usr, "You unbutton the coat.") - else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed - to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") - return - update_clothing_icon() //so our overlays update +/obj/item/clothing/suit/storage/hooded/toggle/verb/toggle() + set name = "Toggle Coat Buttons" + set category = "Object" + set src in usr + if(!usr.canmove || usr.stat || usr.restrained()) + return 0 + + if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user + open = 0 + icon_state = initial(icon_state) + flags_inv = HIDETIE|HIDEHOLSTER + to_chat(usr, "You button up the coat.") + else if(open == 0) + open = 1 + icon_state = "[icon_state]_open" + flags_inv = HIDEHOLSTER + to_chat(usr, "You unbutton the coat.") + else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed + to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") + return + update_clothing_icon() //so our overlays update //New Vest 4 pocket storage and badge toggles, until suit accessories are a thing. @@ -90,21 +92,22 @@ /obj/item/clothing/suit/storage/vest var/icon_badge var/icon_nobadge - verb/toggle() - set name ="Adjust Badge" - set category = "Object" - set src in usr - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - if(icon_state == icon_badge) - icon_state = icon_nobadge - to_chat(usr, "You conceal \the [src]'s badge.") - else if(icon_state == icon_nobadge) - icon_state = icon_badge - to_chat(usr, "You reveal \the [src]'s badge.") - else - to_chat(usr, "\The [src] does not have a badge.") - return - update_clothing_icon() +/obj/item/clothing/suit/storage/vest/verb/toggle() + set name ="Adjust Badge" + set category = "Object" + set src in usr + if(!usr.canmove || usr.stat || usr.restrained()) + return 0 + + if(icon_state == icon_badge) + icon_state = icon_nobadge + to_chat(usr, "You conceal \the [src]'s badge.") + else if(icon_state == icon_nobadge) + icon_state = icon_badge + to_chat(usr, "You reveal \the [src]'s badge.") + else + to_chat(usr, "\The [src] does not have a badge.") + return + update_clothing_icon() diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index e20fac493a..032830294c 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -395,7 +395,7 @@ // Helmet Covers ///////////////// -obj/item/clothing/accessory/armor/helmcover +/obj/item/clothing/accessory/armor/helmcover name = "helmet cover" desc = "A fabric cover for armored helmets." icon_override = 'icons/mob/ties.dmi' diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 085279c424..75e8dc8e4d 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -109,15 +109,10 @@ /obj/item/weapon/storage/box/holobadge name = "holobadge box" desc = "A box claiming to contain holobadges." - New() - new /obj/item/clothing/accessory/badge/holo(src) - new /obj/item/clothing/accessory/badge/holo(src) - new /obj/item/clothing/accessory/badge/holo(src) - new /obj/item/clothing/accessory/badge/holo(src) - new /obj/item/clothing/accessory/badge/holo/cord(src) - new /obj/item/clothing/accessory/badge/holo/cord(src) - ..() - return + starts_with = list( + /obj/item/clothing/accessory/badge/holo = 4, + /obj/item/clothing/accessory/badge/holo/cord = 2 + ) /obj/item/clothing/accessory/badge/holo/warden name = "warden's holobadge" @@ -140,16 +135,14 @@ /obj/item/weapon/storage/box/holobadge/hos name = "holobadge box" desc = "A box claiming to contain holobadges." - New() - new /obj/item/clothing/accessory/badge/holo(src) - new /obj/item/clothing/accessory/badge/holo(src) - new /obj/item/clothing/accessory/badge/holo/warden(src) - new /obj/item/clothing/accessory/badge/holo/detective(src) - new /obj/item/clothing/accessory/badge/holo/detective(src) - new /obj/item/clothing/accessory/badge/holo/hos(src) - new /obj/item/clothing/accessory/badge/holo/cord(src) - ..() - return + starts_with = list( + /obj/item/clothing/accessory/badge/holo = 2, + /obj/item/clothing/accessory/badge/holo/warden = 1, + /obj/item/clothing/accessory/badge/holo/detective = 2, + /obj/item/clothing/accessory/badge/holo/hos = 1, + /obj/item/clothing/accessory/badge/holo/cord = 1 + + ) // Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT. diff --git a/code/modules/compass/compass_waypoint.dm b/code/modules/compass/compass_waypoint.dm index 2895d90096..24f9978bb8 100644 --- a/code/modules/compass/compass_waypoint.dm +++ b/code/modules/compass/compass_waypoint.dm @@ -25,6 +25,3 @@ M.Translate(0, (name ? COMPASS_LABEL_OFFSET-4 : COMPASS_LABEL_OFFSET)) M.Turn(ATAN2(cy-y, cx-x)+180) compass_overlay.transform = M - -#undef COMPASS_PERIOD -#undef COMPASS_INTERVAL diff --git a/code/modules/compass/^compass.dm b/code/modules/compass/~compass.dm similarity index 100% rename from code/modules/compass/^compass.dm rename to code/modules/compass/~compass.dm diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 7bb68feb34..3f6dc119d0 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -5,12 +5,12 @@ //This is the output of the stringpercent(print) proc, and means about 80% of //the print must be there for it to be complete. (Prints are 32 digits) var/const/FINGERPRINT_COMPLETE = 6 -proc/is_complete_print(var/print) +/proc/is_complete_print(var/print) return stringpercent(print) <= FINGERPRINT_COMPLETE -atom/var/list/suit_fibers +/atom/var/list/suit_fibers -atom/proc/add_fibers(mob/living/carbon/human/M) +/atom/proc/add_fibers(mob/living/carbon/human/M) if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) var/obj/item/clothing/gloves/G = M.gloves if(G.transfer_blood) //bloodied gloves transfer blood to touched objects diff --git a/code/modules/economy/Events.dm b/code/modules/economy/Events.dm index 9ce263cd17..1b14f0b78c 100644 --- a/code/modules/economy/Events.dm +++ b/code/modules/economy/Events.dm @@ -26,16 +26,16 @@ if(INDUSTRIAL_ACCIDENT) dearer_goods = list(EMERGENCY, BIOMEDICAL, ROBOTICS) if(BIOHAZARD_OUTBREAK) - dearer_goods = list(BIOMEDICAL, GAS) + dearer_goods = list(BIOMEDICAL, GASEOUS) if(PIRATES) dearer_goods = list(SECURITY, MINERALS) if(CORPORATE_ATTACK) dearer_goods = list(SECURITY, MAINTENANCE) if(ALIEN_RAIDERS) dearer_goods = list(BIOMEDICAL, ANIMALS) - cheaper_goods = list(GAS, MINERALS) + cheaper_goods = list(GASEOUS, MINERALS) if(AI_LIBERATION) - dearer_goods = list(EMERGENCY, GAS, MAINTENANCE) + dearer_goods = list(EMERGENCY, GASEOUS, MAINTENANCE) if(MOURNING) cheaper_goods = list(MINERALS, MAINTENANCE) if(CULT_CELL_REVEALED) diff --git a/code/modules/economy/Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm index 9c6a428852..29f1457fd2 100644 --- a/code/modules/economy/Events_Mundane.dm +++ b/code/modules/economy/Events_Mundane.dm @@ -1,129 +1,4 @@ -/* /datum/event/mundane_news - endWhen = 10 - -/datum/event/mundane_news/announce() - var/datum/trade_destination/affected_dest = pickweight(weighted_mundaneevent_locations) - var/event_type = 0 - if(affected_dest.viable_mundane_events.len) - event_type = pick(affected_dest.viable_mundane_events) - - if(!event_type) - return - - var/author = "The "+using_map.starsys_name+" Times" - var/channel = author - - //see if our location has custom event info for this event - var/body = affected_dest.get_custom_eventstring() - if(!body) - body = "" - switch(event_type) - if(RESEARCH_BREAKTHROUGH) - body = "A major breakthough in the field of [pick("phoron research","super-compressed materials","nano-augmentation","bluespace research","volatile power manipulation")] \ - was announced [pick("yesterday","a few days ago","last week","earlier this month")] by a private firm on [affected_dest.name]. \ - [using_map.company_name] declined to comment as to whether this could impinge on profits." - - if(ELECTION) - body = "The pre-selection of an additional candidates was announced for the upcoming [pick("supervisors council","advisory board","governership","board of inquisitors")] \ - election on [affected_dest.name] was announced earlier today, \ - [pick("media mogul","web celebrity", "industry titan", "superstar", "famed chef", "popular gardener", "ex-army officer", "multi-billionaire")] \ - [random_name(pick(MALE,FEMALE))]. In a statement to the media they said '[pick("My only goal is to help the [pick("sick","poor","children")]",\ - "I will maintain my company's record profits","I believe in our future","We must return to our moral core","Just like... chill out dudes")]'." - - if(RESIGNATION) - body = "[using_map.company_name] regretfully announces the resignation of [pick("Sector Admiral","Division Admiral","Ship Admiral","Vice Admiral")] [random_name(pick(MALE,FEMALE))]." - if(prob(25)) - var/locstring = pick("Segunda","Salusa","Cepheus","Andromeda","Gruis","Corona","Aquila","Asellus") + " " + pick("I","II","III","IV","V","VI","VII","VIII") - body += " In a ceremony on [affected_dest.name] this afternoon, they will be awarded the \ - [pick("Red Star of Sacrifice","Purple Heart of Heroism","Blue Eagle of Loyalty","Green Lion of Ingenuity")] for " - if(prob(33)) - body += "their actions at the Battle of [pick(locstring,"REDACTED")]." - else if(prob(50)) - body += "their contribution to the colony of [locstring]." - else - body += "their loyal service over the years." - else if(prob(33)) - body += " They are expected to settle down in [affected_dest.name], where they have been granted a handsome pension." - else if(prob(50)) - body += " The news was broken on [affected_dest.name] earlier today, where they cited reasons of '[pick("health","family","REDACTED")]'" - else - body += " Administration Aerospace wishes them the best of luck in their retirement ceremony on [affected_dest.name]." - - if(CELEBRITY_DEATH) - body = "It is with regret today that we announce the sudden passing of the " - if(prob(33)) - body += "[pick("distinguished","decorated","veteran","highly respected")] \ - [pick("Ship's Captain","Vice Admiral","Colonel","Lieutenant Colonel")] " - else if(prob(50)) - body += "[pick("award-winning","popular","highly respected","trend-setting")] \ - [pick("comedian","singer/songwright","artist","playwright","TV personality","model")] " - else - body += "[pick("successful","highly respected","ingenious","esteemed")] \ - [pick("academic","Professor","Doctor","Scientist")] " - - body += "[random_name(pick(MALE,FEMALE))] on [affected_dest.name] [pick("last week","yesterday","this morning","two days ago","three days ago")]\ - [pick(". Assassination is suspected, but the perpetrators have not yet been brought to justice",\ - " due to mercenary infiltrators (since captured)",\ - " during an industrial accident",\ - " due to [pick("heart failure","kidney failure","liver failure","brain hemorrhage")]")]" - - if(BARGAINS) - body += "BARGAINS! BARGAINS! BARGAINS! Commerce Control on [affected_dest.name] wants you to know that everything must go! Across all retail centres, \ - all goods are being slashed, and all retailors are onboard - so come on over for the \[shopping\] time of your life." - - if(SONG_DEBUT) - body += "[pick("Singer","Singer/songwriter","Saxophonist","Pianist","Guitarist","TV personality","Star")] [random_name(pick(MALE,FEMALE))] \ - announced the debut of their new [pick("single","album","EP","label")] '[pick("Everyone's","Look at the","Baby don't eye those","All of those","Dirty nasty")] \ - [pick("roses","three stars","starships","nanobots","cyborgs","Skrell","Sren'darr")] \ - [pick("on Venus","on Reade","on Moghes","in my hand","slip through my fingers","die for you","sing your heart out","fly away")]' \ - with [pick("pre-puchases available","a release tour","cover signings","a launch concert")] on [affected_dest.name]." - - if(MOVIE_RELEASE) - body += "From the [pick("desk","home town","homeworld","mind")] of [pick("acclaimed","award-winning","popular","stellar")] \ - [pick("playwright","author","director","actor","TV star")] [random_name(pick(MALE,FEMALE))] comes the latest sensation: '\ - [pick("Deadly","The last","Lost","Dead")] [pick("Starships","Warriors","outcasts","Tajarans","Unathi","Skrell")] \ - [pick("of","from","raid","go hunting on","visit","ravage","pillage","destroy")] \ - [pick("Moghes","Earth","Biesel","Meralar","Rarkajar","the Void","the Edge of Space")]'.\ - . Own it on webcast today, or visit the galactic premier on [affected_dest.name]!" - - if(BIG_GAME_HUNTERS) - body += "Game hunters on [affected_dest.name] " - if(prob(33)) - body += "were surprised when an unusual species experts have since identified as \ - [pick("a subclass of mammal","a divergent abhuman species","an intelligent species of lemur","organic/cyborg hybrids")] turned up. Believed to have been brought in by \ - [pick("alien smugglers","early colonists","mercenary raiders","unwitting tourists")], this is the first such specimen discovered in the wild." - else if(prob(50)) - body += "were attacked by a vicious [pick("nas'r","diyaab","samak","predator which has not yet been identified")]\ - . Officials urge caution, and locals are advised to stock up on armaments." - else - body += "brought in an unusually [pick("valuable","rare","large","vicious","intelligent")] [pick("mammal","predator","farwa","samak")] for inspection \ - [pick("today","yesterday","last week")]. Speculators suggest they may be tipped to break several records." - - if(GOSSIP) - body += "[pick("TV host","Webcast personality","Superstar","Model","Actor","Singer")] [random_name(pick(MALE,FEMALE))] " - if(prob(33)) - body += "and their partner announced the birth of their [pick("first","second","third")] child on [affected_dest.name] early this morning. \ - Doctors say the child is well, and the parents are considering " - if(prob(50)) - body += capitalize(pick(first_names_female)) - else - body += capitalize(pick(first_names_male)) - body += " for the name." - else if(prob(50)) - body += "announced their [pick("split","break up","marriage","engagement")] with [pick("TV host","webcast personality","superstar","model","actor","singer")] \ - [random_name(pick(MALE,FEMALE))] at [pick("a society ball","a new opening","a launch","a club")] on [affected_dest.name] yesterday, pundits are shocked." - else - body += "is recovering from plastic surgery in a clinic on [affected_dest.name] for the [pick("second","third","fourth")] time, reportedly having made the decision in response to " - body += "[pick("unkind comments by an ex","rumours started by jealous friends",\ - "the decision to be dropped by a major sponsor","a disasterous interview on [using_map.starsys_name] Tonight")]." - if(TOURISM) - body += "Tourists are flocking to [affected_dest.name] after the surprise announcement of [pick("major shopping bargains by a wily retailer",\ - "a huge new ARG by a popular entertainment company","a secret tour by popular artiste [random_name(pick(MALE,FEMALE))]")]. \ - The [using_map.starsys_name] Times is offering discount tickets for two to see [random_name(pick(MALE,FEMALE))] live in return for eyewitness reports and up to the minute coverage." - - news_network.SubmitArticle(body, author, channel, null, 1) -*/ /datum/event/trivial_news endWhen = 10 @@ -140,7 +15,7 @@ "Pens proclaim pencils obsolete, 'lead is dead'.",\ "Rock and paper sues scissors for discrimination.",\ "Steak tell-all book reveals he never liked sitting by potato.",\ - "Woodchuck stops counting how many times he’s chucked 'Never again'.",\ + "Woodchuck stops counting how many times he�s chucked 'Never again'.",\ "[affected_dest.name] clerk first person able to pronounce '@*$%!'.",\ "[affected_dest.name] delis serving boiled paperback dictionaries, 'Adjectives chewy' customers declare.",\ "[affected_dest.name] weather deemed 'boring'; meteors and rad storms to be imported.",\ @@ -156,8 +31,8 @@ "Skrell marries computer; wedding attended by 100 modems.",\ "Chef reports successfully using harmonica as cheese grater.",\ "[using_map.company_name] invents handkerchief that says 'Bless you' after sneeze.",\ - "Clone accused of posing for other clones’s school photo.",\ - "Clone accused of stealing other clones’s employee of the month award.",\ + "Clone accused of posing for other clones�s school photo.",\ + "Clone accused of stealing other clones�s employee of the month award.",\ "Woman robs station with hair dryer; crewmen love new style.",\ "This space for rent.",\ "[affected_dest.name] Baker Wins Pickled Crumpet Toss Three Years Running",\ diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm index fbe4003e81..8225e34efc 100644 --- a/code/modules/economy/TradeDestinations.dm +++ b/code/modules/economy/TradeDestinations.dm @@ -11,7 +11,7 @@ var/list/weighted_mundaneevent_locations = list() var/can_shuttle_here = 0 //one day crew from the station will be able to travel to this destination var/list/viable_random_events = list() var/list/temp_price_change[BIOMEDICAL] - var/list/viable_mundane_events = list() + var/mundane_probability = 0 /datum/trade_destination/proc/get_custom_eventstring(var/event_type) return null @@ -24,7 +24,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(SECURITY_BREACH, CORPORATE_ATTACK, AI_LIBERATION) - viable_mundane_events = list(ELECTION, RESIGNATION, CELEBRITY_DEATH) + mundane_probability = 3 /datum/trade_destination/nohio name = "New Ohio" @@ -33,7 +33,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(SECURITY_BREACH, CULT_CELL_REVEALED, BIOHAZARD_OUTBREAK, PIRATES, ALIEN_RAIDERS) - viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH, BARGAINS, GOSSIP) + mundane_probability = 4 /datum/trade_destination/sophia name = "Sophia" @@ -42,7 +42,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(INDUSTRIAL_ACCIDENT, PIRATES, CORPORATE_ATTACK) - viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH) + mundane_probability = 2 /datum/trade_destination/jade name = "Jade" @@ -51,7 +51,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(PIRATES, INDUSTRIAL_ACCIDENT) - viable_mundane_events = list(TOURISM) + mundane_probability = 1 /datum/trade_destination/sif name = "Sif" @@ -60,7 +60,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING) - viable_mundane_events = list(BARGAINS, GOSSIP, SONG_DEBUT, MOVIE_RELEASE, ELECTION, TOURISM, RESIGNATION, CELEBRITY_DEATH) + mundane_probability = 8 /datum/trade_destination/mars name = "Mars" @@ -69,7 +69,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING) - viable_mundane_events = list(ELECTION, TOURISM, RESIGNATION) + mundane_probability = 3 /datum/trade_destination/nisp name = "Nisp" @@ -78,7 +78,7 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS) - viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION) + mundane_probability = 4 /datum/trade_destination/abelsrest name = "Abel's Rest" @@ -87,4 +87,4 @@ var/list/weighted_mundaneevent_locations = list() willing_to_buy = list() willing_to_sell = list() viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS) - viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION) + mundane_probability = 4 diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index d84132ca86..c67ddac088 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -141,7 +141,7 @@ desc = "It's worth 1000 Thalers." worth = 1000 -proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob) +/proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob) var/obj/item/weapon/spacecash/SC = new (spawnloc) SC.set_worth(sum) @@ -157,9 +157,10 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob) drop_sound = 'sound/items/drop/card.ogg' pickup_sound = 'sound/items/pickup/card.ogg' var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. - attack_self() return //Don't act - attackby() return //like actual - update_icon() return //space cash + +/obj/item/weapon/spacecash/ewallet/attack_self() return //Don't act +/obj/item/weapon/spacecash/ewallet/attackby() return //like actual +/obj/item/weapon/spacecash/ewallet/update_icon() return //space cash /obj/item/weapon/spacecash/ewallet/examine(mob/user) . = ..() diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index 4dce5a62a8..a44c7c03fd 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -3,7 +3,6 @@ #define WILD_ANIMAL_ATTACK 2 #define INDUSTRIAL_ACCIDENT 3 #define BIOHAZARD_OUTBREAK 4 -#define WARSHIPS_ARRIVE 5 #define PIRATES 6 #define CORPORATE_ATTACK 7 #define ALIEN_RAIDERS 8 @@ -14,37 +13,15 @@ #define ANIMAL_RIGHTS_RAID 13 #define FESTIVAL 14 -#define RESEARCH_BREAKTHROUGH 15 -#define BARGAINS 16 -#define SONG_DEBUT 17 -#define MOVIE_RELEASE 18 -#define BIG_GAME_HUNTERS 19 -#define ELECTION 20 -#define GOSSIP 21 -#define TOURISM 22 -#define CELEBRITY_DEATH 23 -#define RESIGNATION 24 - -#define DEFAULT 1 - -#define ADMINISTRATIVE 2 -#define CLOTHING 3 -#define SECURITY 4 -#define SPECIAL_SECURITY 5 - -#define FOOD 6 -#define ANIMALS 7 - -#define MINERALS 8 - -#define EMERGENCY 9 -#define GAS 10 -#define MAINTENANCE 11 -#define ELECTRICAL 12 -#define ROBOTICS 13 -#define BIOMEDICAL 14 - -#define GEAR_EVA 15 +#define SECURITY 1 +#define FOOD 2 +#define ANIMALS 3 +#define MINERALS 4 +#define EMERGENCY 5 +#define GASEOUS 6 +#define MAINTENANCE 7 +#define ROBOTICS 8 +#define BIOMEDICAL 9 //---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel: @@ -86,7 +63,7 @@ var/global/economy_init = 0 for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination) var/datum/trade_destination/D = new loc_type weighted_randomevent_locations[D] = D.viable_random_events.len - weighted_mundaneevent_locations[D] = D.viable_mundane_events.len + weighted_mundaneevent_locations[D] = D.mundane_probability create_station_account() diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm index b6b2b6e1b0..23ce932f06 100644 --- a/code/modules/economy/price_list.dm +++ b/code/modules/economy/price_list.dm @@ -980,9 +980,8 @@ /obj/item/weapon/reagent_containers/food/snacks/dionaroast price_tag = 25 -/obj/item/pizzabox - get_item_cost() - return get_item_cost(pizza) +/obj/item/pizzabox/get_item_cost() + return get_item_cost(pizza) //***************// diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index d24e774ed8..9bcad8837d 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -1,9 +1,9 @@ //var/global/list/event_viruses = list() // so that event viruses are kept around for admin logs, rather than being GCed -datum/event/viral_infection +/datum/event/viral_infection var/list/viruses = list() -datum/event/viral_infection/setup() +/datum/event/viral_infection/setup() announceWhen = rand(0, 3000) endWhen = announceWhen + 1 @@ -18,7 +18,7 @@ datum/event/viral_infection/setup() D.makerandom(strength) viruses += D -datum/event/viral_infection/announce() +/datum/event/viral_infection/announce() var/level if (severity == EVENT_LEVEL_MUNDANE) return @@ -30,7 +30,7 @@ datum/event/viral_infection/announce() if (severity == EVENT_LEVEL_MAJOR || prob(60)) command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard \the [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') -datum/event/viral_infection/start() +/datum/event/viral_infection/start() if(!viruses.len) return var/list/candidates = list() //list of candidate keys diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index da620aca6f..f03580dde0 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -22,7 +22,7 @@ var/list/dreams = list( "swallowed whole","a fox","a wolf","a cat","a tiger","a dog","a taur","a xenochimera" ) -mob/living/carbon/proc/dream() +/mob/living/carbon/proc/dream() dreaming = 1 spawn(0) @@ -35,8 +35,8 @@ mob/living/carbon/proc/dream() dreaming = 0 return -mob/living/carbon/proc/handle_dreams() +/mob/living/carbon/proc/handle_dreams() if(client && !dreaming && prob(5)) dream() -mob/living/carbon/var/dreaming = 0 +/mob/living/carbon/var/dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 51cf85b6a2..5fac3debd7 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -11,7 +11,7 @@ Gunshots/explosions/opening doors/less rare audio (done) */ -mob/living/carbon/var +/mob/living/carbon/var image/halimage image/halbody obj/halitem @@ -19,7 +19,7 @@ mob/living/carbon/var handling_hal = 0 hal_crit = 0 -mob/living/carbon/proc/handle_hallucinations() +/mob/living/carbon/proc/handle_hallucinations() if(handling_hal) return handling_hal = 1 while(client && hallucination > 20) @@ -211,7 +211,7 @@ mob/living/carbon/proc/handle_hallucinations() return start_txt + mocktxt + end_txt + "
" -proc/check_panel(mob/M) +/proc/check_panel(mob/M) if (istype(M, /mob/living/carbon/human) || istype(M, /mob/living/silicon/ai)) if(M.hallucination < 15) return 1 @@ -241,87 +241,89 @@ proc/check_panel(mob/M) var/health = 100 - attackby(var/obj/item/weapon/P as obj, mob/user as mob) +/obj/effect/fake_attacker/attackby(var/obj/item/weapon/P as obj, mob/user as mob) + step_away(src,my_target,2) + for(var/mob/M in oviewers(world.view,my_target)) + to_chat(M, "[my_target] flails around wildly.") + my_target.show_message("[src] has been attacked by [my_target] ", 1) //Lazy. + + src.health -= P.force + + + return + +/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber) + if(M == my_target) step_away(src,my_target,2) - for(var/mob/M in oviewers(world.view,my_target)) - to_chat(M, "[my_target] flails around wildly.") - my_target.show_message("[src] has been attacked by [my_target] ", 1) //Lazy. + if(prob(30)) + for(var/mob/O in oviewers(world.view , my_target)) + to_chat(O, "[my_target] stumbles around.") - src.health -= P.force +/obj/effect/fake_attacker/New() + ..() + QDEL_IN(src, 30 SECONDS) + step_away(src,my_target,2) + spawn attack_loop() + +/obj/effect/fake_attacker/Destroy() + if(my_target) + my_target.hallucinations -= src + return ..() - return - - Crossed(var/mob/M, somenumber) - if(M == my_target) - step_away(src,my_target,2) - if(prob(30)) - for(var/mob/O in oviewers(world.view , my_target)) - to_chat(O, "[my_target] stumbles around.") - - New() - ..() - spawn(300) - if(my_target) - my_target.hallucinations -= src - qdel(src) - step_away(src,my_target,2) - spawn attack_loop() +/obj/effect/fake_attacker/proc/updateimage() +// qdel(src.currentimage) - proc/updateimage() - // qdel(src.currentimage) + if(src.dir == NORTH) + qdel(src.currentimage) + src.currentimage = new /image(up,src) + else if(src.dir == SOUTH) + qdel(src.currentimage) + src.currentimage = new /image(down,src) + else if(src.dir == EAST) + qdel(src.currentimage) + src.currentimage = new /image(right,src) + else if(src.dir == WEST) + qdel(src.currentimage) + src.currentimage = new /image(left,src) + my_target << currentimage - if(src.dir == NORTH) - qdel(src.currentimage) - src.currentimage = new /image(up,src) - else if(src.dir == SOUTH) - qdel(src.currentimage) - src.currentimage = new /image(down,src) - else if(src.dir == EAST) - qdel(src.currentimage) - src.currentimage = new /image(right,src) - else if(src.dir == WEST) - qdel(src.currentimage) - src.currentimage = new /image(left,src) - my_target << currentimage - - - proc/attack_loop() - while(1) - sleep(rand(5,10)) - if(src.health < 0) - collapse() - continue - if(get_dist(src,my_target) > 1) - src.set_dir(get_dir(src,my_target)) - step_towards(src,my_target) - updateimage() - else - if(prob(15)) - if(weapon_name) - my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')) - my_target.show_message("[my_target] has been attacked with [weapon_name] by [src.name] ", 1) - my_target.halloss += 8 - if(prob(20)) my_target.eye_blurry += 3 - if(prob(33)) - if(!locate(/obj/effect/overlay) in my_target.loc) - fake_blood(my_target) - else - my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')) - my_target.show_message("[src.name] has punched [my_target]!", 1) - my_target.halloss += 4 - if(prob(33)) - if(!locate(/obj/effect/overlay) in my_target.loc) - fake_blood(my_target) - +/obj/effect/fake_attacker/proc/attack_loop() + while(1) + sleep(rand(5,10)) + if(src.health < 0) + collapse() + continue + if(get_dist(src,my_target) > 1) + src.set_dir(get_dir(src,my_target)) + step_towards(src,my_target) + updateimage() + else if(prob(15)) - step_away(src,my_target,2) + if(weapon_name) + my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')) + my_target.show_message("[my_target] has been attacked with [weapon_name] by [src.name] ", 1) + my_target.halloss += 8 + if(prob(20)) my_target.eye_blurry += 3 + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + else + my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')) + my_target.show_message("[src.name] has punched [my_target]!", 1) + my_target.halloss += 4 + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) - proc/collapse() - collapse = 1 - updateimage() + if(prob(15)) + step_away(src,my_target,2) + +/obj/effect/fake_attacker/proc/collapse() + collapse = 1 + updateimage() /proc/fake_blood(var/mob/target) var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc) diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index bc133a83b8..ff6a44c3dc 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -1,6 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 -proc/Intoxicated(phrase) +/proc/Intoxicated(phrase) phrase = html_decode(phrase) var/leng=length(phrase) var/counter=length(phrase) @@ -23,7 +23,7 @@ proc/Intoxicated(phrase) newphrase+="[newletter]";counter-=1 return newphrase -proc/NewStutter(phrase,stunned) +/proc/NewStutter(phrase,stunned) phrase = html_decode(phrase) var/list/split_phrase = splittext(phrase," ") //Split it up into words. @@ -59,10 +59,10 @@ proc/NewStutter(phrase,stunned) return sanitize(jointext(split_phrase," ")) -proc/Stagger(mob/M,d) //Technically not a filter, but it relates to drunkenness. +/proc/Stagger(mob/M,d) //Technically not a filter, but it relates to drunkenness. step(M, pick(d,turn(d,90),turn(d,-90))) -proc/Ellipsis(original_msg, chance = 50) +/proc/Ellipsis(original_msg, chance = 50) if(chance <= 0) return "..." if(chance >= 100) return original_msg diff --git a/code/modules/food/drinkingglass/glass_boxes.dm b/code/modules/food/drinkingglass/glass_boxes.dm index 2cd035843d..4573a5520f 100644 --- a/code/modules/food/drinkingglass/glass_boxes.dm +++ b/code/modules/food/drinkingglass/glass_boxes.dm @@ -2,92 +2,82 @@ name = "glassware box" desc = "A box of assorted glassware" can_hold = list(/obj/item/weapon/reagent_containers/food/drinks/glass2) - New() - ..() - new /obj/item/weapon/reagent_containers/food/drinks/glass2/square(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/shake(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/shot(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/pint(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/mug(src) - new /obj/item/weapon/reagent_containers/food/drinks/glass2/wine(src) - new /obj/item/weapon/reagent_containers/food/drinks/metaglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint(src) + starts_with = list( + /obj/item/weapon/reagent_containers/food/drinks/glass2/square, + /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks, + /obj/item/weapon/reagent_containers/food/drinks/glass2/shake, + /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail, + /obj/item/weapon/reagent_containers/food/drinks/glass2/shot, + /obj/item/weapon/reagent_containers/food/drinks/glass2/pint, + /obj/item/weapon/reagent_containers/food/drinks/glass2/mug, + /obj/item/weapon/reagent_containers/food/drinks/glass2/wine, + /obj/item/weapon/reagent_containers/food/drinks/metaglass, + /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint + ) /obj/item/weapon/storage/box/glasses name = "box of glasses" - var/glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2 can_hold = list(/obj/item/weapon/reagent_containers/food/drinks/glass2) - New() - ..() - - for(var/i = 1 to 7) - new glass_type(src) + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2 = 7) /obj/item/weapon/storage/box/glasses/square name = "box of half-pint glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/square + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 7) /obj/item/weapon/storage/box/glasses/rocks name = "box of rocks glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 7) /obj/item/weapon/storage/box/glasses/shake name = "box of milkshake glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/shake + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 7) /obj/item/weapon/storage/box/glasses/cocktail name = "box of cocktail glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 7) /obj/item/weapon/storage/box/glasses/shot name = "box of shot glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/shot + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 7) /obj/item/weapon/storage/box/glasses/pint name = "box of pint glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/pint + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 7) /obj/item/weapon/storage/box/glasses/mug name = "box of glass mugs" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/mug + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 7) /obj/item/weapon/storage/box/glasses/wine name = "box of wine glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/wine + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 7) /obj/item/weapon/storage/box/glasses/meta name = "box of half-pint metamorphic glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/metaglass + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/metaglass = 7) /obj/item/weapon/storage/box/glasses/meta/metapint name = "box of metamorphic pint glasses" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 7) /obj/item/weapon/storage/box/glass_extras name = "box of cocktail garnishings" - var/extra_type = /obj/item/weapon/glass_extra can_hold = list(/obj/item/weapon/glass_extra) storage_slots = 14 - New() - ..() - - for(var/i = 1 to 14) - new extra_type(src) + starts_with = list(/obj/item/weapon/glass_extra = 14) /obj/item/weapon/storage/box/glass_extras/straws name = "box of straws" - extra_type = /obj/item/weapon/glass_extra/straw + starts_with = list(/obj/item/weapon/glass_extra/straw = 14) /obj/item/weapon/storage/box/glass_extras/sticks name = "box of drink sticks" - extra_type = /obj/item/weapon/glass_extra/stick + starts_with = list(/obj/item/weapon/glass_extra/stick = 14) /obj/item/weapon/storage/box/glasses/coffeecup name = "box of coffee cups" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/cup + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/cup = 7) /obj/item/weapon/storage/box/glasses/coffeemug name = "box of coffee mugs" - glass_type = /obj/item/weapon/reagent_containers/food/drinks/britcup \ No newline at end of file + starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/britcup = 7) \ No newline at end of file diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index 1f7beec6b9..124240d906 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -12,7 +12,8 @@ var/obj/item/weapon/reagent_containers/glass/rag/rag = null var/rag_underlay = "rag" - on_reagent_change() return // To suppress price updating. Bottles have their own price tags. + +/obj/item/weapon/reagent_containers/food/drinks/bottle/on_reagent_change() return // To suppress price updating. Bottles have their own price tags. /obj/item/weapon/reagent_containers/food/drinks/bottle/Initialize() . = ..() diff --git a/code/modules/food/food/drinks/drinkingglass.dm b/code/modules/food/food/drinks/drinkingglass.dm index 85e8de0705..0e8e5d9483 100644 --- a/code/modules/food/food/drinks/drinkingglass.dm +++ b/code/modules/food/food/drinks/drinkingglass.dm @@ -10,47 +10,39 @@ center_of_mass = list("x"=16, "y"=10) matter = list("glass" = 500) - on_reagent_change() - /*if(reagents.reagent_list.len > 1 ) - icon_state = "glass_brown" - name = "Glass of Hooch" - desc = "Two or more drinks, mixed together."*/ - /*else if(reagents.reagent_list.len == 1) - for(var/datum/reagent/R in reagents.reagent_list) - switch(R.id)*/ - if (reagents.reagent_list.len > 0) - var/datum/reagent/R = reagents.get_master_reagent() +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() + if (!length(reagents?.reagent_list)) + icon_state = "glass_empty" + name = "glass" + desc = "Your standard drinking glass." + center_of_mass = list("x"=16, "y"=10) + return + var/datum/reagent/R = reagents.get_master_reagent() - if(R.glass_icon_state) - icon_state = R.glass_icon_state - else - icon_state = "glass_brown" + if(R.glass_icon_state) + icon_state = R.glass_icon_state + else + icon_state = "glass_brown" - if(R.glass_name) - name = R.glass_name - else - name = "Glass of.. what?" + if(R.glass_name) + name = R.glass_name + else + name = "Glass of.. what?" - if(R.glass_desc) - desc = R.glass_desc - else - desc = "You can't really tell what this is." + if(R.glass_desc) + desc = R.glass_desc + else + desc = "You can't really tell what this is." - if(R.glass_center_of_mass) - center_of_mass = R.glass_center_of_mass - else - center_of_mass = list("x"=16, "y"=10) + if(R.glass_center_of_mass) + center_of_mass = R.glass_center_of_mass + else + center_of_mass = list("x"=16, "y"=10) - if(R.price_tag) - price_tag = R.price_tag - else - price_tag = null - else - icon_state = "glass_empty" - name = "glass" - desc = "Your standard drinking glass." - center_of_mass = list("x"=16, "y"=10) - return + if(R.price_tag) + price_tag = R.price_tag + else + price_tag = null /obj/item/weapon/reagent_containers/food/drinks/cup name = "coffee cup" @@ -60,54 +52,48 @@ volume = 30 center_of_mass = list("x"=16, "y"=16) - on_reagent_change() - if (reagents.reagent_list.len > 0) - var/datum/reagent/R = reagents.get_master_reagent() +/obj/item/weapon/reagent_containers/food/drinks/cup/on_reagent_change() + if (!length(reagents?.reagent_list)) + icon_state = "cup_empty" + name = "coffee cup" + desc = "The container of oriental luxuries." + center_of_mass = list("x"=16, "y"=16) + return + var/datum/reagent/R = reagents.get_master_reagent() - if(R.cup_icon_state) - icon_state = R.cup_icon_state - else - icon_state = "cup_brown" + if(R.cup_icon_state) + icon_state = R.cup_icon_state + else + icon_state = "cup_brown" - if(R.cup_name) - name = R.cup_name - else - name = "Cup of.. what?" + if(R.cup_name) + name = R.cup_name + else + name = "Cup of.. what?" - if(R.cup_desc) - desc = R.cup_desc - else - desc = "You can't really tell what this is." + if(R.cup_desc) + desc = R.cup_desc + else + desc = "You can't really tell what this is." - if(R.cup_center_of_mass) - center_of_mass = R.cup_center_of_mass - else - center_of_mass = list("x"=16, "y"=16) + if(R.cup_center_of_mass) + center_of_mass = R.cup_center_of_mass + else + center_of_mass = list("x"=16, "y"=16) - if(R.price_tag) - price_tag = R.price_tag - else - price_tag = null - - else - icon_state = "cup_empty" - name = "coffee cup" - desc = "The container of oriental luxuries." - center_of_mass = list("x"=16, "y"=16) - return + if(R.price_tag) + price_tag = R.price_tag + else + price_tag = null // for /obj/machinery/vending/sovietsoda -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda - New() - ..() - reagents.add_reagent("sodawater", 50) - on_reagent_change() +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda/New() + ..() + reagents.add_reagent("sodawater", 50) -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola - New() - ..() - reagents.add_reagent("cola", 50) - on_reagent_change() +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola/New() + ..() + reagents.add_reagent("cola", 50) /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass name = "shot glass" @@ -118,21 +104,33 @@ matter = list("glass" = 175) /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change() +<<<<<<< HEAD cut_overlays() +======= + overlays.Cut() + name = "shot glass" +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) - if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1") + if(!reagents.total_volume) + return + var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1") - switch(reagents.total_volume) - if(0 to 3) filling.icon_state = "[icon_state]1" - if(4 to 7) filling.icon_state = "[icon_state]5" - if(8 to INFINITY) filling.icon_state = "[icon_state]12" + switch(reagents.total_volume) + if(0 to 3) filling.icon_state = "[icon_state]1" + if(4 to 7) filling.icon_state = "[icon_state]5" + if(8 to INFINITY) filling.icon_state = "[icon_state]12" +<<<<<<< HEAD filling.color += reagents.get_color() add_overlay(filling) name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future. else name = "shot glass" +======= + filling.color += reagents.get_color() + overlays += filling + name += " of [reagents.get_master_reagent_name()]" //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future. +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask name = "fitness shaker" @@ -174,5 +172,4 @@ reagents.add_reagent("nutriment", 30) reagents.add_reagent("iron", 10) reagents.add_reagent("protein", 15) - reagents.add_reagent("water", 45) - on_reagent_change() \ No newline at end of file + reagents.add_reagent("water", 45) \ No newline at end of file diff --git a/code/modules/food/kitchen/icecream.dm b/code/modules/food/kitchen/icecream.dm index 02335c8a9e..9887bc7bd7 100644 --- a/code/modules/food/kitchen/icecream.dm +++ b/code/modules/food/kitchen/icecream.dm @@ -188,8 +188,8 @@ ice_creamed = 1 #undef ICECREAM_VANILLA -#undef FLAVOUR_CHOCOLATE -#undef FLAVOUR_STRAWBERRY -#undef FLAVOUR_BLUE +#undef ICECREAM_CHOCOLATE +#undef ICECREAM_STRAWBERRY +#undef ICECREAM_BLUE #undef CONE_WAFFLE #undef CONE_CHOC \ No newline at end of file diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 6780a72fe4..a84e4cae1b 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -49,13 +49,15 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/meatball ) result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL - proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked) - being_cooked.heat() - make_food(var/obj/container as obj) - . = ..(container) - for (var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/D in .) - if (!D.warm) - warm_up(D) + +/datum/recipe/donkpocket/proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked) + being_cooked.heat() + +/datum/recipe/donkpocket/make_food(var/obj/container as obj) + . = ..(container) + for (var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/D in .) + if (!D.warm) + warm_up(D) /datum/recipe/donkpocket/warm reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour diff --git a/code/modules/genetics/side_effects.dm b/code/modules/genetics/side_effects.dm index 25d8ba32e6..498aff20d0 100644 --- a/code/modules/genetics/side_effects.dm +++ b/code/modules/genetics/side_effects.dm @@ -5,77 +5,66 @@ var/effect // description of what happens when not treated var/duration = 0 // delay between start() and finish() - proc/start(mob/living/carbon/human/H) - // start the side effect, this should give some cue as to what's happening, - // such as gasping. These cues need to be unique among side-effects. +/datum/genetics/side_effect/proc/start(mob/living/carbon/human/H) + // start the side effect, this should give some cue as to what's happening, + // such as gasping. These cues need to be unique among side-effects. - proc/finish(mob/living/carbon/human/H) - // Finish the side-effect. This should first check whether the cure has been - // applied, and if not, cause bad things to happen. +/datum/genetics/side_effect/proc/finish(mob/living/carbon/human/H) + // Finish the side-effect. This should first check whether the cure has been + // applied, and if not, cause bad things to happen. /datum/genetics/side_effect/genetic_burn name = "Genetic Burn" symptom = "Subject's skin turns unusualy red." treatment = "Inject small dose of dexalin." effect = "Subject's skin burns." - duration = 10*30 + duration = 30 SECONDS - start(mob/living/carbon/human/H) - H.custom_emote(VISIBLE_MESSAGE, "starts turning very red..") +/datum/genetics/side_effect/genetic_burn/start(mob/living/carbon/human/H) + H.custom_emote(VISIBLE_MESSAGE, "starts turning very red..") - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("dexalin")) - for(var/organ_name in BP_ALL) - var/obj/item/organ/external/E = H.get_organ(organ_name) - E.take_damage(0, 5, 0) +/datum/genetics/side_effect/genetic_burn/finish(mob/living/carbon/human/H) + if(H.reagents.has_reagent("dexalin")) + return + for(var/organ_name in BP_ALL) + var/obj/item/organ/external/E = H.get_organ(organ_name) + E.take_damage(0, 5, 0) /datum/genetics/side_effect/bone_snap name = "Bone Snap" symptom = "Subject's limbs tremble notably." treatment = "Inject small dose of bicaridine." effect = "Subject's bone breaks." - duration = 10*60 + duration = 60 SECONDS - start(mob/living/carbon/human/H) - H.custom_emote(VISIBLE_MESSAGE, "'s limbs start shivering uncontrollably.") +/datum/genetics/side_effect/bone_snap/start(mob/living/carbon/human/H) + H.custom_emote(VISIBLE_MESSAGE, "'s limbs start shivering uncontrollably.") - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("bicaridine")) - var/organ_name = pick(BP_ALL) - var/obj/item/organ/external/E = H.get_organ(organ_name) - E.take_damage(20, 0, 0) - E.fracture() - -/*/datum/genetics/side_effect/monkey - name = "Monkey" - symptom = "Subject starts drooling uncontrollably." - treatment = "Inject small dose of dylovene." - effect = "Subject turns into monkey." - duration = 10*90 - - start(mob/living/carbon/human/H) - H.custom_emote(VISIBLE_MESSAGE, "has drool running down from [H.gender == MALE ? "his" : H.gender == FEMALE ? "her" : "their"] mouth.") - - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("anti_toxin")) - H.monkeyize()**/ +/datum/genetics/side_effect/bone_snap/finish(mob/living/carbon/human/H) + if(H.reagents.has_reagent("bicaridine")) + return + var/organ_name = pick(BP_ALL) + var/obj/item/organ/external/E = H.get_organ(organ_name) + E.take_damage(20, 0, 0) + E.fracture() /datum/genetics/side_effect/confuse name = "Confuse" symptom = "Subject starts drooling uncontrollably." treatment = "Inject small dose of dylovene." effect = "Subject becomes confused." - duration = 10*30 + duration = 30 SECONDS - start(mob/living/carbon/human/H) - var/datum/gender/T = gender_datums[H.get_visible_gender()] - H.custom_emote(VISIBLE_MESSAGE, "has drool running down from [T.his] mouth.") +/datum/genetics/side_effect/confuse/start(mob/living/carbon/human/H) + var/datum/gender/T = gender_datums[H.get_visible_gender()] + H.custom_emote(VISIBLE_MESSAGE, "has drool running down from [T.his] mouth.") - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("anti_toxin")) - H.Confuse(100) +/datum/genetics/side_effect/confuse/finish(mob/living/carbon/human/H) + if(H.reagents.has_reagent("anti_toxin")) + return + H.Confuse(100) -proc/trigger_side_effect(mob/living/carbon/human/H) +/proc/trigger_side_effect(mob/living/carbon/human/H) spawn if(!istype(H)) return var/tp = pick(typesof(/datum/genetics/side_effect) - /datum/genetics/side_effect) diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index d31b0bffb5..5de81594a9 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -3,12 +3,12 @@ var/list/ghost_traps -proc/get_ghost_trap(var/trap_key) +/proc/get_ghost_trap(var/trap_key) if(!ghost_traps) populate_ghost_traps() return ghost_traps[trap_key] -proc/populate_ghost_traps() +/proc/populate_ghost_traps() ghost_traps = list() for(var/traptype in typesof(/datum/ghosttrap)) var/datum/ghosttrap/G = new traptype diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 4766f5c1ef..35d7ee2fef 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -142,10 +142,10 @@ item_state = "boxing" special_attack_type = /datum/unarmed_attack/holopugilism -datum/unarmed_attack/holopugilism +/datum/unarmed_attack/holopugilism sparring_variant_type = /datum/unarmed_attack/holopugilism -datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) +/datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) user.do_attack_animation(src) var/damage = rand(0, 9) if(!damage) diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm index 943141b071..8c62404e05 100644 --- a/code/modules/integrated_electronics/subtypes/lists.dm +++ b/code/modules/integrated_electronics/subtypes/lists.dm @@ -144,7 +144,7 @@ push_data() activate_pin(2) -obj/item/integrated_circuit/list/len +/obj/item/integrated_circuit/list/len name = "len circuit" desc = "This circuit will give length of the list." inputs = list( diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 6bb1fc9939..576edff4a5 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -128,36 +128,36 @@ Book Cart End /obj/structure/bookcase/manuals/medical name = "Medical Manuals bookcase" - New() - ..() - new /obj/item/weapon/book/manual/medical_cloning(src) - new /obj/item/weapon/book/manual/medical_diagnostics_manual(src) - new /obj/item/weapon/book/manual/medical_diagnostics_manual(src) - new /obj/item/weapon/book/manual/medical_diagnostics_manual(src) - update_icon() +/obj/structure/bookcase/manuals/medical/New() + ..() + new /obj/item/weapon/book/manual/medical_cloning(src) + new /obj/item/weapon/book/manual/medical_diagnostics_manual(src) + new /obj/item/weapon/book/manual/medical_diagnostics_manual(src) + new /obj/item/weapon/book/manual/medical_diagnostics_manual(src) + update_icon() /obj/structure/bookcase/manuals/engineering name = "Engineering Manuals bookcase" - New() - ..() - new /obj/item/weapon/book/manual/engineering_construction(src) - new /obj/item/weapon/book/manual/engineering_particle_accelerator(src) - new /obj/item/weapon/book/manual/engineering_hacking(src) - new /obj/item/weapon/book/manual/engineering_guide(src) - new /obj/item/weapon/book/manual/atmospipes(src) - new /obj/item/weapon/book/manual/engineering_singularity_safety(src) - new /obj/item/weapon/book/manual/evaguide(src) - update_icon() +/obj/structure/bookcase/manuals/engineering/New() + ..() + new /obj/item/weapon/book/manual/engineering_construction(src) + new /obj/item/weapon/book/manual/engineering_particle_accelerator(src) + new /obj/item/weapon/book/manual/engineering_hacking(src) + new /obj/item/weapon/book/manual/engineering_guide(src) + new /obj/item/weapon/book/manual/atmospipes(src) + new /obj/item/weapon/book/manual/engineering_singularity_safety(src) + new /obj/item/weapon/book/manual/evaguide(src) + update_icon() /obj/structure/bookcase/manuals/research_and_development name = "R&D Manuals bookcase" - New() - ..() - new /obj/item/weapon/book/manual/research_and_development(src) - update_icon() +/obj/structure/bookcase/manuals/research_and_development/New() + ..() + new /obj/item/weapon/book/manual/research_and_development(src) + update_icon() /* @@ -383,26 +383,26 @@ Book Cart End var/obj/item/weapon/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory - attack_self(mob/user as mob) - mode += 1 - if(mode > 3) - mode = 0 - to_chat(user, "[src] Status Display:") - var/modedesc - switch(mode) - if(0) - modedesc = "Scan book to local buffer." - if(1) - modedesc = "Scan book to local buffer and set associated computer buffer to match." - if(2) - modedesc = "Scan book to local buffer, attempt to check in scanned book." - if(3) - modedesc = "Scan book to local buffer, attempt to add book to general inventory." - else - modedesc = "ERROR" - to_chat(user, " - Mode [mode] : [modedesc]") - if(src.computer) - to_chat(user, "Computer has been associated with this unit.") +/obj/item/weapon/barcodescanner/attack_self(mob/user as mob) + mode += 1 + if(mode > 3) + mode = 0 + to_chat(user, "[src] Status Display:") + var/modedesc + switch(mode) + if(0) + modedesc = "Scan book to local buffer." + if(1) + modedesc = "Scan book to local buffer and set associated computer buffer to match." + if(2) + modedesc = "Scan book to local buffer, attempt to check in scanned book." + if(3) + modedesc = "Scan book to local buffer, attempt to add book to general inventory." else - to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") \ No newline at end of file + modedesc = "ERROR" + to_chat(user, " - Mode [mode] : [modedesc]") + if(src.computer) + to_chat(user, "Computer has been associated with this unit.") + else + to_chat(user, "No associated computer found. Only local scans will function properly.") + to_chat(user, "\n") \ No newline at end of file diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 4454ea3a1a..3de7d81ced 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -11,7 +11,7 @@ /* * Borrowbook datum */ -datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long. +/datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long. var/bookname var/mobname var/getdate diff --git a/code/modules/lighting/__lighting_docs.dm b/code/modules/lighting/__lighting_docs.dm index 8ef93935e9..049bfe6c88 100644 --- a/code/modules/lighting/__lighting_docs.dm +++ b/code/modules/lighting/__lighting_docs.dm @@ -54,7 +54,7 @@ turf: (lighting_turf.dm) - Create lighting overlays for this turf -atom/movable/lighting_overlay: (lighting_overlay.dm) +/atom/movable/lighting_overlay: (lighting_overlay.dm) - var/lum_r, var/lum_g, var/lum_b; lumcounts of each colour - var/needs_update; set on update_lumcount, checked by lighting process diff --git a/code/modules/maps/fromdmp.dm b/code/modules/maps/fromdmp.dm index af75aa3d99..4c5b62a310 100644 --- a/code/modules/maps/fromdmp.dm +++ b/code/modules/maps/fromdmp.dm @@ -5,10 +5,10 @@ by Lummox JR */ -mob/verb/Convert(filename as file) +/mob/verb/Convert(filename as file) dmp2swapmap(filename) -proc/d2sm_prepmap(filename) +/proc/d2sm_prepmap(filename) var/txt = file2text(filename) if(!txt) return var/i,j @@ -23,7 +23,7 @@ proc/d2sm_prepmap(filename) i=findText(txt,"\\\n",i) return txt -proc/dmp2swapmap(filename) +/proc/dmp2swapmap(filename) //var/txt = file2text(filename) //if(!txt) return var/txt = d2sm_prepmap(filename) @@ -187,7 +187,7 @@ proc/dmp2swapmap(filename) to_chat(F, "\t\t\t[x]") to_chat(F, codes[pick(codes)]) */ -proc/d2sm_ParseCommaList(txt) +/proc/d2sm_ParseCommaList(txt) var/list/L=new var/i,ch for(i=1,i<=length(txt),++i) @@ -205,7 +205,7 @@ proc/d2sm_ParseCommaList(txt) if(i>1) L+=copytext(txt,1,i) return L -proc/d2sm_MatchBrace(txt, i, which) +/proc/d2sm_MatchBrace(txt, i, which) if(which==40) ++which else which+=2 var/j,ch @@ -216,7 +216,7 @@ proc/d2sm_MatchBrace(txt, i, which) j=d2sm_MatchBrace(txt,j,ch) if(!j) return 0 -proc/d2sm_ConvertType(tt,tabs="") +/proc/d2sm_ConvertType(tt,tabs="") var/i=findText(tt,"{") if(!i) return "[tabs]type = [tt]\n" .="[tabs]type = [copytext(tt,1,i)]\n" @@ -225,7 +225,7 @@ proc/d2sm_ConvertType(tt,tabs="") for(var/pair in L) .="[.][tabs][pair]\n" -proc/d2sm_Contents(list/conts,n,tabs="") +/proc/d2sm_Contents(list/conts,n,tabs="") .="[tabs]contents = list(" var/i for(i=0,iJMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/area/A as anything in areas) + if(A.z in using_map?.secret_levels) + areas -= A + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + return mobs + +/mob/observer/dead/proc/dead_tele(var/area/A in jumpable_areas()) + set category = "Ghost" + set name = "Teleport" + set desc = "Teleport to a location" + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + if(!A) + A = input(usr, "Select an area:", "Ghost Teleport") as null|anything in jumpable_areas() + if(!A) + return + + usr.forceMove(pick(get_area_turfs(A))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(input in jumpable_mobs()) + set category = "Ghost" + set name = "Follow" // "Haunt" + set desc = "Follow and haunt a mob." + + if(!input) + input = input(usr, "Select a mob:", "Ghost Follow") as null|anything in jumpable_mobs() + if(!input) + return + + var/target = jumpable_mobs()[input] + if(!target) return + ManualFollow(target) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob(input in jumpable_mobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + if(!input) + input = input(usr, "Select a mob:", "Ghost Jump") as null|anything in jumpable_mobs() + if(!input) + return + + var/target = jumpable_mobs()[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!") + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

Crew Manifest

" + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices + + var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input("Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = input(src, "Select who to whisper to:", "Whisper to?", null) as null|mob in options + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + overlays.Cut() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.overlays += "pai-ghostalert" + spawn(54) + PP.overlays.Cut() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 20ac966e40..81c6605e4a 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -160,8 +160,8 @@ //These things are allowed to add vision flags. //If you code some crazy item that goes on your feet that lets you see ghosts, you need to add a slot here. - var/tmp/list/slots = list(slot_glasses,slot_head) - var/tmp/list/compiled_vis = list() + var/list/slots = list(slot_glasses,slot_head) + var/list/compiled_vis = list() for(var/slot in slots) var/obj/item/clothing/O = get_equipped_item(slot) //Change this type if you move the vision stuff to item or something. @@ -187,12 +187,12 @@ if(!compiled_vis.len && !vis_enabled.len) return //Nothin' doin'. - var/tmp/list/oddities = vis_enabled ^ compiled_vis + var/list/oddities = vis_enabled ^ compiled_vis if(!oddities.len) return //Same thing in both lists! - var/tmp/list/to_enable = oddities - vis_enabled - var/tmp/list/to_disable = oddities - compiled_vis + var/list/to_enable = oddities - vis_enabled + var/list/to_disable = oddities - compiled_vis for(var/vis in to_enable) plane_holder.set_vis(vis,TRUE) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5cfaf0ec20..8041937f26 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1388,7 +1388,7 @@ see_in_dark = species.darksight see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : see_invisible_default - var/tmp/glasses_processed = 0 + var/glasses_processed = 0 var/obj/item/weapon/rig/rig = get_rig() if(istype(rig) && rig.visor && !looking_elsewhere) if(!rig.helmet || (head && rig.helmet == head)) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 75ddf45a3c..b0dea18d58 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -235,7 +235,7 @@ base_color = "#333333" reagent_tag = IS_TAJARA - allergens = COFFEE + allergens = ALLERGEN_COFFEE move_trail = /obj/effect/decal/cleanable/blood/tracks/paw @@ -338,7 +338,7 @@ breath_heat_level_3 = 1350 //Default 1250 reagent_tag = IS_SKRELL - allergens = MEAT|FISH|DAIRY|EGGS + allergens = ALLERGEN_MEAT|ALLERGEN_FISH|ALLERGEN_DAIRY|ALLERGEN_EGGS has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index 50f4ce9cc5..eae90e0476 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -1,4 +1,4 @@ -proc/create_new_xenomorph(var/alien_caste,var/target) +/proc/create_new_xenomorph(var/alien_caste,var/target) target = get_turf(target) if(!target || !alien_caste) return diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8f57d6443d..8ce9754a37 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -63,7 +63,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes #define SKIN_LAYER 2 //Skin things added by a call on species #define BLOOD_LAYER 3 //Bloodied hands/feet/anything else -#define DAMAGE_LAYER 4 //Injury overlay sprites like open wounds +#define MOB_DAM_LAYER 4 //Injury overlay sprites like open wounds #define SURGERY_LAYER 5 //Overlays for open surgical sites #define UNDERWEAR_LAYER 6 //Underwear/bras/etc #define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb) @@ -79,6 +79,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define SUIT_STORE_LAYER 17 //Suit storage-slot item #define BACK_LAYER 18 //Back-slot item #define HAIR_LAYER 19 //The human's hair +<<<<<<< HEAD #define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added. #define EARS_LAYER 21 //Both ear-slot items (combined image) #define EYES_LAYER 22 //Mob's eyes (used for glowing eyes) @@ -95,6 +96,23 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define WATER_LAYER 33 //'Mob submerged' overlay layer #define TARGETED_LAYER 34 //'Aimed at' overlay layer #define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. +======= +#define EARS_LAYER 20 //Both ear-slot items (combined image) +#define EYES_LAYER 21 //Mob's eyes (used for glowing eyes) +#define FACEMASK_LAYER 22 //Mask-slot item +#define HEAD_LAYER 23 //Head-slot item +#define HANDCUFF_LAYER 24 //Handcuffs, if the human is handcuffed, in a secret inv slot +#define LEGCUFF_LAYER 25 //Same as handcuffs, for legcuffs +#define L_HAND_LAYER 26 //Left-hand item +#define R_HAND_LAYER 27 //Right-hand item +#define WING_LAYER 28 //Wings or protrusions over the suit. +#define TAIL_LAYER_ALT 29 //Modified tail-sprite layer. Tend to be larger. +#define MODIFIER_EFFECTS_LAYER 30 //Effects drawn by modifiers +#define FIRE_LAYER 31 //'Mob on fire' overlay layer +#define MOB_WATER_LAYER 32 //'Mob submerged' overlay layer +#define TARGETED_LAYER 33 //'Aimed at' overlay layer +#define TOTAL_LAYERS 33//<---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) ////////////////////////////////// /mob/living/carbon/human @@ -172,7 +190,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(QDESTROYING(src)) return - remove_layer(DAMAGE_LAYER) + remove_layer(MOB_DAM_LAYER) // first check whether something actually changed about damage appearance var/damage_appearance = "" @@ -188,7 +206,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() previous_damage_appearance = damage_appearance - var/image/standing_image = image(icon = species.damage_overlays, icon_state = "00", layer = BODY_LAYER+DAMAGE_LAYER) + var/image/standing_image = image(icon = species.damage_overlays, icon_state = "00", layer = BODY_LAYER+MOB_DAM_LAYER) // blend the individual damage states with our icons for(var/obj/item/organ/external/O in organs) @@ -209,8 +227,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() standing_image.add_overlay(DI) - overlays_standing[DAMAGE_LAYER] = standing_image - apply_layer(DAMAGE_LAYER) + overlays_standing[MOB_DAM_LAYER] = standing_image + apply_layer(MOB_DAM_LAYER) //BASE MOB SPRITE /mob/living/carbon/human/update_icons_body() @@ -1098,18 +1116,18 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(QDESTROYING(src)) return - remove_layer(WATER_LAYER) + remove_layer(MOB_WATER_LAYER) var/depth = check_submerged() if(!depth || lying) return var/atom/A = loc // We'd better be swimming and on a turf - var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve + var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve I.color = A.color - overlays_standing[WATER_LAYER] = I + overlays_standing[MOB_WATER_LAYER] = I - apply_layer(WATER_LAYER) + apply_layer(MOB_WATER_LAYER) /mob/living/carbon/human/proc/update_surgery() if(QDESTROYING(src)) @@ -1193,7 +1211,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return image(tail_s) //If you have a custom tail selected - if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) + if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style))) var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) if(tail_style.do_colouration) tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) @@ -1221,11 +1239,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() tail_s.Blend(overlay, ICON_OVERLAY) qdel(overlay) +<<<<<<< HEAD var/image/working = image(tail_s) if(tail_style.em_block) working.overlays += em_block_image_generic(working) // Leaving this as overlays += if(isTaurTail(tail_style)) +======= + if(istaurtail(tail_style)) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) var/datum/sprite_accessory/tail/taur/taurtype = tail_style working.pixel_x = -16 if(taurtype.can_ride && !riding_datum) @@ -1251,7 +1273,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //Human Overlays Indexes///////// #undef MUTATIONS_LAYER #undef SKIN_LAYER -#undef DAMAGE_LAYER +#undef MOB_DAM_LAYER #undef SURGERY_LAYER #undef UNDERWEAR_LAYER #undef SHOES_LAYER_ALT @@ -1271,7 +1293,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #undef EYES_LAYER #undef FACEMASK_LAYER #undef HEAD_LAYER -#undef COLLAR_LAYER #undef HANDCUFF_LAYER #undef LEGCUFF_LAYER #undef L_HAND_LAYER diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 5686993d7a..6db59df65b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -62,7 +62,7 @@ var/list/department_radio_keys = list( var/list/channel_to_radio_key = new -proc/get_radio_key_from_channel(var/channel) +/proc/get_radio_key_from_channel(var/channel) var/key = channel_to_radio_key[channel] if(!key) for(var/radio_key in department_radio_keys) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index bd608ca006..e08db4b575 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -265,7 +265,7 @@ drop_item() -obj/item/weapon/gripper/proc/drop_item() +/obj/item/weapon/gripper/proc/drop_item() if(!wrapped) //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z for(var/obj/item/thing in src.contents) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 547bb19304..2540101e20 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -853,7 +853,7 @@ /mob/proc/embedded_needs_process() return (embedded.len > 0) -mob/proc/yank_out_object() +/mob/proc/yank_out_object() set category = "Object" set name = "Yank out object" set desc = "Remove an embedded item at the cost of bleeding and pain." diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 27d8ae4ed2..5b6490c6be 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -42,7 +42,7 @@ /mob/living/carbon/human/isMonkey() return istype(species, /datum/species/monkey) -proc/isdeaf(A) +/proc/isdeaf(A) if(istype(A, /mob)) var/mob/M = A return (M.sdisabilities & DEAF) || M.ear_deaf @@ -57,24 +57,24 @@ proc/isdeaf(A) /mob/proc/is_cloaked() return FALSE -proc/hasorgans(A) // Fucking really?? +/proc/hasorgans(A) // Fucking really?? return ishuman(A) -proc/iscuffed(A) +/proc/iscuffed(A) if(istype(A, /mob/living/carbon)) var/mob/living/carbon/C = A if(C.handcuffed) return 1 return 0 -proc/hassensorlevel(A, var/level) +/proc/hassensorlevel(A, var/level) var/mob/living/carbon/human/H = A if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform return U.sensor_mode >= level return 0 -proc/getsensorlevel(A) +/proc/getsensorlevel(A) var/mob/living/carbon/human/H = A if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform @@ -190,7 +190,7 @@ proc/getsensorlevel(A) for(var/datum/multilingual_say_piece/S in message_pieces) . += new /datum/multilingual_say_piece(S.speaking, stars(S.message)) -proc/slur(phrase) +/proc/slur(phrase) phrase = html_decode(phrase) var/leng=length(phrase) var/counter=length(phrase) @@ -237,7 +237,7 @@ proc/slur(phrase) return sanitize(t) -proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added +/proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added /* Turn text into complete gibberish! */ var/returntext = "" for(var/i = 1, i <= length(t), i++) @@ -364,7 +364,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) else hud_used.action_intent.icon_state = I_HELP -proc/is_blind(A) +/proc/is_blind(A) if(istype(A, /mob/living/carbon)) var/mob/living/carbon/C = A if(C.sdisabilities & BLIND || C.blinded) diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm index 59f8f8f4d7..5a96b1fd03 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -47,7 +47,7 @@ /mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) if(forced) return ..() // Skip our checks - if(!isTaurTail(tail_style)) + if(!istaurtail(tail_style)) return FALSE else var/datum/sprite_accessory/tail/taur/taurtype = tail_style @@ -68,7 +68,7 @@ var/mob/living/carbon/human/H = M - if(isTaurTail(H.tail_style)) + if(istaurtail(H.tail_style)) to_chat(src,"Too many legs. TOO MANY LEGS!!") return FALSE diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index a2079ad494..01db6036e9 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -31,11 +31,11 @@ var/list/comm_message_listeners = list() //We first have to initialize list then var/datum/comm_message_listener/global_message_listener = new //May be used by admins var/last_message_id = 0 -proc/get_comm_message_id() +/proc/get_comm_message_id() last_message_id = last_message_id + 1 return last_message_id -proc/post_comm_message(var/message_title, var/message_text) +/proc/post_comm_message(var/message_title, var/message_text) var/list/message = list() message["id"] = get_comm_message_id() message["title"] = message_title diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 0f67e3b604..4aaa658468 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -246,7 +246,7 @@ return data -obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) var/obj/item/weapon/card/id/I = W.GetID() // Awaiting payment state if(state == 2) diff --git a/code/modules/multiz/_stubs.dm b/code/modules/multiz/_stubs.dm index 4c6e63cb7e..a9d1d456b1 100644 --- a/code/modules/multiz/_stubs.dm +++ b/code/modules/multiz/_stubs.dm @@ -9,8 +9,8 @@ // FOR THE LOVE OF GOD USE THESE. DO NOT FUCKING SPAGHETTIFY THIS. // Use the Has*() functions if you ONLY need to check. // If you need to do something, use Get*(). -HasAbove(var/z) -HasBelow(var/z) +/HasAbove(var/z) +/HasBelow(var/z) // These give either the turf or null. -GetAbove(var/atom/atom) -GetBelow(var/atom/atom) \ No newline at end of file +/GetAbove(var/atom/atom) +/GetBelow(var/atom/atom) \ No newline at end of file diff --git a/code/modules/multiz/basic.dm b/code/modules/multiz/basic.dm index 62ffc46518..af6f1de418 100644 --- a/code/modules/multiz/basic.dm +++ b/code/modules/multiz/basic.dm @@ -43,7 +43,7 @@ var/list/z_levels = list()// Each bit re... haha just kidding this is a list of for(var/level = z, HasAbove(level), level++) . |= level+1 -proc/AreConnectedZLevels(var/zA, var/zB) +/proc/AreConnectedZLevels(var/zA, var/zB) return zA == zB || (zB in GetConnectedZlevels(zA)) /proc/get_zstep(ref, dir) diff --git a/code/modules/multiz/disabled.dm b/code/modules/multiz/disabled.dm index b91fb78931..b5b41bd138 100644 --- a/code/modules/multiz/disabled.dm +++ b/code/modules/multiz/disabled.dm @@ -1,10 +1,10 @@ -proc/HasAbove(var/z) +/proc/HasAbove(var/z) return 0 -proc/HasBelow(var/z) +/proc/HasBelow(var/z) return 0 // These give either the turf or null. -proc/GetAbove(var/turf/turf) +/proc/GetAbove(var/turf/turf) return null -proc/GetBelow(var/turf/turf) +/proc/GetBelow(var/turf/turf) return null \ No newline at end of file diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 0bc21f07eb..83b7bd8125 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -1,7 +1,7 @@ //////////////////////////// // parent class for pipes // //////////////////////////// -obj/machinery/atmospherics/pipe/zpipe +/obj/machinery/atmospherics/pipe/zpipe icon = 'icons/obj/structures.dmi' icon_state = "up" @@ -56,13 +56,13 @@ obj/machinery/atmospherics/pipe/zpipe invisibility = i ? 101 : 0 update_icon() -obj/machinery/atmospherics/pipe/zpipe/process() +/obj/machinery/atmospherics/pipe/zpipe/process() if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle ..() else . = PROCESS_KILL -obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) +/obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() var/pressure_difference = pressure - environment.return_pressure() @@ -77,7 +77,7 @@ obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) else return 1 -obj/machinery/atmospherics/pipe/zpipe/proc/burst() +/obj/machinery/atmospherics/pipe/zpipe/proc/burst() src.visible_message("\The [src] bursts!"); playsound(src, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new @@ -85,27 +85,27 @@ obj/machinery/atmospherics/pipe/zpipe/proc/burst() smoke.start() qdel(src) // NOT qdel. -obj/machinery/atmospherics/pipe/zpipe/proc/normalize_dir() +/obj/machinery/atmospherics/pipe/zpipe/proc/normalize_dir() if(dir == (NORTH|SOUTH)) set_dir(NORTH) else if(dir == (EAST|WEST)) set_dir(EAST) -obj/machinery/atmospherics/pipe/zpipe/Destroy() +/obj/machinery/atmospherics/pipe/zpipe/Destroy() if(node1) node1.disconnect(src) if(node2) node2.disconnect(src) . = ..() -obj/machinery/atmospherics/pipe/zpipe/pipeline_expansion() +/obj/machinery/atmospherics/pipe/zpipe/pipeline_expansion() return list(node1, node2) -obj/machinery/atmospherics/pipe/zpipe/update_icon() +/obj/machinery/atmospherics/pipe/zpipe/update_icon() color = pipe_color return -obj/machinery/atmospherics/pipe/zpipe/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/zpipe/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) qdel(parent) @@ -120,14 +120,14 @@ obj/machinery/atmospherics/pipe/zpipe/disconnect(obj/machinery/atmospherics/refe ///////////////////////// // the elusive up pipe // ///////////////////////// -obj/machinery/atmospherics/pipe/zpipe/up +/obj/machinery/atmospherics/pipe/zpipe/up icon = 'icons/obj/structures.dmi' icon_state = "up" name = "upwards pipe" desc = "A pipe segment to connect upwards." -obj/machinery/atmospherics/pipe/zpipe/up/atmos_init() +/obj/machinery/atmospherics/pipe/zpipe/up/atmos_init() normalize_dir() var/node1_dir @@ -157,14 +157,14 @@ obj/machinery/atmospherics/pipe/zpipe/up/atmos_init() // and the down pipe // /////////////////////// -obj/machinery/atmospherics/pipe/zpipe/down +/obj/machinery/atmospherics/pipe/zpipe/down icon = 'icons/obj/structures.dmi' icon_state = "down" name = "downwards pipe" desc = "A pipe segment to connect downwards." -obj/machinery/atmospherics/pipe/zpipe/down/atmos_init() +/obj/machinery/atmospherics/pipe/zpipe/down/atmos_init() normalize_dir() var/node1_dir @@ -194,7 +194,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/atmos_init() // supply/scrubbers // /////////////////////// -obj/machinery/atmospherics/pipe/zpipe/up/scrubbers +/obj/machinery/atmospherics/pipe/zpipe/up/scrubbers icon_state = "up-scrubbers" name = "upwards scrubbers pipe" desc = "A scrubbers pipe segment to connect upwards." @@ -204,7 +204,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/scrubbers icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/zpipe/up/supply +/obj/machinery/atmospherics/pipe/zpipe/up/supply icon_state = "up-supply" name = "upwards supply pipe" desc = "A supply pipe segment to connect upwards." @@ -214,7 +214,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/supply icon_connect_type = "-supply" color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/zpipe/up/fuel +/obj/machinery/atmospherics/pipe/zpipe/up/fuel icon_state = "up-fuel" name = "upwards fuel pipe" desc = "A fuel pipe segment to connect upwards." @@ -224,7 +224,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/fuel icon_connect_type = "-fuel" color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/zpipe/up/aux +/obj/machinery/atmospherics/pipe/zpipe/up/aux icon_state = "up-aux" name = "upwards aux pipe" desc = "A aux pipe segment to connect upwards." @@ -234,7 +234,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/aux icon_connect_type = "-aux" color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/zpipe/down/scrubbers +/obj/machinery/atmospherics/pipe/zpipe/down/scrubbers icon_state = "down-scrubbers" name = "downwards scrubbers pipe" desc = "A scrubbers pipe segment to connect downwards." @@ -244,7 +244,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/scrubbers icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/zpipe/down/supply +/obj/machinery/atmospherics/pipe/zpipe/down/supply icon_state = "down-supply" name = "downwards supply pipe" desc = "A supply pipe segment to connect downwards." @@ -254,7 +254,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/supply icon_connect_type = "-supply" color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/zpipe/down/fuel +/obj/machinery/atmospherics/pipe/zpipe/down/fuel icon_state = "down-fuel" name = "downwards fuel pipe" desc = "A fuel pipe segment to connect downwards." @@ -264,7 +264,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/fuel icon_connect_type = "-fuel" color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/zpipe/down/aux +/obj/machinery/atmospherics/pipe/zpipe/down/aux icon_state = "down-aux" name = "upwards aux pipe" desc = "A aux pipe segment to connect upwards." diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm index 330e505d51..86a1149169 100644 --- a/code/modules/news/newspaper.dm +++ b/code/modules/news/newspaper.dm @@ -19,7 +19,7 @@ drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' -obj/item/weapon/newspaper/attack_self(mob/user as mob) +/obj/item/weapon/newspaper/attack_self(mob/user as mob) if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat @@ -27,7 +27,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) switch(screen) if(0) //Cover dat+="
The Griffon
" - dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" + dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]� Space Facilities

" if(isemptylist(news_content)) if(important_message) dat+="Contents:
    **Important Security Announcement** \[page [pages+2]\]
" @@ -99,7 +99,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) else to_chat(user, "The paper is full of intelligible symbols!") -obj/item/weapon/newspaper/Topic(href, href_list) +/obj/item/weapon/newspaper/Topic(href, href_list) var/mob/living/U = usr ..() if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) @@ -130,7 +130,7 @@ obj/item/weapon/newspaper/Topic(href, href_list) if(istype(src.loc, /mob)) attack_self(src.loc) -obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen)) if(scribble_page == curr_page) to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index f0d1c826ec..264ef3d6b7 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -304,7 +304,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5 return D return res -proc/blood_incompatible(donor,receiver,donor_species,receiver_species) +/proc/blood_incompatible(donor,receiver,donor_species,receiver_species) if(!donor || !receiver) return 0 if(donor_species && receiver_species) @@ -327,7 +327,7 @@ proc/blood_incompatible(donor,receiver,donor_species,receiver_species) //AB is a universal receiver. return 0 -proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) +/proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) //Vorestation Edit Start - We're not going to splatter at all because we're in something and that's silly. if(istype(source,/atom/movable)) diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/_organ_internal.dm similarity index 100% rename from code/modules/organs/internal/organ_internal.dm rename to code/modules/organs/internal/_organ_internal.dm diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm index 047602ec4b..1166e3d689 100644 --- a/code/modules/organs/internal/appendix.dm +++ b/code/modules/organs/internal/appendix.dm @@ -1,5 +1,3 @@ -#define PROCESS_ACCURACY 10 - /obj/item/organ/internal/appendix name = "appendix" icon_state = "appendix" diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index d70269b391..18429b1de9 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -1,5 +1,3 @@ -#define PROCESS_ACCURACY 10 - /obj/item/organ/internal/eyes name = "eyeballs" icon_state = "eyes" diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 9f015bcdc9..02ff5f21d2 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -1,5 +1,3 @@ -#define PROCESS_ACCURACY 10 - /obj/item/organ/internal/heart name = "heart" icon_state = "heart-on" diff --git a/code/modules/organs/internal/kidneys.dm b/code/modules/organs/internal/kidneys.dm index 2378c0fe99..daf9954b03 100644 --- a/code/modules/organs/internal/kidneys.dm +++ b/code/modules/organs/internal/kidneys.dm @@ -1,5 +1,3 @@ -#define PROCESS_ACCURACY 10 - /obj/item/organ/internal/kidneys name = "kidneys" icon_state = "kidneys" diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm index c23467466a..b26c864609 100644 --- a/code/modules/organs/internal/liver.dm +++ b/code/modules/organs/internal/liver.dm @@ -1,5 +1,3 @@ -#define PROCESS_ACCURACY 10 - /obj/item/organ/internal/liver name = "liver" icon_state = "liver" diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 34d2c258b6..8ec76a36d0 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -1,5 +1,3 @@ -#define PROCESS_ACCURACY 10 - /obj/item/organ/internal/lungs name = "lungs" icon_state = "lungs" diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index ffc9a6149b..1d374ab7f0 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -1,14 +1,14 @@ -mob/proc/flash_pain() +/mob/proc/flash_pain() flick("pain",pain) -mob/var/list/pain_stored = list() -mob/var/last_pain_message = "" -mob/var/next_pain_time = 0 +/mob/var/list/pain_stored = list() +/mob/var/last_pain_message = "" +/mob/var/next_pain_time = 0 // message is the custom message to be displayed // power decides how much painkillers will stop the message // force means it ignores anti-spam timer -mob/living/carbon/proc/custom_pain(message, power, force) +/mob/living/carbon/proc/custom_pain(message, power, force) if(!message || stat || !can_feel_pain() || chem_effects[CE_PAINKILLER] > power) return 0 message = "[message]" @@ -21,7 +21,7 @@ mob/living/carbon/proc/custom_pain(message, power, force) to_chat(src,message) next_pain_time = world.time + (100-power) -mob/living/carbon/human/proc/handle_pain() +/mob/living/carbon/human/proc/handle_pain() if(stat) return diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index dd7f5dcf89..164307ba68 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -53,169 +53,169 @@ var/tmp/list/desc_list = list() var/tmp/list/damage_list = list() - New(var/damage) +/datum/wound/New(var/damage) - created = world.time + created = world.time - // reading from a list("stage" = damage) is pretty difficult, so build two separate - // lists from them instead - for(var/V in stages) - desc_list += V - damage_list += stages[V] + // reading from a list("stage" = damage) is pretty difficult, so build two separate + // lists from them instead + for(var/V in stages) + desc_list += V + damage_list += stages[V] - src.damage = damage + src.damage = damage - // initialize with the appropriate stage - src.init_stage(damage) + // initialize with the appropriate stage + src.init_stage(damage) - bleed_timer += damage + bleed_timer += damage // returns 1 if there's a next stage, 0 otherwise - proc/init_stage(var/initial_damage) - current_stage = stages.len +/datum/wound/proc/init_stage(var/initial_damage) + current_stage = stages.len - while(src.current_stage > 1 && src.damage_list[current_stage-1] <= initial_damage / src.amount) - src.current_stage-- + while(src.current_stage > 1 && src.damage_list[current_stage-1] <= initial_damage / src.amount) + src.current_stage-- - src.min_damage = damage_list[current_stage] - src.desc = desc_list[current_stage] + src.min_damage = damage_list[current_stage] + src.desc = desc_list[current_stage] - // the amount of damage per wound - proc/wound_damage() - return src.damage / src.amount +// the amount of damage per wound +/datum/wound/proc/wound_damage() + return src.damage / src.amount - proc/can_autoheal() - if(is_treated()) - return TRUE - if(src.wound_damage() <= autoheal_cutoff) - if(created + 10 MINUTES > world.time) // Wounds don't autoheal for ten minutes if not bandaged. - return FALSE - return TRUE +/datum/wound/proc/can_autoheal() + if(is_treated()) + return TRUE + if(src.wound_damage() <= autoheal_cutoff) + if(created + 10 MINUTES > world.time) // Wounds don't autoheal for ten minutes if not bandaged. + return FALSE + return TRUE - // checks whether the wound has been appropriately treated - proc/is_treated() - if(damage_type == BRUISE || damage_type == CUT || damage_type == PIERCE) - return bandaged - else if(damage_type == BURN) - return salved +// checks whether the wound has been appropriately treated +/datum/wound/proc/is_treated() + if(damage_type == BRUISE || damage_type == CUT || damage_type == PIERCE) + return bandaged + else if(damage_type == BURN) + return salved - // Checks whether other other can be merged into src. - proc/can_merge(var/datum/wound/other) - if (other.type != src.type) return 0 - if (other.current_stage != src.current_stage) return 0 - if (other.damage_type != src.damage_type) return 0 - if (!(other.can_autoheal()) != !(src.can_autoheal())) return 0 - if (!(other.bandaged) != !(src.bandaged)) return 0 - if (!(other.clamped) != !(src.clamped)) return 0 - if (!(other.salved) != !(src.salved)) return 0 - if (!(other.disinfected) != !(src.disinfected)) return 0 - //if (other.germ_level != src.germ_level) return 0 - return 1 +// Checks whether other other can be merged into src. +/datum/wound/proc/can_merge(var/datum/wound/other) + if (other.type != src.type) return 0 + if (other.current_stage != src.current_stage) return 0 + if (other.damage_type != src.damage_type) return 0 + if (!(other.can_autoheal()) != !(src.can_autoheal())) return 0 + if (!(other.bandaged) != !(src.bandaged)) return 0 + if (!(other.clamped) != !(src.clamped)) return 0 + if (!(other.salved) != !(src.salved)) return 0 + if (!(other.disinfected) != !(src.disinfected)) return 0 + //if (other.germ_level != src.germ_level) return 0 + return 1 - proc/merge_wound(var/datum/wound/other) - src.damage += other.damage - src.amount += other.amount - src.bleed_timer += other.bleed_timer - src.germ_level = max(src.germ_level, other.germ_level) - src.created = max(src.created, other.created) //take the newer created time - - // checks if wound is considered open for external infections - // untreated cuts (and bleeding bruises) and burns are possibly infectable, chance higher if wound is bigger - proc/infection_check() - if (damage < 10) //small cuts, tiny bruises, and moderate burns shouldn't be infectable. - return 0 - if (is_treated() && damage < 25) //anything less than a flesh wound (or equivalent) isn't infectable if treated properly - return 0 - if (disinfected) - germ_level = 0 //reset this, just in case - return 0 - - if (damage_type == BRUISE && !bleeding()) //bruises only infectable if bleeding - return 0 - - var/dam_coef = round(damage/10) - switch (damage_type) - if (BRUISE) - return prob(dam_coef*5) - if (BURN) - return prob(dam_coef*10) - if (CUT) - return prob(dam_coef*20) +/datum/wound/proc/merge_wound(var/datum/wound/other) + src.damage += other.damage + src.amount += other.amount + src.bleed_timer += other.bleed_timer + src.germ_level = max(src.germ_level, other.germ_level) + src.created = max(src.created, other.created) //take the newer created time +// checks if wound is considered open for external infections +// untreated cuts (and bleeding bruises) and burns are possibly infectable, chance higher if wound is bigger +/datum/wound/proc/infection_check() + if (damage < 10) //small cuts, tiny bruises, and moderate burns shouldn't be infectable. + return 0 + if (is_treated() && damage < 25) //anything less than a flesh wound (or equivalent) isn't infectable if treated properly + return 0 + if (disinfected) + germ_level = 0 //reset this, just in case return 0 - proc/bandage() - bandaged = 1 + if (damage_type == BRUISE && !bleeding()) //bruises only infectable if bleeding + return 0 - proc/salve() - salved = 1 + var/dam_coef = round(damage/10) + switch (damage_type) + if (BRUISE) + return prob(dam_coef*5) + if (BURN) + return prob(dam_coef*10) + if (CUT) + return prob(dam_coef*20) - proc/disinfect() - disinfected = 1 + return 0 - // heal the given amount of damage, and if the given amount of damage was more - // than what needed to be healed, return how much heal was left - // set @heals_internal to also heal internal organ damage - proc/heal_damage(amount, heals_internal = 0) - if(src.internal && !heals_internal) - // heal nothing - return amount +/datum/wound/proc/bandage() + bandaged = 1 - var/healed_damage = min(src.damage, amount) - amount -= healed_damage - src.damage -= healed_damage +/datum/wound/proc/salve() + salved = 1 - while(src.wound_damage() < damage_list[current_stage] && current_stage < src.desc_list.len) - current_stage++ - desc = desc_list[current_stage] - src.min_damage = damage_list[current_stage] +/datum/wound/proc/disinfect() + disinfected = 1 - // return amount of healing still leftover, can be used for other wounds +// heal the given amount of damage, and if the given amount of damage was more +// than what needed to be healed, return how much heal was left +// set @heals_internal to also heal internal organ damage +/datum/wound/proc/heal_damage(amount, heals_internal = 0) + if(src.internal && !heals_internal) + // heal nothing return amount - // opens the wound again - proc/open_wound(damage) - src.damage += damage - bleed_timer += damage + var/healed_damage = min(src.damage, amount) + amount -= healed_damage + src.damage -= healed_damage - while(src.current_stage > 1 && src.damage_list[current_stage-1] <= src.damage / src.amount) - src.current_stage-- + while(src.wound_damage() < damage_list[current_stage] && current_stage < src.desc_list.len) + current_stage++ + desc = desc_list[current_stage] + src.min_damage = damage_list[current_stage] - src.desc = desc_list[current_stage] - src.min_damage = damage_list[current_stage] + // return amount of healing still leftover, can be used for other wounds + return amount - // returns whether this wound can absorb the given amount of damage. - // this will prevent large amounts of damage being trapped in less severe wound types - proc/can_worsen(damage_type, damage) - if (src.damage_type != damage_type) - return 0 //incompatible damage types +// opens the wound again +/datum/wound/proc/open_wound(damage) + src.damage += damage + bleed_timer += damage - if (src.amount > 1) - return 0//merged wounds cannot be worsened. + while(src.current_stage > 1 && src.damage_list[current_stage-1] <= src.damage / src.amount) + src.current_stage-- - //with 1.5*, a shallow cut will be able to carry at most 30 damage, - //37.5 for a deep cut - //52.5 for a flesh wound, etc. - var/max_wound_damage = 1.5*src.damage_list[1] - if (src.damage + damage > max_wound_damage) - return 0 + src.desc = desc_list[current_stage] + src.min_damage = damage_list[current_stage] - return 1 +// returns whether this wound can absorb the given amount of damage. +// this will prevent large amounts of damage being trapped in less severe wound types +/datum/wound/proc/can_worsen(damage_type, damage) + if (src.damage_type != damage_type) + return 0 //incompatible damage types - proc/bleeding() - if (src.internal) - return 0 // internal wounds don't bleed in the sense of this function + if (src.amount > 1) + return 0//merged wounds cannot be worsened. - if (current_stage > max_bleeding_stage) - return 0 + //with 1.5*, a shallow cut will be able to carry at most 30 damage, + //37.5 for a deep cut + //52.5 for a flesh wound, etc. + var/max_wound_damage = 1.5*src.damage_list[1] + if (src.damage + damage > max_wound_damage) + return 0 - if (bandaged||clamped) - return 0 + return 1 - if (bleed_timer <= 0 && wound_damage() <= bleed_threshold) - return 0 //Bleed timer has run out. Once a wound is big enough though, you'll need a bandage to stop it +/datum/wound/proc/bleeding() + if (src.internal) + return 0 // internal wounds don't bleed in the sense of this function - return 1 + if (current_stage > max_bleeding_stage) + return 0 + + if (bandaged||clamped) + return 0 + + if (bleed_timer <= 0 && wound_damage() <= bleed_threshold) + return 0 //Bleed timer has run out. Once a wound is big enough though, you'll need a bandage to stop it + + return 1 /** WOUND DEFINITIONS **/ @@ -295,7 +295,7 @@ max_bleeding_stage = 3 stages = list("big gaping wound" = 60, "healing gaping wound" = 40, "large blood soaked clot" = 25, "large angry scar" = 10, "large straight scar" = 0) -datum/wound/cut/massive +/datum/wound/cut/massive max_bleeding_stage = 3 stages = list("massive wound" = 70, "massive healing wound" = 50, "massive blood soaked clot" = 25, "massive angry scar" = 10, "massive jagged scar" = 0) @@ -327,7 +327,7 @@ datum/wound/cut/massive stages = list("big gaping hole" = 50, "healing gaping hole" = 20, "large blood soaked clot" = 15, "large angry scar" = 10, "large round scar" = 0) damage_type = PIERCE -datum/wound/puncture/massive +/datum/wound/puncture/massive max_bleeding_stage = 3 stages = list("massive wound" = 60, "massive healing wound" = 30, "massive blood soaked clot" = 25, "massive angry scar" = 10, "massive jagged scar" = 0) damage_type = PIERCE diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm index 473fcc1ab5..5a3e8ed477 100644 --- a/code/modules/overmap/spacetravel.dm +++ b/code/modules/overmap/spacetravel.dm @@ -32,7 +32,7 @@ if(can_die()) qdel(src) -proc/get_deepspace(x,y) +/proc/get_deepspace(x,y) var/turf/unsimulated/map/overmap_turf = locate(x,y,global.using_map.overmap_z) if(!istype(overmap_turf)) CRASH("Attempt to get deepspace at ([x],[y]) which is not on overmap: [overmap_turf]") @@ -75,7 +75,7 @@ proc/get_deepspace(x,y) return FALSE // return isnull(client) && !key && stat == DEAD // Allows bodies that players have ghosted from to be deleted - Ater -proc/overmap_spacetravel(var/turf/space/T, var/atom/movable/A) +/proc/overmap_spacetravel(var/turf/space/T, var/atom/movable/A) if (!T || !A) return diff --git a/code/modules/overmap/turfs.dm b/code/modules/overmap/turfs.dm index 916a8f4159..6647d16a4d 100644 --- a/code/modules/overmap/turfs.dm +++ b/code/modules/overmap/turfs.dm @@ -91,7 +91,7 @@ var/list/moving_levels = list() //Proc to 'move' stars in spess //yes it looks ugly, but it should only fire when state actually change. //null direction stops movement -proc/toggle_move_stars(zlevel, direction) +/proc/toggle_move_stars(zlevel, direction) if(!zlevel) return diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index 353090efed..143635c001 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -75,7 +75,7 @@ generateFooter() updateDisplay() -obj/item/weapon/paper/admin/proc/updateDisplay() +/obj/item/weapon/paper/admin/proc/updateDisplay() usr << browse("[name][headerOn ? header : ""][info_links][stamps][footerOn ? footer : ""][interactions]", "window=[name];can_close=0") diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index b33b325648..dd00694df7 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -139,7 +139,7 @@ deletepicture(src) -obj/item/device/camera/siliconcam/proc/getsource() +/obj/item/device/camera/siliconcam/proc/getsource() if(istype(src.loc, /mob/living/silicon/ai)) return src diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 3dab7ddb74..428a95b365 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -1,5 +1,5 @@ //like orange but only checks north/south/east/west for one step -proc/cardinalrange(var/center) +/proc/cardinalrange(var/center) var/list/things = list() for(var/direction in cardinal) var/turf/T = get_step(center, direction) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 0c78f105e3..693226ecfe 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -264,7 +264,7 @@ var/list/possible_cable_coil_colours = list( qdel(src) return -obj/structure/cable/proc/cableColor(var/colorC) +/obj/structure/cable/proc/cableColor(var/colorC) var/color_n = "#DD0000" if(colorC) color_n = colorC diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 88117f8164..b49fa564bc 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -14,7 +14,7 @@ var/list/fusion_reactions /decl/fusion_reaction/proc/handle_reaction_special(var/obj/effect/fusion_em_field/holder) return 0 -proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) +/proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) if(!fusion_reactions) fusion_reactions = list() for(var/rtype in typesof(/decl/fusion_reaction) - /decl/fusion_reaction) diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index 18290c3946..5c4628fe23 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -41,7 +41,7 @@ charge_cost = 400 recharge_time = 7 -obj/item/weapon/gun/energy/phasegun/rifle +/obj/item/weapon/gun/energy/phasegun/rifle name = "phase rifle" desc = "The RayZar EW31 Orion is a specialist energy weapon, intended for use against hostile wildlife." icon_state = "phaserifle" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 3b272f8d11..404562ae1d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -160,7 +160,7 @@ projectile_type = /obj/item/projectile/animate charge_cost = 240 */ -obj/item/weapon/gun/energy/staff/focus +/obj/item/weapon/gun/energy/staff/focus name = "mental focus" desc = "An artifact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out." icon = 'icons/obj/wizard.dmi' diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index acfd06426c..85f9077cfb 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -81,7 +81,7 @@ max_shells = 7 -obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun() +/obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun() set name = "Name Gun" set category = "Object" set desc = "Rename your gun. If you're the Detective." diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index a7d069fad4..cea545ce25 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -92,7 +92,7 @@ STOP_PROCESSING(SSobj, src) return ..() -obj/aiming_overlay/proc/update_aiming_deferred() +/obj/aiming_overlay/proc/update_aiming_deferred() set waitfor = 0 sleep(0) update_aiming() diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index f426fa5ebc..4d8c31a749 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -96,7 +96,7 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/weapon/grenade/empgrenade, /obj/item/weapon/material/knife/tacknife/combatknife) -datum/supply_drop_loot/riot +/datum/supply_drop_loot/riot name = "Riot Gear" container = /obj/structure/largecrate /datum/supply_drop_loot/riot/New() diff --git a/code/modules/reagents/machinery/dispenser/cartridge_presets.dm b/code/modules/reagents/machinery/dispenser/cartridge_presets.dm index 21b321ad34..672356551b 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge_presets.dm @@ -1,108 +1,197 @@ -/obj/item/weapon/reagent_containers/chem_disp_cartridge - small - volume = CARTRIDGE_VOLUME_SMALL +/obj/item/weapon/reagent_containers/chem_disp_cartridge/small + volume = CARTRIDGE_VOLUME_SMALL - medium - volume = CARTRIDGE_VOLUME_MEDIUM +/obj/item/weapon/reagent_containers/chem_disp_cartridge/medium + volume = CARTRIDGE_VOLUME_MEDIUM - // Multiple - water spawn_reagent = "water" - sugar spawn_reagent = "sugar" +// Multiple +/obj/item/weapon/reagent_containers/chem_disp_cartridge/water + spawn_reagent = "water" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar + spawn_reagent = "sugar" - // Chemistry - hydrogen spawn_reagent = "hydrogen" - lithium spawn_reagent = "lithium" - carbon spawn_reagent = "carbon" - nitrogen spawn_reagent = "nitrogen" - oxygen spawn_reagent = "oxygen" - fluorine spawn_reagent = "fluorine" - sodium spawn_reagent = "sodium" - aluminum spawn_reagent = "aluminum" - silicon spawn_reagent = "silicon" - phosphorus spawn_reagent = "phosphorus" - sulfur spawn_reagent = "sulfur" - chlorine spawn_reagent = "chlorine" - potassium spawn_reagent = "potassium" - iron spawn_reagent = "iron" - copper spawn_reagent = "copper" - mercury spawn_reagent = "mercury" - radium spawn_reagent = "radium" - ethanol spawn_reagent = "ethanol" - sacid spawn_reagent = "sacid" - tungsten spawn_reagent = "tungsten" - calcium spawn_reagent = "calcium" +// Chemistry +/obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen + spawn_reagent = "hydrogen" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium + spawn_reagent = "lithium" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon + spawn_reagent = "carbon" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen + spawn_reagent = "nitrogen" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen + spawn_reagent = "oxygen" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine + spawn_reagent = "fluorine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium + spawn_reagent = "sodium" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum + spawn_reagent = "aluminum" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon + spawn_reagent = "silicon" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus + spawn_reagent = "phosphorus" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur + spawn_reagent = "sulfur" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine + spawn_reagent = "chlorine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium + spawn_reagent = "potassium" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/iron + spawn_reagent = "iron" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/copper + spawn_reagent = "copper" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/mercury + spawn_reagent = "mercury" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/radium + spawn_reagent = "radium" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol + spawn_reagent = "ethanol" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid + spawn_reagent = "sacid" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten + spawn_reagent = "tungsten" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium + spawn_reagent = "calcium" - // Bar, alcoholic - beer spawn_reagent = "beer" - kahlua spawn_reagent = "kahlua" - whiskey spawn_reagent = "whiskey" - wine spawn_reagent = "wine" - vodka spawn_reagent = "vodka" - gin spawn_reagent = "gin" - rum spawn_reagent = "rum" - tequila spawn_reagent = "tequilla" - vermouth spawn_reagent = "vermouth" - cognac spawn_reagent = "cognac" - ale spawn_reagent = "ale" - mead spawn_reagent = "mead" - bitters spawn_reagent = "bitters" - cider spawn_reagent = "cider" +// Bar, alcoholic +/obj/item/weapon/reagent_containers/chem_disp_cartridge/beer + spawn_reagent = "beer" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/kahlua + spawn_reagent = "kahlua" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/whiskey + spawn_reagent = "whiskey" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/wine + spawn_reagent = "wine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/vodka + spawn_reagent = "vodka" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/gin + spawn_reagent = "gin" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/rum + spawn_reagent = "rum" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila + spawn_reagent = "tequilla" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth + spawn_reagent = "vermouth" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac + spawn_reagent = "cognac" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/ale + spawn_reagent = "ale" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/mead + spawn_reagent = "mead" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/bitters + spawn_reagent = "bitters" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/cider + spawn_reagent = "cider" - // Bar, soft - ice spawn_reagent = "ice" - tea spawn_reagent = "tea" - icetea spawn_reagent = "icetea" - cola spawn_reagent = "cola" - smw spawn_reagent = "spacemountainwind" - dr_gibb spawn_reagent = "dr_gibb" - spaceup spawn_reagent = "space_up" - tonic spawn_reagent = "tonic" - sodawater spawn_reagent = "sodawater" - lemon_lime spawn_reagent = "lemon_lime" - orange spawn_reagent = "orangejuice" - lime spawn_reagent = "limejuice" - watermelon spawn_reagent = "watermelonjuice" - lemon spawn_reagent = "lemonjuice" +// Bar, soft +/obj/item/weapon/reagent_containers/chem_disp_cartridge/ice + spawn_reagent = "ice" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/tea + spawn_reagent = "tea" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/icetea + spawn_reagent = "icetea" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/cola + spawn_reagent = "cola" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/smw + spawn_reagent = "spacemountainwind" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/dr_gibb + spawn_reagent = "dr_gibb" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/spaceup + spawn_reagent = "space_up" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic + spawn_reagent = "tonic" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater + spawn_reagent = "sodawater" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime + spawn_reagent = "lemon_lime" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/orange + spawn_reagent = "orangejuice" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/lime + spawn_reagent = "limejuice" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon + spawn_reagent = "watermelonjuice" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon + spawn_reagent = "lemonjuice" - // Bar, coffee - coffee spawn_reagent = "coffee" - cafe_latte spawn_reagent = "cafe_latte" - soy_latte spawn_reagent = "soy_latte" - hot_coco spawn_reagent = "hot_coco" - milk spawn_reagent = "milk" - cream spawn_reagent = "cream" - mint spawn_reagent = "mint" - berry spawn_reagent = "berryjuice" - greentea spawn_reagent = "greentea" - decaf spawn_reagent = "decaf" +// Bar, coffee +/obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee + spawn_reagent = "coffee" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte + spawn_reagent = "cafe_latte" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte + spawn_reagent = "soy_latte" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco + spawn_reagent = "hot_coco" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/milk + spawn_reagent = "milk" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/cream + spawn_reagent = "cream" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/mint + spawn_reagent = "mint" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/berry + spawn_reagent = "berryjuice" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/greentea + spawn_reagent = "greentea" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/decaf + spawn_reagent = "decaf" - // ERT - inaprov spawn_reagent = "inaprovaline" - ryetalyn spawn_reagent = "ryetalyn" - paracetamol spawn_reagent = "paracetamol" - tramadol spawn_reagent = "tramadol" - oxycodone spawn_reagent = "oxycodone" - sterilizine spawn_reagent = "sterilizine" - leporazine spawn_reagent = "leporazine" - kelotane spawn_reagent = "kelotane" - dermaline spawn_reagent = "dermaline" - dexalin spawn_reagent = "dexalin" - dexalin/small volume = CARTRIDGE_VOLUME_SMALL // For the medicine cartridge crate, so it's not too easy to get large amounts of dexalin - dexalin_p spawn_reagent = "dexalinp" - tricord spawn_reagent = "tricordrazine" - dylovene spawn_reagent = "anti_toxin" - synaptizine spawn_reagent = "synaptizine" - hyronalin spawn_reagent = "hyronalin" - arithrazine spawn_reagent = "arithrazine" - alkysine spawn_reagent = "alkysine" - imidazoline spawn_reagent = "imidazoline" - peridaxon spawn_reagent = "peridaxon" - bicaridine spawn_reagent = "bicaridine" - hyperzine spawn_reagent = "hyperzine" - rezadone spawn_reagent = "rezadone" - spaceacillin spawn_reagent = "spaceacillin" - ethylredox spawn_reagent = "ethylredoxrazine" - sleeptox spawn_reagent = "stoxin" - chloral spawn_reagent = "chloralhydrate" - cryoxadone spawn_reagent = "cryoxadone" - clonexadone spawn_reagent = "clonexadone" +// ERT +/obj/item/weapon/reagent_containers/chem_disp_cartridge/inaprov + spawn_reagent = "inaprovaline" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/ryetalyn + spawn_reagent = "ryetalyn" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/paracetamol + spawn_reagent = "paracetamol" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/tramadol + spawn_reagent = "tramadol" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/oxycodone + spawn_reagent = "oxycodone" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sterilizine + spawn_reagent = "sterilizine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/leporazine + spawn_reagent = "leporazine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/kelotane + spawn_reagent = "kelotane" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/dermaline + spawn_reagent = "dermaline" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/dexalin + spawn_reagent = "dexalin" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/dexalin/small + volume = CARTRIDGE_VOLUME_SMALL // For the medicine cartridge crate, so it's not too easy to get large amounts of dexalin +/obj/item/weapon/reagent_containers/chem_disp_cartridge/dexalin_p + spawn_reagent = "dexalinp" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/tricord + spawn_reagent = "tricordrazine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/dylovene + spawn_reagent = "anti_toxin" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/synaptizine + spawn_reagent = "synaptizine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/hyronalin + spawn_reagent = "hyronalin" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/arithrazine + spawn_reagent = "arithrazine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/alkysine + spawn_reagent = "alkysine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/imidazoline + spawn_reagent = "imidazoline" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/peridaxon + spawn_reagent = "peridaxon" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/bicaridine + spawn_reagent = "bicaridine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/hyperzine + spawn_reagent = "hyperzine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/rezadone + spawn_reagent = "rezadone" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/spaceacillin + spawn_reagent = "spaceacillin" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/ethylredox + spawn_reagent = "ethylredoxrazine" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/sleeptox + spawn_reagent = "stoxin" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/chloral + spawn_reagent = "chloralhydrate" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/cryoxadone + spawn_reagent = "cryoxadone" +/obj/item/weapon/reagent_containers/chem_disp_cartridge/clonexadone + spawn_reagent = "clonexadone" diff --git a/code/modules/reagents/machinery/dispenser/supply.dm b/code/modules/reagents/machinery/dispenser/supply.dm index 30b1c3c0f6..984d7786a8 100644 --- a/code/modules/reagents/machinery/dispenser/supply.dm +++ b/code/modules/reagents/machinery/dispenser/supply.dm @@ -147,27 +147,23 @@ group = "Reagents" #define SEC_PACK(_tname, _type, _name, _cname, _cost, _access)\ - datum/supply_pack/dispenser_cartridges{\ - _tname {\ - name = _name ;\ - containername = _cname ;\ - containertype = /obj/structure/closet/crate/secure;\ - access = list( _access );\ - cost = _cost ;\ - contains = list( _type , _type );\ - group = "Reagent Cartridges"\ - }\ + /datum/supply_pack/dispenser_cartridges/##_tname {\ + name = _name ;\ + containername = _cname ;\ + containertype = /obj/structure/closet/crate/secure;\ + access = list( _access );\ + cost = _cost ;\ + contains = list( _type , _type );\ + group = "Reagent Cartridges"\ } #define PACK(_tname, _type, _name, _cname, _cost)\ - datum/supply_pack/dispenser_cartridges{\ - _tname {\ - name = _name ;\ - containername = _cname ;\ - containertype = /obj/structure/closet/crate;\ - cost = _cost ;\ - contains = list( _type , _type );\ - group = "Reagent Cartridges"\ - }\ + /datum/supply_pack/dispenser_cartridges/##_tname {\ + name = _name ;\ + containername = _cname ;\ + containertype = /obj/structure/closet/crate;\ + cost = _cost ;\ + contains = list( _type , _type );\ + group = "Reagent Cartridges"\ } // Chemistry-restricted (raw reagents excluding sugar/water) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 906b8411b7..12b4694e21 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -310,7 +310,7 @@ if (!is_open_container()) add_overlay("lid_[initial(icon_state)]") -obj/item/weapon/reagent_containers/glass/bucket/wood +/obj/item/weapon/reagent_containers/glass/bucket/wood desc = "An old wooden bucket." name = "wooden bucket" icon = 'icons/obj/janitor.dmi' diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm index 9ab8b125da..3ffb7e58e5 100644 --- a/code/modules/reagents/reagents/_reagents.dm +++ b/code/modules/reagents/reagents/_reagents.dm @@ -26,7 +26,7 @@ var/affects_dead = 0 // Does this chem process inside a corpse? var/affects_robots = 0 // Does this chem process inside a Synth? - var/allergen_type = GENERIC // What potential allergens does this contain? + var/allergen_type // What potential allergens does this contain? var/allergen_factor = 1 // If the potential allergens are mixed and low-volume, they're a bit less dangerous. Needed for drinks because they're a single reagent compared to food which contains multiple seperate reagents. var/cup_icon_state = null diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index a921f41064..53fcef6448 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -124,7 +124,7 @@ icon_raw = "batter_raw" icon_cooked = "batter_cooked" coated_adj = "battered" - allergen_type = GRAINS | EGGS //Made with flour(grain), and eggs(eggs) + allergen_type = ALLERGEN_GRAINS | ALLERGEN_EGGS //Made with flour(grain), and eggs(eggs) /datum/reagent/nutriment/coating/beerbatter name = "beer batter mix" @@ -135,7 +135,7 @@ icon_raw = "batter_raw" icon_cooked = "batter_cooked" coated_adj = "beer-battered" - allergen_type = GRAINS | EGGS //Made with flour(grain), eggs(eggs), and beer(grain) + allergen_type = ALLERGEN_GRAINS | ALLERGEN_EGGS //Made with flour(grain), eggs(eggs), and beer(grain) /datum/reagent/nutriment/coating/beerbatter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -239,7 +239,7 @@ id = "cornoil" description = "An oil derived from various types of corn." reagent_state = LIQUID - allergen_type = VEGETABLE //Corn is a vegetable + allergen_type = ALLERGEN_VEGETABLE //Corn is a vegetable /datum/reagent/nutriment/triglyceride/oil/peanut name = "Peanut Oil" @@ -249,7 +249,7 @@ taste_mult = 0.3 nutriment_factor = 15 color = "#4F3500" - allergen_type = SEEDS //Peanut oil would come from peanuts, hence seeds. + allergen_type = ALLERGEN_SEEDS //Peanut oil would come from peanuts, hence seeds. // Aurora Cooking Port Insertion End @@ -266,7 +266,7 @@ id = "protein" taste_description = "some sort of meat" color = "#440000" - allergen_type = MEAT //"Animal protein" implies it comes from animals, therefore meat. + allergen_type = ALLERGEN_MEAT //"Animal protein" implies it comes from animals, therefore meat. /datum/reagent/nutriment/protein/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) switch(alien) @@ -286,35 +286,35 @@ id = "tofu" color = "#fdffa8" taste_description = "tofu" - allergen_type = BEANS //Made from soy beans + allergen_type = ALLERGEN_BEANS //Made from soy beans /datum/reagent/nutriment/protein/seafood name = "seafood protein" id = "seafood" color = "#f5f4e9" taste_description = "fish" - allergen_type = FISH //I suppose the fish allergy likely refers to seafood in general. + allergen_type = ALLERGEN_FISH //I suppose the fish allergy likely refers to seafood in general. /datum/reagent/nutriment/protein/cheese name = "cheese" id = "cheese" color = "#EDB91F" taste_description = "cheese" - allergen_type = DAIRY //Cheese is made from dairy + allergen_type = ALLERGEN_DAIRY //Cheese is made from dairy /datum/reagent/nutriment/protein/egg name = "egg yolk" id = "egg" taste_description = "egg" color = "#FFFFAA" - allergen_type = EGGS //Eggs contain egg + allergen_type = ALLERGEN_EGGS //Eggs contain egg /datum/reagent/nutriment/protein/murk name = "murkfin protein" id = "murk_protein" taste_description = "mud" color = "#664330" - allergen_type = FISH //Murkfin is fish + allergen_type = ALLERGEN_FISH //Murkfin is fish /datum/reagent/nutriment/honey name = "Honey" @@ -352,7 +352,7 @@ taste_description = "unmistakably mayonnaise" nutriment_factor = 10 color = "#FFFFFF" - allergen_type = EGGS //Mayo is made from eggs + allergen_type = ALLERGEN_EGGS //Mayo is made from eggs /datum/reagent/nutriment/yeast name = "Yeast" @@ -370,7 +370,7 @@ reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" - allergen_type = GRAINS //Flour is made from grain + allergen_type = ALLERGEN_GRAINS //Flour is made from grain /datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T) if(!istype(T, /turf/space)) @@ -384,7 +384,7 @@ taste_mult = 1.3 nutriment_factor = 1 color = "#482000" - allergen_type = COFFEE //Again, coffee contains coffee + allergen_type = ALLERGEN_COFFEE //Again, coffee contains coffee /datum/reagent/nutriment/tea name = "Tea Powder" @@ -411,7 +411,7 @@ description = "Dehydrated, powdered juice of some kind." taste_mult = 1.3 nutriment_factor = 1 - allergen_type = FRUIT //I suppose it's implied here that the juice is from dehydrated fruit. + allergen_type = ALLERGEN_FRUIT //I suppose it's implied here that the juice is from dehydrated fruit. /datum/reagent/nutriment/instantjuice/grape name = "Grape Juice Powder" @@ -450,7 +450,7 @@ reagent_state = LIQUID nutriment_factor = 2 color = "#792300" - allergen_type = BEANS //Soy (beans) + allergen_type = ALLERGEN_BEANS //Soy (beans) /datum/reagent/nutriment/ketchup @@ -461,7 +461,7 @@ reagent_state = LIQUID nutriment_factor = 5 color = "#731008" - allergen_type = FRUIT //Tomatoes are a fruit. + allergen_type = ALLERGEN_FRUIT //Tomatoes are a fruit. /datum/reagent/nutriment/barbecue name = "Barbeque Sauce" @@ -491,7 +491,7 @@ reagent_state = LIQUID nutriment_factor = 1 color = "#801E28" - allergen_type = FRUIT //Cherries are fruits + allergen_type = ALLERGEN_FRUIT //Cherries are fruits /datum/reagent/nutriment/peanutbutter name = "Peanut Butter" @@ -502,7 +502,7 @@ reagent_state = LIQUID nutriment_factor = 30 color = "#4F3500" - allergen_type = SEEDS //Peanuts(seeds) + allergen_type = ALLERGEN_SEEDS //Peanuts(seeds) /datum/reagent/nutriment/vanilla name = "Vanilla Extract" @@ -548,7 +548,7 @@ reagent_state = LIQUID nutriment_factor = 2 color = "#899613" - allergen_type = DAIRY //incase anyone is dumb enough to drink it - it does contain milk! + allergen_type = ALLERGEN_DAIRY //incase anyone is dumb enough to drink it - it does contain milk! /datum/reagent/nutriment/sprinkles name = "Sprinkles" @@ -917,7 +917,7 @@ glass_name = "banana juice" glass_desc = "The raw essence of a banana. HONK!" - allergen_type = FRUIT //Bananas are fruit + allergen_type = ALLERGEN_FRUIT //Bananas are fruit /datum/reagent/drink/juice/berry name = "Berry Juice" @@ -928,7 +928,7 @@ glass_name = "berry juice" glass_desc = "Berry juice. Or maybe it's jam. Who cares?" - allergen_type = FRUIT //Berries are fruit + allergen_type = ALLERGEN_FRUIT //Berries are fruit /datum/reagent/drink/juice/pineapple name = "Pineapple Juice" @@ -939,7 +939,7 @@ glass_name = "pineapple juice" glass_desc = "Pineapple juice. Or maybe it's spineapple. Who cares?" - allergen_type = FRUIT //Pineapples are fruit + allergen_type = ALLERGEN_FRUIT //Pineapples are fruit /datum/reagent/drink/juice/carrot name = "Carrot juice" @@ -950,7 +950,7 @@ glass_name = "carrot juice" glass_desc = "It is just like a carrot but without crunching." - allergen_type = VEGETABLE //Carrots are vegetables + allergen_type = ALLERGEN_VEGETABLE //Carrots are vegetables /datum/reagent/drink/juice/carrot/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -966,7 +966,7 @@ glass_name = "grape juice" glass_desc = "It's grrrrrape!" - allergen_type = FRUIT //Grapes are fruit + allergen_type = ALLERGEN_FRUIT //Grapes are fruit /datum/reagent/drink/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1000,7 +1000,7 @@ glass_name = "lemon juice" glass_desc = "Sour..." - allergen_type = FRUIT //Lemons are fruit + allergen_type = ALLERGEN_FRUIT //Lemons are fruit /datum/reagent/drink/juice/apple @@ -1013,7 +1013,7 @@ glass_name = "apple juice" glass_desc = "An earth favorite." - allergen_type = FRUIT //Apples are fruit + allergen_type = ALLERGEN_FRUIT //Apples are fruit /datum/reagent/drink/juice/lime name = "Lime Juice" @@ -1025,7 +1025,7 @@ glass_name = "lime juice" glass_desc = "A glass of sweet-sour lime juice" - allergen_type = FRUIT //Limes are fruit + allergen_type = ALLERGEN_FRUIT //Limes are fruit /datum/reagent/drink/juice/lime/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1042,7 +1042,7 @@ glass_name = "orange juice" glass_desc = "Vitamins! Yay!" - allergen_type = FRUIT //Oranges are fruit + allergen_type = ALLERGEN_FRUIT //Oranges are fruit /datum/reagent/drink/orangejuice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1072,7 +1072,7 @@ glass_name = "potato juice" glass_desc = "Juice from a potato. Bleh." - allergen_type = VEGETABLE //Potatoes are vegetables + allergen_type = ALLERGEN_VEGETABLE //Potatoes are vegetables /datum/reagent/drink/juice/tomato name = "Tomato Juice" @@ -1084,7 +1084,7 @@ glass_name = "tomato juice" glass_desc = "Are you sure this is tomato juice?" - allergen_type = FRUIT //Yes tomatoes are a fruit + allergen_type = ALLERGEN_FRUIT //Yes tomatoes are a fruit /datum/reagent/drink/juice/tomato/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1101,7 +1101,7 @@ glass_name = "watermelon juice" glass_desc = "Delicious juice made from watermelon." - allergen_type = FRUIT //Watermelon is a fruit + allergen_type = ALLERGEN_FRUIT //Watermelon is a fruit // Everything else @@ -1118,7 +1118,7 @@ cup_icon_state = "cup_cream" cup_name = "cup of milk" cup_desc = "White and nutritious goodness!" - allergen_type = DAIRY //Milk is dairy + allergen_type = ALLERGEN_DAIRY //Milk is dairy /datum/reagent/drink/milk/chocolate name = "Chocolate Milk" @@ -1164,7 +1164,7 @@ cup_icon_state = "cup_cream" cup_name = "cup of cream" cup_desc = "Ewwww..." - allergen_type = DAIRY //Cream is dairy + allergen_type = ALLERGEN_DAIRY //Cream is dairy /datum/reagent/drink/milk/soymilk name = "Soy Milk" @@ -1179,7 +1179,7 @@ cup_icon_state = "cup_cream" cup_name = "cup of milk" cup_desc = "White and nutritious goodness!" - allergen_type = BEANS //Would be made from soy beans + allergen_type = ALLERGEN_BEANS //Would be made from soy beans /datum/reagent/drink/tea name = "Tea" @@ -1264,7 +1264,7 @@ cup_name = "cup of lemon tea" cup_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" - allergen_type = FRUIT //Made with lemon juice + allergen_type = ALLERGEN_FRUIT //Made with lemon juice /datum/reagent/drink/tea/limetea name = "Lime Tea" @@ -1278,7 +1278,7 @@ cup_name = "cup of lime tea" cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!" - allergen_type = FRUIT //Made with lime juice + allergen_type = ALLERGEN_FRUIT //Made with lime juice /datum/reagent/drink/tea/orangetea name = "Orange Tea" @@ -1292,7 +1292,7 @@ cup_name = "cup of orange tea" cup_desc = "A tasty mixture of orange and tea. It's apparently good for you!" - allergen_type = FRUIT //Made with orange juice + allergen_type = ALLERGEN_FRUIT //Made with orange juice /datum/reagent/drink/tea/berrytea name = "Berry Tea" @@ -1306,7 +1306,7 @@ cup_name = "cup of berry tea" cup_desc = "A tasty mixture of berries and tea. It's apparently good for you!" - allergen_type = FRUIT //Made with berry juice + allergen_type = ALLERGEN_FRUIT //Made with berry juice /datum/reagent/drink/greentea name = "Green Tea" @@ -1353,7 +1353,7 @@ glass_name = "coffee" glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - allergen_type = COFFEE //Apparently coffee contains coffee + allergen_type = ALLERGEN_COFFEE //Apparently coffee contains coffee /datum/reagent/drink/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1425,7 +1425,7 @@ cup_icon_state = "cup_latte" cup_name = "cup of soy latte" cup_desc = "A nice and refreshing beverage while you are reading." - allergen_type = COFFEE|BEANS //Soy(beans) and coffee + allergen_type = ALLERGEN_COFFEE|ALLERGEN_BEANS //Soy(beans) and coffee /datum/reagent/drink/coffee/soy_latte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1445,7 +1445,7 @@ cup_icon_state = "cup_latte" cup_name = "cup of cafe latte" cup_desc = "A nice and refreshing beverage while you are reading." - allergen_type = COFFEE|DAIRY //Cream and coffee + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY //Cream and coffee /datum/reagent/drink/coffee/cafe_latte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1466,7 +1466,7 @@ glass_name = "decaf coffee" glass_desc = "Basically just brown, bitter water." - allergen_type = COFFEE //Decaf coffee would still likely trigger allergy symptoms. + allergen_type = ALLERGEN_COFFEE //Decaf coffee would still likely trigger allergy symptoms. /datum/reagent/drink/hot_coco name = "Hot Chocolate" @@ -1510,7 +1510,7 @@ glass_name = "grape soda" glass_desc = "Looks like a delicious drink!" glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with grape juice + allergen_type = ALLERGEN_FRUIT //Made with grape juice /datum/reagent/drink/soda/tonic name = "Tonic Water" @@ -1538,7 +1538,7 @@ glass_name = "lemonade" glass_desc = "Oh the nostalgia..." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with lemon juice + allergen_type = ALLERGEN_FRUIT //Made with lemon juice /datum/reagent/drink/soda/melonade name = "Melonade" @@ -1551,7 +1551,7 @@ glass_name = "melonade" glass_desc = "Oh the.. nostalgia?" glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with watermelon juice + allergen_type = ALLERGEN_FRUIT //Made with watermelon juice /datum/reagent/drink/soda/appleade name = "Appleade" @@ -1564,7 +1564,7 @@ glass_name = "appleade" glass_desc = "Applejuice, improved." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with apple juice + allergen_type = ALLERGEN_FRUIT //Made with apple juice /datum/reagent/drink/soda/pineappleade name = "Pineappleade" @@ -1577,7 +1577,7 @@ glass_name = "pineappleade" glass_desc = "Pineapple, juiced up." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with pineapple juice + allergen_type = ALLERGEN_FRUIT //Made with pineapple juice /datum/reagent/drink/soda/kiraspecial name = "Kira Special" @@ -1590,7 +1590,7 @@ glass_name = "Kira Special" glass_desc = "Long live the guy who everyone had mistaken for a girl. Baka!" glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from orange and lime juice + allergen_type = ALLERGEN_FRUIT //Made from orange and lime juice /datum/reagent/drink/soda/brownstar name = "Brown Star" @@ -1602,7 +1602,7 @@ glass_name = "Brown Star" glass_desc = "It's not what it sounds like..." - allergen_type = FRUIT //Made with orangejuice and cola + allergen_type = ALLERGEN_FRUIT //Made with orangejuice and cola /datum/reagent/drink/milkshake name = "Milkshake" @@ -1614,7 +1614,7 @@ glass_name = "milkshake" glass_desc = "Glorious brainfreezing mixture." - allergen_type = DAIRY //Made with dairy products + allergen_type = ALLERGEN_DAIRY //Made with dairy products /datum/reagent/milkshake/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1647,7 +1647,7 @@ glass_name = "Chocolate Milkshake" glass_desc = "A refreshing chocolate milkshake, just like mom used to make." - allergen_type = DAIRY //Made with dairy products + allergen_type = ALLERGEN_DAIRY //Made with dairy products /datum/reagent/drink/milkshake/berryshake name = "Berry Milkshake" @@ -1659,7 +1659,7 @@ glass_name = "Berry Milkshake" glass_desc = "A refreshing berry milkshake, just like mom used to make." - allergen_type = FRUIT|DAIRY //Made with berry juice and dairy products + allergen_type = ALLERGEN_FRUIT|ALLERGEN_DAIRY //Made with berry juice and dairy products /datum/reagent/drink/milkshake/coffeeshake name = "Coffee Milkshake" @@ -1674,7 +1674,7 @@ glass_name = "Coffee Milkshake" glass_desc = "An energizing coffee milkshake, perfect for hot days at work.." - allergen_type = DAIRY|COFFEE //Made with coffee and dairy products + allergen_type = ALLERGEN_DAIRY|ALLERGEN_COFFEE //Made with coffee and dairy products /datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien) M.make_jittery(5) @@ -1688,7 +1688,7 @@ glass_name = "Peanut Milkshake" glass_desc = "Savory cream in an ice-cold stature." - allergen_type = SEEDS|DAIRY //Made with peanutbutter(seeds) and dairy products + allergen_type = ALLERGEN_SEEDS|ALLERGEN_DAIRY //Made with peanutbutter(seeds) and dairy products /datum/reagent/drink/rewriter name = "Rewriter" @@ -1700,7 +1700,7 @@ glass_name = "Rewriter" glass_desc = "The secret of the sanctuary of the Libarian..." - allergen_type = FRUIT|COFFEE //Made with space mountain wind (Fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_COFFEE //Made with space mountain wind (Fruit) /datum/reagent/drink/rewriter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1765,7 +1765,7 @@ glass_name = "Space Mountain Wind" glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Fruit allergens because citrus is implied to come from limes/lemons + allergen_type = ALLERGEN_FRUIT //Fruit allergens because citrus is implied to come from limes/lemons /datum/reagent/drink/soda/dr_gibb name = "Dr. Gibb" @@ -1790,7 +1790,7 @@ glass_name = "Space-up" glass_desc = "Space-up. It helps keep your cool." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT + allergen_type = ALLERGEN_FRUIT /datum/reagent/drink/soda/lemon_lime name = "Lemon-Lime" @@ -1803,7 +1803,7 @@ glass_name = "lemon lime soda" glass_desc = "A tangy substance made of 0.5% natural citrus!" glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with lemon and lime juice + allergen_type = ALLERGEN_FRUIT //Made with lemon and lime juice /datum/reagent/drink/soda/gingerale name = "Ginger Ale" @@ -1860,7 +1860,7 @@ glass_name = "roy rogers" glass_desc = "I'm a cowboy, on a steel horse I ride" glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with lemon lime + allergen_type = ALLERGEN_FRUIT //Made with lemon lime /datum/reagent/drink/collins_mix name = "Collins Mix" @@ -1873,7 +1873,7 @@ glass_name = "collins mix" glass_desc = "Best hope it isn't a hoax." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with lemon lime + allergen_type = ALLERGEN_FRUIT //Made with lemon lime /datum/reagent/drink/arnold_palmer name = "Arnold Palmer" @@ -1886,7 +1886,7 @@ glass_name = "arnold palmer" glass_desc = "Tastes just like the old man." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with lemonade + allergen_type = ALLERGEN_FRUIT //Made with lemonade /datum/reagent/drink/doctor_delight name = "The Doctor's Delight" @@ -1899,7 +1899,7 @@ glass_name = "The Doctor's Delight" glass_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." - allergen_type = FRUIT|DAIRY //Made from several fruit juices, and cream. + allergen_type = ALLERGEN_FRUIT|ALLERGEN_DAIRY //Made from several fruit juices, and cream. /datum/reagent/drink/doctor_delight/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2008,7 +2008,7 @@ glass_name = "Dream Cream" glass_desc = "A smoothy, silky mix of honey and dairy." - allergen_type = DAIRY //Made using dairy + allergen_type = ALLERGEN_DAIRY //Made using dairy /datum/reagent/drink/soda/vilelemon name = "Vile Lemon" @@ -2020,7 +2020,7 @@ glass_name = "Vile Lemon" glass_desc = "A sour, fizzy drink with lemonade and lemonlime." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from lemonade + allergen_type = ALLERGEN_FRUIT //Made from lemonade /datum/reagent/drink/entdraught name = "Ent's Draught" @@ -2031,7 +2031,7 @@ glass_name = "Ent's Draught" glass_desc = "You can almost smell the tranquility emanating from this." - //allergen_type = FRUIT Sorry to break the news, chief. Honey is not a fruit. + //allergen_type = ALLERGEN_FRUIT Sorry to break the news, chief. Honey is not a fruit. /datum/reagent/drink/lovepotion name = "Love Potion" @@ -2042,7 +2042,7 @@ glass_name = "Love Potion" glass_desc = "Love me tender, love me sweet." - allergen_type = FRUIT|DAIRY //Made from cream(dairy) and berryjuice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_DAIRY //Made from cream(dairy) and berryjuice(fruit) /datum/reagent/drink/oilslick name = "Oil Slick" @@ -2055,7 +2055,7 @@ glass_name = "Oil Slick" glass_desc = "A concoction that should probably be in an engine, rather than your stomach." glass_icon = DRINK_ICON_NOISY - allergen_type = VEGETABLE //Made from corn oil + allergen_type = ALLERGEN_VEGETABLE //Made from corn oil /datum/reagent/drink/slimeslammer name = "Slick Slimes Slammer" @@ -2068,7 +2068,7 @@ glass_name = "Slick Slime Slammer" glass_desc = "A concoction that should probably be in an engine, rather than your stomach. Still." glass_icon = DRINK_ICON_NOISY - allergen_type = VEGETABLE|SEEDS //Made from corn oil and peanutbutter + allergen_type = ALLERGEN_VEGETABLE|ALLERGEN_SEEDS //Made from corn oil and peanutbutter /datum/reagent/drink/eggnog name = "Eggnog" @@ -2079,7 +2079,7 @@ glass_name = "Eggnog" glass_desc = "You can't egg-nore the holiday cheer all around you" - allergen_type = DAIRY|EGGS //Eggnog is made with dairy and eggs. + allergen_type = ALLERGEN_DAIRY|ALLERGEN_EGGS //Eggnog is made with dairy and eggs. /datum/reagent/drink/nuclearwaste name = "Nuclear Waste" @@ -2093,7 +2093,7 @@ glass_desc = "Sadly, no super powers." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) - allergen_type = VEGETABLE //Made from oilslick, so has the same allergens. + allergen_type = ALLERGEN_VEGETABLE //Made from oilslick, so has the same allergens. /datum/reagent/drink/nuclearwaste/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2119,7 +2119,7 @@ glass_desc = "A pitiful sludge that looks vaguely like a soda.. if you look at it a certain way." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) - allergen_type = VEGETABLE //Made from corn oil + allergen_type = ALLERGEN_VEGETABLE //Made from corn oil /datum/reagent/drink/sodaoil/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2149,7 +2149,7 @@ glass_name = "mojito" glass_desc = "Mint, bubbly water, and citrus, made for sailing." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with lime juice + allergen_type = ALLERGEN_FRUIT //Made with lime juice /datum/reagent/drink/sexonthebeach name = "Virgin Sex On The Beach" @@ -2160,7 +2160,7 @@ glass_name = "sex on the beach" glass_desc = "A secret combination of orange juice and pomegranate." - allergen_type = FRUIT //Made with orange juice + allergen_type = ALLERGEN_FRUIT //Made with orange juice /datum/reagent/drink/driverspunch name = "Driver's Punch" @@ -2172,7 +2172,7 @@ glass_name = "driver`s punch" glass_desc = "A fruity punch!" glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with appleade and orange juice + allergen_type = ALLERGEN_FRUIT //Made with appleade and orange juice /datum/reagent/drink/mintapplesparkle name = "Mint Apple Sparkle" @@ -2184,7 +2184,7 @@ glass_name = "mint apple sparkle" glass_desc = "Delicious appleade with a touch of mint." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with appleade + allergen_type = ALLERGEN_FRUIT //Made with appleade /datum/reagent/drink/berrycordial name = "Berry Cordial" @@ -2196,7 +2196,7 @@ glass_name = "berry cordial" glass_desc = "How berry cordial of you." glass_icon = DRINK_ICON_NOISY - allergen_type = FRUIT //Made with berry and lemonjuice + allergen_type = ALLERGEN_FRUIT //Made with berry and lemonjuice /datum/reagent/drink/tropicalfizz name = "Tropical Fizz" @@ -2209,7 +2209,7 @@ glass_desc = "One sip and you're in the bahamas." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made with several fruit juices + allergen_type = ALLERGEN_FRUIT //Made with several fruit juices /datum/reagent/drink/fauxfizz name = "Faux Fizz" @@ -2222,7 +2222,7 @@ glass_desc = "One sip and you're in the bahamas... maybe." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //made with several fruit juices + allergen_type = ALLERGEN_FRUIT //made with several fruit juices /* Alcohol */ @@ -2252,7 +2252,7 @@ glass_name = "ale" glass_desc = "A freezing pint of delicious ale" - allergen_type = GRAINS //Barley is grain + allergen_type = ALLERGEN_GRAINS //Barley is grain /datum/reagent/ethanol/beer name = "Beer" @@ -2266,7 +2266,7 @@ glass_name = "beer" glass_desc = "A freezing pint of beer" - allergen_type = GRAINS //Made from grains + allergen_type = ALLERGEN_GRAINS //Made from grains /datum/reagent/ethanol/beer/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2286,7 +2286,7 @@ glass_name = "lite beer" glass_desc = "A freezing pint of lite beer" - allergen_type = GRAINS //Made from grains + allergen_type = ALLERGEN_GRAINS //Made from grains /datum/reagent/ethanol/bluecuracao name = "Blue Curacao" @@ -2300,7 +2300,7 @@ glass_name = "blue curacao" glass_desc = "Exotically blue, fruity drink, distilled from oranges." - allergen_type = FRUIT //Made from oranges(fruit) + allergen_type = ALLERGEN_FRUIT //Made from oranges(fruit) /datum/reagent/ethanol/cognac name = "Cognac" @@ -2314,7 +2314,7 @@ glass_name = "cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." - allergen_type = FRUIT //Cognac is made from wine which is made from grapes. + allergen_type = ALLERGEN_FRUIT //Cognac is made from wine which is made from grapes. /datum/reagent/ethanol/deadrum name = "Deadrum" @@ -2356,12 +2356,12 @@ glass_name = "gin" glass_desc = "A crystal clear glass of Griffeater gin." - allergen_type = FRUIT //Made from juniper berries + allergen_type = ALLERGEN_FRUIT //Made from juniper berries //Base type for alchoholic drinks containing coffee /datum/reagent/ethanol/coffee overdose = 45 - allergen_type = COFFEE //Contains coffee or is made from coffee + allergen_type = ALLERGEN_COFFEE //Contains coffee or is made from coffee /datum/reagent/ethanol/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -2415,7 +2415,7 @@ glass_name = "melon liquor" glass_desc = "A relatively sweet and fruity 46 proof liquor." - allergen_type = FRUIT //Made from watermelons + allergen_type = ALLERGEN_FRUIT //Made from watermelons /datum/reagent/ethanol/melonspritzer name = "Melon Spritzer" @@ -2429,7 +2429,7 @@ glass_desc = "Melons: Citrus style." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from watermelon juice, apple juice, and lime juice + allergen_type = ALLERGEN_FRUIT //Made from watermelon juice, apple juice, and lime juice /datum/reagent/ethanol/rum name = "Rum" @@ -2465,7 +2465,7 @@ glass_name = "sex on the beach" glass_desc = "A concoction of vodka and a secret combination of orange juice and pomegranate." - allergen_type = FRUIT //Made from orange juice + allergen_type = ALLERGEN_FRUIT //Made from orange juice /datum/reagent/ethanol/tequila name = "Tequila" @@ -2510,7 +2510,7 @@ glass_name = "vermouth" glass_desc = "You wonder why you're even drinking this straight." - allergen_type = FRUIT //Vermouth is made from wine which is made from grapes(fruit) + allergen_type = ALLERGEN_FRUIT //Vermouth is made from wine which is made from grapes(fruit) /datum/reagent/ethanol/vodka name = "Vodka" @@ -2523,7 +2523,7 @@ glass_name = "vodka" glass_desc = "The glass contain wodka. Xynta." - allergen_type = GRAINS //Vodka is made from grains + allergen_type = ALLERGEN_GRAINS //Vodka is made from grains /datum/reagent/ethanol/vodka/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2540,7 +2540,7 @@ glass_name = "whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - allergen_type = GRAINS //Whiskey is also made from grain. + allergen_type = ALLERGEN_GRAINS //Whiskey is also made from grain. /datum/reagent/ethanol/wine name = "Wine" @@ -2553,7 +2553,7 @@ glass_name = "wine" glass_desc = "A very classy looking drink." - allergen_type = FRUIT //Wine is made from grapes (fruit) + allergen_type = ALLERGEN_FRUIT //Wine is made from grapes (fruit) /datum/reagent/ethanol/wine/champagne name = "Champagne" @@ -2565,7 +2565,7 @@ glass_name = "champagne" glass_desc = "An even classier looking drink." - allergen_type = FRUIT //Still wine, and still made from grapes (fruit) + allergen_type = ALLERGEN_FRUIT //Still wine, and still made from grapes (fruit) /datum/reagent/ethanol/cider name = "Cider" @@ -2579,7 +2579,7 @@ glass_desc = "The second most Irish drink." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from fruit + allergen_type = ALLERGEN_FRUIT //Made from fruit // Cocktails @@ -2596,7 +2596,7 @@ glass_name = "Acid Spit" glass_desc = "A drink from the company archives. Made from live aliens." - allergen_type = FRUIT //Made from wine (fruit) + allergen_type = ALLERGEN_FRUIT //Made from wine (fruit) /datum/reagent/ethanol/alliescocktail name = "Allies Cocktail" @@ -2609,7 +2609,7 @@ glass_name = "Allies cocktail" glass_desc = "A drink made from your allies." - allergen_type = GRAINS|FRUIT //Made from vodka(grain) as well as martini(vermouth(fruit) and gin(fruit)) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from vodka(grain) as well as martini(vermouth(fruit) and gin(fruit)) /datum/reagent/ethanol/aloe name = "Aloe" @@ -2622,7 +2622,7 @@ glass_name = "Aloe" glass_desc = "Very, very, very good." - allergen_type = FRUIT|DAIRY|GRAINS //Made from cream(dairy), whiskey(grains), and watermelon juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_DAIRY|ALLERGEN_GRAINS //Made from cream(dairy), whiskey(grains), and watermelon juice(fruit) /datum/reagent/ethanol/amasec name = "Amasec" @@ -2636,7 +2636,7 @@ glass_name = "Amasec" glass_desc = "Always handy before combat!" - allergen_type = FRUIT|GRAINS //Made from wine(fruit) and vodka(grains) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from wine(fruit) and vodka(grains) /datum/reagent/ethanol/andalusia name = "Andalusia" @@ -2649,7 +2649,7 @@ glass_name = "Andalusia" glass_desc = "A nice, strange named drink." - allergen_type = GRAINS|FRUIT //Made from whiskey(grains) and lemonjuice (fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from whiskey(grains) and lemonjuice (fruit) /datum/reagent/ethanol/antifreeze name = "Anti-freeze" @@ -2664,7 +2664,7 @@ glass_name = "Anti-freeze" glass_desc = "The ultimate refreshment." - allergen_type = GRAINS|DAIRY //Made from vodka(grains) and cream(dairy) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_DAIRY //Made from vodka(grains) and cream(dairy) /datum/reagent/ethanol/atomicbomb name = "Atomic Bomb" @@ -2679,7 +2679,7 @@ glass_name = "Atomic Bomb" glass_desc = "We cannot take legal responsibility for your actions after imbibing." - allergen_type = COFFEE|DAIRY|FRUIT|GRAINS //Made from b52 which contains kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from b52 which contains kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) /datum/reagent/ethanol/coffee/b52 name = "B-52" @@ -2693,7 +2693,7 @@ glass_name = "B-52" glass_desc = "Kahlua, Irish cream, and cognac. You will get bombed." - allergen_type = COFFEE|DAIRY|FRUIT|GRAINS //Made from kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) /datum/reagent/ethanol/bahama_mama name = "Bahama mama" @@ -2706,7 +2706,7 @@ glass_name = "Bahama Mama" glass_desc = "Tropical cocktail." - allergen_type = FRUIT //Made from orange juice and lime juice + allergen_type = ALLERGEN_FRUIT //Made from orange juice and lime juice /datum/reagent/ethanol/bananahonk name = "Banana Mama" @@ -2720,7 +2720,7 @@ glass_name = "Banana Honk" glass_desc = "A drink from Banana Heaven." - allergen_type = FRUIT|DAIRY //Made from banana juice(fruit) and cream(dairy) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_DAIRY //Made from banana juice(fruit) and cream(dairy) /datum/reagent/ethanol/barefoot name = "Barefoot" @@ -2733,7 +2733,7 @@ glass_name = "Barefoot" glass_desc = "Barefoot and pregnant." - allergen_type = DAIRY|FRUIT //Made from berry juice (fruit), cream(dairy), and vermouth(fruit) + allergen_type = ALLERGEN_DAIRY|ALLERGEN_FRUIT //Made from berry juice (fruit), cream(dairy), and vermouth(fruit) /datum/reagent/ethanol/beepsky_smash name = "Beepsky Smash" @@ -2748,7 +2748,7 @@ glass_name = "Beepsky Smash" glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - allergen_type = FRUIT|GRAINS //Made from whiskey(grains), and limejuice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from whiskey(grains), and limejuice(fruit) /datum/reagent/ethanol/beepsky_smash/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2766,7 +2766,7 @@ glass_name = "bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - allergen_type = GRAINS|DAIRY //Made from milk(dairy) and beer(grains) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_DAIRY //Made from milk(dairy) and beer(grains) /datum/reagent/ethanol/black_russian name = "Black Russian" @@ -2779,7 +2779,7 @@ glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." - allergen_type = COFFEE|GRAINS //Made from vodka(grains) and kahlua(coffee) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_GRAINS //Made from vodka(grains) and kahlua(coffee) /datum/reagent/ethanol/bloody_mary name = "Bloody Mary" @@ -2792,7 +2792,7 @@ glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - allergen_type = GRAINS|FRUIT //Made from vodka (grains), tomato juice(fruit), and lime juice(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from vodka (grains), tomato juice(fruit), and lime juice(fruit) /datum/reagent/ethanol/booger name = "Booger" @@ -2805,7 +2805,7 @@ glass_name = "Booger" glass_desc = "Ewww..." - allergen_type = DAIRY|FRUIT //Made from cream(dairy), banana juice(fruit), and watermelon juice(fruit) + allergen_type = ALLERGEN_DAIRY|ALLERGEN_FRUIT //Made from cream(dairy), banana juice(fruit), and watermelon juice(fruit) /datum/reagent/ethanol/coffee/brave_bull //Since it's under the /coffee subtype, it already has coffee allergens. name = "Brave Bull" @@ -2830,7 +2830,7 @@ glass_name = "Changeling Sting" glass_desc = "A stingy drink." - allergen_type = FRUIT|GRAINS //Made from screwdriver(vodka(grains), orange juice(fruit)), lime juice(fruit), and lemon juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from screwdriver(vodka(grains), orange juice(fruit)), lime juice(fruit), and lemon juice(fruit) /datum/reagent/ethanol/martini name = "Classic Martini" @@ -2843,7 +2843,7 @@ glass_name = "classic martini" glass_desc = "Damn, the bartender even stirred it, not shook it." - allergen_type = FRUIT //Made from gin(fruit) and vermouth(fruit) + allergen_type = ALLERGEN_FRUIT //Made from gin(fruit) and vermouth(fruit) /datum/reagent/ethanol/cuba_libre name = "Cuba Libre" @@ -2867,7 +2867,7 @@ glass_name = "Demons' Blood" glass_desc = "Just looking at this thing makes the hair on the back of your neck stand up." - allergen_type = FRUIT //Made from space mountain wind(fruit) + allergen_type = ALLERGEN_FRUIT //Made from space mountain wind(fruit) /datum/reagent/ethanol/devilskiss name = "Devils Kiss" @@ -2879,7 +2879,7 @@ glass_name = "Devil's Kiss" glass_desc = "Creepy time!" - allergen_type = COFFEE //Made from kahlua (Coffee) + allergen_type = ALLERGEN_COFFEE //Made from kahlua (Coffee) /datum/reagent/ethanol/driestmartini name = "Driest Martini" @@ -2892,7 +2892,7 @@ glass_name = "Driest Martini" glass_desc = "Only for the experienced. You think you see sand floating in the glass." - allergen_type = FRUIT //Made from gin(fruit) + allergen_type = ALLERGEN_FRUIT //Made from gin(fruit) /datum/reagent/ethanol/ginfizz name = "Gin Fizz" @@ -2905,7 +2905,7 @@ glass_name = "gin fizz" glass_desc = "Refreshingly lemony, deliciously dry." - allergen_type = FRUIT //Made from gin(fruit) and lime juice(fruit) + allergen_type = ALLERGEN_FRUIT //Made from gin(fruit) and lime juice(fruit) /datum/reagent/ethanol/grog name = "Grog" @@ -2930,7 +2930,7 @@ glass_name = "Erika Surprise" glass_desc = "The surprise is, it's green!" - allergen_type = GRAINS|FRUIT //Made from ale (grains), lime juice (fruit), whiskey(grains), banana juice(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from ale (grains), lime juice (fruit), whiskey(grains), banana juice(fruit) /datum/reagent/ethanol/gargle_blaster name = "Pan-Galactic Gargle Blaster" @@ -2946,7 +2946,7 @@ glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." - allergen_type = FRUIT|GRAINS //Made from vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) /datum/reagent/ethanol/gintonic name = "Gin and Tonic" @@ -2959,7 +2959,7 @@ glass_name = "gin and tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." - allergen_type = FRUIT //Made from gin(fruit) + allergen_type = ALLERGEN_FRUIT //Made from gin(fruit) /datum/reagent/ethanol/goldschlager name = "Goldschlager" @@ -2973,7 +2973,7 @@ glass_name = "Goldschlager" glass_desc = "100 proof that teen girls will drink anything with gold in it." - allergen_type = GRAINS //Made from vodka(grains) + allergen_type = ALLERGEN_GRAINS //Made from vodka(grains) /datum/reagent/ethanol/hippies_delight name = "Hippies' Delight" @@ -2988,7 +2988,7 @@ glass_name = "Hippie's Delight" glass_desc = "A drink enjoyed by people during the 1960's." - allergen_type = FRUIT|GRAINS //Made from gargle blaster which contains vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from gargle blaster which contains vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) //Also, yes. Mushrooms produce psilocybin; however, it's also still just a chemical compound, and not necessarily going to trigger a fungi allergy. /datum/reagent/ethanol/hooch @@ -3016,7 +3016,7 @@ glass_name = "iced beer" glass_desc = "A beer so frosty, the air around it freezes." glass_special = list(DRINK_ICE) - allergen_type = GRAINS //Made from beer(grains) + allergen_type = ALLERGEN_GRAINS //Made from beer(grains) /datum/reagent/ethanol/irishcarbomb name = "Irish Car Bomb" @@ -3029,7 +3029,7 @@ glass_name = "Irish Car Bomb" glass_desc = "An irish car bomb." - allergen_type = DAIRY|GRAINS //Made from ale(grains) and irish cream(whiskey(grains), cream(dairy)) + allergen_type = ALLERGEN_DAIRY|ALLERGEN_GRAINS //Made from ale(grains) and irish cream(whiskey(grains), cream(dairy)) /datum/reagent/ethanol/coffee/irishcoffee name = "Irish Coffee" @@ -3042,7 +3042,7 @@ glass_name = "Irish coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - allergen_type = COFFEE|DAIRY|GRAINS //Made from Coffee(coffee) and irish cream(whiskey(grains), cream(dairy)) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_GRAINS //Made from Coffee(coffee) and irish cream(whiskey(grains), cream(dairy)) /datum/reagent/ethanol/irish_cream name = "Irish Cream" @@ -3055,7 +3055,7 @@ glass_name = "Irish cream" glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - allergen_type = DAIRY|GRAINS //Made from cream(dairy) and whiskey(grains) + allergen_type = ALLERGEN_DAIRY|ALLERGEN_GRAINS //Made from cream(dairy) and whiskey(grains) /datum/reagent/ethanol/longislandicedtea name = "Long Island Iced Tea" @@ -3068,7 +3068,7 @@ glass_name = "Long Island iced tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - allergen_type = GRAINS|FRUIT //Made from vodka(grains) and gin(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from vodka(grains) and gin(fruit) /datum/reagent/ethanol/manhattan name = "Manhattan" @@ -3081,7 +3081,7 @@ glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." - allergen_type = GRAINS|FRUIT //Made from whiskey(grains), and vermouth(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from whiskey(grains), and vermouth(fruit) /datum/reagent/ethanol/manhattan_proj name = "Manhattan Project" @@ -3094,7 +3094,7 @@ glass_name = "Manhattan Project" glass_desc = "A scientist's drink of choice, for thinking how to blow up the station." - allergen_type = GRAINS|FRUIT //Made from manhattan which is made from whiskey(grains), and vermouth(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from manhattan which is made from whiskey(grains), and vermouth(fruit) /datum/reagent/ethanol/manly_dorf name = "The Manly Dorf" @@ -3107,7 +3107,7 @@ glass_name = "The Manly Dorf" glass_desc = "A manly concotion made from Ale and Beer. Intended for true men only." - allergen_type = GRAINS //Made from beer(grains) and ale(grains) + allergen_type = ALLERGEN_GRAINS //Made from beer(grains) and ale(grains) /datum/reagent/ethanol/margarita name = "Margarita" @@ -3120,7 +3120,7 @@ glass_name = "margarita" glass_desc = "On the rocks with salt on the rim. Arriba~!" - allergen_type = FRUIT //Made from lime juice(fruit) + allergen_type = ALLERGEN_FRUIT //Made from lime juice(fruit) /datum/reagent/ethanol/mead name = "Mead" @@ -3161,7 +3161,7 @@ glass_icon = DRINK_ICON_NOISY glass_special = list("neuroright") - allergen_type = FRUIT|GRAINS //Made from gargle blaster which is made from vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from gargle blaster which is made from vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) /datum/reagent/ethanol/neurotoxin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -3189,7 +3189,7 @@ glass_name = "???" glass_desc = "A black ichor with an oily purple sheer on top. Are you sure you should drink this?" - allergen_type = FRUIT //Made from berries which are fruit + allergen_type = ALLERGEN_FRUIT //Made from berries which are fruit /datum/reagent/ethanol/pwine/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -3228,7 +3228,7 @@ glass_name = "Sbiten" glass_desc = "A spicy mix of Vodka and Spice. Very hot." - allergen_type = GRAINS //Made from vodka(grains) + allergen_type = ALLERGEN_GRAINS //Made from vodka(grains) /datum/reagent/ethanol/screwdrivercocktail name = "Screwdriver" @@ -3241,7 +3241,7 @@ glass_name = "Screwdriver" glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - allergen_type = FRUIT|GRAINS //Made from vodka(grains) and orange juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from vodka(grains) and orange juice(fruit) /datum/reagent/ethanol/silencer name = "Silencer" @@ -3255,7 +3255,7 @@ glass_name = "Silencer" glass_desc = "A drink from mime Heaven." - allergen_type = DAIRY //Made from cream (dairy) + allergen_type = ALLERGEN_DAIRY //Made from cream (dairy) /datum/reagent/ethanol/singulo name = "Singulo" @@ -3268,7 +3268,7 @@ glass_name = "Singulo" glass_desc = "A blue-space beverage." - allergen_type = GRAINS|FRUIT //Made from vodka(grains) and wine(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from vodka(grains) and wine(fruit) /datum/reagent/ethanol/snowwhite name = "Snow White" @@ -3281,7 +3281,7 @@ glass_name = "Snow White" glass_desc = "A cold refreshment." - allergen_type = COFFEE|FRUIT //made from Pineapple juice(fruit), lemon_lime(fruit), and kahlua(coffee) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_FRUIT //made from Pineapple juice(fruit), lemon_lime(fruit), and kahlua(coffee) /datum/reagent/ethanol/suidream name = "Sui Dream" @@ -3294,7 +3294,7 @@ glass_name = "Sui Dream" glass_desc = "A froofy, fruity, and sweet mixed drink. Understanding the name only brings shame." - allergen_type = FRUIT //Made from blue curacao(fruit) and melon liquor(fruit) + allergen_type = ALLERGEN_FRUIT //Made from blue curacao(fruit) and melon liquor(fruit) /datum/reagent/ethanol/syndicatebomb name = "Syndicate Bomb" @@ -3307,7 +3307,7 @@ glass_name = "Syndicate Bomb" glass_desc = "Tastes like terrorism!" - allergen_type = GRAINS //Made from beer(grain) and whiskeycola(whiskey(grain)) + allergen_type = ALLERGEN_GRAINS //Made from beer(grain) and whiskeycola(whiskey(grain)) /datum/reagent/ethanol/tequilla_sunrise name = "Tequila Sunrise" @@ -3332,7 +3332,7 @@ glass_name = "Three Mile Island iced tea" glass_desc = "A glass of this is sure to prevent a meltdown." - allergen_type = GRAINS|FRUIT //Made from long island iced tea(vodka(grains) and gin(fruit)) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from long island iced tea(vodka(grains) and gin(fruit)) /datum/reagent/ethanol/toxins_special name = "Toxins Special" @@ -3348,7 +3348,7 @@ glass_name = "Toxins Special" glass_desc = "Whoah, this thing is on fire!" - allergen_type = FRUIT //Made from vermouth(fruit) + allergen_type = ALLERGEN_FRUIT //Made from vermouth(fruit) /datum/reagent/ethanol/vodkamartini name = "Vodka Martini" @@ -3361,7 +3361,7 @@ glass_name = "vodka martini" glass_desc ="A bastardization of the classic martini. Still great." - allergen_type = GRAINS|FRUIT //made from vodka(grains) and vermouth(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //made from vodka(grains) and vermouth(fruit) /datum/reagent/ethanol/vodkatonic name = "Vodka and Tonic" @@ -3374,7 +3374,7 @@ glass_name = "vodka and tonic" glass_desc = "For when a gin and tonic isn't Russian enough." - allergen_type = GRAINS //Made from vodka(grains) + allergen_type = ALLERGEN_GRAINS //Made from vodka(grains) /datum/reagent/ethanol/white_russian name = "White Russian" @@ -3387,7 +3387,7 @@ glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." - allergen_type = COFFEE|GRAINS|DAIRY //Made from black russian(vodka(grains), kahlua(coffee)) and cream(dairy) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_GRAINS|ALLERGEN_DAIRY //Made from black russian(vodka(grains), kahlua(coffee)) and cream(dairy) /datum/reagent/ethanol/whiskey_cola name = "Whiskey Cola" @@ -3400,7 +3400,7 @@ glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - allergen_type = GRAINS //Made from whiskey(grains) + allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) /datum/reagent/ethanol/whiskeysoda name = "Whiskey Soda" @@ -3413,7 +3413,7 @@ glass_name = "whiskey soda" glass_desc = "Ultimate refreshment." - allergen_type = GRAINS //Made from whiskey(grains) + allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) /datum/reagent/ethanol/specialwhiskey // I have no idea what this is and where it comes from name = "Special Blend Whiskey" @@ -3426,7 +3426,7 @@ glass_name = "special blend whiskey" glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." - allergen_type = GRAINS //Whiskey(grains) + allergen_type = ALLERGEN_GRAINS //Whiskey(grains) /datum/reagent/ethanol/unathiliquor name = "Redeemer's Brew" @@ -3464,7 +3464,7 @@ glass_name = "Sake Bomb" glass_desc = "Some sake mixed into a pint of beer." - allergen_type = GRAINS //Made from beer(grains) + allergen_type = ALLERGEN_GRAINS //Made from beer(grains) /datum/reagent/ethanol/tamagozake name = "Tamagozake" @@ -3477,7 +3477,7 @@ glass_name = "Tamagozake" glass_desc = "An egg cracked into sake and sugar." - allergen_type = EGGS //Made with eggs + allergen_type = ALLERGEN_EGGS //Made with eggs /datum/reagent/ethanol/ginzamary name = "Ginza Mary" @@ -3490,7 +3490,7 @@ glass_name = "Ginza Mary" glass_desc = "Tomato juice, vodka, and sake make something not quite completely unlike a Bloody Mary." - allergen_type = FRUIT|GRAINS //Made from vodka(grains) and tomatojuice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from vodka(grains) and tomatojuice(fruit) /datum/reagent/ethanol/tokyorose name = "Tokyo Rose" @@ -3503,7 +3503,7 @@ glass_name = "Tokyo Rose" glass_desc = "It's kinda pretty!" - allergen_type = FRUIT //Made from berryjuice + allergen_type = ALLERGEN_FRUIT //Made from berryjuice /datum/reagent/ethanol/saketini name = "Saketini" @@ -3516,7 +3516,7 @@ glass_name = "Saketini" glass_desc = "What are you doing drinking this outside of New Kyoto?" - allergen_type = FRUIT //Made from gin(fruit) + allergen_type = ALLERGEN_FRUIT //Made from gin(fruit) /datum/reagent/ethanol/coffee/elysiumfacepunch name = "Elysium Facepunch" @@ -3529,7 +3529,7 @@ glass_name = "Elysium Facepunch" glass_desc = "A loathesome cocktail favored by Heaven's skeleton shift workers." - allergen_type = COFFEE|FRUIT //Made from kahlua(Coffee) and lemonjuice(fruit) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_FRUIT //Made from kahlua(Coffee) and lemonjuice(fruit) /datum/reagent/ethanol/erebusmoonrise name = "Erebus Moonrise" @@ -3542,7 +3542,7 @@ glass_name = "Erebus Moonrise" glass_desc = "A deeply alcoholic mix, popular in Nyx." - allergen_type = GRAINS //Made from whiskey(grains) and Vodka(grains) + allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) and Vodka(grains) /datum/reagent/ethanol/balloon name = "Balloon" @@ -3555,7 +3555,7 @@ glass_name = "Balloon" glass_desc = "A strange drink invented in the aerostats of Venus." - allergen_type = DAIRY|FRUIT //Made from blue curacao(fruit) and cream(dairy) + allergen_type = ALLERGEN_DAIRY|ALLERGEN_FRUIT //Made from blue curacao(fruit) and cream(dairy) /datum/reagent/ethanol/natunabrandy name = "Natuna Brandy" @@ -3569,7 +3569,7 @@ glass_desc = "On Natuna, they do the best with what they have." glass_special = list(DRINK_FIZZ) - allergen_type = GRAINS //Made from beer(grains) + allergen_type = ALLERGEN_GRAINS //Made from beer(grains) /datum/reagent/ethanol/euphoria name = "Euphoria" @@ -3582,7 +3582,7 @@ glass_name = "Euphoria" glass_desc = "Invented by a Eutopian marketing team, this is one of the most expensive cocktails in existence." - allergen_type = GRAINS|FRUIT //Made from specialwhiskey(grain) and cognac(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from specialwhiskey(grain) and cognac(fruit) /datum/reagent/ethanol/xanaducannon name = "Xanadu Cannon" @@ -3595,7 +3595,7 @@ glass_name = "Xanadu Cannon" glass_desc = "Common in the entertainment districts of Titan." - allergen_type = GRAINS //Made from ale(grain) + allergen_type = ALLERGEN_GRAINS //Made from ale(grain) /datum/reagent/ethanol/debugger name = "Debugger" @@ -3607,7 +3607,7 @@ glass_name = "Debugger" glass_desc = "From Shelf. Not for human consumption." - allergen_type = VEGETABLE //Made from corn oil(vegetable) + allergen_type = ALLERGEN_VEGETABLE //Made from corn oil(vegetable) /datum/reagent/ethanol/spacersbrew name = "Spacer's Brew" @@ -3620,7 +3620,7 @@ glass_name = "Spacer's Brew" glass_desc = "Ethanol and orange soda. A common emergency drink on frontier colonies." - allergen_type = FRUIT //Made from brownstar(orange juice(fruit)) + allergen_type = ALLERGEN_FRUIT //Made from brownstar(orange juice(fruit)) /datum/reagent/ethanol/binmanbliss name = "Binman Bliss" @@ -3644,7 +3644,7 @@ glass_name = "Chrysanthemum" glass_desc = "An exotic cocktail from New Kyoto." - allergen_type = FRUIT //Made from melon liquor(fruit) + allergen_type = ALLERGEN_FRUIT //Made from melon liquor(fruit) /datum/reagent/ethanol/bitters name = "Bitters" @@ -3668,7 +3668,7 @@ glass_name = "Soemmer Fire" glass_desc = "A painfully hot mixed drink, for when you absolutely need to hurt right now." - allergen_type = GRAINS|FRUIT //Made from manhattan(whiskey(grains), vermouth(fruit)) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from manhattan(whiskey(grains), vermouth(fruit)) /datum/reagent/drink/soemmerfire/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -3687,7 +3687,7 @@ glass_name = "Wine Brandy" glass_desc = "A very classy looking after-dinner drink." - allergen_type = FRUIT //Made from wine, which is made from fruit + allergen_type = ALLERGEN_FRUIT //Made from wine, which is made from fruit /datum/reagent/ethanol/morningafter name = "Morning After" @@ -3700,7 +3700,7 @@ glass_name = "Morning After" glass_desc = "The finest hair of the dog, coming up!" - allergen_type = GRAINS|COFFEE //Made from sbiten(vodka(grain)) and coffee(coffee) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_COFFEE //Made from sbiten(vodka(grain)) and coffee(coffee) /datum/reagent/ethanol/vesper name = "Vesper" @@ -3713,7 +3713,7 @@ glass_name = "Vesper" glass_desc = "A dry martini, ice cold and well shaken." - allergen_type = FRUIT|GRAINS //Made from wine(fruit), vodka(grain), and gin(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from wine(fruit), vodka(grain), and gin(fruit) /datum/reagent/ethanol/rotgut name = "Rotgut Fever Dream" @@ -3726,7 +3726,7 @@ glass_name = "Rotgut Fever Dream" glass_desc = "Why are you doing this to yourself?" - allergen_type = GRAINS //Made from whiskey(grains) and vodka(grains) + allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) and vodka(grains) /datum/reagent/ethanol/voxdelight name = "Vox's Delight" @@ -3759,7 +3759,7 @@ glass_name = "Screaming Viking" glass_desc = "A boozy, citrus-packed brew." - allergen_type = FRUIT|GRAINS //Made from martini(gin(fruit), vermouth(fruit)), vodka tonic(vodka(grain)), and lime juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from martini(gin(fruit), vermouth(fruit)), vodka tonic(vodka(grain)), and lime juice(fruit) /datum/reagent/ethanol/robustin name = "Robustin" @@ -3772,7 +3772,7 @@ glass_name = "Robustin" glass_desc = "A bootleg brew of all the worst things on station." - allergen_type = GRAINS|DAIRY //Made from antifreeze(vodka(grains),cream(dairy)) and vodka(grains) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_DAIRY //Made from antifreeze(vodka(grains),cream(dairy)) and vodka(grains) /datum/reagent/ethanol/virginsip name = "Virgin Sip" @@ -3785,7 +3785,7 @@ glass_name = "Virgin Sip" glass_desc = "A perfect martini, watered down and ruined." - allergen_type = FRUIT //Made from driest martini(gin(fruit)) + allergen_type = ALLERGEN_FRUIT //Made from driest martini(gin(fruit)) /datum/reagent/ethanol/jellyshot name = "Jelly Shot" @@ -3798,7 +3798,7 @@ glass_name = "Jelly Shot" glass_desc = "A thick and vibrant alcoholic gel, perfect for the night life." - allergen_type = FRUIT|GRAINS //Made from cherry jelly(fruit), and vodka(grains) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from cherry jelly(fruit), and vodka(grains) /datum/reagent/ethanol/slimeshot name = "Named Bullet" @@ -3811,7 +3811,7 @@ glass_name = "Named Bullet" glass_desc = "A thick slime jelly shot. You can feel your death approaching." - allergen_type = GRAINS //Made from vodka(grains) + allergen_type = ALLERGEN_GRAINS //Made from vodka(grains) /datum/reagent/drink/slimeshot/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -3830,7 +3830,7 @@ glass_name = "Clover Club" glass_desc = "A light and refreshing raspberry cocktail." - allergen_type = FRUIT //Made from berry juice(fruit), lemon juice(fruit), and gin(fruit) + allergen_type = ALLERGEN_FRUIT //Made from berry juice(fruit), lemon juice(fruit), and gin(fruit) /datum/reagent/ethanol/negroni name = "Negroni" @@ -3843,7 +3843,7 @@ glass_name = "Negroni" glass_desc = "A dark, complicated blend, perfect for relaxing nights by the fire." - allergen_type = FRUIT //Made from gin(fruit) and vermouth(fruit) + allergen_type = ALLERGEN_FRUIT //Made from gin(fruit) and vermouth(fruit) /datum/reagent/ethanol/whiskeysour name = "Whiskey Sour" @@ -3856,7 +3856,7 @@ glass_name = "Whiskey Sour" glass_desc = "A smokey, refreshing lemoned whiskey." - allergen_type = GRAINS|FRUIT //Made from whiskey(grains) and lemon juice(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from whiskey(grains) and lemon juice(fruit) /datum/reagent/ethanol/oldfashioned name = "Old Fashioned" @@ -3869,7 +3869,7 @@ glass_name = "Old Fashioned" glass_desc = "A classic mix of whiskey and sugar... simple and direct." - allergen_type = GRAINS //Made from whiskey(grains) + allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) /datum/reagent/ethanol/daiquiri name = "Daiquiri" @@ -3882,7 +3882,7 @@ glass_name = "Daiquiri" glass_desc = "Refeshing rum and citrus. Time for a tropical get away." - allergen_type = FRUIT //Made from lime juice(fruit) + allergen_type = ALLERGEN_FRUIT //Made from lime juice(fruit) /datum/reagent/ethanol/mojito name = "Mojito" @@ -3896,7 +3896,7 @@ glass_desc = "Minty rum and citrus, made for sailing." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from lime juice(fruit) + allergen_type = ALLERGEN_FRUIT //Made from lime juice(fruit) /datum/reagent/ethanol/paloma name = "Paloma" @@ -3910,7 +3910,7 @@ glass_desc = "Tequila and citrus, iced just right..." glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from orange juice(fruit) + allergen_type = ALLERGEN_FRUIT //Made from orange juice(fruit) /datum/reagent/ethanol/piscosour name = "Pisco Sour" @@ -3923,7 +3923,7 @@ glass_name = "Pisco Sour" glass_desc = "South American bliss, served ice cold." - allergen_type = FRUIT //Made from wine brandy(fruit), and lemon juice(fruit) + allergen_type = ALLERGEN_FRUIT //Made from wine brandy(fruit), and lemon juice(fruit) /datum/reagent/ethanol/coldfront name = "Cold Front" @@ -3938,7 +3938,7 @@ glass_name = "Cold Front" glass_desc = "Minty, rich, and painfully cold. It's a blizzard in a cup." - allergen_type = COFFEE //Made from iced coffee(coffee) + allergen_type = ALLERGEN_COFFEE //Made from iced coffee(coffee) /datum/reagent/ethanol/mintjulep name = "Mint Julep" @@ -3975,7 +3975,7 @@ glass_desc = "The glass is barely able to contain the wodka. Xynta." glass_special = list(DRINK_FIZZ) - allergen_type = GRAINS //Made from vodka(grain) + allergen_type = ALLERGEN_GRAINS //Made from vodka(grain) /datum/reagent/ethanol/godka/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -4005,7 +4005,7 @@ glass_desc = "A very pious looking drink." glass_icon = DRINK_ICON_NOISY - allergen_type = FRUIT //Made from grapes(fruit) + allergen_type = ALLERGEN_FRUIT //Made from grapes(fruit) /datum/reagent/ethanol/holy_mary name = "Holy Mary" @@ -4018,7 +4018,7 @@ glass_name = "Holy Mary" glass_desc = "Angel's Ichor, mixed with Vodka and a lil' bit of lime. Tastes like liquid ascension." - allergen_type = FRUIT|GRAINS //Made from vodka(grain), holy wine(fruit), and lime juice(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from vodka(grain), holy wine(fruit), and lime juice(fruit) /datum/reagent/ethanol/angelswrath name = "Angels Wrath" @@ -4034,7 +4034,7 @@ glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) - allergen_type = FRUIT //Made from space mountain wind(fruit), and holy wine(fruit) + allergen_type = ALLERGEN_FRUIT //Made from space mountain wind(fruit), and holy wine(fruit) /datum/reagent/ethanol/angelskiss name = "Angels Kiss" @@ -4047,7 +4047,7 @@ glass_name = "Angel's Kiss" glass_desc = "Miracle time!" - allergen_type = FRUIT|COFFEE //Made from holy wine(fruit), and kahlua(coffee) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_COFFEE //Made from holy wine(fruit), and kahlua(coffee) /datum/reagent/ethanol/ichor_mead name = "Ichor Mead" @@ -4060,7 +4060,7 @@ glass_name = "Ichor Mead" glass_desc = "A trip to Valhalla." - allergen_type = FRUIT //Made from holy wine(fruit) + allergen_type = ALLERGEN_FRUIT //Made from holy wine(fruit) /datum/reagent/ethanol/schnapps_pep name = "Peppermint Schnapps" @@ -4084,7 +4084,7 @@ glass_name = "peach schnapps" glass_desc = "A glass of peach schnapps. It seems like it'd be better, mixed." - allergen_type = FRUIT //Made from peach(fruit) + allergen_type = ALLERGEN_FRUIT //Made from peach(fruit) /datum/reagent/ethanol/schnapps_lem name = "Lemonade Schnapps" @@ -4097,7 +4097,7 @@ glass_name = "lemonade schnapps" glass_desc = "A glass of lemonade schnapps. It seems like it'd be better, mixed." - allergen_type = FRUIT //Made from lemons(fruit) + allergen_type = ALLERGEN_FRUIT //Made from lemons(fruit) /datum/reagent/ethanol/jager name = "Schuss Konig" @@ -4121,7 +4121,7 @@ glass_name = "fusionnaire" glass_desc = "A relatively new cocktail, mostly served in the bars of NanoTrasen owned stations." - allergen_type = FRUIT|GRAINS //Made from lemon juice(fruit), vodka(grains), and lemon schnapps(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from lemon juice(fruit), vodka(grains), and lemon schnapps(fruit) /datum/reagent/ethanol/deathbell name = "Deathbell" @@ -4137,7 +4137,7 @@ glass_name = "Deathbell" glass_desc = "The perfect blend of the most alcoholic things a bartender can get their hands on." - allergen_type = GRAINS|DAIRY|FRUIT //Made from antifreeze(vodka(grains),cream(dairy)), gargleblaster(vodka(grains),gin(fruit),whiskey(grains),cognac(fruit),lime juice(fruit)), and syndicate bomb(beer(grain),whiskeycola(whiskey(grain))) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_DAIRY|ALLERGEN_FRUIT //Made from antifreeze(vodka(grains),cream(dairy)), gargleblaster(vodka(grains),gin(fruit),whiskey(grains),cognac(fruit),lime juice(fruit)), and syndicate bomb(beer(grain),whiskeycola(whiskey(grain))) /datum/reagent/ethanol/deathbell/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm index 0ea989228a..dde7bf21a9 100644 --- a/code/modules/reagents/reagents/toxins.dm +++ b/code/modules/reagents/reagents/toxins.dm @@ -946,7 +946,7 @@ metabolism = REM * 0.5 overdose = REAGENTS_OVERDOSE -datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 7127ed9ff5..610fb85e54 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -589,146 +589,146 @@ // initialize a holder from the contents of a disposal unit - proc/init(var/obj/machinery/disposal/D, var/datum/gas_mixture/flush_gas) - gas = flush_gas// transfer gas resv. into holder object -- let's be explicit about the data this proc consumes, please. +/obj/structure/disposalholder/proc/init(var/obj/machinery/disposal/D, var/datum/gas_mixture/flush_gas) + gas = flush_gas// transfer gas resv. into holder object -- let's be explicit about the data this proc consumes, please. - //Check for any living mobs trigger hasmob. - //hasmob effects whether the package goes to cargo or its tagged destination. - for(var/mob/living/M in D) - if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone)) - hasmob = 1 + //Check for any living mobs trigger hasmob. + //hasmob effects whether the package goes to cargo or its tagged destination. + for(var/mob/living/M in D) + if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone)) + hasmob = 1 - //Checks 1 contents level deep. This means that players can be sent through disposals... - //...but it should require a second person to open the package. (i.e. person inside a wrapped locker) - for(var/obj/O in D) - if(O.contents) - for(var/mob/living/M in O.contents) - if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone)) - hasmob = 1 + //Checks 1 contents level deep. This means that players can be sent through disposals... + //...but it should require a second person to open the package. (i.e. person inside a wrapped locker) + for(var/obj/O in D) + if(O.contents) + for(var/mob/living/M in O.contents) + if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone)) + hasmob = 1 - // now everything inside the disposal gets put into the holder - // note AM since can contain mobs or objs - for(var/atom/movable/AM in D) - AM.forceMove(src) - if(istype(AM, /obj/structure/bigDelivery) && !hasmob) - var/obj/structure/bigDelivery/T = AM - src.destinationTag = T.sortTag - if(istype(AM, /obj/item/smallDelivery) && !hasmob) - var/obj/item/smallDelivery/T = AM - src.destinationTag = T.sortTag - //Drones can mail themselves through maint. - if(istype(AM, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/drone = AM - src.destinationTag = drone.mail_destination + // now everything inside the disposal gets put into the holder + // note AM since can contain mobs or objs + for(var/atom/movable/AM in D) + AM.forceMove(src) + if(istype(AM, /obj/structure/bigDelivery) && !hasmob) + var/obj/structure/bigDelivery/T = AM + src.destinationTag = T.sortTag + if(istype(AM, /obj/item/smallDelivery) && !hasmob) + var/obj/item/smallDelivery/T = AM + src.destinationTag = T.sortTag + //Drones can mail themselves through maint. + if(istype(AM, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/drone = AM + src.destinationTag = drone.mail_destination - // start the movement process - // argument is the disposal unit the holder started in - proc/start(var/obj/machinery/disposal/D) - if(!D.trunk) - D.expel(src) // no trunk connected, so expel immediately - return - - forceMove(D.trunk) - active = 1 - set_dir(DOWN) - spawn(1) - move() // spawn off the movement process - +// start the movement process +// argument is the disposal unit the holder started in +/obj/structure/disposalholder/proc/start(var/obj/machinery/disposal/D) + if(!D.trunk) + D.expel(src) // no trunk connected, so expel immediately return - // movement process, persists while holder is moving through pipes - proc/move() - var/obj/structure/disposalpipe/last - while(active) - sleep(1) // was 1 - if(!loc) return // check if we got GC'd + forceMove(D.trunk) + active = 1 + set_dir(DOWN) + spawn(1) + move() // spawn off the movement process - if(hasmob && prob(3)) - for(var/mob/living/H in src) - if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system, - H.take_overall_damage(20, 0, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie + return - var/obj/structure/disposalpipe/curr = loc - last = curr - curr = curr.transfer(src) +// movement process, persists while holder is moving through pipes +/obj/structure/disposalholder/proc/move() + var/obj/structure/disposalpipe/last + while(active) + sleep(1) // was 1 + if(!loc) return // check if we got GC'd - if(!loc) return //side effects + if(hasmob && prob(3)) + for(var/mob/living/H in src) + if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system, + H.take_overall_damage(20, 0, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie - if(!curr) - last.expel(src, loc, dir) + var/obj/structure/disposalpipe/curr = loc + last = curr + curr = curr.transfer(src) - // - if(!(count--)) - active = 0 - return + if(!loc) return //side effects + + if(!curr) + last.expel(src, loc, dir) + + // + if(!(count--)) + active = 0 + return - // find the turf which should contain the next pipe - proc/nextloc() - return get_step(loc,dir) +// find the turf which should contain the next pipe +/obj/structure/disposalholder/proc/nextloc() + return get_step(loc,dir) - // find a matching pipe on a turf - proc/findpipe(var/turf/T) +// find a matching pipe on a turf +/obj/structure/disposalholder/proc/findpipe(var/turf/T) - if(!T) - return null - - var/fdir = turn(dir, 180) // flip the movement direction - for(var/obj/structure/disposalpipe/P in T) - if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir - return P - // if no matching pipe, return null + if(!T) return null - // merge two holder objects - // used when a a holder meets a stuck holder - proc/merge(var/obj/structure/disposalholder/other) - for(var/atom/movable/AM in other) - AM.forceMove(src) // move everything in other holder to this one - if(ismob(AM)) - var/mob/M = AM - if(M.client) // if a client mob, update eye to follow this holder - M.client.eye = src + var/fdir = turn(dir, 180) // flip the movement direction + for(var/obj/structure/disposalpipe/P in T) + if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir + return P + // if no matching pipe, return null + return null - qdel(other) +// merge two holder objects +// used when a a holder meets a stuck holder +/obj/structure/disposalholder/proc/merge(var/obj/structure/disposalholder/other) + for(var/atom/movable/AM in other) + AM.forceMove(src) // move everything in other holder to this one + if(ismob(AM)) + var/mob/M = AM + if(M.client) // if a client mob, update eye to follow this holder + M.client.eye = src + + qdel(other) - proc/settag(var/new_tag) +/obj/structure/disposalholder/proc/settag(var/new_tag) + destinationTag = new_tag + +/obj/structure/disposalholder/proc/setpartialtag(var/new_tag) + if(partialTag == new_tag) destinationTag = new_tag - - proc/setpartialtag(var/new_tag) - if(partialTag == new_tag) - destinationTag = new_tag - partialTag = "" - else - partialTag = new_tag + partialTag = "" + else + partialTag = new_tag - // called when player tries to move while in a pipe - relaymove(mob/user as mob) +// called when player tries to move while in a pipe +/obj/structure/disposalholder/relaymove(mob/user as mob) - if(!istype(user,/mob/living)) - return + if(!istype(user,/mob/living)) + return - var/mob/living/U = user + var/mob/living/U = user - if (U.stat || U.last_special <= world.time) - return + if (U.stat || U.last_special <= world.time) + return - U.last_special = world.time+100 + U.last_special = world.time+100 - if (src.loc) - for (var/mob/M in hearers(src.loc.loc)) - to_chat(M, "CLONG, clong!") + if (src.loc) + for (var/mob/M in hearers(src.loc.loc)) + to_chat(M, "CLONG, clong!") - playsound(src, 'sound/effects/clang.ogg', 50, 0, 0) + playsound(src, 'sound/effects/clang.ogg', 50, 0, 0) // called to vent all gas in holder to a location - proc/vent_gas(var/atom/location) - location.assume_air(gas) // vent all gas to turf - return +/obj/structure/disposalholder/proc/vent_gas(var/atom/location) + location.assume_air(gas) // vent all gas to turf + return /obj/structure/disposalholder/Destroy() qdel(gas) @@ -753,275 +753,276 @@ var/base_icon_state // initial icon state on map var/sortType = "" var/subtype = 0 - // new pipe, set the icon_state as on map - New() - ..() - base_icon_state = icon_state - return + +// new pipe, set the icon_state as on map +/obj/structure/disposalpipe/New() + ..() + base_icon_state = icon_state + return - // pipe is deleted - // ensure if holder is present, it is expelled - Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // deleting pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.forceMove(T) - AM.pipe_eject(0) - qdel(H) - ..() - return - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - ..() - - // returns the direction of the next pipe object, given the entrance dir - // by default, returns the bitmask of remaining directions - proc/nextdir(var/fromdir) - return dpdir & (~turn(fromdir, 180)) - - // transfer the holder through this pipe segment - // overriden for special behaviour - // - proc/transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir) - H.set_dir(nextdir) - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.forceMove(P) - else // if wasn't a pipe, then set loc to turf - H.forceMove(T) - return null - - return P - - - // update the icon_state to reflect hidden status - proc/update() +// pipe is deleted +// ensure if holder is present, it is expelled +/obj/structure/disposalpipe/Destroy() + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 var/turf/T = src.loc - hide(!T.is_plating() && !istype(T,/turf/space)) // space never hides pipes + if(T.density) + // deleting pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case - // hide called by levelupdate if turf intact status changes - // change visibility status and force update of icon - hide(var/intact) - invisibility = intact ? 101: 0 // hide if floor is intact - updateicon() - - // update actual icon_state depending on visibility - // if invisible, append "f" to icon_state to show faded version - // this will be revealed if a T-scanner is used - // if visible, use regular icon_state - proc/updateicon() -/* if(invisibility) //we hide things with alpha now, no need for transparent icons - icon_state = "[base_icon_state]f" - else - icon_state = base_icon_state*/ - icon_state = base_icon_state - return - - - // expel the held objects into a turf - // called when there is a break in the pipe - proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) - if(!istype(H)) + for(var/atom/movable/AM in H) + AM.forceMove(T) + AM.pipe_eject(0) + qdel(H) + ..() return - // Empty the holder if it is expelled into a dense turf. - // Leaving it intact and sitting in a wall is stupid. - if(T.density) + // otherwise, do normal expel from turf + if(H) + expel(H, T, 0) + ..() + +// returns the direction of the next pipe object, given the entrance dir +// by default, returns the bitmask of remaining directions +/obj/structure/disposalpipe/proc/nextdir(var/fromdir) + return dpdir & (~turn(fromdir, 180)) + +// transfer the holder through this pipe segment +// overriden for special behaviour +// +/obj/structure/disposalpipe/proc/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.set_dir(nextdir) + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) + + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.forceMove(P) + else // if wasn't a pipe, then set loc to turf + H.forceMove(T) + return null + + return P + + +// update the icon_state to reflect hidden status +/obj/structure/disposalpipe/proc/update() + var/turf/T = src.loc + hide(!T.is_plating() && !istype(T,/turf/space)) // space never hides pipes + +// hide called by levelupdate if turf intact status changes +// change visibility status and force update of icon +/obj/structure/disposalpipe/hide(var/intact) + invisibility = intact ? 101: 0 // hide if floor is intact + updateicon() + +// update actual icon_state depending on visibility +// if invisible, append "f" to icon_state to show faded version +// this will be revealed if a T-scanner is used +// if visible, use regular icon_state +/obj/structure/disposalpipe/proc/updateicon() +/* if(invisibility) //we hide things with alpha now, no need for transparent icons + icon_state = "[base_icon_state]f" + else + icon_state = base_icon_state*/ + icon_state = base_icon_state + return + + +// expel the held objects into a turf +// called when there is a break in the pipe +/obj/structure/disposalpipe/proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) + if(!istype(H)) + return + + // Empty the holder if it is expelled into a dense turf. + // Leaving it intact and sitting in a wall is stupid. + if(T.density) + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + return + + + if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile + var/turf/simulated/floor/F = T + F.break_tile() + new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff + + var/turf/target + if(direction) // direction is specified + if(istype(T, /turf/space)) // if ended in space, then range is unlimited + target = get_edge_target_turf(T, direction) + else // otherwise limit to 10 tiles + target = get_ranged_target_turf(T, direction, 10) + + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) + AM.pipe_eject(direction) + spawn(1) + if(AM) + AM.throw_at(target, 100, 1) + H.vent_gas(T) + qdel(H) + + else // no specified direction, so throw in random direction + + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) + for(var/atom/movable/AM in H) + target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) + + AM.forceMove(T) + AM.pipe_eject(0) + spawn(1) + if(AM) + AM.throw_at(target, 5, 1) + + H.vent_gas(T) // all gas vent to turf + qdel(H) + + return + +// call to break the pipe +// will expel any holder inside at the time +// then delete the pipe +// remains : set to leave broken pipe pieces in place +/obj/structure/disposalpipe/proc/broken(var/remains = 0) + if(remains) + for(var/D in cardinal) + if(D & dpdir) + var/obj/structure/disposalpipe/broken/P = new(src.loc) + P.set_dir(D) + + src.invisibility = 101 // make invisible (since we won't delete the pipe immediately) + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 + var/turf/T = src.loc + if(T.density) + // broken pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case + + for(var/atom/movable/AM in H) + AM.forceMove(T) AM.pipe_eject(0) qdel(H) return - - if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile - var/turf/simulated/floor/F = T - F.break_tile() - new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff - - var/turf/target - if(direction) // direction is specified - if(istype(T, /turf/space)) // if ended in space, then range is unlimited - target = get_edge_target_turf(T, direction) - else // otherwise limit to 10 tiles - target = get_ranged_target_turf(T, direction, 10) - - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) - for(var/atom/movable/AM in H) - AM.forceMove(T) - AM.pipe_eject(direction) - spawn(1) - if(AM) - AM.throw_at(target, 100, 1) - H.vent_gas(T) - qdel(H) - - else // no specified direction, so throw in random direction - - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) - for(var/atom/movable/AM in H) - target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) - - AM.forceMove(T) - AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) - - H.vent_gas(T) // all gas vent to turf - qdel(H) - - return - - // call to break the pipe - // will expel any holder inside at the time - // then delete the pipe - // remains : set to leave broken pipe pieces in place - proc/broken(var/remains = 0) - if(remains) - for(var/D in cardinal) - if(D & dpdir) - var/obj/structure/disposalpipe/broken/P = new(src.loc) - P.set_dir(D) - - src.invisibility = 101 // make invisible (since we won't delete the pipe immediately) - var/obj/structure/disposalholder/H = locate() in src + // otherwise, do normal expel from turf if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // broken pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case + expel(H, T, 0) - for(var/atom/movable/AM in H) - AM.forceMove(T) - AM.pipe_eject(0) - qdel(H) - return - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - - spawn(2) // delete pipe after 2 ticks to ensure expel proc finished - qdel(src) + spawn(2) // delete pipe after 2 ticks to ensure expel proc finished + qdel(src) - // pipe affected by explosion - ex_act(severity) +// pipe affected by explosion +/obj/structure/disposalpipe/ex_act(severity) - switch(severity) - if(1.0) - broken(0) - return - if(2.0) - health -= rand(5,15) - healthcheck() - return - if(3.0) - health -= rand(0,15) - healthcheck() - return + switch(severity) + if(1.0) + broken(0) + return + if(2.0) + health -= rand(5,15) + healthcheck() + return + if(3.0) + health -= rand(0,15) + healthcheck() + return // test health for brokenness - proc/healthcheck() - if(health < -2) - broken(0) - else if(health<1) - broken(1) - return +/obj/structure/disposalpipe/proc/healthcheck() + if(health < -2) + broken(0) + else if(health<1) + broken(1) + return //attack by item //weldingtool: unfasten and convert to obj/disposalconstruct - attackby(var/obj/item/I, var/mob/user) +/obj/structure/disposalpipe/attackby(var/obj/item/I, var/mob/user) - var/turf/T = src.loc - if(!T.is_plating()) - return // prevent interaction with T-scanner revealed pipes - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I + var/turf/T = src.loc + if(!T.is_plating()) + return // prevent interaction with T-scanner revealed pipes + src.add_fingerprint(user) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, W.usesound, 50, 1) - // check if anything changed over 2 seconds - var/turf/uloc = user.loc - var/atom/wloc = W.loc - to_chat(user, "Slicing the disposal pipe.") - sleep(30) - if(!W.isOn()) return - if(user.loc == uloc && wloc == W.loc) - welded() - else - to_chat(user, "You must stay still while welding the pipe.") + if(W.remove_fuel(0,user)) + playsound(src, W.usesound, 50, 1) + // check if anything changed over 2 seconds + var/turf/uloc = user.loc + var/atom/wloc = W.loc + to_chat(user, "Slicing the disposal pipe.") + sleep(30) + if(!W.isOn()) return + if(user.loc == uloc && wloc == W.loc) + welded() else - to_chat(user, "You need more welding fuel to cut the pipe.") - return + to_chat(user, "You must stay still while welding the pipe.") + else + to_chat(user, "You need more welding fuel to cut the pipe.") + return // called when pipe is cut with welder - proc/welded() +/obj/structure/disposalpipe/proc/welded() - var/obj/structure/disposalconstruct/C = new (src.loc) - switch(base_icon_state) - if("pipe-s") - C.ptype = 0 - if("pipe-c") - C.ptype = 1 - if("pipe-j1") - C.ptype = 2 - if("pipe-j2") - C.ptype = 3 - if("pipe-y") - C.ptype = 4 - if("pipe-t") - C.ptype = 5 - if("pipe-j1s") - C.ptype = 9 - C.sortType = sortType - if("pipe-j2s") - C.ptype = 10 - C.sortType = sortType + var/obj/structure/disposalconstruct/C = new (src.loc) + switch(base_icon_state) + if("pipe-s") + C.ptype = 0 + if("pipe-c") + C.ptype = 1 + if("pipe-j1") + C.ptype = 2 + if("pipe-j2") + C.ptype = 3 + if("pipe-y") + C.ptype = 4 + if("pipe-t") + C.ptype = 5 + if("pipe-j1s") + C.ptype = 9 + C.sortType = sortType + if("pipe-j2s") + C.ptype = 10 + C.sortType = sortType ///// Z-Level stuff - if("pipe-u") - C.ptype = 11 - if("pipe-d") - C.ptype = 12 + if("pipe-u") + C.ptype = 11 + if("pipe-d") + C.ptype = 12 ///// Z-Level stuff - if("pipe-tagger") - C.ptype = 13 - if("pipe-tagger-partial") - C.ptype = 14 - C.subtype = src.subtype - src.transfer_fingerprints_to(C) - C.set_dir(dir) - C.density = 0 - C.anchored = 1 - C.update() + if("pipe-tagger") + C.ptype = 13 + if("pipe-tagger-partial") + C.ptype = 14 + C.subtype = src.subtype + src.transfer_fingerprints_to(C) + C.set_dir(dir) + C.density = 0 + C.anchored = 1 + C.update() - qdel(src) + qdel(src) // pipe is deleted // ensure if holder is present, it is expelled @@ -1059,116 +1060,116 @@ /obj/structure/disposalpipe/segment icon_state = "pipe-s" - New() - ..() - if(icon_state == "pipe-s") - dpdir = dir | turn(dir, 180) - else - dpdir = dir | turn(dir, -90) +/obj/structure/disposalpipe/segment/New() + ..() + if(icon_state == "pipe-s") + dpdir = dir | turn(dir, 180) + else + dpdir = dir | turn(dir, -90) - update() - return + update() + return ///// Z-Level stuff /obj/structure/disposalpipe/up icon_state = "pipe-u" - New() - ..() - dpdir = dir - update() - return +/obj/structure/disposalpipe/up/New() + ..() + dpdir = dir + update() + return - nextdir(var/fromdir) - var/nextdir - if(fromdir == 11) - nextdir = dir +/obj/structure/disposalpipe/up/nextdir(var/fromdir) + var/nextdir + if(fromdir == 11) + nextdir = dir + else + nextdir = 12 + return nextdir + +/obj/structure/disposalpipe/up/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.set_dir(nextdir) + + var/turf/T + var/obj/structure/disposalpipe/P + + if(nextdir == 12) + T = GetAbove(src) + if(!T) + H.forceMove(loc) + return else - nextdir = 12 - return nextdir + for(var/obj/structure/disposalpipe/down/F in T) + P = F - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir) - H.set_dir(nextdir) + else + T = get_step(src.loc, H.dir) + P = H.findpipe(T) - var/turf/T - var/obj/structure/disposalpipe/P + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) - if(nextdir == 12) - T = GetAbove(src) - if(!T) - H.forceMove(loc) - return - else - for(var/obj/structure/disposalpipe/down/F in T) - P = F + H.forceMove(P) + else // if wasn't a pipe, then set loc to turf + H.forceMove(T) + return null - else - T = get_step(src.loc, H.dir) - P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.forceMove(P) - else // if wasn't a pipe, then set loc to turf - H.forceMove(T) - return null - - return P + return P /obj/structure/disposalpipe/down icon_state = "pipe-d" - New() - ..() - dpdir = dir - update() - return +/obj/structure/disposalpipe/down/New() + ..() + dpdir = dir + update() + return - nextdir(var/fromdir) - var/nextdir - if(fromdir == 12) - nextdir = dir +/obj/structure/disposalpipe/down/nextdir(var/fromdir) + var/nextdir + if(fromdir == 12) + nextdir = dir + else + nextdir = 11 + return nextdir + +/obj/structure/disposalpipe/down/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.dir = nextdir + + var/turf/T + var/obj/structure/disposalpipe/P + + if(nextdir == 11) + T = GetBelow(src) + if(!T) + H.forceMove(src.loc) + return else - nextdir = 11 - return nextdir + for(var/obj/structure/disposalpipe/up/F in T) + P = F - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir) - H.dir = nextdir + else + T = get_step(src.loc, H.dir) + P = H.findpipe(T) - var/turf/T - var/obj/structure/disposalpipe/P + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) - if(nextdir == 11) - T = GetBelow(src) - if(!T) - H.forceMove(src.loc) - return - else - for(var/obj/structure/disposalpipe/up/F in T) - P = F + H.forceMove(P) + else // if wasn't a pipe, then set loc to turf + H.forceMove(T) + return null - else - T = get_step(src.loc, H.dir) - P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.forceMove(P) - else // if wasn't a pipe, then set loc to turf - H.forceMove(T) - return null - - return P + return P ///// Z-Level stuff /obj/structure/disposalpipe/junction/yjunction @@ -1178,45 +1179,45 @@ /obj/structure/disposalpipe/junction icon_state = "pipe-j1" - New() - ..() - if(icon_state == "pipe-j1") - dpdir = dir | turn(dir, -90) | turn(dir,180) - else if(icon_state == "pipe-j2") - dpdir = dir | turn(dir, 90) | turn(dir,180) - else // pipe-y - dpdir = dir | turn(dir,90) | turn(dir, -90) - update() - return +/obj/structure/disposalpipe/junction/New() + ..() + if(icon_state == "pipe-j1") + dpdir = dir | turn(dir, -90) | turn(dir,180) + else if(icon_state == "pipe-j2") + dpdir = dir | turn(dir, 90) | turn(dir,180) + else // pipe-y + dpdir = dir | turn(dir,90) | turn(dir, -90) + update() + return - // next direction to move - // if coming in from secondary dirs, then next is primary dir - // if coming in from primary dir, then next is equal chance of other dirs +// next direction to move +// if coming in from secondary dirs, then next is primary dir +// if coming in from primary dir, then next is equal chance of other dirs - nextdir(var/fromdir) - var/flipdir = turn(fromdir, 180) - if(flipdir != dir) // came from secondary dir - return dir // so exit through primary - else // came from primary - // so need to choose either secondary exit - var/mask = ..(fromdir) +/obj/structure/disposalpipe/junction/nextdir(var/fromdir) + var/flipdir = turn(fromdir, 180) + if(flipdir != dir) // came from secondary dir + return dir // so exit through primary + else // came from primary + // so need to choose either secondary exit + var/mask = ..(fromdir) - // find a bit which is set - var/setbit = 0 - if(mask & NORTH) - setbit = NORTH - else if(mask & SOUTH) - setbit = SOUTH - else if(mask & EAST) - setbit = EAST - else - setbit = WEST + // find a bit which is set + var/setbit = 0 + if(mask & NORTH) + setbit = NORTH + else if(mask & SOUTH) + setbit = SOUTH + else if(mask & EAST) + setbit = EAST + else + setbit = WEST - if(prob(50)) // 50% chance to choose the found bit or the other one - return setbit - else - return mask & (~setbit) + if(prob(50)) // 50% chance to choose the found bit or the other one + return setbit + else + return mask & (~setbit) /obj/structure/disposalpipe/tagger @@ -1225,46 +1226,46 @@ var/sort_tag = "" var/partial = 0 - proc/updatedesc() - desc = initial(desc) - if(sort_tag) - desc += "\nIt's tagging objects with the '[sort_tag]' tag." +/obj/structure/disposalpipe/tagger/proc/updatedesc() + desc = initial(desc) + if(sort_tag) + desc += "\nIt's tagging objects with the '[sort_tag]' tag." - proc/updatename() - if(sort_tag) - name = "[initial(name)] ([sort_tag])" +/obj/structure/disposalpipe/tagger/proc/updatename() + if(sort_tag) + name = "[initial(name)] ([sort_tag])" + else + name = initial(name) + +/obj/structure/disposalpipe/tagger/New() + . = ..() + dpdir = dir | turn(dir, 180) + if(sort_tag) GLOB.tagger_locations |= sort_tag + updatename() + updatedesc() + update() + +/obj/structure/disposalpipe/tagger/attackby(var/obj/item/I, var/mob/user) + if(..()) + return + + if(istype(I, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = I + + if(O.currTag)// Tag set + sort_tag = O.currTag + playsound(src, 'sound/machines/twobeep.ogg', 100, 1) + to_chat(user, "Changed tag to '[sort_tag]'.") + updatename() + updatedesc() + +/obj/structure/disposalpipe/tagger/transfer(var/obj/structure/disposalholder/H) + if(sort_tag) + if(partial) + H.setpartialtag(sort_tag) else - name = initial(name) - - New() - . = ..() - dpdir = dir | turn(dir, 180) - if(sort_tag) GLOB.tagger_locations |= sort_tag - updatename() - updatedesc() - update() - - attackby(var/obj/item/I, var/mob/user) - if(..()) - return - - if(istype(I, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = I - - if(O.currTag)// Tag set - sort_tag = O.currTag - playsound(src, 'sound/machines/twobeep.ogg', 100, 1) - to_chat(user, "Changed tag to '[sort_tag]'.") - updatename() - updatedesc() - - transfer(var/obj/structure/disposalholder/H) - if(sort_tag) - if(partial) - H.setpartialtag(sort_tag) - else - H.settag(sort_tag) - return ..() + H.settag(sort_tag) + return ..() /obj/structure/disposalpipe/tagger/partial //needs two passes to tag name = "partial package tagger" @@ -1281,103 +1282,105 @@ var/negdir = 0 var/sortdir = 0 - proc/updatedesc() - desc = initial(desc) - if(sortType) - desc += "\nIt's filtering objects with the '[sortType]' tag." +/obj/structure/disposalpipe/sortjunction/proc/updatedesc() + desc = initial(desc) + if(sortType) + desc += "\nIt's filtering objects with the '[sortType]' tag." - proc/updatename() - if(sortType) - name = "[initial(name)] ([sortType])" +/obj/structure/disposalpipe/sortjunction/proc/updatename() + if(sortType) + name = "[initial(name)] ([sortType])" + else + name = initial(name) + +/obj/structure/disposalpipe/sortjunction/proc/updatedir() + posdir = dir + negdir = turn(posdir, 180) + + if(icon_state == "pipe-j1s") + sortdir = turn(posdir, -90) + else if(icon_state == "pipe-j2s") + sortdir = turn(posdir, 90) + + dpdir = sortdir | posdir | negdir + +/obj/structure/disposalpipe/sortjunction/New() + . = ..() + if(sortType) GLOB.tagger_locations |= sortType + + updatedir() + updatename() + updatedesc() + update() + +/obj/structure/disposalpipe/sortjunction/attackby(var/obj/item/I, var/mob/user) + if(..()) + return + + if(istype(I, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = I + + if(O.currTag)// Tag set + sortType = O.currTag + playsound(src, 'sound/machines/twobeep.ogg', 100, 1) + to_chat(user, "Changed filter to '[sortType]'.") + updatename() + updatedesc() + +/obj/structure/disposalpipe/sortjunction/proc/divert_check(var/checkTag) + return sortType == checkTag + +// next direction to move +// if coming in from negdir, then next is primary dir or sortdir +// if coming in from posdir, then flip around and go back to posdir +// if coming in from sortdir, go to posdir + +/obj/structure/disposalpipe/sortjunction/nextdir(var/fromdir, var/sortTag) + if(fromdir != sortdir) // probably came from the negdir + if(divert_check(sortTag)) + return sortdir else - name = initial(name) - - proc/updatedir() - posdir = dir - negdir = turn(posdir, 180) - - if(icon_state == "pipe-j1s") - sortdir = turn(posdir, -90) - else if(icon_state == "pipe-j2s") - sortdir = turn(posdir, 90) - - dpdir = sortdir | posdir | negdir - - New() - . = ..() - if(sortType) GLOB.tagger_locations |= sortType - - updatedir() - updatename() - updatedesc() - update() - - attackby(var/obj/item/I, var/mob/user) - if(..()) - return - - if(istype(I, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = I - - if(O.currTag)// Tag set - sortType = O.currTag - playsound(src, 'sound/machines/twobeep.ogg', 100, 1) - to_chat(user, "Changed filter to '[sortType]'.") - updatename() - updatedesc() - - proc/divert_check(var/checkTag) - return sortType == checkTag - - // next direction to move - // if coming in from negdir, then next is primary dir or sortdir - // if coming in from posdir, then flip around and go back to posdir - // if coming in from sortdir, go to posdir - - nextdir(var/fromdir, var/sortTag) - if(fromdir != sortdir) // probably came from the negdir - if(divert_check(sortTag)) - return sortdir - else - return posdir - else // came from sortdir - // so go with the flow to positive direction return posdir + else // came from sortdir + // so go with the flow to positive direction + return posdir - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir, H.destinationTag) - H.set_dir(nextdir) - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) +/obj/structure/disposalpipe/sortjunction/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir, H.destinationTag) + H.set_dir(nextdir) + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) - H.forceMove(P) - else // if wasn't a pipe, then set loc to turf - H.forceMove(T) - return null + H.forceMove(P) + else // if wasn't a pipe, then set loc to turf + H.forceMove(T) + return null - return P + return P //a three-way junction that filters all wrapped and tagged items /obj/structure/disposalpipe/sortjunction/wildcard name = "wildcard sorting junction" desc = "An underfloor disposal pipe which filters all wrapped and tagged items." subtype = 1 - divert_check(var/checkTag) - return checkTag != "" + +/obj/structure/disposalpipe/sortjunction/wildcard/divert_check(var/checkTag) + return checkTag != "" //junction that filters all untagged items /obj/structure/disposalpipe/sortjunction/untagged name = "untagged sorting junction" desc = "An underfloor disposal pipe which filters all untagged items." subtype = 2 - divert_check(var/checkTag) - return checkTag == "" + +/obj/structure/disposalpipe/sortjunction/untagged/divert_check(var/checkTag) + return checkTag == "" /obj/structure/disposalpipe/sortjunction/flipped //for easier and cleaner mapping icon_state = "pipe-j2s" @@ -1491,18 +1494,17 @@ // i.e. will be treated as an empty turf desc = "A broken piece of disposal pipe." - New() - ..() - update() - return +/obj/structure/disposalpipe/broken/New() + ..() + update() + return - // called when welded - // for broken pipe, remove and turn into scrap - - welded() -// var/obj/item/scrap/S = new(src.loc) -// S.set_components(200,0,0) - qdel(src) +// called when welded +// for broken pipe, remove and turn into scrap +/obj/structure/disposalpipe/broken/welded() +// var/obj/item/scrap/S = new(src.loc) +// S.set_components(200,0,0) + qdel(src) // the disposal outlet machine diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 2bfab50bbb..c3e2ea92f1 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -73,7 +73,11 @@ return /obj/structure/bigDelivery/update_icon() +<<<<<<< HEAD cut_overlays() +======= + overlays = new() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(nameset || examtext) var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") if(icon_state == "deliverycloset") @@ -86,7 +90,11 @@ label_x = rand(-8, 6) I.pixel_x = label_x I.pixel_y = -3 +<<<<<<< HEAD add_overlay(I) +======= + overlays += I +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(src.sortTag) var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") if(icon_state == "deliverycloset") @@ -99,7 +107,11 @@ tag_x = rand(-8, 6) I.pixel_x = tag_x I.pixel_y = -3 +<<<<<<< HEAD add_overlay(I) +======= + overlays += I +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/structure/bigDelivery/examine(mob/user) . = ..() @@ -185,12 +197,20 @@ return /obj/item/smallDelivery/update_icon() +<<<<<<< HEAD cut_overlays() +======= + overlays = new() +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if((nameset || examtext) && icon_state != "deliverycrate1") var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") if(icon_state == "deliverycrate5") I.pixel_y = -1 +<<<<<<< HEAD add_overlay(I) +======= + overlays += I +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(src.sortTag) var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") switch(icon_state) @@ -207,7 +227,11 @@ I.pixel_y = 3 if("deliverycrate5") I.pixel_y = -3 +<<<<<<< HEAD add_overlay(I) +======= + overlays += I +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/smallDelivery/examine(mob/user) . = ..() @@ -339,6 +363,7 @@ item_state = "electronic" slot_flags = SLOT_BELT +<<<<<<< HEAD /obj/item/device/destTagger/tgui_state(mob/user) return GLOB.tgui_inventory_state @@ -370,6 +395,32 @@ return FALSE currTag = new_tag . = TRUE +======= +/obj/item/device/destTagger/proc/openwindow(mob/user as mob) + var/dat = "

TagMaster 2.3

" + + dat += "" + for(var/i = 1, i <= GLOB.tagger_locations.len, i++) + dat += "" + + if (i%4==0) + dat += "" + + dat += "
[GLOB.tagger_locations[i]]

Current Selection: [currTag ? currTag : "None"]
" + + user << browse(dat, "window=destTagScreen;size=450x350") + onclose(user, "destTagScreen") + +/obj/item/device/destTagger/attack_self(mob/user as mob) + openwindow(user) + return + +/obj/item/device/destTagger/Topic(href, href_list) + src.add_fingerprint(usr) + if(href_list["nextTag"] && (href_list["nextTag"] in GLOB.tagger_locations)) + src.currTag = href_list["nextTag"] + openwindow(usr) +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/disposal/deliveryChute name = "Delivery chute" @@ -379,12 +430,20 @@ var/c_mode = 0 +<<<<<<< HEAD /obj/machinery/disposal/deliveryChute/New() ..() spawn(5) trunk = locate() in src.loc if(trunk) trunk.linked = src // link the pipe trunk to self +======= +/obj/machinery/disposal/deliveryChute/Initialize() + . = ..() + trunk = locate() in src.loc + if(trunk) + trunk.linked = src // link the pipe trunk to self +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/disposal/deliveryChute/interact() return @@ -439,6 +498,7 @@ return if(I.is_screwdriver()) +<<<<<<< HEAD if(c_mode==0) c_mode=1 playsound(src, I.usesound, 50, 1) @@ -467,6 +527,29 @@ else to_chat(user, "You need more welding fuel to complete this task.") return +======= + c_mode = !c_mode + playsound(src, I.usesound, 50, 1) + to_chat(user, "You [c_mode ? "remove" : "attach"] the screws around the power connection.") + return + if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1) + var/obj/item/weapon/weldingtool/W = I + if(!W.remove_fuel(0,user)) + to_chat(user, "You need more welding fuel to complete this task.") + return + playsound(src, W.usesound, 50, 1) + to_chat(user, "You start slicing the floorweld off the delivery chute.") + if(do_after(user,20 * W.toolspeed)) + if(!src || !W.isOn()) return + to_chat(user, "You sliced the floorweld off the delivery chute.") + var/obj/structure/disposalconstruct/C = new (src.loc) + C.ptype = 8 // 8 = Delivery chute + C.update() + C.anchored = 1 + C.density = 1 + qdel(src) + return +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/disposal/deliveryChute/Destroy() if(trunk) diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm index 2ce34f3485..7ec9bad2fa 100644 --- a/code/modules/research/designs/misc.dm +++ b/code/modules/research/designs/misc.dm @@ -12,7 +12,7 @@ build_path = /obj/item/device/communicator sort_string = "TAAAA" -datum/design/item/general/laserpointer +/datum/design/item/general/laserpointer name = "laser pointer" desc = "Don't shine it in your eyes!" id = "laser_pointer" diff --git a/code/modules/research/designs/uncommented.dm b/code/modules/research/designs/uncommented.dm index 7bbf53571a..f83e3a685b 100644 --- a/code/modules/research/designs/uncommented.dm +++ b/code/modules/research/designs/uncommented.dm @@ -22,7 +22,7 @@ materials = list("glass" = 2000, "sacid" = 20) build_path = "/obj/item/weapon/circuitboard/rust_core_control" -datum/design/rust_fuel_control +/datum/design/rust_fuel_control name = "Circuit Design (RUST fuel controller)" desc = "Allows for the construction of circuit boards used to build a fuel injector control console for the RUST fusion engine." id = "rust_fuel_control" @@ -31,7 +31,7 @@ datum/design/rust_fuel_control materials = list("glass" = 2000, "sacid" = 20) build_path = "/obj/item/weapon/circuitboard/rust_fuel_control" -datum/design/rust_fuel_port +/datum/design/rust_fuel_port name = "Internal circuitry (RUST fuel port)" desc = "Allows for the construction of circuit boards used to build a fuel injection port for the RUST fusion engine." id = "rust_fuel_port" @@ -40,7 +40,7 @@ datum/design/rust_fuel_port materials = list("glass" = 2000, "sacid" = 20, "uranium" = 3000) build_path = "/obj/item/weapon/module/rust_fuel_port" -datum/design/rust_fuel_compressor +/datum/design/rust_fuel_compressor name = "Circuit Design (RUST fuel compressor)" desc = "Allows for the construction of circuit boards used to build a fuel compressor of the RUST fusion engine." id = "rust_fuel_compressor" @@ -49,7 +49,7 @@ datum/design/rust_fuel_compressor materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 1000) build_path = "/obj/item/weapon/module/rust_fuel_compressor" -datum/design/rust_core +/datum/design/rust_core name = "Internal circuitry (RUST tokamak core)" desc = "The circuit board that for a RUST-pattern tokamak fusion core." id = "pacman" @@ -58,7 +58,7 @@ datum/design/rust_core materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 2000) build_path = "/obj/item/weapon/circuitboard/rust_core" -datum/design/rust_injector +/datum/design/rust_injector name = "Internal circuitry (RUST tokamak core)" desc = "The circuit board that for a RUST-pattern particle accelerator." id = "pacman" diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index be884e2c46..3614ba60be 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -364,13 +364,13 @@ var/obj/machinery/blackbox_recorder/blackbox query_insert.Execute() // Sanitize inputs to avoid SQL injection attacks -proc/sql_sanitize_text(var/text) +/proc/sql_sanitize_text(var/text) text = replacetext(text, "'", "''") text = replacetext(text, ";", "") text = replacetext(text, "&", "") return text -proc/feedback_set(var/variable,var/value) +/proc/feedback_set(var/variable,var/value) if(!blackbox) return variable = sql_sanitize_text(variable) @@ -381,7 +381,7 @@ proc/feedback_set(var/variable,var/value) FV.set_value(value) -proc/feedback_inc(var/variable,var/value) +/proc/feedback_inc(var/variable,var/value) if(!blackbox) return variable = sql_sanitize_text(variable) @@ -392,7 +392,7 @@ proc/feedback_inc(var/variable,var/value) FV.inc(value) -proc/feedback_dec(var/variable,var/value) +/proc/feedback_dec(var/variable,var/value) if(!blackbox) return variable = sql_sanitize_text(variable) @@ -403,7 +403,7 @@ proc/feedback_dec(var/variable,var/value) FV.dec(value) -proc/feedback_set_details(var/variable,var/details) +/proc/feedback_set_details(var/variable,var/details) if(!blackbox) return variable = sql_sanitize_text(variable) @@ -415,7 +415,7 @@ proc/feedback_set_details(var/variable,var/details) FV.set_details(details) -proc/feedback_add_details(var/variable,var/details) +/proc/feedback_add_details(var/variable,var/details) if(!blackbox) return variable = sql_sanitize_text(variable) diff --git a/code/modules/scripting/AST/AST Nodes.dm b/code/modules/scripting/AST/AST Nodes.dm index 6853697ebf..1bc6eb5cd9 100644 --- a/code/modules/scripting/AST/AST Nodes.dm +++ b/code/modules/scripting/AST/AST Nodes.dm @@ -41,23 +41,20 @@ var /* Class: node */ -/node - proc - ToString() - return "[src.type]" +/node/proc/ToString() + return "[src.type]" /* Class: identifier */ /node/identifier - var - id_name + var/id_name - New(id) - .=..() - src.id_name=id +/node/identifier/New(id) + .=..() + src.id_name=id - ToString() - return id_name +/node/identifier/ToString() + return id_name /* Class: expression @@ -68,72 +65,64 @@ var See and for subtypes. */ /node/expression/operator - var - node/expression/exp - tmp - name - precedence + var/node/expression/exp + var/tmp/name + var/tmp/precedence - New() - .=..() - if(!src.name) src.name="[src.type]" +/node/expression/operator/New() + .=..() + if(!src.name) src.name="[src.type]" - ToString() - return "operator: [name]" +/node/expression/operator/ToString() + return "operator: [name]" /* Class: FunctionCall */ /node/expression/FunctionCall //Function calls can also be expressions or statements. - var - func_name - node/identifier/object - list/parameters=new + var/func_name + var/node/identifier/object + var/list/parameters = list() /* Class: literal */ /node/expression/value/literal - var - value + var/value - New(value) - .=..() - src.value=value +/node/expression/value/literal/New(value) + .=..() + src.value=value - ToString() - return src.value +/node/expression/value/literal/ToString() + return src.value /* Class: variable */ /node/expression/value/variable - var - node - object //Either a node/identifier or another node/expression/value/variable which points to the object - node/identifier - id + var/node/object //Either a node/identifier or another node/expression/value/variable which points to the object + var/node/identifier/id - New(ident) - .=..() - id=ident - if(istext(id))id=new(id) +/node/expression/value/variable/New(ident) + .=..() + id=ident + if(istext(id))id=new(id) - ToString() - return src.id.ToString() +/node/expression/value/variable/ToString() + return src.id.ToString() /* Class: reference */ /node/expression/value/reference - var - datum/value + var/datum/value - New(value) - .=..() - src.value=value +/node/expression/value/reference/New(value) + .=..() + src.value=value - ToString() - return "ref: [src.value] ([src.value.type])" \ No newline at end of file +/node/expression/value/reference/ToString() + return "ref: [src.value] ([src.value.type])" \ No newline at end of file diff --git a/code/modules/scripting/AST/Blocks.dm b/code/modules/scripting/AST/Blocks.dm index 18f408f1f1..c992d7b4fa 100644 --- a/code/modules/scripting/AST/Blocks.dm +++ b/code/modules/scripting/AST/Blocks.dm @@ -9,12 +9,10 @@ and not just in the global scope as in many languages. */ /node/BlockDefinition - var/list - statements = new - functions = new - initial_variables = new + var/list/statements = list() + var/list/functions = list() + var/list/initial_variables = list() - proc /* Proc: SetVar Defines a permanent variable. The variable will not be deleted when it goes out of scope. @@ -26,8 +24,8 @@ See Also: - */ - SetVar(name, value) - initial_variables[name]=value +/node/BlockDefinition/proc/SetVar(name, value) + initial_variables[name]=value /* @@ -35,14 +33,13 @@ A block object representing the global scope. */ // - GlobalBlock - New() - initial_variables["null"]=null - return ..() +/node/BlockDefinition/GlobalBlock/New() + initial_variables["null"]=null + return ..() /* Class: FunctionBlock A block representing a function body. */ // - FunctionBlock \ No newline at end of file +/node/BlockDefinition/FunctionBlock \ No newline at end of file diff --git a/code/modules/scripting/AST/Operators/Binary Operators.dm b/code/modules/scripting/AST/Operators/Binary Operators.dm index 8df19879cf..e191ba348c 100644 --- a/code/modules/scripting/AST/Operators/Binary Operators.dm +++ b/code/modules/scripting/AST/Operators/Binary Operators.dm @@ -16,48 +16,48 @@ Returns true if x = y. */ // - Equal - precedence=OOP_EQUAL +/node/expression/operator/binary/Equal + precedence=OOP_EQUAL /* Class: NotEqual Returns true if x and y aren't equal. */ // - NotEqual - precedence=OOP_EQUAL +/node/expression/operator/binary/NotEqual + precedence=OOP_EQUAL /* Class: Greater Returns true if x > y. */ // - Greater - precedence=OOP_COMPARE +/node/expression/operator/binary/Greater + precedence=OOP_COMPARE /* Class: Less Returns true if x < y. */ // - Less - precedence=OOP_COMPARE +/node/expression/operator/binary/Less + precedence=OOP_COMPARE /* Class: GreaterOrEqual Returns true if x >= y. */ // - GreaterOrEqual - precedence=OOP_COMPARE +/node/expression/operator/binary/GreaterOrEqual + precedence=OOP_COMPARE /* Class: LessOrEqual Returns true if x <= y. */ // - LessOrEqual - precedence=OOP_COMPARE +/node/expression/operator/binary/LessOrEqual + precedence=OOP_COMPARE ////////// Logical Operators ////////// @@ -67,24 +67,24 @@ Returns true if x and y are true. */ // - LogicalAnd - precedence=OOP_AND +/node/expression/operator/binary/LogicalAnd + precedence=OOP_AND /* Class: LogicalOr Returns true if x, y, or both are true. */ // - LogicalOr - precedence=OOP_OR +/node/expression/operator/binary/LogicalOr + precedence=OOP_OR /* Class: LogicalXor Returns true if either x or y but not both are true. */ // - LogicalXor //Not implemented in nS - precedence=OOP_OR +/node/expression/operator/binary/LogicalXor //Not implemented in nS + precedence=OOP_OR ////////// Bitwise Operators ////////// @@ -97,8 +97,8 @@ 011 & 110 = 010 */ // - BitwiseAnd - precedence=OOP_BIT +/node/expression/operator/binary/BitwiseAnd + precedence=OOP_BIT /* Class: BitwiseOr @@ -108,8 +108,8 @@ 011 | 110 = 111 */ // - BitwiseOr - precedence=OOP_BIT +/node/expression/operator/binary/BitwiseOr + precedence=OOP_BIT /* Class: BitwiseXor @@ -119,8 +119,8 @@ 011 xor 110 = 101 */ // - BitwiseXor - precedence=OOP_BIT +/node/expression/operator/binary/BitwiseXor + precedence=OOP_BIT ////////// Arithmetic Operators ////////// @@ -130,45 +130,45 @@ Returns the sum of x and y. */ // - Add - precedence=OOP_ADD +/node/expression/operator/binary/Add + precedence=OOP_ADD /* Class: Subtract Returns the difference of x and y. */ // - Subtract - precedence=OOP_ADD +/node/expression/operator/binary/Subtract + precedence=OOP_ADD /* Class: Multiply Returns the product of x and y. */ // - Multiply - precedence=OOP_MULTIPLY +/node/expression/operator/binary/Multiply + precedence=OOP_MULTIPLY /* Class: Divide Returns the quotient of x and y. */ // - Divide - precedence=OOP_MULTIPLY +/node/expression/operator/binary/Divide + precedence=OOP_MULTIPLY /* Class: Power Returns x raised to the power of y. */ // - Power - precedence=OOP_POW +/node/expression/operator/binary/Power + precedence=OOP_POW /* Class: Modulo Returns the remainder of x / y. */ // - Modulo - precedence=OOP_MULTIPLY +/node/expression/operator/binary/Modulo + precedence=OOP_MULTIPLY diff --git a/code/modules/scripting/AST/Operators/Unary Operators.dm b/code/modules/scripting/AST/Operators/Unary Operators.dm index 3a5f3ffb96..b49984ba18 100644 --- a/code/modules/scripting/AST/Operators/Unary Operators.dm +++ b/code/modules/scripting/AST/Operators/Unary Operators.dm @@ -16,8 +16,8 @@ !true = false and !false = true */ // - LogicalNot - name="logical not" +/node/expression/operator/unary/LogicalNot + name="logical not" /* Class: BitwiseNot @@ -27,25 +27,25 @@ ~10 (decimal 2) = 01 (decimal 1). */ // - BitwiseNot - name="bitwise not" +/node/expression/operator/unary/BitwiseNot + name="bitwise not" /* Class: Minus Returns -x. */ // - Minus - name="minus" +/node/expression/operator/unary/Minus + name="minus" /* Class: group A special unary operator representing a value in parentheses. */ // - group - precedence=OOP_GROUP +/node/expression/operator/unary/group + precedence=OOP_GROUP - New(node/expression/exp) - src.exp=exp - return ..() +/node/expression/operator/unary/New(node/expression/exp) + src.exp=exp + return ..() diff --git a/code/modules/scripting/AST/Statements.dm b/code/modules/scripting/AST/Statements.dm index e60fcb389c..eba7b71ae5 100644 --- a/code/modules/scripting/AST/Statements.dm +++ b/code/modules/scripting/AST/Statements.dm @@ -11,22 +11,20 @@ Represents a call to a function. */ // - FunctionCall - var - func_name - node/identifier/object - list/parameters=new +/node/statement/FunctionCall + var/func_name + var/node/identifier/object + var/list/parameters=list() /* Class: FunctionDefinition Defines a function. */ // - FunctionDefinition - var - func_name - list/parameters=new - node/BlockDefinition/FunctionBlock/block +/node/statement/FunctionDefinition + var/func_name + var/list/parameters=list() + var/node/BlockDefinition/FunctionBlock/block /* Class: VariableAssignment @@ -40,13 +38,10 @@ - */ // - VariableAssignment - var - node - identifier - object - var_name - expression/value +/node/statement/VariableAssignment + var/node/identifier/object + var/node/identifier/var_name + var/node/expression/value /* Class: VariableDeclaration @@ -56,67 +51,56 @@ - */ // - VariableDeclaration - var - node - identifier - object - var_name +/node/statement/VariableDeclaration + var/node/identifier/object + var/node/identifier/var_name /* Class: IfStatement */ // - IfStatement - var - node - BlockDefinition - block - else_block //may be null - expression/cond +/node/statement/IfStatement + var/node/BlockDefinition/block + var/node/BlockDefinition/else_block // may be null + var/node/expression/cond /* Class: WhileLoop Loops while a given condition is true. */ // - WhileLoop - var - node - BlockDefinition/block - expression/cond +/node/statement/WhileLoop + var/node/BlockDefinition/block + var/node/expression/cond /* Class: ForLoop Loops while test is true, initializing a variable, increasing the variable */ - ForLoop - var - node - BlockDefinition/block - expression/test - expression/init - expression/increment +/node/statement/ForLoop + var/node/BlockDefinition/block + var/node/expression/test + var/node/expression/init + var/node/expression/increment /* Class: BreakStatement Ends a loop. */ // - BreakStatement +/node/statement/BreakStatement /* Class: ContinueStatement Skips to the next iteration of a loop. */ // - ContinueStatement +/node/statement/ContinueStatement /* Class: ReturnStatement Ends the function and returns a value. */ // - ReturnStatement - var - node/expression/value \ No newline at end of file +/node/statement/ReturnStatement + var/node/expression/value \ No newline at end of file diff --git a/code/modules/scripting/Errors.dm b/code/modules/scripting/Errors.dm index 5b722d007c..8a47bf1c28 100644 --- a/code/modules/scripting/Errors.dm +++ b/code/modules/scripting/Errors.dm @@ -6,127 +6,117 @@ An error scanning or parsing the source code. */ /scriptError - var -/* - Var: message - A message describing the problem. -*/ - message - New(msg=null) - if(msg)message=msg + var/message /// A message describing the problem. +/scriptError/New(msg=null) + if(msg)message=msg - BadToken - message="Unexpected token: " - var/token/token - New(token/t) - token=t - if(t&&t.line) message="[t.line]: [message]" - if(istype(t))message+="[t.value]" - else message+="[t]" +/scriptError/BadToken + message="Unexpected token: " + var/token/token +/scriptError/BadToken/New(token/t) + token=t + if(t&&t.line) message="[t.line]: [message]" + if(istype(t))message+="[t.value]" + else message+="[t]" - InvalidID - parent_type=/scriptError/BadToken - message="Invalid identifier name: " +/scriptError/InvalidID + parent_type=/scriptError/BadToken + message="Invalid identifier name: " - ReservedWord - parent_type=/scriptError/BadToken - message="Identifer using reserved word: " +/scriptError/ReservedWord + parent_type=/scriptError/BadToken + message="Identifer using reserved word: " - BadNumber - parent_type=/scriptError/BadToken - message = "Bad number: " +/scriptError/BadNumber + parent_type=/scriptError/BadToken + message = "Bad number: " - BadReturn - var/token/token - message = "Unexpected return statement outside of a function." - New(token/t) - src.token=t +/scriptError/BadReturn + var/token/token + message = "Unexpected return statement outside of a function." +/scriptError/BadReturn/New(token/t) + src.token=t - EndOfFile - message = "Unexpected end of file." +/scriptError/EndOfFile + message = "Unexpected end of file." - ExpectedToken - message="Expected: '" - New(id, token/T) - if(T && T.line) message="[T.line]: [message]" - message+="[id]'. " - if(T)message+="Found '[T.value]'." +/scriptError/ExpectedToken + message="Expected: '" +/scriptError/ExpectedToken/New(id, token/T) + if(T && T.line) message="[T.line]: [message]" + message+="[id]'. " + if(T)message+="Found '[T.value]'." - UnterminatedComment - message="Unterminated multi-line comment statement: expected */" +/scriptError/UnterminatedComment + message="Unterminated multi-line comment statement: expected */" - DuplicateFunction - New(name, token/t) - message="Function '[name]' defined twice." +/scriptError/DuplicateFunction + message="Function defined twice." +/scriptError/DuplicateFunction/New(name, token/t) + message="Function '[name]' defined twice." /* Class: runtimeError An error thrown by the interpreter in running the script. */ /runtimeError - var - name -/* - Var: message - A basic description as to what went wrong. -*/ - message - stack/stack + var/name + var/message /// A basic description as to what went wrong. + var/stack/stack - proc -/* - Proc: ToString - Returns a description of the error suitable for showing to the user. -*/ - ToString() - . = "[name]: [message]" - if(!stack.Top()) return - .+="\nStack:" - while(stack.Top()) - var/node/statement/FunctionCall/stmt=stack.Pop() - . += "\n\t [stmt.func_name]()" +/** + * Proc: ToString + * Returns a description of the error suitable for showing to the user. + */ +/runtimeError/proc/ToString() + . = "[name]: [message]" + if(!stack.Top()) return + .+="\nStack:" + while(stack.Top()) + var/node/statement/FunctionCall/stmt=stack.Pop() + . += "\n\t [stmt.func_name]()" - TypeMismatch - name="TypeMismatchError" - New(op, a, b) - message="Type mismatch: '[a]' [op] '[b]'" +/runtimeError/TypeMismatch + name="TypeMismatchError" +/runtimeError/TypeMismatch/New(op, a, b) + message="Type mismatch: '[a]' [op] '[b]'" - UnexpectedReturn - name="UnexpectedReturnError" - message="Unexpected return statement." +/runtimeError/UnexpectedReturn + name="UnexpectedReturnError" + message="Unexpected return statement." - UnknownInstruction - name="UnknownInstructionError" - message="Unknown instruction type. This may be due to incompatible compiler and interpreter versions or a lack of implementation." +/runtimeError/UnknownInstruction + name="UnknownInstructionError" + message="Unknown instruction type. This may be due to incompatible compiler and interpreter versions or a lack of implementation." - UndefinedVariable - name="UndefinedVariableError" - New(variable) - message="Variable '[variable]' has not been declared." +/runtimeError/UndefinedVariable + name="UndefinedVariableError" +/runtimeError/UndefinedVariable/New(variable) + message="Variable '[variable]' has not been declared." - UndefinedFunction - name="UndefinedFunctionError" - New(function) - message="Function '[function]()' has not been defined." +/runtimeError/UndefinedFunction + name="UndefinedFunctionError" +/runtimeError/UndefinedFunction/New(function) + message="Function '[function]()' has not been defined." - DuplicateVariableDeclaration - name="DuplicateVariableError" - New(variable) - message="Variable '[variable]' was already declared." +/runtimeError/DuplicateVariableDeclaration + name="DuplicateVariableError" +/runtimeError/DuplicateVariableDeclaration/New(variable) + message="Variable '[variable]' was already declared." - IterationLimitReached - name="MaxIterationError" - message="A loop has reached its maximum number of iterations." +/runtimeError/IterationLimitReached + name="MaxIterationError" + message="A loop has reached its maximum number of iterations." - RecursionLimitReached - name="MaxRecursionError" - message="The maximum amount of recursion has been reached." +/runtimeError/RecursionLimitReached + name="MaxRecursionError" + message="The maximum amount of recursion has been reached." - DivisionByZero - name="DivideByZeroError" - message="Division by zero attempted." +/runtimeError/DivisionByZero + name="DivideByZeroError" + message="Division by zero attempted." - MaxCPU - name="MaxComputationalUse" - message="Maximum amount of computational cycles reached (>= 1000)." \ No newline at end of file +/runtimeError/MaxCPU + name="MaxComputationalUse" + message="Maximum amount of computational cycles reached (>= 1000)." \ No newline at end of file diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm index 8adc021c4d..5b6ea4daf0 100644 --- a/code/modules/scripting/IDE.dm +++ b/code/modules/scripting/IDE.dm @@ -1,4 +1,4 @@ -client/verb/tcssave() +/client/verb/tcssave() set hidden = 1 if(mob.machine || issilicon(mob)) if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || issilicon(mob)) @@ -25,7 +25,7 @@ client/verb/tcssave() src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") -client/verb/tcscompile() +/client/verb/tcscompile() set hidden = 1 if(mob.machine || issilicon(mob)) if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) @@ -76,7 +76,7 @@ client/verb/tcscompile() src << output(null, "tcserror") src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") -client/verb/tcsrun() +/client/verb/tcsrun() set hidden = 1 if(mob.machine || issilicon(mob)) if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) @@ -142,7 +142,7 @@ client/verb/tcsrun() src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") -client/verb/exittcs() +/client/verb/exittcs() set hidden = 1 if(mob.machine || issilicon(mob)) if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) @@ -154,7 +154,7 @@ client/verb/exittcs() if(mob in Machine.viewingcode) Machine.viewingcode.Remove(mob) -client/verb/tcsrevert() +/client/verb/tcsrevert() set hidden = 1 if(mob.machine || issilicon(mob)) if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) @@ -183,7 +183,7 @@ client/verb/tcsrevert() src << output("Failed to revert: Unable to locate machine.", "tcserror") -client/verb/tcsclearmem() +/client/verb/tcsclearmem() set hidden = 1 if(mob.machine || issilicon(mob)) if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index ffe15da21d..1d3fbda3e7 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -7,248 +7,224 @@ /n_Interpreter/TCS_Interpreter var/datum/TCS_Compiler/Compiler - HandleError(runtimeError/e) - Compiler.Holder.add_entry(e.ToString(), "Execution Error") +/n_Interpreter/TCS_Interpreter/HandleError(runtimeError/e) + Compiler.Holder.add_entry(e.ToString(), "Execution Error") /datum/TCS_Compiler var/n_Interpreter/TCS_Interpreter/interpreter var/obj/machinery/telecomms/server/Holder // the server that is running the code var/ready = 1 // 1 if ready to run code - /* -- Compile a raw block of text -- */ + /** Proc: Compile + * Compile a raw block of text into a program + * Returns: List of errors + */ - proc/Compile(code as message) - var/n_scriptOptions/nS_Options/options = new() - var/n_Scanner/nS_Scanner/scanner = new(code, options) - var/list/tokens = scanner.Scan() - var/n_Parser/nS_Parser/parser = new(tokens, options) - var/node/BlockDefinition/GlobalBlock/program = parser.Parse() +/datum/TCS_Compiler/proc/Compile(code as message) + var/n_scriptOptions/nS_Options/options = new() + var/n_Scanner/nS_Scanner/scanner = new(code, options) + var/list/tokens = scanner.Scan() + var/n_Parser/nS_Parser/parser = new(tokens, options) + var/node/BlockDefinition/GlobalBlock/program = parser.Parse() - var/list/returnerrors = list() + var/list/returnerrors = list() - returnerrors += scanner.errors - returnerrors += parser.errors - - if(returnerrors.len) - return returnerrors - - interpreter = new(program) - interpreter.persist = 1 - interpreter.Compiler= src + returnerrors += scanner.errors + returnerrors += parser.errors + if(returnerrors.len) return returnerrors + interpreter = new(program) + interpreter.persist = 1 + interpreter.Compiler= src + + return returnerrors + /* -- Execute the compiled code -- */ +/** Proc: Run + * Executes the compiled code. + * Arguments: + * var/datum/signal/signal - a telecomms signal + * Returns: None + */ +/datum/TCS_Compiler/proc/Run(var/datum/signal/signal) - proc/Run(var/datum/signal/signal) + if(!ready) + return - if(!ready) - return + if(!interpreter) + return - if(!interpreter) - return + interpreter.container = src - interpreter.container = src + interpreter.SetVar("PI" , 3.141592653) // value of pi + interpreter.SetVar("E" , 2.718281828) // value of e + interpreter.SetVar("SQURT2" , 1.414213562) // value of the square root of 2 + interpreter.SetVar("FALSE" , 0) // boolean shortcut to 0 + interpreter.SetVar("TRUE" , 1) // boolean shortcut to 1 - interpreter.SetVar("PI" , 3.141592653) // value of pi - interpreter.SetVar("E" , 2.718281828) // value of e - interpreter.SetVar("SQURT2" , 1.414213562) // value of the square root of 2 - interpreter.SetVar("FALSE" , 0) // boolean shortcut to 0 - interpreter.SetVar("TRUE" , 1) // boolean shortcut to 1 + interpreter.SetVar("NORTH" , NORTH) // NORTH (1) + interpreter.SetVar("SOUTH" , SOUTH) // SOUTH (2) + interpreter.SetVar("EAST" , EAST) // EAST (4) + interpreter.SetVar("WEST" , WEST) // WEST (8) - interpreter.SetVar("NORTH" , NORTH) // NORTH (1) - interpreter.SetVar("SOUTH" , SOUTH) // SOUTH (2) - interpreter.SetVar("EAST" , EAST) // EAST (4) - interpreter.SetVar("WEST" , WEST) // WEST (8) + // Channel macros + interpreter.SetVar("$common", PUB_FREQ) + interpreter.SetVar("$science", SCI_FREQ) + interpreter.SetVar("$command", COMM_FREQ) + interpreter.SetVar("$medical", MED_FREQ) + interpreter.SetVar("$engineering",ENG_FREQ) + interpreter.SetVar("$security", SEC_FREQ) + interpreter.SetVar("$supply", SUP_FREQ) + interpreter.SetVar("$explorer", EXP_FREQ) - // Channel macros - interpreter.SetVar("$common", PUB_FREQ) - interpreter.SetVar("$science", SCI_FREQ) - interpreter.SetVar("$command", COMM_FREQ) - interpreter.SetVar("$medical", MED_FREQ) - interpreter.SetVar("$engineering",ENG_FREQ) - interpreter.SetVar("$security", SEC_FREQ) - interpreter.SetVar("$supply", SUP_FREQ) - interpreter.SetVar("$explorer", EXP_FREQ) + // Signal data - // Signal data + interpreter.SetVar("$content", signal.data["message"]) + interpreter.SetVar("$freq" , signal.frequency) + interpreter.SetVar("$source" , signal.data["name"]) + interpreter.SetVar("$job" , signal.data["job"]) + interpreter.SetVar("$sign" , signal) + interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0 - interpreter.SetVar("$content", signal.data["message"]) - interpreter.SetVar("$freq" , signal.frequency) - interpreter.SetVar("$source" , signal.data["name"]) - interpreter.SetVar("$job" , signal.data["job"]) - interpreter.SetVar("$sign" , signal) - interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0 + // Set up the script procs - // Set up the script procs + /* + -> Send another signal to a server + @format: broadcast(content, frequency, source, job) - /* - -> Send another signal to a server - @format: broadcast(content, frequency, source, job) + @param content: Message to broadcast + @param frequency: Frequency to broadcast to + @param source: The name of the source you wish to imitate. Must be stored in stored_names list. + @param job: The name of the job. + */ + interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job")) - @param content: Message to broadcast - @param frequency: Frequency to broadcast to - @param source: The name of the source you wish to imitate. Must be stored in stored_names list. - @param job: The name of the job. - */ - interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job")) + /* + -> Store a value permanently to the server machine (not the actual game hosting machine, the ingame machine) + @format: mem(address, value) - /* - -> Store a value permanently to the server machine (not the actual game hosting machine, the ingame machine) - @format: mem(address, value) + @param address: The memory address (string index) to store a value to + @param value: The value to store to the memory address + */ + interpreter.SetProc("mem", "mem", signal, list("address", "value")) - @param address: The memory address (string index) to store a value to - @param value: The value to store to the memory address - */ - interpreter.SetProc("mem", "mem", signal, list("address", "value")) + /* + -> Delay code for a given amount of deciseconds + @format: sleep(time) - /* - -> Delay code for a given amount of deciseconds - @format: sleep(time) + @param time: time to sleep in deciseconds (1/10th second) + */ + interpreter.SetProc("sleep", /proc/delay) - @param time: time to sleep in deciseconds (1/10th second) - */ - interpreter.SetProc("sleep", /proc/delay) + /* + -> Replaces a string with another string + @format: replace(string, substring, replacestring) - /* - -> Replaces a string with another string - @format: replace(string, substring, replacestring) + @param string: the string to search for substrings (best used with $content$ constant) + @param substring: the substring to search for + @param replacestring: the string to replace the substring with - @param string: the string to search for substrings (best used with $content$ constant) - @param substring: the substring to search for - @param replacestring: the string to replace the substring with + */ + interpreter.SetProc("replace", /proc/string_replacetext) - */ - interpreter.SetProc("replace", /proc/string_replacetext) + /* + -> Locates an element/substring inside of a list or string + @format: find(haystack, needle, start = 1, end = 0) - /* - -> Locates an element/substring inside of a list or string - @format: find(haystack, needle, start = 1, end = 0) + @param haystack: the container to search + @param needle: the element to search for + @param start: the position to start in + @param end: the position to end in - @param haystack: the container to search - @param needle: the element to search for - @param start: the position to start in - @param end: the position to end in + */ + interpreter.SetProc("find", /proc/smartfind) - */ - interpreter.SetProc("find", /proc/smartfind) + /* + -> Finds the length of a string or list + @format: length(container) - /* - -> Finds the length of a string or list - @format: length(container) + @param container: the list or container to measure - @param container: the list or container to measure + */ + interpreter.SetProc("length", /proc/smartlength) - */ - interpreter.SetProc("length", /proc/smartlength) + /* -- Clone functions, carried from default BYOND procs --- */ - /* -- Clone functions, carried from default BYOND procs --- */ + // vector namespace + interpreter.SetProc("vector", /proc/n_list) + interpreter.SetProc("at", /proc/n_listpos) + interpreter.SetProc("copy", /proc/n_listcopy) + interpreter.SetProc("push_back", /proc/n_listadd) + interpreter.SetProc("remove", /proc/n_listremove) + interpreter.SetProc("cut", /proc/n_listcut) + interpreter.SetProc("swap", /proc/n_listswap) + interpreter.SetProc("insert", /proc/n_listinsert) - // vector namespace - interpreter.SetProc("vector", /proc/n_list) - interpreter.SetProc("at", /proc/n_listpos) - interpreter.SetProc("copy", /proc/n_listcopy) - interpreter.SetProc("push_back", /proc/n_listadd) - interpreter.SetProc("remove", /proc/n_listremove) - interpreter.SetProc("cut", /proc/n_listcut) - interpreter.SetProc("swap", /proc/n_listswap) - interpreter.SetProc("insert", /proc/n_listinsert) + interpreter.SetProc("pick", /proc/n_pick) + interpreter.SetProc("prob", /proc/prob_chance) + interpreter.SetProc("substr", /proc/docopytext) - interpreter.SetProc("pick", /proc/n_pick) - interpreter.SetProc("prob", /proc/prob_chance) - interpreter.SetProc("substr", /proc/docopytext) + // Donkie~ + // Strings + interpreter.SetProc("lower", /proc/n_lower) + interpreter.SetProc("upper", /proc/n_upper) + interpreter.SetProc("explode", /proc/string_explode) + interpreter.SetProc("repeat", /proc/n_repeat) + interpreter.SetProc("reverse", /proc/n_reverse) + interpreter.SetProc("tonum", /proc/n_str2num) - // Donkie~ - // Strings - interpreter.SetProc("lower", /proc/n_lower) - interpreter.SetProc("upper", /proc/n_upper) - interpreter.SetProc("explode", /proc/string_explode) - interpreter.SetProc("repeat", /proc/n_repeat) - interpreter.SetProc("reverse", /proc/n_reverse) - interpreter.SetProc("tonum", /proc/n_str2num) - - // Numbers - interpreter.SetProc("tostring", /proc/n_num2str) - interpreter.SetProc("sqrt", /proc/n_sqrt) - interpreter.SetProc("abs", /proc/n_abs) - interpreter.SetProc("floor", /proc/n_floor) - interpreter.SetProc("ceil", /proc/n_ceil) - interpreter.SetProc("round", /proc/n_round) - interpreter.SetProc("clamp", /proc/n_clamp) - interpreter.SetProc("inrange", /proc/n_inrange) - // End of Donkie~ + // Numbers + interpreter.SetProc("tostring", /proc/n_num2str) + interpreter.SetProc("sqrt", /proc/n_sqrt) + interpreter.SetProc("abs", /proc/n_abs) + interpreter.SetProc("floor", /proc/n_floor) + interpreter.SetProc("ceil", /proc/n_ceil) + interpreter.SetProc("round", /proc/n_round) + interpreter.SetProc("clamp", /proc/n_clamp) + interpreter.SetProc("inrange", /proc/n_inrange) + // End of Donkie~ - // Run the compiled code - interpreter.Run() + // Run the compiled code + interpreter.Run() - // Backwards-apply variables onto signal data - /* sanitize EVERYTHING. fucking players can't be trusted with SHIT */ + // Backwards-apply variables onto signal data + /* sanitize EVERYTHING. fucking players can't be trusted with SHIT */ - signal.data["message"] = interpreter.GetVar("$content") - signal.frequency = interpreter.GetVar("$freq") + signal.data["message"] = interpreter.GetVar("$content") + signal.frequency = interpreter.GetVar("$freq") - var/setname = "" - var/obj/machinery/telecomms/server/S = signal.data["server"] - if(interpreter.GetVar("$source") in S.stored_names) - setname = interpreter.GetVar("$source") - else - setname = "[interpreter.GetVar("$source")]" + var/setname = "" + var/obj/machinery/telecomms/server/S = signal.data["server"] + if(interpreter.GetVar("$source") in S.stored_names) + setname = interpreter.GetVar("$source") + else + setname = "[interpreter.GetVar("$source")]" - if(signal.data["name"] != setname) - signal.data["realname"] = setname - signal.data["name"] = setname - signal.data["job"] = interpreter.GetVar("$job") - signal.data["reject"] = !(interpreter.GetVar("$pass")) // set reject to the opposite of $pass + if(signal.data["name"] != setname) + signal.data["realname"] = setname + signal.data["name"] = setname + signal.data["job"] = interpreter.GetVar("$job") + signal.data["reject"] = !(interpreter.GetVar("$pass")) // set reject to the opposite of $pass - // If the message is invalid, just don't broadcast it! - if(signal.data["message"] == "" || !signal.data["message"]) - signal.data["reject"] = 1 + // If the message is invalid, just don't broadcast it! + if(signal.data["message"] == "" || !signal.data["message"]) + signal.data["reject"] = 1 /* -- Actual language proc code -- */ -datum/signal +/datum/signal/proc/mem(var/address, var/value) - proc/mem(var/address, var/value) - - if(istext(address)) - var/obj/machinery/telecomms/server/S = data["server"] - - if(!value && value != 0) - return S.memory[address] - - else - S.memory[address] = value - - - proc/tcombroadcast(var/message, var/freq, var/source, var/job) - - var/datum/signal/newsign = new + if(istext(address)) var/obj/machinery/telecomms/server/S = data["server"] - var/obj/item/device/radio/hradio = S.server_radio - if(!hradio) - error("[src] has no radio.") - return + if(!value && value != 0) + return S.memory[address] - if((!message || message == "") && message != 0) - message = "*beep*" - if(!source) - source = "[html_encode(uppertext(S.id))]" - hradio = new // sets the hradio as a radio intercom - if(!freq) - freq = PUB_FREQ - if(findtext(num2text(freq), ".")) // if the frequency has been set as a decimal - freq *= 10 // shift the decimal one place - - if(!job) - job = "?" - - newsign.data["mob"] = null - newsign.data["mobtype"] = /mob/living/carbon/human - if(source in S.stored_names) - newsign.data["name"] = source else +<<<<<<< HEAD newsign.data["name"] = "[html_encode(uppertext(source))]" newsign.data["realname"] = newsign.data["name"] newsign.data["job"] = job @@ -272,4 +248,60 @@ datum/signal var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub") if(!pass) S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters +======= + S.memory[address] = value + + +/datum/signal/proc/tcombroadcast(var/message, var/freq, var/source, var/job) + + var/datum/signal/newsign = new + var/obj/machinery/telecomms/server/S = data["server"] + var/obj/item/device/radio/hradio = S.server_radio + + if(!hradio) + error("[src] has no radio.") + return + + if((!message || message == "") && message != 0) + message = "*beep*" + if(!source) + source = "[html_encode(uppertext(S.id))]" + hradio = new // sets the hradio as a radio intercom + if(!freq) + freq = PUB_FREQ + if(findtext(num2text(freq), ".")) // if the frequency has been set as a decimal + freq *= 10 // shift the decimal one place + + if(!job) + job = "?" + + newsign.data["mob"] = null + newsign.data["mobtype"] = /mob/living/carbon/human + if(source in S.stored_names) + newsign.data["name"] = source + else + newsign.data["name"] = "[html_encode(uppertext(source))]" + newsign.data["realname"] = newsign.data["name"] + newsign.data["job"] = job + newsign.data["compression"] = 0 + newsign.data["message"] = message + newsign.data["type"] = 2 // artificial broadcast + if(!isnum(freq)) + freq = text2num(freq) + newsign.frequency = freq + + var/datum/radio_frequency/connection = radio_controller.return_frequency(freq) + newsign.data["connection"] = connection + + + newsign.data["radio"] = hradio + newsign.data["vmessage"] = message + newsign.data["vname"] = source + newsign.data["vmask"] = 0 + newsign.data["level"] = list() + + var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub") + if(!pass) + S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/modules/scripting/Implementations/_Logic.dm b/code/modules/scripting/Implementations/_Logic.dm index 5522d0e2aa..f1b828cbdf 100644 --- a/code/modules/scripting/Implementations/_Logic.dm +++ b/code/modules/scripting/Implementations/_Logic.dm @@ -137,7 +137,7 @@ /* //Makes a list where all indicies in a string is a seperate index in the list // JUST A HELPER DON'T ADD TO NTSCRIPT -proc/string_tolist(var/string) +/proc/string_tolist(var/string) var/list/L = new/list() var/i @@ -146,7 +146,7 @@ proc/string_tolist(var/string) return L -proc/string_explode(var/string, var/separator) +/proc/string_explode(var/string, var/separator) if(istext(string)) if(istext(separator) && separator == "") return string_tolist(string) @@ -165,11 +165,11 @@ proc/string_explode(var/string, var/separator) Just found out there was already a string explode function, did some benchmarking, and that function were a bit faster, sticking to that. */ -proc/string_explode(var/string, var/separator) +/proc/string_explode(var/string, var/separator) if(istext(string) && istext(separator)) return splittext(string, separator) -proc/n_repeat(var/string, var/amount) +/proc/n_repeat(var/string, var/amount) if(istext(string) && isnum(amount)) var/i var/newstring = "" @@ -182,7 +182,7 @@ proc/n_repeat(var/string, var/amount) return newstring -proc/n_reverse(var/string) +/proc/n_reverse(var/string) if(istext(string)) var/newstring = "" var/i @@ -194,44 +194,44 @@ proc/n_reverse(var/string) return newstring // I don't know if it's neccesary to make my own proc, but I think I have to to be able to check for istext. -proc/n_str2num(var/string) +/proc/n_str2num(var/string) if(istext(string)) return text2num(string) // Number shit -proc/n_num2str(var/num) +/proc/n_num2str(var/num) if(isnum(num)) return num2text(num) // Squareroot -proc/n_sqrt(var/num) +/proc/n_sqrt(var/num) if(isnum(num)) return sqrt(num) // Magnitude of num -proc/n_abs(var/num) +/proc/n_abs(var/num) if(isnum(num)) return abs(num) // Round down -proc/n_floor(var/num) +/proc/n_floor(var/num) if(isnum(num)) return round(num) // Round up -proc/n_ceil(var/num) +/proc/n_ceil(var/num) if(isnum(num)) return round(num)+1 // Round to nearest integer -proc/n_round(var/num) +/proc/n_round(var/num) if(isnum(num)) if(num-round(num)<0.5) return round(num) return n_ceil(num) // Clamps N between min and max -proc/n_clamp(var/num, var/min=-1, var/max=1) +/proc/n_clamp(var/num, var/min=-1, var/max=1) if(isnum(num)&&isnum(min)&&isnum(max)) if(num<=min) return min @@ -240,7 +240,7 @@ proc/n_clamp(var/num, var/min=-1, var/max=1) return num // Returns 1 if N is inbetween Min and Max -proc/n_inrange(var/num, var/min=-1, var/max=1) +/proc/n_inrange(var/num, var/min=-1, var/max=1) if(isnum(num)&&isnum(min)&&isnum(max)) return ((min <= num) && (num <= max)) // END OF BY DONKIE :( diff --git a/code/modules/scripting/Interpreter/Evaluation.dm b/code/modules/scripting/Interpreter/Evaluation.dm index 02cdc929c5..cfdc797ce4 100644 --- a/code/modules/scripting/Interpreter/Evaluation.dm +++ b/code/modules/scripting/Interpreter/Evaluation.dm @@ -1,169 +1,167 @@ /proc/isobject(x) - return (istype(x, /datum) || istype(x, /list) || istype(x, /savefile) || istype(x, /client) || (x==world)) + return !(isnum(x) || istext(x)) -/n_Interpreter - proc - Eval(node/expression/exp) - if(istype(exp, /node/expression/FunctionCall)) - return RunFunction(exp) - else if(istype(exp, /node/expression/operator)) - return EvalOperator(exp) - else if(istype(exp, /node/expression/value/literal)) - var/node/expression/value/literal/lit=exp - return lit.value - else if(istype(exp, /node/expression/value/reference)) - var/node/expression/value/reference/ref=exp - return ref.value - else if(istype(exp, /node/expression/value/variable)) - var/node/expression/value/variable/v=exp - if(!v.object) - return Eval(GetVariable(v.id.id_name)) - else - var/datum/D - if(istype(v.object, /node/identifier)) - D=GetVariable(v.object:id_name) - else - D=v.object - D=Eval(D) - if(!isobject(D)) - return null - if(!D.vars.Find(v.id.id_name)) - RaiseError(new/runtimeError/UndefinedVariable("[v.object.ToString()].[v.id.id_name]")) - return null - return Eval(D.vars[v.id.id_name]) - else if(istype(exp, /node/expression)) +/n_Interpreter/proc/Eval(node/expression/exp) + if(istype(exp, /node/expression/FunctionCall)) + return RunFunction(exp) + else if(istype(exp, /node/expression/operator)) + return EvalOperator(exp) + else if(istype(exp, /node/expression/value/literal)) + var/node/expression/value/literal/lit=exp + return lit.value + else if(istype(exp, /node/expression/value/reference)) + var/node/expression/value/reference/ref=exp + return ref.value + else if(istype(exp, /node/expression/value/variable)) + var/node/expression/value/variable/v=exp + if(!v.object) + return Eval(GetVariable(v.id.id_name)) + else + var/datum/D + if(istype(v.object, /node/identifier)) + D=GetVariable(v.object:id_name) + else + D=v.object + D=Eval(D) + if(!isobject(D)) + return null + if(!D.vars.Find(v.id.id_name)) + RaiseError(new/runtimeError/UndefinedVariable("[v.object.ToString()].[v.id.id_name]")) + return null + return Eval(D.vars[v.id.id_name]) + else if(istype(exp, /node/expression)) + RaiseError(new/runtimeError/UnknownInstruction()) + else + return exp + +/n_Interpreter/proc/EvalOperator(node/expression/operator/exp) + if(istype(exp, /node/expression/operator/binary)) + var/node/expression/operator/binary/bin=exp + switch(bin.type) + if(/node/expression/operator/binary/Equal) + return Equal(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/NotEqual) + return NotEqual(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Greater) + return Greater(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Less) + return Less(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/GreaterOrEqual) + return GreaterOrEqual(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/LessOrEqual) + return LessOrEqual(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/LogicalAnd) + return LogicalAnd(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/LogicalOr) + return LogicalOr(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/LogicalXor) + return LogicalXor(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/BitwiseAnd) + return BitwiseAnd(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/BitwiseOr) + return BitwiseOr(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/BitwiseXor) + return BitwiseXor(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Add) + return Add(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Subtract) + return Subtract(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Multiply) + return Multiply(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Divide) + return Divide(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Power) + return Power(Eval(bin.exp), Eval(bin.exp2)) + if(/node/expression/operator/binary/Modulo) + return Modulo(Eval(bin.exp), Eval(bin.exp2)) + else RaiseError(new/runtimeError/UnknownInstruction()) - else - return exp - - EvalOperator(node/expression/operator/exp) - if(istype(exp, /node/expression/operator/binary)) - var/node/expression/operator/binary/bin=exp - switch(bin.type) - if(/node/expression/operator/binary/Equal) - return Equal(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/NotEqual) - return NotEqual(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Greater) - return Greater(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Less) - return Less(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/GreaterOrEqual) - return GreaterOrEqual(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LessOrEqual) - return LessOrEqual(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LogicalAnd) - return LogicalAnd(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LogicalOr) - return LogicalOr(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LogicalXor) - return LogicalXor(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/BitwiseAnd) - return BitwiseAnd(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/BitwiseOr) - return BitwiseOr(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/BitwiseXor) - return BitwiseXor(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Add) - return Add(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Subtract) - return Subtract(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Multiply) - return Multiply(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Divide) - return Divide(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Power) - return Power(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Modulo) - return Modulo(Eval(bin.exp), Eval(bin.exp2)) - else - RaiseError(new/runtimeError/UnknownInstruction()) - else - switch(exp.type) - if(/node/expression/operator/unary/Minus) - return Minus(Eval(exp.exp)) - if(/node/expression/operator/unary/LogicalNot) - return LogicalNot(Eval(exp.exp)) - if(/node/expression/operator/unary/BitwiseNot) - return BitwiseNot(Eval(exp.exp)) - if(/node/expression/operator/unary/group) - return Eval(exp.exp) - else - RaiseError(new/runtimeError/UnknownInstruction()) + return + switch(exp.type) + if(/node/expression/operator/unary/Minus) + return Minus(Eval(exp.exp)) + if(/node/expression/operator/unary/LogicalNot) + return LogicalNot(Eval(exp.exp)) + if(/node/expression/operator/unary/BitwiseNot) + return BitwiseNot(Eval(exp.exp)) + if(/node/expression/operator/unary/group) + return Eval(exp.exp) + else + RaiseError(new/runtimeError/UnknownInstruction()) - //Binary// - //Comparison operators - Equal(a, b) return a==b - NotEqual(a, b) return a!=b //LogicalNot(Equal(a, b)) - Greater(a, b) return a>b - Less(a, b) return a=b - LessOrEqual(a, b) return a<=b - //Logical Operators - LogicalAnd(a, b) return a&&b - LogicalOr(a, b) return a||b - LogicalXor(a, b) return (a||b) && !(a&&b) - //Bitwise Operators - BitwiseAnd(a, b) return a&b - BitwiseOr(a, b) return a|b - BitwiseXor(a, b) return a^b - //Arithmetic Operators - Add(a, b) - if(istext(a)&&!istext(b)) b="[b]" - else if(istext(b)&&!istext(a)) a="[a]" - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("+", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("+", a, b)) - return null - return a+b - Subtract(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("-", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("-", a, b)) - return null - return a-b - Divide(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("/", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("/", a, b)) - return null - if(b==0) - RaiseError(new/runtimeError/DivisionByZero()) - return null - return a/b - Multiply(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("*", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("*", a, b)) - return null - return a*b - Modulo(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("%", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("%", a, b)) - return null - return a%b - Power(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("**", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("**", a, b)) - return null - return a**b +//Binary// + //Comparison operators +/n_Interpreter/proc/Equal(a, b) return a==b +/n_Interpreter/proc/NotEqual(a, b) return a!=b //LogicalNot(Equal(a, b)) +/n_Interpreter/proc/Greater(a, b) return a>b +/n_Interpreter/proc/Less(a, b) return a=b +/n_Interpreter/proc/LessOrEqual(a, b) return a<=b + //Logical Operators +/n_Interpreter/proc/LogicalAnd(a, b) return a&&b +/n_Interpreter/proc/LogicalOr(a, b) return a||b +/n_Interpreter/proc/LogicalXor(a, b) return (a||b) && !(a&&b) + //Bitwise Operators +/n_Interpreter/proc/BitwiseAnd(a, b) return a&b +/n_Interpreter/proc/BitwiseOr(a, b) return a|b +/n_Interpreter/proc/BitwiseXor(a, b) return a^b + //Arithmetic Operators +/n_Interpreter/proc/Add(a, b) + if(istext(a)&&!istext(b)) b="[b]" + else if(istext(b)&&!istext(a)) a="[a]" + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("+", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("+", a, b)) + return null + return a+b +/n_Interpreter/proc/Subtract(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("-", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("-", a, b)) + return null + return a-b +/n_Interpreter/proc/Divide(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("/", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("/", a, b)) + return null + if(b==0) + RaiseError(new/runtimeError/DivisionByZero()) + return null + return a/b +/n_Interpreter/proc/Multiply(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("*", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("*", a, b)) + return null + return a*b +/n_Interpreter/proc/Modulo(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("%", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("%", a, b)) + return null + return a%b +/n_Interpreter/proc/Power(a, b) + if(isobject(a) && !isobject(b)) + RaiseError(new/runtimeError/TypeMismatch("**", a, b)) + return null + else if(isobject(b) && !isobject(a)) + RaiseError(new/runtimeError/TypeMismatch("**", a, b)) + return null + return a**b - //Unary// - Minus(a) return -a - LogicalNot(a) return !a - BitwiseNot(a) return ~a \ No newline at end of file +//Unary// +/n_Interpreter/proc/Minus(a) return -a +/n_Interpreter/proc/LogicalNot(a) return !a +/n_Interpreter/proc/BitwiseNot(a) return ~a \ No newline at end of file diff --git a/code/modules/scripting/Interpreter/Interaction.dm b/code/modules/scripting/Interpreter/Interaction.dm index f0b7c988d2..231281a0c9 100644 --- a/code/modules/scripting/Interpreter/Interaction.dm +++ b/code/modules/scripting/Interpreter/Interaction.dm @@ -6,9 +6,7 @@ Class: n_Interpreter Procedures allowing for interaction with the script that is being run by the interpreter object. */ - /n_Interpreter - proc /* Proc: Load @@ -17,22 +15,22 @@ Parameters: program - A object which represents the script's global scope. */ - Load(node/BlockDefinition/GlobalBlock/program) - ASSERT(program) - src.program = program - CreateGlobalScope() +/n_Interpreter/proc/Load(node/BlockDefinition/GlobalBlock/program) + ASSERT(program) + src.program = program + CreateGlobalScope() /* Proc: Run Runs the script. */ - Run() - cur_recursion = 0 // reset recursion - cur_statements = 0 // reset CPU tracking - alertadmins = 0 +/n_Interpreter/proc/Run() + cur_recursion = 0 // reset recursion + cur_statements = 0 // reset CPU tracking + alertadmins = 0 - ASSERT(src.program) - RunBlock(src.program) + ASSERT(src.program) + RunBlock(src.program) /* Proc: SetVar @@ -45,11 +43,11 @@ See Also: - */ - SetVar(name, value) - if(!istext(name)) - //CRASH("Invalid variable name") - return - AssignVariable(name, value) +/n_Interpreter/proc/SetVar(name, value) + if(!istext(name)) + //CRASH("Invalid variable name") + return + AssignVariable(name, value) /* Proc: SetProc @@ -61,40 +59,40 @@ object - (Optional) An object which will the be target of a function call. params - Only required if object is not null, a list of the names of parameters the proc takes. */ - SetProc(name, path, object=null, list/params=null) - if(!istext(name)) - //CRASH("Invalid function name") - return - if(!object) - globalScope.functions[name] = path - else - var/node/statement/FunctionDefinition/S = new() - S.func_name = name - S.parameters = params - S.block = new() - S.block.SetVar("src", object) - var/node/expression/FunctionCall/C = new() - C.func_name = path - C.object = new("src") - for(var/p in params) - C.parameters += new/node/expression/value/variable(p) - var/node/statement/ReturnStatement/R=new() - R.value=C - S.block.statements += R - globalScope.functions[name] = S +/n_Interpreter/proc/SetProc(name, path, object=null, list/params=null) + if(!istext(name)) + //CRASH("Invalid function name") + return + if(!object) + globalScope.functions[name] = path + return + var/node/statement/FunctionDefinition/S = new() + S.func_name = name + S.parameters = params + S.block = new() + S.block.SetVar("src", object) + var/node/expression/FunctionCall/C = new() + C.func_name = path + C.object = new("src") + for(var/p in params) + C.parameters += new/node/expression/value/variable(p) + var/node/statement/ReturnStatement/R=new() + R.value=C + S.block.statements += R + globalScope.functions[name] = S /* Proc: VarExists Checks whether a global variable with the specified name exists. */ - VarExists(name) - return globalScope.variables.Find(name) //convert to 1/0 first? +/n_Interpreter/proc/VarExists(name) + return globalScope.variables.Find(name) //convert to 1/0 first? /* Proc: ProcExists Checks whether a global function with the specified name exists. */ - ProcExists(name) - return globalScope.functions.Find(name) +/n_Interpreter/proc/ProcExists(name) + return globalScope.functions.Find(name) /* Proc: GetVar @@ -103,12 +101,12 @@ See Also: - */ - GetVar(name) - if(!VarExists(name)) - //CRASH("No variable named '[name]'.") - return - var/x = globalScope.variables[name] - return Eval(x) +/n_Interpreter/proc/GetVar(name) + if(!VarExists(name)) + //CRASH("No variable named '[name]'.") + return + var/x = globalScope.variables[name] + return Eval(x) /* Proc: CallProc @@ -118,19 +116,19 @@ See Also: - */ - CallProc(name, params[]=null) - if(!ProcExists(name)) - //CRASH("No function named '[name]'.") - return - var/node/statement/FunctionDefinition/func = globalScope.functions[name] - if(istype(func)) - var/node/statement/FunctionCall/stmt = new - stmt.func_name = func.func_name - stmt.parameters = params - return RunFunction(stmt) - else - return call(func)(arglist(params)) - //CRASH("Unknown function type '[name]'.") +/n_Interpreter/proc/CallProc(name, params[]=null) + if(!ProcExists(name)) + //CRASH("No function named '[name]'.") + return + var/node/statement/FunctionDefinition/func = globalScope.functions[name] + if(istype(func)) + var/node/statement/FunctionCall/stmt = new + stmt.func_name = func.func_name + stmt.parameters = params + return RunFunction(stmt) + else + return call(func)(arglist(params)) + //CRASH("Unknown function type '[name]'.") /* Event: HandleError @@ -139,4 +137,4 @@ See Also: - */ - HandleError(runtimeError/e) \ No newline at end of file +/n_Interpreter/proc/HandleError(runtimeError/e) \ No newline at end of file diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm index 70849ffa15..efdf1f7651 100644 --- a/code/modules/scripting/Interpreter/Interpreter.dm +++ b/code/modules/scripting/Interpreter/Interpreter.dm @@ -14,301 +14,296 @@ #define BREAKING 2 #define CONTINUING 4 /n_Interpreter - var - scope - curScope - globalScope - node - BlockDefinition/program - statement/FunctionDefinition/curFunction - stack - scopes = new() - functions = new() + var/scope/curScope + var/scope/globalScope + var/node/BlockDefinition/program + var/node/statement/FunctionDefinition/curFunction + var/stack/scopes = new() + var/stack/functions = new() - datum/container // associated container for interpeter + var/datum/container // associated container for interpeter /* Var: status A variable indicating that the rest of the current block should be skipped. This may be set to any combination of . */ - status=0 - returnVal + var/status=0 + var/returnVal - max_statements=1000 // maximum amount of statements that can be called in one execution. this is to prevent massive crashes and exploitation - cur_statements=0 // current amount of statements called - alertadmins=0 // set to 1 if the admins shouldn't be notified of anymore issues - max_iterations=100 // max number of uninterrupted loops possible - max_recursion=50 // max recursions without returning anything (or completing the code block) - cur_recursion=0 // current amount of recursion + var/max_statements=1000 // maximum amount of statements that can be called in one execution. this is to prevent massive crashes and exploitation + var/cur_statements=0 // current amount of statements called + var/alertadmins=0 // set to 1 if the admins shouldn't be notified of anymore issues + var/max_iterations=100 // max number of uninterrupted loops possible + var/max_recursion=50 // max recursions without returning anything (or completing the code block) + var/cur_recursion=0 // current amount of recursion /* Var: persist If 0, global variables will be reset after Run() finishes. */ - persist=1 - paused=0 + var/persist=1 + var/paused=0 /* Constructor: New Calls with the given parameters. */ - New(node/BlockDefinition/GlobalBlock/program=null) - .=..() - if(program)Load(program) +/n_Interpreter/New(node/BlockDefinition/GlobalBlock/program=null) + .=..() + if(program)Load(program) - proc /* Proc: RaiseError Raises a runtime error. */ - RaiseError(runtimeError/e) - e.stack=functions.Copy() - e.stack.Push(curFunction) - src.HandleError(e) +/n_Interpreter/proc/RaiseError(runtimeError/e) + e.stack=functions.Copy() + e.stack.Push(curFunction) + src.HandleError(e) - CreateScope(node/BlockDefinition/B) - var/scope/S = new(B, curScope) - scopes.Push(curScope) - curScope = S - return S +/n_Interpreter/proc/CreateScope(node/BlockDefinition/B) + var/scope/S = new(B, curScope) + scopes.Push(curScope) + curScope = S + return S - CreateGlobalScope() - scopes.Clear() - var/scope/S = new(program, null) - globalScope = S - return S +/n_Interpreter/proc/CreateGlobalScope() + scopes.Clear() + var/scope/S = new(program, null) + globalScope = S + return S /* - Proc: RunBlock - Runs each statement in a block of code. +Proc: RunBlock +Runs each statement in a block of code. */ - RunBlock(node/BlockDefinition/Block, scope/scope = null) - var/is_global = istype(Block, /node/BlockDefinition/GlobalBlock) - if(!is_global) - if(scope) - curScope = scope +/n_Interpreter/proc/RunBlock(node/BlockDefinition/Block, scope/scope = null) + var/is_global = istype(Block, /node/BlockDefinition/GlobalBlock) + if(!is_global) + if(scope) + curScope = scope + else + CreateScope(Block) + else + if(!persist) + CreateGlobalScope() + curScope = globalScope + + if(cur_statements < max_statements) + + for(var/node/statement/S in Block.statements) + while(paused) sleep(10) + + cur_statements++ + if(cur_statements >= max_statements) + RaiseError(new/runtimeError/MaxCPU()) + + if(container && !alertadmins) + if(istype(container, /datum/TCS_Compiler)) + var/datum/TCS_Compiler/Compiler = container + var/obj/machinery/telecomms/server/Holder = Compiler.Holder + var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])." + + alertadmins = 1 + message_admins(message, 1) + break + + if(istype(S, /node/statement/VariableAssignment)) + var/node/statement/VariableAssignment/stmt = S + var/name = stmt.var_name.id_name + if(!stmt.object) + // Below we assign the variable first to null if it doesn't already exist. + // This is necessary for assignments like +=, and when the variable is used in a function + // If the variable already exists in a different block, then AssignVariable will automatically use that one. + if(!IsVariableAccessible(name)) + AssignVariable(name, null) + AssignVariable(name, Eval(stmt.value)) else - CreateScope(Block) + var/datum/D = Eval(GetVariable(stmt.object.id_name)) + if(!D) return + D.vars[stmt.var_name.id_name] = Eval(stmt.value) + else if(istype(S, /node/statement/VariableDeclaration)) + //VariableDeclaration nodes are used to forcibly declare a local variable so that one in a higher scope isn't used by default. + var/node/statement/VariableDeclaration/dec=S + if(!dec.object) + AssignVariable(dec.var_name.id_name, null, curScope) + else + var/datum/D = Eval(GetVariable(dec.object.id_name)) + if(!D) return + D.vars[dec.var_name.id_name] = null + else if(istype(S, /node/statement/FunctionCall)) + RunFunction(S) + else if(istype(S, /node/statement/FunctionDefinition)) + //do nothing + else if(istype(S, /node/statement/WhileLoop)) + RunWhile(S) + else if(istype(S, /node/statement/IfStatement)) + RunIf(S) + else if(istype(S, /node/statement/ReturnStatement)) + if(!curFunction) + RaiseError(new/runtimeError/UnexpectedReturn()) + continue + status |= RETURNING + returnVal=Eval(S:value) + break + else if(istype(S, /node/statement/BreakStatement)) + status |= BREAKING + break + else if(istype(S, /node/statement/ContinueStatement)) + status |= CONTINUING + break else - if(!persist) - CreateGlobalScope() - curScope = globalScope + RaiseError(new/runtimeError/UnknownInstruction()) + if(status) + break - if(cur_statements < max_statements) - - for(var/node/statement/S in Block.statements) - while(paused) sleep(10) - - cur_statements++ - if(cur_statements >= max_statements) - RaiseError(new/runtimeError/MaxCPU()) - - if(container && !alertadmins) - if(istype(container, /datum/TCS_Compiler)) - var/datum/TCS_Compiler/Compiler = container - var/obj/machinery/telecomms/server/Holder = Compiler.Holder - var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])." - - alertadmins = 1 - message_admins(message, 1) - break - - if(istype(S, /node/statement/VariableAssignment)) - var/node/statement/VariableAssignment/stmt = S - var/name = stmt.var_name.id_name - if(!stmt.object) - // Below we assign the variable first to null if it doesn't already exist. - // This is necessary for assignments like +=, and when the variable is used in a function - // If the variable already exists in a different block, then AssignVariable will automatically use that one. - if(!IsVariableAccessible(name)) - AssignVariable(name, null) - AssignVariable(name, Eval(stmt.value)) - else - var/datum/D = Eval(GetVariable(stmt.object.id_name)) - if(!D) return - D.vars[stmt.var_name.id_name] = Eval(stmt.value) - else if(istype(S, /node/statement/VariableDeclaration)) - //VariableDeclaration nodes are used to forcibly declare a local variable so that one in a higher scope isn't used by default. - var/node/statement/VariableDeclaration/dec=S - if(!dec.object) - AssignVariable(dec.var_name.id_name, null, curScope) - else - var/datum/D = Eval(GetVariable(dec.object.id_name)) - if(!D) return - D.vars[dec.var_name.id_name] = null - else if(istype(S, /node/statement/FunctionCall)) - RunFunction(S) - else if(istype(S, /node/statement/FunctionDefinition)) - //do nothing - else if(istype(S, /node/statement/WhileLoop)) - RunWhile(S) - else if(istype(S, /node/statement/IfStatement)) - RunIf(S) - else if(istype(S, /node/statement/ReturnStatement)) - if(!curFunction) - RaiseError(new/runtimeError/UnexpectedReturn()) - continue - status |= RETURNING - returnVal=Eval(S:value) - break - else if(istype(S, /node/statement/BreakStatement)) - status |= BREAKING - break - else if(istype(S, /node/statement/ContinueStatement)) - status |= CONTINUING - break - else - RaiseError(new/runtimeError/UnknownInstruction()) - if(status) - break - - curScope = scopes.Pop() + curScope = scopes.Pop() /* - Proc: RunFunction - Runs a function block or a proc with the arguments specified in the script. +Proc: RunFunction +Runs a function block or a proc with the arguments specified in the script. */ - RunFunction(node/statement/FunctionCall/stmt) - //Note that anywhere /node/statement/FunctionCall/stmt is used so may /node/expression/FunctionCall +/n_Interpreter/proc/RunFunction(node/statement/FunctionCall/stmt) + //Note that anywhere /node/statement/FunctionCall/stmt is used so may /node/expression/FunctionCall - // If recursion gets too high (max 50 nested functions) throw an error - if(cur_recursion >= max_recursion) - RaiseError(new/runtimeError/RecursionLimitReached()) - return 0 + // If recursion gets too high (max 50 nested functions) throw an error + if(cur_recursion >= max_recursion) + RaiseError(new/runtimeError/RecursionLimitReached()) + return 0 - var/node/statement/FunctionDefinition/def - if(!stmt.object) //A scope's function is being called, stmt.object is null - def = GetFunction(stmt.func_name) - else if(istype(stmt.object)) //A method of an object exposed as a variable is being called, stmt.object is a /node/identifier - var/O = GetVariable(stmt.object.id_name) //Gets a reference to the object which is the target of the function call. - if(!O) return //Error already thrown in GetVariable() - def = Eval(O) + var/node/statement/FunctionDefinition/def + if(!stmt.object) //A scope's function is being called, stmt.object is null + def = GetFunction(stmt.func_name) + else if(istype(stmt.object)) //A method of an object exposed as a variable is being called, stmt.object is a /node/identifier + var/O = GetVariable(stmt.object.id_name) //Gets a reference to the object which is the target of the function call. + if(!O) return //Error already thrown in GetVariable() + def = Eval(O) - if(!def) return + if(!def) return - cur_recursion++ // add recursion - if(istype(def)) - if(curFunction) functions.Push(curFunction) - var/scope/S = CreateScope(def.block) - for(var/i=1 to def.parameters.len) - var/val - if(stmt.parameters.len>=i) - val = stmt.parameters[i] - //else - // unspecified param - AssignVariable(def.parameters[i], new/node/expression/value/literal(Eval(val)), S) - curFunction=stmt - RunBlock(def.block, S) - //Handle return value - . = returnVal - status &= ~RETURNING - returnVal=null - curFunction=functions.Pop() - cur_recursion-- - else - cur_recursion-- - var/list/params=new - for(var/node/expression/P in stmt.parameters) - params+=list(Eval(P)) - if(isobject(def)) //def is an object which is the target of a function call - if( !hascall(def, stmt.func_name) ) - RaiseError(new/runtimeError/UndefinedFunction("[stmt.object.id_name].[stmt.func_name]")) - return - return call(def, stmt.func_name)(arglist(params)) - else //def is a path to a global proc - return call(def)(arglist(params)) + cur_recursion++ // add recursion + if(istype(def)) + if(curFunction) functions.Push(curFunction) + var/scope/S = CreateScope(def.block) + for(var/i=1 to def.parameters.len) + var/val + if(stmt.parameters.len>=i) + val = stmt.parameters[i] //else - // RaiseError(new/runtimeError/UnknownInstruction()) + // unspecified param + AssignVariable(def.parameters[i], new/node/expression/value/literal(Eval(val)), S) + curFunction=stmt + RunBlock(def.block, S) + //Handle return value + . = returnVal + status &= ~RETURNING + returnVal=null + curFunction=functions.Pop() + cur_recursion-- + else + cur_recursion-- + var/list/params=new + for(var/node/expression/P in stmt.parameters) + params+=list(Eval(P)) + if(isobject(def)) //def is an object which is the target of a function call + if( !hascall(def, stmt.func_name) ) + RaiseError(new/runtimeError/UndefinedFunction("[stmt.object.id_name].[stmt.func_name]")) + return + return call(def, stmt.func_name)(arglist(params)) + else //def is a path to a global proc + return call(def)(arglist(params)) + //else + // RaiseError(new/runtimeError/UnknownInstruction()) /* - Proc: RunIf - Checks a condition and runs either the if block or else block. +Proc: RunIf +Checks a condition and runs either the if block or else block. */ - RunIf(node/statement/IfStatement/stmt) - if(Eval(stmt.cond)) - RunBlock(stmt.block) - else if(stmt.else_block) - RunBlock(stmt.else_block) +/n_Interpreter/proc/RunIf(node/statement/IfStatement/stmt) + if(Eval(stmt.cond)) + RunBlock(stmt.block) + else if(stmt.else_block) + RunBlock(stmt.else_block) /* - Proc: RunWhile - Runs a while loop. +Proc: RunWhile +Runs a while loop. */ - RunWhile(node/statement/WhileLoop/stmt) - var/i=1 - while(Eval(stmt.cond) && Iterate(stmt.block, i++)) - continue - status &= ~BREAKING +/n_Interpreter/proc/RunWhile(node/statement/WhileLoop/stmt) + var/i=1 + while(Eval(stmt.cond) && Iterate(stmt.block, i++)) + continue + status &= ~BREAKING /* - Proc:Iterate - Runs a single iteration of a loop. Returns a value indicating whether or not to continue looping. +Proc:Iterate +Runs a single iteration of a loop. Returns a value indicating whether or not to continue looping. */ - Iterate(node/BlockDefinition/block, count) - RunBlock(block) - if(max_iterations > 0 && count >= max_iterations) - RaiseError(new/runtimeError/IterationLimitReached()) - return 0 - if(status & (BREAKING|RETURNING)) - return 0 - status &= ~CONTINUING - return 1 +/n_Interpreter/proc/Iterate(node/BlockDefinition/block, count) + RunBlock(block) + if(max_iterations > 0 && count >= max_iterations) + RaiseError(new/runtimeError/IterationLimitReached()) + return 0 + if(status & (BREAKING|RETURNING)) + return 0 + status &= ~CONTINUING + return 1 /* - Proc: GetFunction - Finds a function in an accessible scope with the given name. Returns a . +Proc: GetFunction +Finds a function in an accessible scope with the given name. Returns a . */ - GetFunction(name) - var/scope/S = curScope - while(S) - if(S.functions.Find(name)) - return S.functions[name] - S = S.parent - RaiseError(new/runtimeError/UndefinedFunction(name)) +/n_Interpreter/proc/GetFunction(name) + var/scope/S = curScope + while(S) + if(S.functions.Find(name)) + return S.functions[name] + S = S.parent + RaiseError(new/runtimeError/UndefinedFunction(name)) /* - Proc: GetVariable - Finds a variable in an accessible scope and returns its value. +Proc: GetVariable +Finds a variable in an accessible scope and returns its value. */ - GetVariable(name) - var/scope/S = curScope - while(S) - if(S.variables.Find(name)) - return S.variables[name] - S = S.parent - RaiseError(new/runtimeError/UndefinedVariable(name)) +/n_Interpreter/proc/GetVariable(name) + var/scope/S = curScope + while(S) + if(S.variables.Find(name)) + return S.variables[name] + S = S.parent + RaiseError(new/runtimeError/UndefinedVariable(name)) - GetVariableScope(name) //needed for when you reassign a variable in a higher scope - var/scope/S = curScope - while(S) - if(S.variables.Find(name)) - return S - S = S.parent +/n_Interpreter/proc/GetVariableScope(name) //needed for when you reassign a variable in a higher scope + var/scope/S = curScope + while(S) + if(S.variables.Find(name)) + return S + S = S.parent - IsVariableAccessible(name) - var/scope/S = curScope - while(S) - if(S.variables.Find(name)) - return TRUE - S = S.parent - return FALSE +/n_Interpreter/proc/IsVariableAccessible(name) + var/scope/S = curScope + while(S) + if(S.variables.Find(name)) + return TRUE + S = S.parent + return FALSE /* - Proc: AssignVariable - Assigns a value to a variable in a specific block. +Proc: AssignVariable +Assigns a value to a variable in a specific block. - Parameters: - name - The name of the variable to assign. - value - The value to assign to it. - S - The scope the variable resides in. If it is null, a scope with the variable already existing is found. If no scopes have a variable of the given name, the current scope is used. +Parameters: +name - The name of the variable to assign. +value - The value to assign to it. +S - The scope the variable resides in. If it is null, a scope with the variable already existing is found. If no scopes have a variable of the given name, the current scope is used. */ - AssignVariable(name, node/expression/value, scope/S=null) - if(!S) S = GetVariableScope(name) - if(!S) S = curScope - if(!S) S = globalScope - ASSERT(istype(S)) - if(istext(value) || isnum(value) || isnull(value)) value = new/node/expression/value/literal(value) - else if(!istype(value) && isobject(value)) value = new/node/expression/value/reference(value) - //TODO: check for invalid name - S.variables["[name]"] = value +/n_Interpreter/proc/AssignVariable(name, node/expression/value, scope/S=null) + if(!S) S = GetVariableScope(name) + if(!S) S = curScope + if(!S) S = globalScope + ASSERT(istype(S)) + if(istext(value) || isnum(value) || isnull(value)) value = new/node/expression/value/literal(value) + else if(!istype(value) && isobject(value)) value = new/node/expression/value/reference(value) + //TODO: check for invalid name + S.variables["[name]"] = value diff --git a/code/modules/scripting/Interpreter/Scope.dm b/code/modules/scripting/Interpreter/Scope.dm index 50da804707..d768e74bf1 100644 --- a/code/modules/scripting/Interpreter/Scope.dm +++ b/code/modules/scripting/Interpreter/Scope.dm @@ -2,17 +2,15 @@ Class: scope A runtime instance of a block. Used internally by the interpreter. */ -scope - var - scope/parent = null - node/BlockDefinition/block - list - functions - variables +/scope/ + var/scope/parent = null + var/node/BlockDefinition/block + var/list/functions + var/list/variables - New(node/BlockDefinition/B, scope/parent) - src.block = B - src.parent = parent - src.variables = B.initial_variables.Copy() - src.functions = B.functions.Copy() - .=..() \ No newline at end of file +/scope/New(node/BlockDefinition/B, scope/parent) + src.block = B + src.parent = parent + src.variables = B.initial_variables.Copy() + src.functions = B.functions.Copy() + .=..() \ No newline at end of file diff --git a/code/modules/scripting/Options.dm b/code/modules/scripting/Options.dm index c8ca1d5830..b113b857be 100644 --- a/code/modules/scripting/Options.dm +++ b/code/modules/scripting/Options.dm @@ -14,69 +14,87 @@ var/const //Ascii values of characters /* Class: n_scriptOptions */ -n_scriptOptions - proc - CanStartID(char) //returns true if the character can start a variable, function, or keyword name (by default letters or an underscore) - if(!isnum(char))char=text2ascii(char) - return (char in ascii_A to ascii_Z) || (char in ascii_a to ascii_z) || char==ascii_UNDERSCORE || char==ascii_DOLLAR +/n_scriptOptions/proc/CanStartID(char) //returns true if the character can start a variable, function, or keyword name (by default letters or an underscore) + if(!isnum(char))char=text2ascii(char) + return (char in ascii_A to ascii_Z) || (char in ascii_a to ascii_z) || char==ascii_UNDERSCORE || char==ascii_DOLLAR - IsValidIDChar(char) //returns true if the character can be in the body of a variable, function, or keyword name (by default letters, numbers, and underscore) - if(!isnum(char))char=text2ascii(char) - return CanStartID(char) || IsDigit(char) +/n_scriptOptions/proc/IsValidIDChar(char) //returns true if the character can be in the body of a variable, function, or keyword name (by default letters, numbers, and underscore) + if(!isnum(char))char=text2ascii(char) + return CanStartID(char) || IsDigit(char) - IsDigit(char) - if(!isnum(char))char=text2ascii(char) - return char in ascii_ZERO to ascii_NINE +/n_scriptOptions/proc/IsDigit(char) + if(!isnum(char))char=text2ascii(char) + return char in ascii_ZERO to ascii_NINE - IsValidID(id) //returns true if all the characters in the string are okay to be in an identifier name - if(!CanStartID(id)) //don't need to grab first char in id, since text2ascii does it automatically - return 0 - if(length(id)==1) return 1 - for(var/i=2 to length(id)) - if(!IsValidIDChar(copytext(id, i, i+1))) - return 0 - return 1 +/n_scriptOptions/proc/IsValidID(id) //returns true if all the characters in the string are okay to be in an identifier name + if(!CanStartID(id)) //don't need to grab first char in id, since text2ascii does it automatically + return 0 + if(length(id)==1) return 1 + for(var/i=2 to length(id)) + if(!IsValidIDChar(copytext(id, i, i+1))) + return 0 + return 1 /* Class: nS_Options An implementation of for the n_Script language. */ - nS_Options - var - list - symbols = list("(", ")", "\[", "]", ";", ",", "{", "}") //scanner - Characters that can be in symbols +/n_scriptOptions/nS_Options + var/list/symbols = list("(", ")", "\[", "]", ";", ",", "{", "}") //scanner - Characters that can be in symbols /* - Var: keywords - An associative list used by the parser to parse keywords. Indices are strings which will trigger the keyword when parsed and the - associated values are types of which the proc will be called. +Var: keywords +An associative list used by the parser to parse keywords. Indices are strings which will trigger the keyword when parsed and the +associated values are types of which the proc will be called. */ - keywords = list("if" = /n_Keyword/nS_Keyword/kwIf, "else" = /n_Keyword/nS_Keyword/kwElse, \ - "while" = /n_Keyword/nS_Keyword/kwWhile, "break" = /n_Keyword/nS_Keyword/kwBreak, \ - "continue" = /n_Keyword/nS_Keyword/kwContinue, \ - "return" = /n_Keyword/nS_Keyword/kwReturn, "def" = /n_Keyword/nS_Keyword/kwDef) + var/list/keywords = list( + "if" = /n_Keyword/nS_Keyword/kwIf, + "else" = /n_Keyword/nS_Keyword/kwElse, + "while" = /n_Keyword/nS_Keyword/kwWhile, + "break" = /n_Keyword/nS_Keyword/kwBreak, + "continue" = /n_Keyword/nS_Keyword/kwContinue, + "return" = /n_Keyword/nS_Keyword/kwReturn, + "def" = /n_Keyword/nS_Keyword/kwDef + ) - list - assign_operators=list("=" = null, "&=" = "&", - "|=" = "|", "`=" = "`", - "+=" = "+", "-=" = "-", - "*=" = "*", "/=" = "/", - "^=" = "^", - "%=" = "%") + var/list/assign_operators = list( + "=" = null, + "&=" = "&", + "|=" = "|", + "`=" = "`", + "+=" = "+", + "-=" = "-", + "*=" = "*", + "/=" = "/", + "^=" = "^", + "%=" = "%" + ) - unary_operators =list("!" = /node/expression/operator/unary/LogicalNot, "~" = /node/expression/operator/unary/BitwiseNot, - "-" = /node/expression/operator/unary/Minus) + var/list/unary_operators =list( + "!" = /node/expression/operator/unary/LogicalNot, + "~" = /node/expression/operator/unary/BitwiseNot, + "-" = /node/expression/operator/unary/Minus + ) - binary_operators=list("==" = /node/expression/operator/binary/Equal, "!=" = /node/expression/operator/binary/NotEqual, - ">" = /node/expression/operator/binary/Greater, "<" = /node/expression/operator/binary/Less, - ">=" = /node/expression/operator/binary/GreaterOrEqual,"<=" = /node/expression/operator/binary/LessOrEqual, - "&&" = /node/expression/operator/binary/LogicalAnd, "||" = /node/expression/operator/binary/LogicalOr, - "&" = /node/expression/operator/binary/BitwiseAnd, "|" = /node/expression/operator/binary/BitwiseOr, - "`" = /node/expression/operator/binary/BitwiseXor, "+" = /node/expression/operator/binary/Add, - "-" = /node/expression/operator/binary/Subtract, "*" = /node/expression/operator/binary/Multiply, - "/" = /node/expression/operator/binary/Divide, "^" = /node/expression/operator/binary/Power, - "%" = /node/expression/operator/binary/Modulo) + var/list/binary_operators=list( + "==" = /node/expression/operator/binary/Equal, + "!=" = /node/expression/operator/binary/NotEqual, + ">" = /node/expression/operator/binary/Greater, + "<" = /node/expression/operator/binary/Less, + ">=" = /node/expression/operator/binary/GreaterOrEqual, + "<=" = /node/expression/operator/binary/LessOrEqual, + "&&" = /node/expression/operator/binary/LogicalAnd, + "||" = /node/expression/operator/binary/LogicalOr, + "&" = /node/expression/operator/binary/BitwiseAnd, + "|" = /node/expression/operator/binary/BitwiseOr, + "`" = /node/expression/operator/binary/BitwiseXor, + "+" = /node/expression/operator/binary/Add, + "-" = /node/expression/operator/binary/Subtract, + "*" = /node/expression/operator/binary/Multiply, + "/" = /node/expression/operator/binary/Divide, + "^" = /node/expression/operator/binary/Power, + "%" = /node/expression/operator/binary/Modulo) - New() - .=..() - for(var/O in assign_operators+binary_operators+unary_operators) - if(!symbols.Find(O)) symbols+=O \ No newline at end of file +/n_scriptOptions/nS_Options/New() + .=..() + for(var/O in assign_operators+binary_operators+unary_operators) + if(!symbols.Find(O)) symbols+=O \ No newline at end of file diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm index 14fa1b297c..eddfdbf679 100644 --- a/code/modules/scripting/Parser/Expressions.dm +++ b/code/modules/scripting/Parser/Expressions.dm @@ -19,294 +19,292 @@ Class: nS_Parser */ /n_Parser/nS_Parser - var /* Var: expecting A variable which keeps track of whether an operator or value is expected. It should be either or . See for more information. */ - expecting=VALUE + var/expecting=VALUE - proc /* Proc: Precedence Compares two operators, decides which is higher in the order of operations, and returns or . */ - Precedence(node/expression/operator/top, node/expression/operator/input) - if(istype(top)) - top=top.precedence - if(istype(input)) - input=input:precedence - if(top>=input) - return REDUCE - return SHIFT +/n_Parser/nS_Parser/proc/Precedence(node/expression/operator/top, node/expression/operator/input) + if(istype(top)) + top=top.precedence + if(istype(input)) + input=input:precedence + if(top>=input) + return REDUCE + return SHIFT /* - Proc: GetExpression - Takes a token expected to represent a value and returns an node. +Proc: GetExpression +Takes a token expected to represent a value and returns an node. */ - GetExpression(token/T) - if(!T) return - if(istype(T, /node/expression)) - return T - switch(T.type) - if(/token/word) - return new/node/expression/value/variable(T.value) - if(/token/accessor) - var/token/accessor/A=T - var/node/expression/value/variable/E//=new(A.member) - var/stack/S=new() - while(istype(A.object, /token/accessor)) - S.Push(A) - A=A.object - ASSERT(istext(A.object)) +/n_Parser/nS_Parser/proc/GetExpression(token/T) + if(!T) return + if(istype(T, /node/expression)) + return T + switch(T.type) + if(/token/word) + return new/node/expression/value/variable(T.value) + if(/token/accessor) + var/token/accessor/A=T + var/node/expression/value/variable/E//=new(A.member) + var/stack/S=new() + while(istype(A.object, /token/accessor)) + S.Push(A) + A=A.object + ASSERT(istext(A.object)) - while(A) - var/node/expression/value/variable/V=new() - V.id=new(A.member) - if(E) - V.object=E - else - V.object=new/node/identifier(A.object) - E=V - A=S.Pop() - return E + while(A) + var/node/expression/value/variable/V=new() + V.id=new(A.member) + if(E) + V.object=E + else + V.object=new/node/identifier(A.object) + E=V + A=S.Pop() + return E - if(/token/number, /token/string) - return new/node/expression/value/literal(T.value) + if(/token/number, /token/string) + return new/node/expression/value/literal(T.value) /* - Proc: GetOperator - Gets a path related to a token or string and returns an instance of the given type. This is used to get an instance of either a binary or unary - operator from a token. +Proc: GetOperator +Gets a path related to a token or string and returns an instance of the given type. This is used to get an instance of either a binary or unary +operator from a token. - Parameters: - O - The input value. If this is a token, O is reset to the token's value. - When O is a string and is in L, its associated value is used as the path to instantiate. - type - The desired type of the returned object. - L - The list in which to search for O. +Parameters: +O - The input value. If this is a token, O is reset to the token's value. + When O is a string and is in L, its associated value is used as the path to instantiate. +type - The desired type of the returned object. +L - The list in which to search for O. - See Also: - - - - +See Also: +- +- */ - GetOperator(O, type=/node/expression/operator, L[]) - if(istype(O, type)) return O //O is already the desired type - if(istype(O, /token)) O=O:value //sets O to text - if(istext(O)) //sets O to path - if(L.Find(O)) O=L[O] - else return null - if(ispath(O))O=new O //catches path from last check - else return null //Unknown type - return O +/n_Parser/nS_Parser/proc/GetOperator(O, type=/node/expression/operator, L[]) + if(istype(O, type)) return O //O is already the desired type + if(istype(O, /token)) O=O:value //sets O to text + if(istext(O)) //sets O to path + if(L.Find(O)) O=L[O] + else return null + if(ispath(O))O=new O //catches path from last check + else return null //Unknown type + return O /* - Proc: GetBinaryOperator - Uses to search for an instance of a binary operator type with which the given string is associated. For example, if - O is set to "+", an node is returned. +Proc: GetBinaryOperator +Uses to search for an instance of a binary operator type with which the given string is associated. For example, if +O is set to "+", an node is returned. - See Also: - - - - +See Also: +- +- */ - GetBinaryOperator(O) - return GetOperator(O, /node/expression/operator/binary, options.binary_operators) +/n_Parser/nS_Parser/proc/GetBinaryOperator(O) + return GetOperator(O, /node/expression/operator/binary, options.binary_operators) /* - Proc: GetUnaryOperator - Uses to search for an instance of a unary operator type with which the given string is associated. For example, if - O is set to "!", a node is returned. +Proc: GetUnaryOperator +Uses to search for an instance of a unary operator type with which the given string is associated. For example, if +O is set to "!", a node is returned. - See Also: - - - - +See Also: +- +- */ - GetUnaryOperator(O) - return GetOperator(O, /node/expression/operator/unary, options.unary_operators) +/n_Parser/nS_Parser/proc/GetUnaryOperator(O) + return GetOperator(O, /node/expression/operator/unary, options.unary_operators) /* - Proc: Reduce - Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top - of the val stack. +Proc: Reduce +Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top +of the val stack. */ - Reduce(stack/opr, stack/val) - var/node/expression/operator/O=opr.Pop() - if(!O) return - if(!istype(O)) - errors+=new/scriptError("Error reducing expression - invalid operator.") - return - //Take O and assign its operands, popping one or two values from the val stack - //depending on whether O is a binary or unary operator. - if(istype(O, /node/expression/operator/binary)) - var/node/expression/operator/binary/B=O - B.exp2=val.Pop() - B.exp =val.Pop() - val.Push(B) - else - O.exp=val.Pop() - val.Push(O) +/n_Parser/nS_Parser/proc/Reduce(stack/opr, stack/val) + var/node/expression/operator/O=opr.Pop() + if(!O) return + if(!istype(O)) + errors+=new/scriptError("Error reducing expression - invalid operator.") + return + //Take O and assign its operands, popping one or two values from the val stack + //depending on whether O is a binary or unary operator. + if(istype(O, /node/expression/operator/binary)) + var/node/expression/operator/binary/B=O + B.exp2=val.Pop() + B.exp =val.Pop() + val.Push(B) + else + O.exp=val.Pop() + val.Push(O) /* - Proc: EndOfExpression - Returns true if the current token represents the end of an expression. +Proc: EndOfExpression +Returns true if the current token represents the end of an expression. - Parameters: - end - A list of values to compare the current token to. +Parameters: +end - A list of values to compare the current token to. */ - EndOfExpression(end[]) - if(!curToken) - return 1 - if(istype(curToken, /token/symbol) && end.Find(curToken.value)) - return 1 - if(istype(curToken, /token/end) && end.Find(/token/end)) - return 1 - return 0 +/n_Parser/nS_Parser/proc/EndOfExpression(end[]) + if(!curToken) + return 1 + if(istype(curToken, /token/symbol) && end.Find(curToken.value)) + return 1 + if(istype(curToken, /token/end) && end.Find(/token/end)) + return 1 + return 0 /* - Proc: ParseExpression - Uses the Shunting-yard algorithm to parse expressions. +Proc: ParseExpression +Uses the Shunting-yard algorithm to parse expressions. - Notes: - - When an opening parenthesis is found, then is called to handle it. - - The variable helps distinguish unary operators from binary operators (for cases like the - operator, which can be either). +Notes: +- When an opening parenthesis is found, then is called to handle it. +- The variable helps distinguish unary operators from binary operators (for cases like the - operator, which can be either). - Articles: - - - - +Articles: +- +- - See Also: - - - - - - +See Also: +- +- +- */ - ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}")) - var/stack/opr=new - var/stack/val=new - src.expecting=VALUE - while(TRUE) - if(EndOfExpression(end)) - break - if(istype(curToken, /token/symbol) && ErrChars.Find(curToken.value)) - errors+=new/scriptError/BadToken(curToken) - break +/n_Parser/nS_Parser/proc/ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}")) + var/stack/opr=new + var/stack/val=new + src.expecting=VALUE + while(TRUE) + if(EndOfExpression(end)) + break + if(istype(curToken, /token/symbol) && ErrChars.Find(curToken.value)) + errors+=new/scriptError/BadToken(curToken) + break - if(index>tokens.len) //End of File - errors+=new/scriptError/EndOfFile() - break - var/token/ntok - if(index+1<=tokens.len) - ntok=tokens[index+1] + if(index>tokens.len) //End of File + errors+=new/scriptError/EndOfFile() + break + var/token/ntok + if(index+1<=tokens.len) + ntok=tokens[index+1] - if(istype(curToken, /token/symbol) && curToken.value=="(") //Parse parentheses expression - if(expecting!=VALUE) - errors+=new/scriptError/ExpectedToken("operator", curToken) - NextToken() - continue - val.Push(ParseParenExpression()) - else if(istype(curToken, /token/symbol)) //Operator found. - var/node/expression/operator/curOperator //Figure out whether it is unary or binary and get a new instance. - if(src.expecting==OPERATOR) - curOperator=GetBinaryOperator(curToken) - if(!curOperator) - errors+=new/scriptError/ExpectedToken("operator", curToken) - NextToken() - continue - else - curOperator=GetUnaryOperator(curToken) - if(!curOperator) //given symbol isn't a unary operator - errors+=new/scriptError/ExpectedToken("expression", curToken) - NextToken() - continue - - if(opr.Top() && Precedence(opr.Top(), curOperator)==REDUCE) //Check order of operations and reduce if necessary - Reduce(opr, val) - continue - opr.Push(curOperator) - src.expecting=VALUE - else if(ntok && ntok.value=="(" && istype(ntok, /token/symbol)\ - && istype(curToken, /token/word)) //Parse function call - var/token/preToken=curToken - var/old_expect=src.expecting - var/fex=ParseFunctionExpression() - if(old_expect!=VALUE) - errors+=new/scriptError/ExpectedToken("operator", preToken) - NextToken() - continue - val.Push(fex) - else if(istype(curToken, /token/keyword)) //inline keywords - var/n_Keyword/kw=options.keywords[curToken.value] - kw=new kw(inline=1) - if(kw) - if(!kw.Parse(src)) - return - else - errors+=new/scriptError/BadToken(curToken) - else if(istype(curToken, /token/end)) //semicolon found where it wasn't expected - errors+=new/scriptError/BadToken(curToken) + if(istype(curToken, /token/symbol) && curToken.value=="(") //Parse parentheses expression + if(expecting!=VALUE) + errors+=new/scriptError/ExpectedToken("operator", curToken) + NextToken() + continue + val.Push(ParseParenExpression()) + else if(istype(curToken, /token/symbol)) //Operator found. + var/node/expression/operator/curOperator //Figure out whether it is unary or binary and get a new instance. + if(src.expecting==OPERATOR) + curOperator=GetBinaryOperator(curToken) + if(!curOperator) + errors+=new/scriptError/ExpectedToken("operator", curToken) NextToken() continue - else - if(expecting!=VALUE) - errors+=new/scriptError/ExpectedToken("operator", curToken) - NextToken() - continue - val.Push(GetExpression(curToken)) - src.expecting=OPERATOR + else + curOperator=GetUnaryOperator(curToken) + if(!curOperator) //given symbol isn't a unary operator + errors+=new/scriptError/ExpectedToken("expression", curToken) + NextToken() + continue + + if(opr.Top() && Precedence(opr.Top(), curOperator)==REDUCE) //Check order of operations and reduce if necessary + Reduce(opr, val) + continue + opr.Push(curOperator) + src.expecting=VALUE + else if(ntok && ntok.value=="(" && istype(ntok, /token/symbol)\ + && istype(curToken, /token/word)) //Parse function call + var/token/preToken=curToken + var/old_expect=src.expecting + var/fex=ParseFunctionExpression() + if(old_expect!=VALUE) + errors+=new/scriptError/ExpectedToken("operator", preToken) NextToken() + continue + val.Push(fex) + else if(istype(curToken, /token/keyword)) //inline keywords + var/n_Keyword/kw=options.keywords[curToken.value] + kw=new kw(inline=1) + if(kw) + if(!kw.Parse(src)) + return + else + errors+=new/scriptError/BadToken(curToken) + else if(istype(curToken, /token/end)) //semicolon found where it wasn't expected + errors+=new/scriptError/BadToken(curToken) + NextToken() + continue + else + if(expecting!=VALUE) + errors+=new/scriptError/ExpectedToken("operator", curToken) + NextToken() + continue + val.Push(GetExpression(curToken)) + src.expecting=OPERATOR + NextToken() - while(opr.Top()) Reduce(opr, val) //Reduce the value stack completely - .=val.Pop() //Return what should be the last value on the stack - if(val.Top()) // - var/node/N=val.Pop() - errors+=new/scriptError("Error parsing expression. Unexpected value left on stack: [N.ToString()].") - return null + while(opr.Top()) Reduce(opr, val) //Reduce the value stack completely + .=val.Pop() //Return what should be the last value on the stack + if(val.Top()) // + var/node/N=val.Pop() + errors+=new/scriptError("Error parsing expression. Unexpected value left on stack: [N.ToString()].") + return null /* - Proc: ParseFunctionExpression - Parses a function call inside of an expression. +Proc: ParseFunctionExpression +Parses a function call inside of an expression. - See Also: - - +See Also: +- */ - ParseFunctionExpression() - var/node/expression/FunctionCall/exp=new - exp.func_name=curToken.value - NextToken() //skip function name - NextToken() //skip open parenthesis, already found - var/loops = 0 +/n_Parser/nS_Parser/proc/ParseFunctionExpression() + var/node/expression/FunctionCall/exp=new + exp.func_name=curToken.value + NextToken() //skip function name + NextToken() //skip open parenthesis, already found + var/loops = 0 - while(TRUE) - loops++ - if(loops>=1000) - CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;") + while(TRUE) + loops++ + if(loops>=1000) + CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;") - if(istype(curToken, /token/symbol) && curToken.value==")") - return exp - exp.parameters+=ParseParamExpression() - if(curToken.value==","&&istype(curToken, /token/symbol))NextToken() //skip comma - if(istype(curToken, /token/end)) //Prevents infinite loop... - errors+=new/scriptError/ExpectedToken(")") - return exp + if(istype(curToken, /token/symbol) && curToken.value==")") + return exp + exp.parameters+=ParseParamExpression() + if(curToken.value==","&&istype(curToken, /token/symbol))NextToken() //skip comma + if(istype(curToken, /token/end)) //Prevents infinite loop... + errors+=new/scriptError/ExpectedToken(")") + return exp /* - Proc: ParseParenExpression - Parses an expression that ends with a close parenthesis. This is used for parsing expressions inside of parentheses. +Proc: ParseParenExpression +Parses an expression that ends with a close parenthesis. This is used for parsing expressions inside of parentheses. - See Also: - - +See Also: +- */ - ParseParenExpression() - if(!CheckToken("(", /token/symbol)) - return - return new/node/expression/operator/unary/group(ParseExpression(list(")"))) +/n_Parser/nS_Parser/proc/ParseParenExpression() + if(!CheckToken("(", /token/symbol)) + return + return new/node/expression/operator/unary/group(ParseExpression(list(")"))) /* - Proc: ParseParamExpression - Parses an expression that ends with either a comma or close parenthesis. This is used for parsing the parameters passed to a function call. +Proc: ParseParamExpression +Parses an expression that ends with either a comma or close parenthesis. This is used for parsing the parameters passed to a function call. - See Also: - - +See Also: +- */ - ParseParamExpression() - return ParseExpression(list(",", ")")) \ No newline at end of file +/n_Parser/nS_Parser/proc/ParseParamExpression() + return ParseExpression(list(",", ")")) \ No newline at end of file diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm index 94e6f41afe..cc68164877 100644 --- a/code/modules/scripting/Parser/Keywords.dm +++ b/code/modules/scripting/Parser/Keywords.dm @@ -12,16 +12,16 @@ var/const/KW_WARN = 3 //Warning var/const/Class: n_Keyword var/const/Represents a special statement in the code triggered by a keyword. */ -/n_Keyword - New(inline=0) - src.inline=inline - return ..() /* Var: inline 1 if the keyword is in an expression (e.g. the new keyword in many languages), 0 otherwise (such as the if and else keywords). */ +/n_Keyword var/inline +/n_Keyword/New(inline=FALSE) + src.inline=inline + return ..() /* Proc: Parse @@ -31,7 +31,7 @@ var/const/Represents a special statement in the code triggered by a keyword. parser - The parser that created this object. You can use the parameter to manipulate the parser in order to add statements and blocks to its AST. */ - proc/Parse(n_Parser/parser) +/n_Keyword/proc/Parse(n_Parser/parser) /* Class: nS_Keyword @@ -43,124 +43,116 @@ var/const/Represents a special statement in the code triggered by a keyword. proc. */ // - nS_Keyword - New(inline=0) - if(inline) - qdel(src) +/n_Keyword/nS_Keyword/New(inline=0) + if(inline) + qdel(src) - kwReturn - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) - parser.errors+=new/scriptError/BadReturn(parser.curToken) - . = KW_WARN - var/node/statement/ReturnStatement/stmt=new - parser.NextToken() //skip 'return' token - stmt.value=parser.ParseExpression() - parser.curBlock.statements+=stmt +/n_Keyword/nS_Keyword/kwReturn/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) + parser.errors+=new/scriptError/BadReturn(parser.curToken) + . = KW_WARN + var/node/statement/ReturnStatement/stmt=new + parser.NextToken() //skip 'return' token + stmt.value=parser.ParseExpression() + parser.curBlock.statements+=stmt - kwIf - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - var/node/statement/IfStatement/stmt=new - parser.NextToken() //skip 'if' token - stmt.cond=parser.ParseParenExpression() - if(!parser.CheckToken(")", /token/symbol)) - return KW_FAIL - if(!parser.CheckToken("{", /token/symbol, skip=0)) //Token needs to be preserved for parse loop, so skip=0 - return KW_ERR - parser.curBlock.statements+=stmt - stmt.block=new - parser.AddBlock(stmt.block) +/n_Keyword/nS_Keyword/kwIf/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/node/statement/IfStatement/stmt=new + parser.NextToken() //skip 'if' token + stmt.cond=parser.ParseParenExpression() + if(!parser.CheckToken(")", /token/symbol)) + return KW_FAIL + if(!parser.CheckToken("{", /token/symbol, skip=0)) //Token needs to be preserved for parse loop, so skip=0 + return KW_ERR + parser.curBlock.statements+=stmt + stmt.block=new + parser.AddBlock(stmt.block) - kwElse - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - var/list/L=parser.curBlock.statements - var/node/statement/IfStatement/stmt - if(L&&L.len) stmt=L[L.len] //Get the last statement in the current block - if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement - parser.errors+=new/scriptError/ExpectedToken("if statement",parser.curToken) - return KW_FAIL - parser.NextToken() //skip 'else' token - if(!parser.CheckToken("{", /token/symbol, skip=0)) - return KW_ERR - stmt.else_block=new() - parser.AddBlock(stmt.else_block) +/n_Keyword/nS_Keyword/kwElse/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/list/L=parser.curBlock.statements + var/node/statement/IfStatement/stmt + if(L&&L.len) stmt=L[L.len] //Get the last statement in the current block + if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement + parser.errors+=new/scriptError/ExpectedToken("if statement",parser.curToken) + return KW_FAIL + parser.NextToken() //skip 'else' token + if(!parser.CheckToken("{", /token/symbol, skip=0)) + return KW_ERR + stmt.else_block=new() + parser.AddBlock(stmt.else_block) - kwWhile - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - var/node/statement/WhileLoop/stmt=new - parser.NextToken() //skip 'while' token - stmt.cond=parser.ParseParenExpression() - if(!parser.CheckToken(")", /token/symbol)) - return KW_FAIL - if(!parser.CheckToken("{", /token/symbol, skip=0)) - return KW_ERR - parser.curBlock.statements+=stmt - stmt.block=new - parser.AddBlock(stmt.block) +/n_Keyword/nS_Keyword/kwWhile/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/node/statement/WhileLoop/stmt=new + parser.NextToken() //skip 'while' token + stmt.cond=parser.ParseParenExpression() + if(!parser.CheckToken(")", /token/symbol)) + return KW_FAIL + if(!parser.CheckToken("{", /token/symbol, skip=0)) + return KW_ERR + parser.curBlock.statements+=stmt + stmt.block=new + parser.AddBlock(stmt.block) - kwBreak - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) - parser.errors+=new/scriptError/BadToken(parser.curToken) - . = KW_WARN - var/node/statement/BreakStatement/stmt=new - parser.NextToken() //skip 'break' token - parser.curBlock.statements+=stmt +/n_Keyword/nS_Keyword/kwBreak/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) + parser.errors+=new/scriptError/BadToken(parser.curToken) + . = KW_WARN + var/node/statement/BreakStatement/stmt=new + parser.NextToken() //skip 'break' token + parser.curBlock.statements+=stmt - kwContinue - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) - parser.errors+=new/scriptError/BadToken(parser.curToken) - . = KW_WARN - var/node/statement/ContinueStatement/stmt=new - parser.NextToken() //skip 'break' token - parser.curBlock.statements+=stmt +/n_Keyword/nS_Keyword/kwContinue/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) + parser.errors+=new/scriptError/BadToken(parser.curToken) + . = KW_WARN + var/node/statement/ContinueStatement/stmt=new + parser.NextToken() //skip 'break' token + parser.curBlock.statements+=stmt - kwDef - Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - var/node/statement/FunctionDefinition/def=new - parser.NextToken() //skip 'def' token - if(!parser.options.IsValidID(parser.curToken.value)) - parser.errors+=new/scriptError/InvalidID(parser.curToken) - return KW_FAIL - def.func_name=parser.curToken.value - parser.NextToken() - if(!parser.CheckToken("(", /token/symbol)) - return KW_FAIL - while(TRUE) //for now parameters can be separated by whitespace - they don't need a comma in between - if(istype(parser.curToken, /token/symbol)) - switch(parser.curToken.value) - if(",") - parser.NextToken() - if(")") - break - else - parser.errors+=new/scriptError/BadToken(parser.curToken) - return KW_ERR - - else if(istype(parser.curToken, /token/word)) - def.parameters+=parser.curToken.value - parser.NextToken() - else - parser.errors+=new/scriptError/InvalidID(parser.curToken) - return KW_ERR - if(!parser.CheckToken(")", /token/symbol)) - return KW_FAIL - - if(istype(parser.curToken, /token/end)) //Function prototype - parser.curBlock.statements+=def - else if(parser.curToken.value=="{" && istype(parser.curToken, /token/symbol)) - def.block = new - parser.curBlock.statements+=def - parser.curBlock.functions[def.func_name]=def - parser.AddBlock(def.block) +/n_Keyword/nS_Keyword/kwDef/Parse(n_Parser/nS_Parser/parser) + .=KW_PASS + var/node/statement/FunctionDefinition/def=new + parser.NextToken() //skip 'def' token + if(!parser.options.IsValidID(parser.curToken.value)) + parser.errors+=new/scriptError/InvalidID(parser.curToken) + return KW_FAIL + def.func_name=parser.curToken.value + parser.NextToken() + if(!parser.CheckToken("(", /token/symbol)) + return KW_FAIL + while(TRUE) //for now parameters can be separated by whitespace - they don't need a comma in between + if(istype(parser.curToken, /token/symbol)) + switch(parser.curToken.value) + if(",") + parser.NextToken() + if(")") + break else parser.errors+=new/scriptError/BadToken(parser.curToken) - return KW_FAIL + return KW_ERR + + else if(istype(parser.curToken, /token/word)) + def.parameters+=parser.curToken.value + parser.NextToken() + else + parser.errors+=new/scriptError/InvalidID(parser.curToken) + return KW_ERR + if(!parser.CheckToken(")", /token/symbol)) + return KW_FAIL + + if(istype(parser.curToken, /token/end)) //Function prototype + parser.curBlock.statements+=def + else if(parser.curToken.value=="{" && istype(parser.curToken, /token/symbol)) + def.block = new + parser.curBlock.statements+=def + parser.curBlock.functions[def.func_name]=def + parser.AddBlock(def.block) + else + parser.errors+=new/scriptError/BadToken(parser.curToken) + return KW_FAIL diff --git a/code/modules/scripting/Parser/Parser.dm b/code/modules/scripting/Parser/Parser.dm index fa7dd8789f..ab4d6805e7 100644 --- a/code/modules/scripting/Parser/Parser.dm +++ b/code/modules/scripting/Parser/Parser.dm @@ -6,18 +6,16 @@ An object that reads tokens and produces an AST (abstract syntax tree). */ /n_Parser - var + var/index = 1 /* Var: index The parser's current position in the token's list. */ - index = 1 - list /* Var: tokens A list of tokens in the source code generated by a scanner. */ - tokens = new + var/list/tokens = new /* Var: errors A list of fatal errors found by the parser. If there are any items in this list, then it is not safe to run the returned AST. @@ -25,41 +23,37 @@ See Also: - */ - errors = new + var/list/errors = new /* Var: warnings A list of non-fatal problems in the script. */ - warnings = new - token + var/list/warnings = new /* Var: curToken The token at in . */ - curToken - stack - blocks=new - node/BlockDefinition - GlobalBlock/global_block=new - curBlock + var/token/curToken + var/stack/blocks=new + var/node/BlockDefinition/GlobalBlock/global_block=new + var/node/BlockDefinition/curBlock - proc /* Proc: Parse Reads the tokens and returns the AST's node. Be sure to populate the tokens list before calling this procedure. */ - Parse() +/n_Parser/proc/Parse() /* Proc: NextToken Sets to the next token in the list, or null if there are no more tokens. */ - NextToken() - if(index>=tokens.len) - curToken=null - else - curToken=tokens[++index] - return curToken +/n_Parser/proc/NextToken() + if(index>=tokens.len) + curToken=null + else + curToken=tokens[++index] + return curToken /* Class: nS_Parser @@ -74,116 +68,115 @@ tokens - A list of tokens to parse. options - An object used for configuration. */ - New(tokens[], n_scriptOptions/options) - src.tokens=tokens - src.options=options - curBlock=global_block - return ..() +/n_Parser/nS_Parser/New(tokens[], n_scriptOptions/options) + src.tokens=tokens + src.options=options + curBlock=global_block + return ..() - Parse() - ASSERT(tokens) - for(,src.index<=src.tokens.len, src.index++) - curToken=tokens[index] - switch(curToken.type) - if(/token/keyword) - var/n_Keyword/kw=options.keywords[curToken.value] - kw=new kw() - if(kw) - if(!kw.Parse(src)) - return - if(/token/word) - var/token/ntok - if(index+1>tokens.len) - errors+=new/scriptError/BadToken(curToken) - continue - ntok=tokens[index+1] - if(!istype(ntok, /token/symbol)) - errors+=new/scriptError/BadToken(ntok) - continue - if(ntok.value=="(") - ParseFunctionStatement() - else if(options.assign_operators.Find(ntok.value)) - ParseAssignment() - else - errors+=new/scriptError/BadToken(ntok) - continue - if(!istype(curToken, /token/end)) - errors+=new/scriptError/ExpectedToken(";", curToken) - continue - if(/token/symbol) - if(curToken.value=="}") - if(!EndBlock()) - errors+=new/scriptError/BadToken(curToken) - continue - else - errors+=new/scriptError/BadToken(curToken) - continue - if(/token/end) - warnings+=new/scriptError/BadToken(curToken) +/n_Parser/nS_Parser/Parse() + ASSERT(tokens) + for(,src.index<=src.tokens.len, src.index++) + curToken=tokens[index] + switch(curToken.type) + if(/token/keyword) + var/n_Keyword/kw=options.keywords[curToken.value] + kw=new kw() + if(kw) + if(!kw.Parse(src)) + return + if(/token/word) + var/token/ntok + if(index+1>tokens.len) + errors+=new/scriptError/BadToken(curToken) continue + ntok=tokens[index+1] + if(!istype(ntok, /token/symbol)) + errors+=new/scriptError/BadToken(ntok) + continue + if(ntok.value=="(") + ParseFunctionStatement() + else if(options.assign_operators.Find(ntok.value)) + ParseAssignment() + else + errors+=new/scriptError/BadToken(ntok) + continue + if(!istype(curToken, /token/end)) + errors+=new/scriptError/ExpectedToken(";", curToken) + continue + if(/token/symbol) + if(curToken.value=="}") + if(!EndBlock()) + errors+=new/scriptError/BadToken(curToken) + continue else errors+=new/scriptError/BadToken(curToken) - return - return global_block - - proc - CheckToken(val, type, err=1, skip=1) - if(curToken.value!=val || !istype(curToken,type)) - if(err) - errors+=new/scriptError/ExpectedToken(val, curToken) - return 0 - if(skip)NextToken() - return 1 - - AddBlock(node/BlockDefinition/B) - blocks.Push(curBlock) - curBlock=B - - EndBlock() - if(curBlock==global_block) return 0 - curBlock=blocks.Pop() - return 1 - - ParseAssignment() - var/name=curToken.value - if(!options.IsValidID(name)) - errors+=new/scriptError/InvalidID(curToken) - return - NextToken() - var/t=options.binary_operators[options.assign_operators[curToken.value]] - var/node/statement/VariableAssignment/stmt=new() - stmt.var_name=new(name) - NextToken() - if(t) - stmt.value=new t() - stmt.value:exp=new/node/expression/value/variable(stmt.var_name) - stmt.value:exp2=ParseExpression() + continue + if(/token/end) + warnings+=new/scriptError/BadToken(curToken) + continue else - stmt.value=ParseExpression() + errors+=new/scriptError/BadToken(curToken) + return + return global_block + +/n_Parser/nS_Parser/proc/CheckToken(val, type, err=1, skip=1) + if(curToken.value!=val || !istype(curToken,type)) + if(err) + errors+=new/scriptError/ExpectedToken(val, curToken) + return 0 + if(skip)NextToken() + return 1 + +/n_Parser/nS_Parser/proc/AddBlock(node/BlockDefinition/B) + blocks.Push(curBlock) + curBlock=B + +/n_Parser/nS_Parser/proc/EndBlock() + if(curBlock==global_block) return 0 + curBlock=blocks.Pop() + return 1 + +/n_Parser/nS_Parser/proc/ParseAssignment() + var/name=curToken.value + if(!options.IsValidID(name)) + errors+=new/scriptError/InvalidID(curToken) + return + NextToken() + var/t=options.binary_operators[options.assign_operators[curToken.value]] + var/node/statement/VariableAssignment/stmt=new() + stmt.var_name=new(name) + NextToken() + if(t) + stmt.value=new t() + stmt.value:exp=new/node/expression/value/variable(stmt.var_name) + stmt.value:exp2=ParseExpression() + else + stmt.value=ParseExpression() + curBlock.statements+=stmt + +/n_Parser/nS_Parser/proc/ParseFunctionStatement() + if(!istype(curToken, /token/word)) + errors+=new/scriptError("Bad identifier in function call.") + return + var/node/statement/FunctionCall/stmt=new + stmt.func_name=curToken.value + NextToken() //skip function name + if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis + return + var/loops = 0 + while(TRUE) + loops++ + if(loops>=6000) + CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;") + + if(!curToken) + errors+=new/scriptError/EndOfFile() + return + if(istype(curToken, /token/symbol) && curToken.value==")") curBlock.statements+=stmt - - ParseFunctionStatement() - if(!istype(curToken, /token/word)) - errors+=new/scriptError("Bad identifier in function call.") - return - var/node/statement/FunctionCall/stmt=new - stmt.func_name=curToken.value - NextToken() //skip function name - if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis - return - var/loops = 0 - while(TRUE) - loops++ - if(loops>=6000) - CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;") - - if(!curToken) - errors+=new/scriptError/EndOfFile() - return - if(istype(curToken, /token/symbol) && curToken.value==")") - curBlock.statements+=stmt - NextToken() //Skip close parenthesis - return - var/node/expression/P=ParseParamExpression() - stmt.parameters+=P - if(istype(curToken, /token/symbol) && curToken.value==",") NextToken() \ No newline at end of file + NextToken() //Skip close parenthesis + return + var/node/expression/P=ParseParamExpression() + stmt.parameters+=P + if(istype(curToken, /token/symbol) && curToken.value==",") NextToken() \ No newline at end of file diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm index 78c120a22e..919bb82a48 100644 --- a/code/modules/scripting/Scanner/Scanner.dm +++ b/code/modules/scripting/Scanner/Scanner.dm @@ -6,9 +6,7 @@ An object responsible for breaking up source code into tokens for use by the parser. */ /n_Scanner - var - code - list + var/code /* Var: errors A list of fatal errors found by the scanner. If there are any items in this list, then it is not safe to parse the returned tokens. @@ -16,33 +14,32 @@ See Also: - */ - errors = new + var/list/errors = new /* Var: warnings A list of non-fatal problems in the source code found by the scanner. */ - warnings = new + var/list/warnings = new - proc /* Proc: LoadCode Loads source code. */ - LoadCode(c) +/n_Scanner/proc/LoadCode(c) code=c /* Proc: LoadCodeFromFile Gets the code from a file and calls . */ - LoadCodeFromFile(f) +/n_Scanner/proc/LoadCodeFromFile(f) LoadCode(file2text(f)) /* Proc: Scan Runs the scanner and returns the resulting list of tokens. Ensure that has been called first. */ - Scan() +/n_Scanner/proc/Scan() /* Class: nS_Scanner @@ -50,20 +47,15 @@ */ /n_Scanner/nS_Scanner - var /* Variable: codepos The scanner's position in the source code. */ - codepos = 1 - line = 1 - linepos = 0 //column=codepos-linepos - n_scriptOptions/nS_Options/options - - commenting = 0 - // 1: single-line - // 2: multi-line - list + var/codepos = 1 + var/line = 1 + var/linepos = 0 //column=codepos-linepos + var/n_scriptOptions/nS_Options/options + var/commenting = 0 /// 1 is a single-line comment, 2 is a multi-line comment /* Variable: ignore A list of characters that are ignored by the scanner. @@ -71,7 +63,7 @@ Default Value: Whitespace */ - ignore = list(" ", "\t", "\n") //Don't add tokens for whitespace + var/list/ignore = list(" ", "\t", "\n") //Don't add tokens for whitespace /* Variable: end_stmt A list of characters that end a statement. Each item may only be one character long. @@ -79,7 +71,7 @@ Default Value: Semicolon */ - end_stmt = list(";") + var/list/end_stmt = list(";") /* Variable: string_delim A list of characters that can start and end strings. @@ -87,12 +79,12 @@ Default Value: Double and single quotes. */ - string_delim = list("\"", "'") + var/list/string_delim = list("\"", "'") /* Variable: delim A list of characters that denote the start of a new token. This list is automatically populated. */ - delim = new + var/list/delim = new /* Macro: COL @@ -106,45 +98,44 @@ code - The source code to tokenize. options - An object used to configure the scanner. */ - New(code, n_scriptOptions/nS_Options/options) - .=..() - ignore+= ascii2text(13) //Carriage return - delim += ignore + options.symbols + end_stmt + string_delim - src.options=options - LoadCode(code) +/n_Scanner/nS_Scanner/New(code, n_scriptOptions/nS_Options/options) + .=..() + ignore+= ascii2text(13) //Carriage return + delim += ignore + options.symbols + end_stmt + string_delim + src.options=options + LoadCode(code) - Scan() //Creates a list of tokens from source code - var/list/tokens=new - for(, src.codepos<=length(code), src.codepos++) +/n_Scanner/nS_Scanner/Scan() //Creates a list of tokens from source code + var/list/tokens=new + for(, src.codepos<=length(code), src.codepos++) - var/char=copytext(code, codepos, codepos+1) - if(char=="\n") - line++ - linepos=codepos + var/char=copytext(code, codepos, codepos+1) + if(char=="\n") + line++ + linepos=codepos - if(ignore.Find(char)) - continue - else if(char == "/") - ReadComment() - else if(end_stmt.Find(char)) - tokens+=new /token/end(char, line, COL) - else if(string_delim.Find(char)) - codepos++ //skip string delimiter - tokens+=ReadString(char) - else if(options.CanStartID(char)) - tokens+=ReadWord() - else if(options.IsDigit(char)) - tokens+=ReadNumber() - else if(options.symbols.Find(char)) - tokens+=ReadSymbol() + if(ignore.Find(char)) + continue + else if(char == "/") + ReadComment() + else if(end_stmt.Find(char)) + tokens+=new /token/end(char, line, COL) + else if(string_delim.Find(char)) + codepos++ //skip string delimiter + tokens+=ReadString(char) + else if(options.CanStartID(char)) + tokens+=ReadWord() + else if(options.IsDigit(char)) + tokens+=ReadNumber() + else if(options.symbols.Find(char)) + tokens+=ReadSymbol() - codepos=initial(codepos) - line=initial(line) - linepos=initial(linepos) - return tokens + codepos=initial(codepos) + line=initial(line) + linepos=initial(linepos) + return tokens - proc /* Proc: ReadString Reads a string in the source code into a token. @@ -152,131 +143,131 @@ Parameters: start - The character used to start the string. */ - ReadString(start) - var/buf - for(, codepos <= length(code), codepos++)//codepos to length(code)) - var/char=copytext(code, codepos, codepos+1) +/n_Scanner/nS_Scanner/proc/ReadString(start) + var/buf + for(, codepos <= length(code), codepos++)//codepos to length(code)) + var/char=copytext(code, codepos, codepos+1) + switch(char) + if("\\") //Backslash (\) encountered in string + codepos++ //Skip next character in string, since it was escaped by a backslash + char=copytext(code, codepos, codepos+1) switch(char) - if("\\") //Backslash (\) encountered in string - codepos++ //Skip next character in string, since it was escaped by a backslash - char=copytext(code, codepos, codepos+1) - switch(char) - if("\\") //Double backslash - buf+="\\" - if("n") //\n Newline - buf+="\n" - else - if(char==start) //\" Doublequote - buf+=start - else //Unknown escaped text - buf+=char - if("\n") - . = new/token/string(buf, line, COL) - errors+=new/scriptError("Unterminated string. Newline reached.", .) - line++ - linepos=codepos - break + if("\\") //Double backslash + buf+="\\" + if("n") //\n Newline + buf+="\n" else - if(char==start) //string delimiter found, end string - break - else - buf+=char //Just a normal character in a string - if(!.) return new/token/string(buf, line, COL) - -/* - Proc: ReadWord - Reads characters separated by an item in into a token. -*/ - ReadWord() - var/char=copytext(code, codepos, codepos+1) - var/buf - while(!delim.Find(char) && codepos<=length(code)) - buf+=char - char=copytext(code, ++codepos, codepos+1) - codepos-- //allow main Scan() proc to read the delimiter - if(options.keywords.Find(buf)) - return new /token/keyword(buf, line, COL) + if(char==start) //\" Doublequote + buf+=start + else //Unknown escaped text + buf+=char + if("\n") + . = new/token/string(buf, line, COL) + errors+=new/scriptError("Unterminated string. Newline reached.", .) + line++ + linepos=codepos + break else - return new /token/word(buf, line, COL) + if(char==start) //string delimiter found, end string + break + else + buf+=char //Just a normal character in a string + if(!.) return new/token/string(buf, line, COL) /* - Proc: ReadSymbol - Reads a symbol into a token. +Proc: ReadWord +Reads characters separated by an item in into a token. */ - ReadSymbol() - var/char=copytext(code, codepos, codepos+1) - var/buf - - while(options.symbols.Find(buf+char)) - buf+=char - if(++codepos>length(code)) break - char=copytext(code, codepos, codepos+1) - - codepos-- //allow main Scan() proc to read the next character - return new /token/symbol(buf, line, COL) +/n_Scanner/nS_Scanner/proc/ReadWord() + var/char=copytext(code, codepos, codepos+1) + var/buf + while(!delim.Find(char) && codepos<=length(code)) + buf+=char + char=copytext(code, ++codepos, codepos+1) + codepos-- //allow main Scan() proc to read the delimiter + if(options.keywords.Find(buf)) + return new /token/keyword(buf, line, COL) + else + return new /token/word(buf, line, COL) /* - Proc: ReadNumber - Reads a number into a token. +Proc: ReadSymbol +Reads a symbol into a token. */ - ReadNumber() - var/char=copytext(code, codepos, codepos+1) - var/buf - var/dec=0 +/n_Scanner/nS_Scanner/proc/ReadSymbol() + var/char=copytext(code, codepos, codepos+1) + var/buf - while(options.IsDigit(char) || (char=="." && !dec)) - if(char==".") dec=1 - buf+=char - codepos++ - char=copytext(code, codepos, codepos+1) - var/token/number/T=new(buf, line, COL) - if(isnull(text2num(buf))) - errors+=new/scriptError("Bad number: ", T) - T.value=0 - codepos-- //allow main Scan() proc to read the next character - return T + while(options.symbols.Find(buf+char)) + buf+=char + if(++codepos>length(code)) break + char=copytext(code, codepos, codepos+1) + + codepos-- //allow main Scan() proc to read the next character + return new /token/symbol(buf, line, COL) /* - Proc: ReadComment - Reads a comment and outputs the type of comment +Proc: ReadNumber +Reads a number into a token. +*/ +/n_Scanner/nS_Scanner/proc/ReadNumber() + var/char=copytext(code, codepos, codepos+1) + var/buf + var/dec=0 + + while(options.IsDigit(char) || (char=="." && !dec)) + if(char==".") dec=1 + buf+=char + codepos++ + char=copytext(code, codepos, codepos+1) + var/token/number/T=new(buf, line, COL) + if(isnull(text2num(buf))) + errors+=new/scriptError("Bad number: ", T) + T.value=0 + codepos-- //allow main Scan() proc to read the next character + return T + +/* +Proc: ReadComment +Reads a comment and outputs the type of comment */ - ReadComment() - var/char=copytext(code, codepos, codepos+1) - var/nextchar=copytext(code, codepos+1, codepos+2) - var/charstring = char+nextchar - var/comm = 1 - // 1: single-line comment - // 2: multi-line comment - var/expectedend = 0 +/n_Scanner/nS_Scanner/proc/ReadComment() + var/char=copytext(code, codepos, codepos+1) + var/nextchar=copytext(code, codepos+1, codepos+2) + var/charstring = char+nextchar + var/comm = 1 + // 1: single-line comment + // 2: multi-line comment + var/expectedend = 0 - if(charstring == "//" || charstring == "/*") - if(charstring == "/*") - comm = 2 // starts a multi-line comment + if(charstring == "//" || charstring == "/*") + if(charstring == "/*") + comm = 2 // starts a multi-line comment - while(comm) - if(++codepos>length(code)) break + while(comm) + if(++codepos>length(code)) break - if(expectedend) // ending statement expected... - char = copytext(code, codepos, codepos+1) - if(char == "/") // ending statement found - beak the comment - comm = 0 - break + if(expectedend) // ending statement expected... + char = copytext(code, codepos, codepos+1) + if(char == "/") // ending statement found - beak the comment + comm = 0 + break - if(comm == 2) - // multi-line comments are broken by ending statements - char = copytext(code, codepos, codepos+1) - if(char == "*") - expectedend = 1 - continue - else - char = copytext(code, codepos, codepos+1) - if(char == "\n") - comm = 0 - break + if(comm == 2) + // multi-line comments are broken by ending statements + char = copytext(code, codepos, codepos+1) + if(char == "*") + expectedend = 1 + continue + else + char = copytext(code, codepos, codepos+1) + if(char == "\n") + comm = 0 + break - if(expectedend) expectedend = 0 + if(expectedend) expectedend = 0 - if(comm == 2) - errors+=new/scriptError/UnterminatedComment() + if(comm == 2) + errors+=new/scriptError/UnterminatedComment() diff --git a/code/modules/scripting/Scanner/Tokens.dm b/code/modules/scripting/Scanner/Tokens.dm index 0c2a8a5cc7..5068e97c5a 100644 --- a/code/modules/scripting/Scanner/Tokens.dm +++ b/code/modules/scripting/Scanner/Tokens.dm @@ -9,30 +9,29 @@ var/line var/column - New(v, l=0, c=0) - value=v - line=l - column=c +/token/New(v, l=0, c=0) + value=v + line=l + column=c - string - symbol - word - keyword - number - New() - .=..() - if(!isnum(value)) - value=text2num(value) - ASSERT(!isnull(value)) - accessor - var/object - var/member +/token/string +/token/symbol +/token/word +/token/keyword +/token/number/New() + .=..() + if(!isnum(value)) + value=text2num(value) + ASSERT(!isnull(value)) +/token/accessor + var/object + var/member - New(object, member, l=0, c=0) - src.object=object - src.member=member - src.value="[object].[member]" //for debugging only - src.line=l - src.column=c +/token/accessor/New(object, member, l=0, c=0) + src.object=object + src.member=member + src.value="[object].[member]" //for debugging only + src.line=l + src.column=c - end +/token/end diff --git a/code/modules/scripting/stack.dm b/code/modules/scripting/stack.dm index be4147c7ec..3c7fa52ac7 100644 --- a/code/modules/scripting/stack.dm +++ b/code/modules/scripting/stack.dm @@ -1,23 +1,21 @@ /stack - var/list - contents=new - proc - Push(value) - contents+=value + var/list/contents=new +/stack/proc/Push(value) + contents+=value - Pop() - if(!contents.len) return null - . = contents[contents.len] - contents.len-- +/stack/proc/Pop() + if(!contents.len) return null + . = contents[contents.len] + contents.len-- - Top() //returns the item on the top of the stack without removing it - if(!contents.len) return null - return contents[contents.len] +/stack/proc/Top() //returns the item on the top of the stack without removing it + if(!contents.len) return null + return contents[contents.len] - Copy() - var/stack/S=new() - S.contents=src.contents.Copy() - return S +/stack/proc/Copy() + var/stack/S=new() + S.contents=src.contents.Copy() + return S - Clear() - contents.Cut() \ No newline at end of file +/stack/proc/Clear() + contents.Cut() \ No newline at end of file diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index b1d3efdc0c..cfefd5ce5c 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,5 +1,5 @@ /datum/shuttle/autodock/ferry/escape_pod - var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/arming_controller + var/datum/embedded_program/docking/simple/escape_pod_berth/arming_controller category = /datum/shuttle/autodock/ferry/escape_pod /datum/shuttle/autodock/ferry/escape_pod/New() @@ -19,7 +19,7 @@ CRASH("Could not find arming controller for escape pod \"[name]\", tag was '[arming_controller_tag]'.") //find the pod's own controller - var/datum/computer/file/embedded_program/docking/simple/prog = SSshuttles.docking_registry[docking_controller_tag] + var/datum/embedded_program/docking/simple/prog = SSshuttles.docking_registry[docking_controller_tag] var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = prog.master if(!istype(controller_master)) CRASH("Escape pod \"[name]\" could not find it's controller master! docking_controller_tag=[docking_controller_tag]") @@ -44,12 +44,18 @@ //This controller goes on the escape pod itself /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod name = "escape pod controller" - program = /datum/computer/file/embedded_program/docking/simple + program = /datum/embedded_program/docking/simple var/datum/shuttle/autodock/ferry/escape_pod/pod valid_actions = list("toggle_override", "force_door") +<<<<<<< HEAD /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/tgui_data(mob/user) var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type +======= +/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) . = list( "docking_status" = docking_program.get_docking_status(), @@ -79,6 +85,7 @@ //This controller is for the escape pod berth (station side) /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth name = "escape pod berth controller" +<<<<<<< HEAD program = /datum/computer/file/embedded_program/docking/simple/escape_pod_berth valid_actions = list("toggle_override", "force_door") @@ -88,6 +95,17 @@ var/armed = null if(istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod_berth)) var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/P = docking_program +======= + program = /datum/embedded_program/docking/simple/escape_pod_berth + +/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type + + var/armed = null + if (istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth)) + var/datum/embedded_program/docking/simple/escape_pod_berth/P = docking_program +>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) armed = P.armed . = list( @@ -102,44 +120,44 @@ if (!emagged) to_chat(user, "You emag the [src], arming the escape pod!") emagged = 1 - if (istype(program, /datum/computer/file/embedded_program/docking/simple/escape_pod_berth)) - var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/P = program + if (istype(program, /datum/embedded_program/docking/simple/escape_pod_berth)) + var/datum/embedded_program/docking/simple/escape_pod_berth/P = program if (!P.armed) P.arm() return 1 //A docking controller program for a simple door based docking port -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth +/datum/embedded_program/docking/simple/escape_pod_berth var/armed = 0 var/eject_delay = 10 //give latecomers some time to get out of the way if they don't make it onto the pod var/eject_time = null var/closing = 0 -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/proc/arm() +/datum/embedded_program/docking/simple/escape_pod_berth/proc/arm() if(!armed) armed = 1 open_door() -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/receive_user_command(command) +/datum/embedded_program/docking/simple/escape_pod_berth/receive_user_command(command) if (!armed) return TRUE // Eat all commands. return ..(command) -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/process() +/datum/embedded_program/docking/simple/escape_pod_berth/process() ..() if (eject_time && world.time >= eject_time && !closing) close_door() closing = 1 -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/prepare_for_docking() +/datum/embedded_program/docking/simple/escape_pod_berth/prepare_for_docking() return -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/ready_for_docking() +/datum/embedded_program/docking/simple/escape_pod_berth/ready_for_docking() return 1 -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/finish_docking() +/datum/embedded_program/docking/simple/escape_pod_berth/finish_docking() return //don't do anything - the doors only open when the pod is armed. -/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/prepare_for_undocking() +/datum/embedded_program/docking/simple/escape_pod_berth/prepare_for_undocking() eject_time = world.time + eject_delay*10 diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index cf6a76cb5c..6d1249a8ad 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -12,7 +12,7 @@ //ID of the landmark var/landmark_tag //ID of the controller on the dock side (intialize to id_tag, becomes reference) - var/datum/computer/file/embedded_program/docking/docking_controller + var/datum/embedded_program/docking/docking_controller //Map of shuttle names to ID of controller used for this landmark for shuttles with multiple ones. var/list/special_dock_targets diff --git a/code/modules/shuttles/shuttle_autodock.dm b/code/modules/shuttles/shuttle_autodock.dm index aa59856b50..beb0bab011 100644 --- a/code/modules/shuttles/shuttle_autodock.dm +++ b/code/modules/shuttles/shuttle_autodock.dm @@ -1,5 +1,3 @@ -#define DOCK_ATTEMPT_TIMEOUT 200 //how long in ticks we wait before assuming the docking controller is broken or blown up. - // Subtype of shuttle that handles docking with docking controllers // Consists of code pulled down from the old /datum/shuttle and up from /datum/shuttle/ferry // Note: Since all known shuttles extend this type, this really could just be built into /datum/shuttle @@ -9,11 +7,11 @@ var/last_dock_attempt_time = 0 var/docking_controller_tag = null // ID of the controller on the shuttle (If multiple, this is the default one) - var/datum/computer/file/embedded_program/docking/shuttle_docking_controller // Controller on the shuttle (the one in use) + var/datum/embedded_program/docking/shuttle_docking_controller // Controller on the shuttle (the one in use) var/docking_codes var/tmp/obj/effect/shuttle_landmark/next_location //This is only used internally. - var/datum/computer/file/embedded_program/docking/active_docking_controller // Controller we are docked with (or trying to) + var/datum/embedded_program/docking/active_docking_controller // Controller we are docked with (or trying to) var/obj/effect/shuttle_landmark/landmark_transition //This variable is type-abused initially: specify the landmark_tag, not the actual landmark. var/move_time = 240 //the time spent in the transition area diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index cad706c800..24c00f0a6d 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -1,5 +1,3 @@ -#define DOCK_ATTEMPT_TIMEOUT 200 //how long in ticks we wait before assuming the docking controller is broken or blown up. - /datum/shuttle/autodock/ferry var/location = FERRY_LOCATION_STATION //0 = at area_station, 1 = at area_offsite var/direction = FERRY_GOING_TO_STATION //0 = going to station, 1 = going to offsite. diff --git a/code/modules/spells/construct_spells.dm b/code/modules/spells/construct_spells.dm index aac7592f33..15dfd3bd80 100644 --- a/code/modules/spells/construct_spells.dm +++ b/code/modules/spells/construct_spells.dm @@ -3,7 +3,7 @@ * Moved to game/gamemodes/cult/construct_spells.dm. Here for posterity. */ /* -proc/findNullRod(var/atom/target) +/proc/findNullRod(var/atom/target) if(istype(target,/obj/item/weapon/nullrod)) return 1 else if(target.contents) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index ebfde69976..298d0f06d6 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -28,8 +28,8 @@ var/datum/effect/effect/system/ion_trail_follow/ion var/kickstand = 1 -/obj/vehicle/bike/New() - ..() +/obj/vehicle/bike/Initialize() + . = ..() cell = new /obj/item/weapon/cell/high(src) ion = new /datum/effect/effect/system/ion_trail_follow() ion.set_up(src) diff --git a/code/modules/ventcrawl/ventcrawl_atmospherics.dm b/code/modules/ventcrawl/ventcrawl_atmospherics.dm index 80348c7699..3ae52380d6 100644 --- a/code/modules/ventcrawl/ventcrawl_atmospherics.dm +++ b/code/modules/ventcrawl/ventcrawl_atmospherics.dm @@ -82,7 +82,7 @@ /obj/machinery/atmospherics/pipe/manifold/isConnectable(var/obj/machinery/atmospherics/target) return (target == node3 || ..()) -obj/machinery/atmospherics/trinary/isConnectable(var/obj/machinery/atmospherics/target) +/obj/machinery/atmospherics/trinary/isConnectable(var/obj/machinery/atmospherics/target) return (target == node3 || ..()) /obj/machinery/atmospherics/pipe/manifold4w/isConnectable(var/obj/machinery/atmospherics/target) diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index 84e439e7ef..080674bd44 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -52,172 +52,172 @@ // this holds spawned viruses so that the "Info" links work after the proc exits var/list/spawned_viruses = list() - proc/select(mob/user, stage) - if(stage < 1 || stage > 4) return +/datum/virus2_editor/proc/select(mob/user, stage) + if(stage < 1 || stage > 4) return - var/list/L = list() + var/list/L = list() - for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) - var/datum/disease2/effect/f = e - if(initial(f.stage) <= stage) - L[initial(f.name)] = e + for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) + var/datum/disease2/effect/f = e + if(initial(f.stage) <= stage) + L[initial(f.name)] = e - var/datum/disease2/effect/Eff = s[stage] + var/datum/disease2/effect/Eff = s[stage] - var/C = input("Select effect for stage [stage]:", "Stage [stage]", initial(Eff.name)) as null|anything in L - if(!C) return - return L[C] + var/C = input("Select effect for stage [stage]:", "Stage [stage]", initial(Eff.name)) as null|anything in L + if(!C) return + return L[C] - proc/show_ui(mob/user) - var/H = {" -

Virus2 Virus Editor


- Effects:
- "} - for(var/i = 1 to 4) - var/datum/disease2/effect/Eff = s[i] - H += {" - [initial(Eff.name)] - Chance: [s_chance[i]] - Multiplier: [s_multiplier[i]] -
- "} +/datum/virus2_editor/proc/show_ui(mob/user) + var/H = {" +

Virus2 Virus Editor


+ Effects:
+ "} + for(var/i = 1 to 4) + var/datum/disease2/effect/Eff = s[i] H += {" -
- Infectable Species:
- "} - var/f = 1 - for(var/k in GLOB.all_species) - var/datum/species/S = GLOB.all_species[k] - if(S.get_virus_immune()) - continue - if(!f) H += " | " - else f = 0 - H += "[k]" - H += {" - Reset -
- Infection Chance: [infectionchance]
- Spread Type: [spreadtype]
- Speed: [speed]
- Resistance: [resistance]
-
- "} - f = 1 - for(var/k in ALL_ANTIGENS) - if(!f) H += " | " - else f = 0 - H += "[k]" - H += {" - Reset -
-
- Initial infectee: [infectee ? infectee : "(choose)"] - RELEASE - "} + [initial(Eff.name)] + Chance: [s_chance[i]] + Multiplier: [s_multiplier[i]] +
+ "} + H += {" +
+ Infectable Species:
+ "} + var/f = 1 + for(var/k in GLOB.all_species) + var/datum/species/S = GLOB.all_species[k] + if(S.get_virus_immune()) + continue + if(!f) H += " | " + else f = 0 + H += "[k]" + H += {" + Reset +
+ Infection Chance: [infectionchance]
+ Spread Type: [spreadtype]
+ Speed: [speed]
+ Resistance: [resistance]
+
+ "} + f = 1 + for(var/k in ALL_ANTIGENS) + if(!f) H += " | " + else f = 0 + H += "[k]" + H += {" + Reset +
+
+ Initial infectee: [infectee ? infectee : "(choose)"] + RELEASE + "} - user << browse(H, "window=virus2edit") + user << browse(H, "window=virus2edit") - Topic(href, href_list) - switch(href_list["what"]) - if("effect") - var/stage = text2num(href_list["stage"]) - if(href_list["effect"]) - var/datum/disease2/effect/E = select(usr,stage) - if(!E) return - s[stage] = E - // set a default chance and multiplier of half the maximum (roughly average) - s_chance[stage] = max(1, round(initial(E.chance_maxm)/2)) - s_multiplier[stage] = max(1, round(initial(E.maxm)/2)) - else if(href_list["chance"]) - var/datum/disease2/effect/Eff = s[stage] - var/I = input("Chance, per tick, of this effect happening (min 0, max [initial(Eff.chance_maxm)])", "Effect Chance", s_chance[stage]) as null|num - if(I == null || I < 0 || I > initial(Eff.chance_maxm)) return - s_chance[stage] = I - else if(href_list["multiplier"]) - var/datum/disease2/effect/Eff = s[stage] - var/I = input("Multiplier for this effect (min 1, max [initial(Eff.maxm)])", "Effect Multiplier", s_multiplier[stage]) as null|num - if(I == null || I < 1 || I > initial(Eff.maxm)) return - s_multiplier[stage] = I - if("species") - if(href_list["toggle"]) - var/T = href_list["toggle"] - if(T in species) - species -= T +/datum/virus2_editor/Topic(href, href_list) + switch(href_list["what"]) + if("effect") + var/stage = text2num(href_list["stage"]) + if(href_list["effect"]) + var/datum/disease2/effect/E = select(usr,stage) + if(!E) return + s[stage] = E + // set a default chance and multiplier of half the maximum (roughly average) + s_chance[stage] = max(1, round(initial(E.chance_maxm)/2)) + s_multiplier[stage] = max(1, round(initial(E.maxm)/2)) + else if(href_list["chance"]) + var/datum/disease2/effect/Eff = s[stage] + var/I = input("Chance, per tick, of this effect happening (min 0, max [initial(Eff.chance_maxm)])", "Effect Chance", s_chance[stage]) as null|num + if(I == null || I < 0 || I > initial(Eff.chance_maxm)) return + s_chance[stage] = I + else if(href_list["multiplier"]) + var/datum/disease2/effect/Eff = s[stage] + var/I = input("Multiplier for this effect (min 1, max [initial(Eff.maxm)])", "Effect Multiplier", s_multiplier[stage]) as null|num + if(I == null || I < 1 || I > initial(Eff.maxm)) return + s_multiplier[stage] = I + if("species") + if(href_list["toggle"]) + var/T = href_list["toggle"] + if(T in species) + species -= T + else + species |= T + else if(href_list["reset"]) + species = list() + if(infectee) + if(!infectee.species || !(infectee.species.get_bodytype() in species)) + infectee = null + if("ichance") + var/I = input("Input infection chance", "Infection Chance", infectionchance) as null|num + if(!I) return + infectionchance = I + if("stype") + var/S = alert("Which spread type?", "Spread Type", "Contact", "Airborne", "Blood") + if(!S) return + spreadtype = S + if("speed") + var/S = input("Input speed", "Speed", speed) as null|num + if(!S) return + speed = S + if("antigen") + if(href_list["toggle"]) + var/T = href_list["toggle"] + if(length(T) != 1) return + if(T in antigens) + antigens -= T + else + antigens |= T + else if(href_list["reset"]) + antigens = list() + if("resistance") + var/S = input("Input % resistance to antibiotics", "Resistance", resistance) as null|num + if(!S) return + resistance = S + if("infectee") + var/list/candidates = list() + for(var/mob/living/carbon/G in living_mob_list) + if(G.stat != DEAD && G.species) + if(G.species.get_bodytype() in species) + candidates["[G.name][G.client ? "" : " (no client)"]"] = G else - species |= T - else if(href_list["reset"]) - species = list() - if(infectee) - if(!infectee.species || !(infectee.species.get_bodytype() in species)) - infectee = null - if("ichance") - var/I = input("Input infection chance", "Infection Chance", infectionchance) as null|num - if(!I) return - infectionchance = I - if("stype") - var/S = alert("Which spread type?", "Spread Type", "Contact", "Airborne", "Blood") - if(!S) return - spreadtype = S - if("speed") - var/S = input("Input speed", "Speed", speed) as null|num - if(!S) return - speed = S - if("antigen") - if(href_list["toggle"]) - var/T = href_list["toggle"] - if(length(T) != 1) return - if(T in antigens) - antigens -= T - else - antigens |= T - else if(href_list["reset"]) - antigens = list() - if("resistance") - var/S = input("Input % resistance to antibiotics", "Resistance", resistance) as null|num - if(!S) return - resistance = S - if("infectee") - var/list/candidates = list() - for(var/mob/living/carbon/G in living_mob_list) - if(G.stat != DEAD && G.species) - if(G.species.get_bodytype() in species) - candidates["[G.name][G.client ? "" : " (no client)"]"] = G - else - candidates["[G.name] ([G.species.get_bodytype()])[G.client ? "" : " (no client)"]"] = G - if(!candidates.len) - to_chat(usr, "No possible candidates found!") + candidates["[G.name] ([G.species.get_bodytype()])[G.client ? "" : " (no client)"]"] = G + if(!candidates.len) + to_chat(usr, "No possible candidates found!") - var/I = input("Choose initial infectee", "Infectee", infectee) as null|anything in candidates - if(!I || !candidates[I]) return - infectee = candidates[I] - species |= infectee.species.get_bodytype() - if("go") - if(!antigens.len) - var/a = alert("This disease has no antigens; it will be impossible to permanently immunise anyone without them.\ - It is strongly recommended to set at least one antigen. Do you want to go back and edit your virus?", "Antigens", "Yes", "Yes", "No") - if(a == "Yes") return - var/datum/disease2/disease/D = new - D.infectionchance = infectionchance - D.spreadtype = spreadtype - D.antigen = antigens - D.affected_species = species - D.speed = speed - D.resistance = resistance - for(var/i in 1 to 4) - var/datum/disease2/effectholder/E = new - var/Etype = s[i] - E.effect = new Etype() - E.effect.generate() - E.chance = s_chance[i] - E.multiplier = s_multiplier[i] - E.stage = i + var/I = input("Choose initial infectee", "Infectee", infectee) as null|anything in candidates + if(!I || !candidates[I]) return + infectee = candidates[I] + species |= infectee.species.get_bodytype() + if("go") + if(!antigens.len) + var/a = alert("This disease has no antigens; it will be impossible to permanently immunise anyone without them.\ + It is strongly recommended to set at least one antigen. Do you want to go back and edit your virus?", "Antigens", "Yes", "Yes", "No") + if(a == "Yes") return + var/datum/disease2/disease/D = new + D.infectionchance = infectionchance + D.spreadtype = spreadtype + D.antigen = antigens + D.affected_species = species + D.speed = speed + D.resistance = resistance + for(var/i in 1 to 4) + var/datum/disease2/effectholder/E = new + var/Etype = s[i] + E.effect = new Etype() + E.effect.generate() + E.chance = s_chance[i] + E.multiplier = s_multiplier[i] + E.stage = i - D.effects += E + D.effects += E - spawned_viruses += D + spawned_viruses += D - message_admins("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)") - log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!") - infect_virus2(infectee, D, forced=1) + message_admins("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)") + log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!") + infect_virus2(infectee, D, forced=1) - show_ui(usr) + show_ui(usr) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 67d76a8177..9a4076ef73 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -280,7 +280,7 @@ var/global/list/virusDB = list() virusDB["[uniqueID]"] = v return 1 -proc/virus2_lesser_infection() +/proc/virus2_lesser_infection() var/list/candidates = list() //list of candidate keys for(var/mob/living/carbon/human/G in player_list) @@ -293,7 +293,7 @@ proc/virus2_lesser_infection() infect_mob_random_lesser(candidates[1]) -proc/virus2_greater_infection() +/proc/virus2_greater_infection() var/list/candidates = list() //list of candidate keys for(var/mob/living/carbon/human/G in player_list) @@ -305,7 +305,7 @@ proc/virus2_greater_infection() infect_mob_random_greater(candidates[1]) -proc/virology_letterhead(var/report_name) +/proc/virology_letterhead(var/report_name) return {"

[report_name]

[station_name()] Virology Lab
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 876d0d30b6..dd19e5e3f4 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -51,9 +51,9 @@ var/badness = 1 var/data = null // For semi-procedural effects; this should be generated in generate() if used - proc/activate(var/mob/living/carbon/mob,var/multiplier) - proc/deactivate(var/mob/living/carbon/mob) - proc/generate(copy_data) // copy_data will be non-null if this is a copy; it should be used to initialise the data for this effect if present +/datum/disease2/effect/proc/activate(var/mob/living/carbon/mob,var/multiplier) +/datum/disease2/effect/proc/deactivate(var/mob/living/carbon/mob) +/datum/disease2/effect/proc/generate(copy_data) // copy_data will be non-null if this is a copy; it should be used to initialise the data for this effect if present /datum/disease2/effect/invisible name = "Waiting Syndrome" diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 64790fdfc5..18a8bb24e8 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -1,5 +1,5 @@ //Returns 1 if mob can be infected, 0 otherwise. -proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") +/proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") if (!istype(M)) return 0 @@ -56,7 +56,7 @@ proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") return prob(protection) //Checks if table-passing table can reach target (5 tile radius) -proc/airborne_can_reach(turf/source, turf/target) +/proc/airborne_can_reach(turf/source, turf/target) var/obj/dummy = new(source) dummy.pass_flags = PASSTABLE diff --git a/code/modules/xenoarcheaology/effects/gravitational_waves.dm b/code/modules/xenoarcheaology/effects/gravitational_waves.dm index 8483d23d4b..6798eef64c 100644 --- a/code/modules/xenoarcheaology/effects/gravitational_waves.dm +++ b/code/modules/xenoarcheaology/effects/gravitational_waves.dm @@ -20,6 +20,6 @@ holder.visible_message("\The [holder] distorts as local gravity intensifies, and shifts toward it.") gravwave(get_turf(holder), effectrange, STAGE_TWO) -proc/gravwave(var/atom/target, var/pull_range = 7, var/pull_power = STAGE_TWO) +/proc/gravwave(var/atom/target, var/pull_range = 7, var/pull_power = STAGE_TWO) for(var/atom/A in oview(pull_range, target)) A.singularity_pull(target, pull_power) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 4621e6669e..2a12dfa81d 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -1,4 +1,4 @@ -client/script = {"" - if(screen == 0) - dat += "

Tracking beacons data

" - for(var/obj/item/mecha_parts/mecha_tracking/TR in world) - var/answer = TR.get_mecha_info() - if(answer) - dat += {"
[answer]
- Send message
- Show exosuit log | (EMP pulse)
"} - - if(screen==1) - dat += "

Log contents

" - dat += "Return
" - dat += "[stored_data]" - - dat += "(Refresh)
" - dat += "" - - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/mecha/Topic(href, href_list) - if(..()) - return - var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list) - if(href_list["send_message"]) - var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("send_message") - var/message = sanitize(input(usr,"Input message","Transmit message") as text) - var/obj/mecha/M = MT.in_mecha() - if(message && M) - M.occupant_message(message) - return - if(href_list["shock"]) - var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("shock") - MT.shock() - if(href_list["get_log"]) - var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("get_log") - stored_data = MT.get_mecha_log() - screen = 1 - if(href_list["return"]) - screen = 0 - src.updateUsrDialog() - return ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) @@ -133,7 +77,6 @@ icon_state = "motion2" origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) -<<<<<<< HEAD /obj/item/mecha_parts/mecha_tracking/tgui_data(mob/user) var/list/data = ..() if(!in_mecha()) @@ -159,25 +102,6 @@ data["cargoMax"] = RM.cargo_capacity return data -======= -/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() - if(!in_mecha()) - return 0 - var/obj/mecha/M = src.loc - var/cell_charge = M.get_charge() - var/answer = {"Name: [M.name]
- Integrity: [M.health/initial(M.health)*100]%
- Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]
- Airtank: [M.return_pressure()]kPa
- Pilot: [M.occupant||"None"]
- Location: [get_area(M)||"Unknown"]
- Active equipment: [M.selected||"None"]"} - if(istype(M, /obj/mecha/working/ripley)) - var/obj/mecha/working/ripley/RM = M - answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" - - return answer ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/mecha_parts/mecha_tracking/emp_act() qdel(src) @@ -188,13 +112,8 @@ return /obj/item/mecha_parts/mecha_tracking/proc/in_mecha() -<<<<<<< HEAD if(istype(loc, /obj/mecha)) return loc -======= - if(istype(src.loc, /obj/mecha)) - return src.loc ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) return 0 /obj/item/mecha_parts/mecha_tracking/proc/shock() @@ -204,32 +123,12 @@ qdel(src) /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() -<<<<<<< HEAD if(!in_mecha()) return list() var/obj/mecha/M = loc return M.get_log_tgui() -======= - if(!src.in_mecha()) - return 0 - var/obj/mecha/M = src.loc - return M.get_log_html() ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/weapon/storage/box/mechabeacons name = "Exosuit Tracking Beacons" -<<<<<<< HEAD - -/obj/item/weapon/storage/box/mechabeacons/New() - ..() - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) -======= starts_with = list(/obj/item/mecha_parts/mecha_tracking = 7) ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm index 637a5ab36c..7019c64399 100644 --- a/code/game/mecha/micro/mecha_construction_paths_vr.dm +++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm @@ -1,768 +1,771 @@ /datum/construction/mecha/polecat_chassis - steps = list(list("key"=/obj/item/mecha_parts/micro/part/polecat_torso),//1 - list("key"=/obj/item/mecha_parts/micro/part/polecat_left_arm),//2 - list("key"=/obj/item/mecha_parts/micro/part/polecat_right_arm),//3 - list("key"=/obj/item/mecha_parts/micro/part/polecat_left_leg),//4 - list("key"=/obj/item/mecha_parts/micro/part/polecat_right_leg)//5 - ) + steps = list( + list("key"=/obj/item/mecha_parts/micro/part/polecat_torso),//1 + list("key"=/obj/item/mecha_parts/micro/part/polecat_left_arm),//2 + list("key"=/obj/item/mecha_parts/micro/part/polecat_right_arm),//3 + list("key"=/obj/item/mecha_parts/micro/part/polecat_left_leg),//4 + list("key"=/obj/item/mecha_parts/micro/part/polecat_right_leg)//5 + ) - custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") - holder.add_overlay(used_atom.icon_state+"+o") - qdel(used_atom) - return 1 +/datum/construction/mecha/polecat_chassis/custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.add_overlay(used_atom.icon_state+"+o") + qdel(used_atom) + return 1 - action(atom/used_atom,mob/user as mob) - return check_all_steps(used_atom,user) +/datum/construction/mecha/polecat_chassis/action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) - spawn_result() - var/obj/item/mecha_parts/chassis/const_holder = holder - const_holder.construct = new /datum/construction/reversible/mecha/polecat(const_holder) - const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' - const_holder.icon_state = "polecat0" - const_holder.density = 1 - const_holder.overlays.len = 0 - spawn() - qdel(src) - return +/datum/construction/mecha/polecat_chassis/spawn_result() + var/obj/item/mecha_parts/chassis/const_holder = holder + const_holder.construct = new /datum/construction/reversible/mecha/polecat(const_holder) + const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' + const_holder.icon_state = "polecat0" + const_holder.density = 1 + const_holder.overlays.len = 0 + spawn() + qdel(src) + return /datum/construction/reversible/mecha/polecat result = "/obj/mecha/micro/sec/polecat" steps = list( - //1 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=IS_WRENCH, - "desc"="External armor is wrenched."), - //2 - list("key"=IS_WRENCH, - "backkey"=IS_CROWBAR, - "desc"="External armor is installed."), - //3 - list("key"=/obj/item/mecha_parts/micro/part/polecat_armour, - "backkey"=/obj/item/weapon/weldingtool, - "desc"="Internal armor is welded."), - //4 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=IS_WRENCH, - "desc"="Internal armor is wrenched"), - //5 - list("key"=IS_WRENCH, - "backkey"=IS_CROWBAR, - "desc"="Internal armor is installed"), - //6 - list("key"=/obj/item/stack/material/steel, - "backkey"=IS_SCREWDRIVER, - "desc"="Advanced capacitor is secured"), - //7 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Advanced capacitor is installed"), - //8 - list("key"=/obj/item/weapon/stock_parts/capacitor/adv, - "backkey"=IS_SCREWDRIVER, - "desc"="Advanced scanner module is secured"), - //9 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Advanced scanner module is installed"), - //10 - list("key"=/obj/item/weapon/stock_parts/scanning_module/adv, - "backkey"=IS_SCREWDRIVER, - "desc"="Targeting module is secured"), - //11 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Targeting module is installed"), - //12 - list("key"=/obj/item/weapon/circuitboard/mecha/polecat/targeting, - "backkey"=IS_SCREWDRIVER, - "desc"="Peripherals control module is secured"), - //13 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Peripherals control module is installed"), - //14 - list("key"=/obj/item/weapon/circuitboard/mecha/polecat/peripherals, - "backkey"=IS_SCREWDRIVER, - "desc"="Central control module is secured"), - //15 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Central control module is installed"), - //16 - list("key"=/obj/item/weapon/circuitboard/mecha/polecat/main, - "backkey"=IS_SCREWDRIVER, - "desc"="The wiring is adjusted"), - //17 - list("key"=IS_WIRECUTTER, - "backkey"=IS_SCREWDRIVER, - "desc"="The wiring is added"), - //18 - list("key"=/obj/item/stack/cable_coil, - "backkey"=IS_SCREWDRIVER, - "desc"="The hydraulic systems are active."), - //19 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_WRENCH, - "desc"="The hydraulic systems are connected."), - //20 - list("key"=IS_WRENCH, - "desc"="The hydraulic systems are disconnected.") - ) + //1 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=IS_WRENCH, + "desc"="External armor is wrenched."), + //2 + list("key"=IS_WRENCH, + "backkey"=IS_CROWBAR, + "desc"="External armor is installed."), + //3 + list("key"=/obj/item/mecha_parts/micro/part/polecat_armour, + "backkey"=/obj/item/weapon/weldingtool, + "desc"="Internal armor is welded."), + //4 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=IS_WRENCH, + "desc"="Internal armor is wrenched"), + //5 + list("key"=IS_WRENCH, + "backkey"=IS_CROWBAR, + "desc"="Internal armor is installed"), + //6 + list("key"=/obj/item/stack/material/steel, + "backkey"=IS_SCREWDRIVER, + "desc"="Advanced capacitor is secured"), + //7 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Advanced capacitor is installed"), + //8 + list("key"=/obj/item/weapon/stock_parts/capacitor/adv, + "backkey"=IS_SCREWDRIVER, + "desc"="Advanced scanner module is secured"), + //9 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Advanced scanner module is installed"), + //10 + list("key"=/obj/item/weapon/stock_parts/scanning_module/adv, + "backkey"=IS_SCREWDRIVER, + "desc"="Targeting module is secured"), + //11 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Targeting module is installed"), + //12 + list("key"=/obj/item/weapon/circuitboard/mecha/polecat/targeting, + "backkey"=IS_SCREWDRIVER, + "desc"="Peripherals control module is secured"), + //13 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Peripherals control module is installed"), + //14 + list("key"=/obj/item/weapon/circuitboard/mecha/polecat/peripherals, + "backkey"=IS_SCREWDRIVER, + "desc"="Central control module is secured"), + //15 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Central control module is installed"), + //16 + list("key"=/obj/item/weapon/circuitboard/mecha/polecat/main, + "backkey"=IS_SCREWDRIVER, + "desc"="The wiring is adjusted"), + //17 + list("key"=IS_WIRECUTTER, + "backkey"=IS_SCREWDRIVER, + "desc"="The wiring is added"), + //18 + list("key"=/obj/item/stack/cable_coil, + "backkey"=IS_SCREWDRIVER, + "desc"="The hydraulic systems are active."), + //19 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_WRENCH, + "desc"="The hydraulic systems are connected."), + //20 + list("key"=IS_WRENCH, + "desc"="The hydraulic systems are disconnected.") + ) - action(atom/used_atom,mob/user as mob) - return check_step(used_atom,user) +/datum/construction/reversible/mecha/polecat/action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) - custom_action(index, diff, atom/used_atom, mob/user) - if(!..()) - return 0 - //TODO: better messages. - switch(index) - if(20) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") +/datum/construction/reversible/mecha/polecat/custom_action(index, diff, atom/used_atom, mob/user) + if(!..()) + return 0 + //TODO: better messages. + switch(index) + if(20) + user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + holder.icon_state = "polecat1" + if(19) + if(diff==FORWARD) + user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + holder.icon_state = "polecat2" + else + user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + holder.icon_state = "polecat0" + if(18) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + holder.icon_state = "polecat3" + else + user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") holder.icon_state = "polecat1" - if(19) - if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") - holder.icon_state = "polecat2" - else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") - holder.icon_state = "polecat0" - if(18) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") - holder.icon_state = "polecat3" - else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") - holder.icon_state = "polecat1" - if(17) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") - holder.icon_state = "polecat4" - else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") - var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) - coil.amount = 4 - holder.icon_state = "polecat2" - if(16) - if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - qdel(used_atom) - holder.icon_state = "polecat5" - else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") - holder.icon_state = "polecat3" - if(15) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - holder.icon_state = "polecat6" - else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") - new /obj/item/weapon/circuitboard/mecha/polecat/main(get_turf(holder)) - holder.icon_state = "polecat4" - if(14) - if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - qdel(used_atom) - holder.icon_state = "polecat7" - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - holder.icon_state = "polecat5" - if(13) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - holder.icon_state = "polecat8" - else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") - new /obj/item/weapon/circuitboard/mecha/polecat/peripherals(get_turf(holder)) - holder.icon_state = "polecat6" - if(12) - if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - qdel(used_atom) - holder.icon_state = "polecat9" - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - holder.icon_state = "polecat7" - if(11) - if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") - holder.icon_state = "polecat10" - else - user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") - new /obj/item/weapon/circuitboard/mecha/polecat/targeting(get_turf(holder)) - holder.icon_state = "polecat8" - if(10) - if(diff==FORWARD) - user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") - qdel(used_atom) - holder.icon_state = "polecat11" - else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") - holder.icon_state = "polecat9" - if(9) - if(diff==FORWARD) - user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") - holder.icon_state = "polecat12" - else - user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].") - new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) - holder.icon_state = "polecat10" - if(8) - if(diff==FORWARD) - user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") - qdel(used_atom) - holder.icon_state = "polecat13" - else - user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") - holder.icon_state = "polecat11" - if(7) - if(diff==FORWARD) - user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") - holder.icon_state = "polecat14" - else - user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].") - new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) - holder.icon_state = "polecat12" - if(6) - if(diff==FORWARD) - user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") - holder.icon_state = "polecat15" - else - user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") - holder.icon_state = "polecat13" - if(5) - if(diff==FORWARD) - user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") - holder.icon_state = "polecat16" - else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") - var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) - MS.amount = 3 - holder.icon_state = "polecat14" - if(4) - if(diff==FORWARD) - user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") - holder.icon_state = "polecat17" - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "polecat15" - if(3) - if(diff==FORWARD) - user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") - qdel(used_atom)//CHOMPedit upstream port. Fixes polecat not useing it's armor plates up. - holder.icon_state = "polecat18" - else - user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") - holder.icon_state = "polecat16" - if(2) - if(diff==FORWARD) - user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") - holder.icon_state = "polecat19" - else - user.visible_message("[user] pries external armor layer from [holder].", "You pry the external armor layer from [holder].") // Rykka does smol grammar fix. - new /obj/item/mecha_parts/micro/part/polecat_armour(get_turf(holder))// Actually gives you the polecat's armored plates back instead of plasteel. - holder.icon_state = "polecat17" - if(1) - if(diff==FORWARD) - user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") - else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - holder.icon_state = "polecat18" - return 1 + if(17) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + holder.icon_state = "polecat4" + else + user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) + coil.amount = 4 + holder.icon_state = "polecat2" + if(16) + if(diff==FORWARD) + user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + qdel(used_atom) + holder.icon_state = "polecat5" + else + user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + holder.icon_state = "polecat3" + if(15) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + holder.icon_state = "polecat6" + else + user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + new /obj/item/weapon/circuitboard/mecha/polecat/main(get_turf(holder)) + holder.icon_state = "polecat4" + if(14) + if(diff==FORWARD) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + qdel(used_atom) + holder.icon_state = "polecat7" + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + holder.icon_state = "polecat5" + if(13) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + holder.icon_state = "polecat8" + else + user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/polecat/peripherals(get_turf(holder)) + holder.icon_state = "polecat6" + if(12) + if(diff==FORWARD) + user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + qdel(used_atom) + holder.icon_state = "polecat9" + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + holder.icon_state = "polecat7" + if(11) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + holder.icon_state = "polecat10" + else + user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/polecat/targeting(get_turf(holder)) + holder.icon_state = "polecat8" + if(10) + if(diff==FORWARD) + user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") + qdel(used_atom) + holder.icon_state = "polecat11" + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + holder.icon_state = "polecat9" + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") + holder.icon_state = "polecat12" + else + user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].") + new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) + holder.icon_state = "polecat10" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") + qdel(used_atom) + holder.icon_state = "polecat13" + else + user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") + holder.icon_state = "polecat11" + if(7) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") + holder.icon_state = "polecat14" + else + user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].") + new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) + holder.icon_state = "polecat12" + if(6) + if(diff==FORWARD) + user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") + holder.icon_state = "polecat15" + else + user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") + holder.icon_state = "polecat13" + if(5) + if(diff==FORWARD) + user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") + holder.icon_state = "polecat16" + else + user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "polecat14" + if(4) + if(diff==FORWARD) + user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + holder.icon_state = "polecat17" + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + holder.icon_state = "polecat15" + if(3) + if(diff==FORWARD) + user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") + qdel(used_atom)//CHOMPedit upstream port. Fixes polecat not useing it's armor plates up. + holder.icon_state = "polecat18" + else + user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + holder.icon_state = "polecat16" + if(2) + if(diff==FORWARD) + user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") + holder.icon_state = "polecat19" + else + user.visible_message("[user] pries external armor layer from [holder].", "You pry the external armor layer from [holder].") // Rykka does smol grammar fix. + new /obj/item/mecha_parts/micro/part/polecat_armour(get_turf(holder))// Actually gives you the polecat's armored plates back instead of plasteel. + holder.icon_state = "polecat17" + if(1) + if(diff==FORWARD) + user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + holder.icon_state = "polecat18" + return 1 - spawn_result() - ..() - feedback_inc("mecha_polecat_created",1) - return +/datum/construction/reversible/mecha/polecat/spawn_result() + ..() + feedback_inc("mecha_polecat_created",1) + return /datum/construction/mecha/gopher_chassis - steps = list(list("key"=/obj/item/mecha_parts/micro/part/gopher_torso),//1 - list("key"=/obj/item/mecha_parts/micro/part/gopher_left_arm),//2 - list("key"=/obj/item/mecha_parts/micro/part/gopher_right_arm),//3 - list("key"=/obj/item/mecha_parts/micro/part/gopher_left_leg),//4 - list("key"=/obj/item/mecha_parts/micro/part/gopher_right_leg)//5 - ) + steps = list( + list("key"=/obj/item/mecha_parts/micro/part/gopher_torso),//1 + list("key"=/obj/item/mecha_parts/micro/part/gopher_left_arm),//2 + list("key"=/obj/item/mecha_parts/micro/part/gopher_right_arm),//3 + list("key"=/obj/item/mecha_parts/micro/part/gopher_left_leg),//4 + list("key"=/obj/item/mecha_parts/micro/part/gopher_right_leg)//5 + ) - custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") - holder.add_overlay(used_atom.icon_state+"+o") - qdel(used_atom) - return 1 +/datum/construction/mecha/gopher_chassis/custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.add_overlay(used_atom.icon_state+"+o") + qdel(used_atom) + return 1 - action(atom/used_atom,mob/user as mob) - return check_all_steps(used_atom,user) +/datum/construction/mecha/gopher_chassis/action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) - spawn_result() - var/obj/item/mecha_parts/chassis/const_holder = holder - const_holder.construct = new /datum/construction/reversible/mecha/gopher(const_holder) - const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' - const_holder.icon_state = "gopher0" - const_holder.density = 1 - const_holder.overlays.len = 0 - spawn() - qdel(src) - return +/datum/construction/mecha/gopher_chassis/spawn_result() + var/obj/item/mecha_parts/chassis/const_holder = holder + const_holder.construct = new /datum/construction/reversible/mecha/gopher(const_holder) + const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' + const_holder.icon_state = "gopher0" + const_holder.density = 1 + const_holder.overlays.len = 0 + spawn() + qdel(src) + return /datum/construction/reversible/mecha/gopher result = "/obj/mecha/micro/utility/gopher" steps = list( - //1 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=IS_WRENCH, - "desc"="External armor is wrenched."), - //2 - list("key"=IS_WRENCH, - "backkey"=IS_CROWBAR, - "desc"="External armor is installed."), - //3 - list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, - "desc"="Internal armor is welded."), - //4 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=IS_WRENCH, - "desc"="Internal armor is wrenched"), - //5 - list("key"=IS_WRENCH, - "backkey"=IS_CROWBAR, - "desc"="Internal armor is installed"), - //6 - list("key"=/obj/item/stack/material/steel, - "backkey"=IS_SCREWDRIVER, - "desc"="Peripherals control module is secured"), - //7 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Peripherals control module is installed"), - //8 - list("key"=/obj/item/weapon/circuitboard/mecha/gopher/peripherals, - "backkey"=IS_SCREWDRIVER, - "desc"="Central control module is secured"), - //9 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Central control module is installed"), - //10 - list("key"=/obj/item/weapon/circuitboard/mecha/gopher/main, - "backkey"=IS_SCREWDRIVER, - "desc"="The wiring is adjusted"), - //11 - list("key"=IS_WIRECUTTER, - "backkey"=IS_SCREWDRIVER, - "desc"="The wiring is added"), - //12 - list("key"=/obj/item/stack/cable_coil, - "backkey"=IS_SCREWDRIVER, - "desc"="The hydraulic systems are active."), - //13 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_WRENCH, - "desc"="The hydraulic systems are connected."), - //14 - list("key"=IS_WRENCH, - "desc"="The hydraulic systems are disconnected.") - ) + //1 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=IS_WRENCH, + "desc"="External armor is wrenched."), + //2 + list("key"=IS_WRENCH, + "backkey"=IS_CROWBAR, + "desc"="External armor is installed."), + //3 + list("key"=/obj/item/stack/material/plasteel, + "backkey"=/obj/item/weapon/weldingtool, + "desc"="Internal armor is welded."), + //4 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=IS_WRENCH, + "desc"="Internal armor is wrenched"), + //5 + list("key"=IS_WRENCH, + "backkey"=IS_CROWBAR, + "desc"="Internal armor is installed"), + //6 + list("key"=/obj/item/stack/material/steel, + "backkey"=IS_SCREWDRIVER, + "desc"="Peripherals control module is secured"), + //7 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Peripherals control module is installed"), + //8 + list("key"=/obj/item/weapon/circuitboard/mecha/gopher/peripherals, + "backkey"=IS_SCREWDRIVER, + "desc"="Central control module is secured"), + //9 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Central control module is installed"), + //10 + list("key"=/obj/item/weapon/circuitboard/mecha/gopher/main, + "backkey"=IS_SCREWDRIVER, + "desc"="The wiring is adjusted"), + //11 + list("key"=IS_WIRECUTTER, + "backkey"=IS_SCREWDRIVER, + "desc"="The wiring is added"), + //12 + list("key"=/obj/item/stack/cable_coil, + "backkey"=IS_SCREWDRIVER, + "desc"="The hydraulic systems are active."), + //13 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_WRENCH, + "desc"="The hydraulic systems are connected."), + //14 + list("key"=IS_WRENCH, + "desc"="The hydraulic systems are disconnected.") + ) - action(atom/used_atom,mob/user as mob) - return check_step(used_atom,user) +/datum/construction/reversible/mecha/gopher/action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) - custom_action(index, diff, atom/used_atom, mob/user) - if(!..()) - return 0 +/datum/construction/reversible/mecha/gopher/custom_action(index, diff, atom/used_atom, mob/user) + if(!..()) + return 0 - //TODO: better messages. - switch(index) - if(14) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + //TODO: better messages. + switch(index) + if(14) + user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + holder.icon_state = "gopher1" + if(13) + if(diff==FORWARD) + user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + holder.icon_state = "gopher2" + else + user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + holder.icon_state = "gopher0" + if(12) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + holder.icon_state = "gopher3" + else + user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") holder.icon_state = "gopher1" - if(13) - if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") - holder.icon_state = "gopher2" - else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") - holder.icon_state = "gopher0" - if(12) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") - holder.icon_state = "gopher3" - else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") - holder.icon_state = "gopher1" - if(11) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") - holder.icon_state = "gopher4" - else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") - var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) - coil.amount = 4 - holder.icon_state = "gopher2" - if(10) - if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - qdel(used_atom) - holder.icon_state = "gopher5" - else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") - holder.icon_state = "gopher3" - if(9) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - holder.icon_state = "gopher6" - else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") - new /obj/item/weapon/circuitboard/mecha/gopher/main(get_turf(holder)) - holder.icon_state = "gopher4" - if(8) - if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - qdel(used_atom) - holder.icon_state = "gopher7" - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - holder.icon_state = "gopher5" - if(7) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - holder.icon_state = "gopher8" - else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") - new /obj/item/weapon/circuitboard/mecha/gopher/peripherals(get_turf(holder)) - holder.icon_state = "gopher6" - if(6) - if(diff==FORWARD) - user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") - holder.icon_state = "gopher9" - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - holder.icon_state = "gopher7" - if(5) - if(diff==FORWARD) - user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") - holder.icon_state = "gopher10" - else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") - var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) - MS.amount = 3 - holder.icon_state = "gopher8" - if(4) - if(diff==FORWARD) - user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") - holder.icon_state = "gopher11" - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "gopher9" - if(3) - if(diff==FORWARD) - user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") - holder.icon_state = "gopher12" - else - user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") - holder.icon_state = "gopher10" - if(2) - if(diff==FORWARD) - user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") - holder.icon_state = "gopher13" - else - user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") - var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) - MS.amount = 2 - holder.icon_state = "gopher11" - if(1) - if(diff==FORWARD) - user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") - else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - holder.icon_state = "gopher12" - return 1 + if(11) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + holder.icon_state = "gopher4" + else + user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) + coil.amount = 4 + holder.icon_state = "gopher2" + if(10) + if(diff==FORWARD) + user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + qdel(used_atom) + holder.icon_state = "gopher5" + else + user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + holder.icon_state = "gopher3" + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + holder.icon_state = "gopher6" + else + user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + new /obj/item/weapon/circuitboard/mecha/gopher/main(get_turf(holder)) + holder.icon_state = "gopher4" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + qdel(used_atom) + holder.icon_state = "gopher7" + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + holder.icon_state = "gopher5" + if(7) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + holder.icon_state = "gopher8" + else + user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/gopher/peripherals(get_turf(holder)) + holder.icon_state = "gopher6" + if(6) + if(diff==FORWARD) + user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") + holder.icon_state = "gopher9" + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + holder.icon_state = "gopher7" + if(5) + if(diff==FORWARD) + user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") + holder.icon_state = "gopher10" + else + user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "gopher8" + if(4) + if(diff==FORWARD) + user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + holder.icon_state = "gopher11" + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + holder.icon_state = "gopher9" + if(3) + if(diff==FORWARD) + user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") + holder.icon_state = "gopher12" + else + user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + holder.icon_state = "gopher10" + if(2) + if(diff==FORWARD) + user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") + holder.icon_state = "gopher13" + else + user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) + MS.amount = 2 + holder.icon_state = "gopher11" + if(1) + if(diff==FORWARD) + user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + holder.icon_state = "gopher12" + return 1 - spawn_result() - ..() - feedback_inc("mecha_gopher_created",1) - return +/datum/construction/reversible/mecha/gopher/spawn_result() + ..() + feedback_inc("mecha_gopher_created",1) + return /datum/construction/mecha/weasel_chassis - steps = list(list("key"=/obj/item/mecha_parts/micro/part/weasel_torso),//1 - list("key"=/obj/item/mecha_parts/micro/part/weasel_head),//2 - list("key"=/obj/item/mecha_parts/micro/part/weasel_left_arm),//3 - list("key"=/obj/item/mecha_parts/micro/part/weasel_right_arm),//4 - list("key"=/obj/item/mecha_parts/micro/part/weasel_tri_leg),//5 - ) + steps = list( + list("key"=/obj/item/mecha_parts/micro/part/weasel_torso),//1 + list("key"=/obj/item/mecha_parts/micro/part/weasel_head),//2 + list("key"=/obj/item/mecha_parts/micro/part/weasel_left_arm),//3 + list("key"=/obj/item/mecha_parts/micro/part/weasel_right_arm),//4 + list("key"=/obj/item/mecha_parts/micro/part/weasel_tri_leg),//5 + ) - custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") - holder.add_overlay(used_atom.icon_state+"+o") - qdel(used_atom) - return 1 +/datum/construction/mecha/weasel_chassis/custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.add_overlay(used_atom.icon_state+"+o") + qdel(used_atom) + return 1 - action(atom/used_atom,mob/user as mob) - return check_all_steps(used_atom,user) +/datum/construction/mecha/weasel_chassis/action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) - spawn_result() - var/obj/item/mecha_parts/chassis/const_holder = holder - const_holder.construct = new /datum/construction/reversible/mecha/weasel(const_holder) - const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' - const_holder.icon_state = "weasel0" - const_holder.density = 1 - const_holder.overlays.len = 0 - spawn() - qdel(src) - return +/datum/construction/mecha/weasel_chassis/spawn_result() + var/obj/item/mecha_parts/chassis/const_holder = holder + const_holder.construct = new /datum/construction/reversible/mecha/weasel(const_holder) + const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' + const_holder.icon_state = "weasel0" + const_holder.density = 1 + const_holder.overlays.len = 0 + spawn() + qdel(src) + return /datum/construction/reversible/mecha/weasel result = "/obj/mecha/micro/sec/weasel" steps = list( - //1 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=IS_WRENCH, - "desc"="External armor is wrenched."), - //2 - list("key"=IS_WRENCH, - "backkey"=IS_CROWBAR, - "desc"="External armor is installed."), - //3 - list("key"=/obj/item/stack/material/plasteel, - "backkey"=/obj/item/weapon/weldingtool, - "desc"="Internal armor is welded."), - //4 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=IS_WRENCH, - "desc"="Internal armor is wrenched"), - //5 - list("key"=IS_WRENCH, - "backkey"=IS_CROWBAR, - "desc"="Internal armor is installed"), - //6 - list("key"=/obj/item/stack/material/steel, - "backkey"=IS_SCREWDRIVER, - "desc"="Advanced capacitor is secured"), - //7 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Advanced capacitor is installed"), - //8 - list("key"=/obj/item/weapon/stock_parts/capacitor/adv, - "backkey"=IS_SCREWDRIVER, - "desc"="Advanced scanner module is secured"), - //9 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Advanced scanner module is installed"), - //10 - list("key"=/obj/item/weapon/stock_parts/scanning_module/adv, - "backkey"=IS_SCREWDRIVER, - "desc"="Targeting module is secured"), - //11 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Targeting module is installed"), - //12 - list("key"=/obj/item/weapon/circuitboard/mecha/weasel/targeting, - "backkey"=IS_SCREWDRIVER, - "desc"="Peripherals control module is secured"), - //13 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Peripherals control module is installed"), - //14 - list("key"=/obj/item/weapon/circuitboard/mecha/weasel/peripherals, - "backkey"=IS_SCREWDRIVER, - "desc"="Central control module is secured"), - //15 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_CROWBAR, - "desc"="Central control module is installed"), - //16 - list("key"=/obj/item/weapon/circuitboard/mecha/weasel/main, - "backkey"=IS_SCREWDRIVER, - "desc"="The wiring is adjusted"), - //17 - list("key"=IS_WIRECUTTER, - "backkey"=IS_SCREWDRIVER, - "desc"="The wiring is added"), - //18 - list("key"=/obj/item/stack/cable_coil, - "backkey"=IS_SCREWDRIVER, - "desc"="The hydraulic systems are active."), - //19 - list("key"=IS_SCREWDRIVER, - "backkey"=IS_WRENCH, - "desc"="The hydraulic systems are connected."), - //20 - list("key"=IS_WRENCH, - "desc"="The hydraulic systems are disconnected.") - ) + //1 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=IS_WRENCH, + "desc"="External armor is wrenched."), + //2 + list("key"=IS_WRENCH, + "backkey"=IS_CROWBAR, + "desc"="External armor is installed."), + //3 + list("key"=/obj/item/stack/material/plasteel, + "backkey"=/obj/item/weapon/weldingtool, + "desc"="Internal armor is welded."), + //4 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=IS_WRENCH, + "desc"="Internal armor is wrenched"), + //5 + list("key"=IS_WRENCH, + "backkey"=IS_CROWBAR, + "desc"="Internal armor is installed"), + //6 + list("key"=/obj/item/stack/material/steel, + "backkey"=IS_SCREWDRIVER, + "desc"="Advanced capacitor is secured"), + //7 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Advanced capacitor is installed"), + //8 + list("key"=/obj/item/weapon/stock_parts/capacitor/adv, + "backkey"=IS_SCREWDRIVER, + "desc"="Advanced scanner module is secured"), + //9 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Advanced scanner module is installed"), + //10 + list("key"=/obj/item/weapon/stock_parts/scanning_module/adv, + "backkey"=IS_SCREWDRIVER, + "desc"="Targeting module is secured"), + //11 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Targeting module is installed"), + //12 + list("key"=/obj/item/weapon/circuitboard/mecha/weasel/targeting, + "backkey"=IS_SCREWDRIVER, + "desc"="Peripherals control module is secured"), + //13 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Peripherals control module is installed"), + //14 + list("key"=/obj/item/weapon/circuitboard/mecha/weasel/peripherals, + "backkey"=IS_SCREWDRIVER, + "desc"="Central control module is secured"), + //15 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_CROWBAR, + "desc"="Central control module is installed"), + //16 + list("key"=/obj/item/weapon/circuitboard/mecha/weasel/main, + "backkey"=IS_SCREWDRIVER, + "desc"="The wiring is adjusted"), + //17 + list("key"=IS_WIRECUTTER, + "backkey"=IS_SCREWDRIVER, + "desc"="The wiring is added"), + //18 + list("key"=/obj/item/stack/cable_coil, + "backkey"=IS_SCREWDRIVER, + "desc"="The hydraulic systems are active."), + //19 + list("key"=IS_SCREWDRIVER, + "backkey"=IS_WRENCH, + "desc"="The hydraulic systems are connected."), + //20 + list("key"=IS_WRENCH, + "desc"="The hydraulic systems are disconnected.") + ) - action(atom/used_atom,mob/user as mob) - return check_step(used_atom,user) +/datum/construction/reversible/mecha/weasel/action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) - custom_action(index, diff, atom/used_atom, mob/user) - if(!..()) - return 0 - //TODO: better messages. - switch(index) - if(20) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") +/datum/construction/reversible/mecha/weasel/custom_action(index, diff, atom/used_atom, mob/user) + if(!..()) + return 0 + //TODO: better messages. + switch(index) + if(20) + user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + holder.icon_state = "weasel1" + if(19) + if(diff==FORWARD) + user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + holder.icon_state = "weasel2" + else + user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + holder.icon_state = "weasel0" + if(18) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + holder.icon_state = "weasel3" + else + user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") holder.icon_state = "weasel1" - if(19) - if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") - holder.icon_state = "weasel2" - else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") - holder.icon_state = "weasel0" - if(18) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") - holder.icon_state = "weasel3" - else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") - holder.icon_state = "weasel1" - if(17) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") - holder.icon_state = "weasel4" - else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") - var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) - coil.amount = 4 - holder.icon_state = "weasel2" - if(16) - if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - qdel(used_atom) - holder.icon_state = "weasel5" - else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") - holder.icon_state = "weasel3" - if(15) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - holder.icon_state = "weasel6" - else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") - new /obj/item/weapon/circuitboard/mecha/weasel/main(get_turf(holder)) - holder.icon_state = "weasel4" - if(14) - if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - qdel(used_atom) - holder.icon_state = "weasel7" - else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") - holder.icon_state = "weasel5" - if(13) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") - holder.icon_state = "weasel8" - else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") - new /obj/item/weapon/circuitboard/mecha/weasel/peripherals(get_turf(holder)) - holder.icon_state = "weasel6" - if(12) - if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - qdel(used_atom) - holder.icon_state = "weasel9" - else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") - holder.icon_state = "weasel7" - if(11) - if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") - holder.icon_state = "weasel10" - else - user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") - new /obj/item/weapon/circuitboard/mecha/weasel/targeting(get_turf(holder)) - holder.icon_state = "weasel8" - if(10) - if(diff==FORWARD) - user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") - qdel(used_atom) - holder.icon_state = "weasel11" - else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") - holder.icon_state = "weasel9" - if(9) - if(diff==FORWARD) - user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") - holder.icon_state = "weasel12" - else - user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].") - new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) - holder.icon_state = "weasel10" - if(8) - if(diff==FORWARD) - user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") - qdel(used_atom) - holder.icon_state = "weasel13" - else - user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") - holder.icon_state = "weasel11" - if(7) - if(diff==FORWARD) - user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") - holder.icon_state = "weasel14" - else - user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].") - new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) - holder.icon_state = "weasel12" - if(6) - if(diff==FORWARD) - user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") - holder.icon_state = "weasel15" - else - user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") - holder.icon_state = "weasel13" - if(5) - if(diff==FORWARD) - user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") - holder.icon_state = "weasel16" - else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") - var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) - MS.amount = 3 - holder.icon_state = "weasel14" - if(4) - if(diff==FORWARD) - user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") - holder.icon_state = "weasel17" - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "weasel15" - if(3) - if(diff==FORWARD) - user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") - holder.icon_state = "weasel18" - else - user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") - holder.icon_state = "weasel16" - if(2) - if(diff==FORWARD) - user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") - holder.icon_state = "weasel19" - else - user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") - var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) - MS.amount = 3 - holder.icon_state = "weasel17" - if(1) - if(diff==FORWARD) - user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") - else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - holder.icon_state = "weasel18" - return 1 + if(17) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + holder.icon_state = "weasel4" + else + user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) + coil.amount = 4 + holder.icon_state = "weasel2" + if(16) + if(diff==FORWARD) + user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + qdel(used_atom) + holder.icon_state = "weasel5" + else + user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + holder.icon_state = "weasel3" + if(15) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + holder.icon_state = "weasel6" + else + user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + new /obj/item/weapon/circuitboard/mecha/weasel/main(get_turf(holder)) + holder.icon_state = "weasel4" + if(14) + if(diff==FORWARD) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + qdel(used_atom) + holder.icon_state = "weasel7" + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + holder.icon_state = "weasel5" + if(13) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + holder.icon_state = "weasel8" + else + user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/weasel/peripherals(get_turf(holder)) + holder.icon_state = "weasel6" + if(12) + if(diff==FORWARD) + user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + qdel(used_atom) + holder.icon_state = "weasel9" + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + holder.icon_state = "weasel7" + if(11) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + holder.icon_state = "weasel10" + else + user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/weasel/targeting(get_turf(holder)) + holder.icon_state = "weasel8" + if(10) + if(diff==FORWARD) + user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") + qdel(used_atom) + holder.icon_state = "weasel11" + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + holder.icon_state = "weasel9" + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") + holder.icon_state = "weasel12" + else + user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].") + new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) + holder.icon_state = "weasel10" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") + qdel(used_atom) + holder.icon_state = "weasel13" + else + user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") + holder.icon_state = "weasel11" + if(7) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") + holder.icon_state = "weasel14" + else + user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].") + new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) + holder.icon_state = "weasel12" + if(6) + if(diff==FORWARD) + user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") + holder.icon_state = "weasel15" + else + user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") + holder.icon_state = "weasel13" + if(5) + if(diff==FORWARD) + user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") + holder.icon_state = "weasel16" + else + user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "weasel14" + if(4) + if(diff==FORWARD) + user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + holder.icon_state = "weasel17" + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + holder.icon_state = "weasel15" + if(3) + if(diff==FORWARD) + user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") + holder.icon_state = "weasel18" + else + user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + holder.icon_state = "weasel16" + if(2) + if(diff==FORWARD) + user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") + holder.icon_state = "weasel19" + else + user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "weasel17" + if(1) + if(diff==FORWARD) + user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + holder.icon_state = "weasel18" + return 1 - spawn_result() - ..() - feedback_inc("mecha_weasel_created",1) - return +/datum/construction/reversible/mecha/weasel/spawn_result() + ..() + feedback_inc("mecha_weasel_created",1) + return diff --git a/code/game/mecha/micro/mecha_parts_vr.dm b/code/game/mecha/micro/mecha_parts_vr.dm index 59f6714351..fa07c8d8c4 100644 --- a/code/game/mecha/micro/mecha_parts_vr.dm +++ b/code/game/mecha/micro/mecha_parts_vr.dm @@ -7,26 +7,27 @@ w_class = ITEMSIZE_NORMAL -/obj/item/mecha_parts/micro/chassis/ +/obj/item/mecha_parts/micro/chassis name="Mecha Chassis" icon_state = "backbone" var/datum/construction/construct - attackby(obj/item/W as obj, mob/user as mob) - if(!construct || !construct.action(W, user)) - ..() - return +/obj/item/mecha_parts/micro/chassis/attackby(obj/item/W as obj, mob/user as mob) + if(!construct || !construct.action(W, user)) + ..() + return + +/obj/item/mecha_parts/micro/chassis/attack_hand() + return - attack_hand() - return //Gopher /obj/item/mecha_parts/micro/chassis/gopher name = "Gopher Chassis" icon_state = "gopher-chassis" - New() - ..() - construct = new /datum/construction/mecha/gopher_chassis(src) +/obj/item/mecha_parts/micro/chassis/gopher/New() + ..() + construct = new /datum/construction/mecha/gopher_chassis(src) /obj/item/mecha_parts/micro/part/gopher_torso name="Gopher Torso" @@ -62,9 +63,10 @@ /obj/item/mecha_parts/micro/chassis/polecat name = "Polecat Chassis" icon_state = "polecat-chassis" - New() - ..() - construct = new /datum/construction/mecha/polecat_chassis(src) + +/obj/item/mecha_parts/micro/chassis/polecat/New() + ..() + construct = new /datum/construction/mecha/polecat_chassis(src) /obj/item/mecha_parts/micro/part/polecat_torso name="Polecat Torso" @@ -100,9 +102,10 @@ /obj/item/mecha_parts/micro/chassis/weasel name = "Weasel Chassis" icon_state = "weasel-chassis" - New() - ..() - construct = new /datum/construction/mecha/weasel_chassis(src) + +/obj/item/mecha_parts/micro/chassis/weasel/New() + ..() + construct = new /datum/construction/mecha/weasel_chassis(src) /obj/item/mecha_parts/micro/part/weasel_torso name="Weasel Torso" diff --git a/code/game/mecha/micro/micro_equipment.dm b/code/game/mecha/micro/micro_equipment.dm index d36f9fa0a3..127f5b9323 100644 --- a/code/game/mecha/micro/micro_equipment.dm +++ b/code/game/mecha/micro/micro_equipment.dm @@ -61,25 +61,25 @@ equip_type = EQUIP_MICRO_WEAPON required_type = list(/obj/mecha/micro/sec) - Topic(href,href_list) - ..() - if(href_list["mode"]) - mode = text2num(href_list["mode"]) - switch(mode) - if(0) - occupant_message("Now firing buckshot.") - projectile = /obj/item/projectile/bullet/pellet/shotgun - if(1) - occupant_message("Now firing beanbags.") - projectile = /obj/item/projectile/bullet/shotgun/beanbag - if(2) - occupant_message("Now firing slugs.") - projectile = /obj/item/projectile/bullet/shotgun +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun/Topic(href,href_list) + ..() + if(href_list["mode"]) + mode = text2num(href_list["mode"]) + switch(mode) + if(0) + occupant_message("Now firing buckshot.") + projectile = /obj/item/projectile/bullet/pellet/shotgun + if(1) + occupant_message("Now firing beanbags.") + projectile = /obj/item/projectile/bullet/shotgun/beanbag + if(2) + occupant_message("Now firing slugs.") + projectile = /obj/item/projectile/bullet/shotgun - return + return - get_equip_info() - return "[..()] \[BS|BB|S\]" +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun/get_equip_info() + return "[..()] \[BS|BB|S\]" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/grenade/microflashbang @@ -113,44 +113,44 @@ equip_type = EQUIP_MICRO_UTILITY required_type = list(/obj/mecha/micro/utility) - action(atom/target) - if(!action_checks(target)) return - if(isobj(target)) - var/obj/target_obj = target - if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return - set_ready_state(0) - chassis.use_power(energy_drain) - chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") - occupant_message("You start to drill [target]") - var/T = chassis.loc - var/C = target.loc //why are these backwards? we may never know -Pete - if(do_after_cooldown(target)) - if(T == chassis.loc && src == chassis.selected) - if(istype(target, /turf/simulated/wall)) - var/turf/simulated/wall/W = target - if(W.reinf_material) - occupant_message("[target] is too durable to drill through.") - else - log_message("Drilled through [target]") - target.ex_act(2) - else if(istype(target, /turf/simulated/mineral)) - for(var/turf/simulated/mineral/M in range(chassis,1)) - if(get_dir(chassis,M)&chassis.dir) - M.GetDrilled() - log_message("Drilled through [target]") - var/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/ore_box = (locate(/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop) in chassis.equipment) - if(ore_box) - for(var/obj/item/weapon/ore/ore in range(chassis,1)) - if(get_dir(chassis,ore)&chassis.dir) - if (ore_box.contents.len >= ore_box.orecapacity) - occupant_message("The ore compartment is full.") - return 1 - else - ore.forceMove(ore_box) - else if(target.loc == C) +/obj/item/mecha_parts/mecha_equipment/tool/drill/micro/action(atom/target) + if(!action_checks(target)) return + if(isobj(target)) + var/obj/target_obj = target + if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return + set_ready_state(0) + chassis.use_power(energy_drain) + chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") + occupant_message("You start to drill [target]") + var/T = chassis.loc + var/C = target.loc //why are these backwards? we may never know -Pete + if(do_after_cooldown(target)) + if(T == chassis.loc && src == chassis.selected) + if(istype(target, /turf/simulated/wall)) + var/turf/simulated/wall/W = target + if(W.reinf_material) + occupant_message("[target] is too durable to drill through.") + else log_message("Drilled through [target]") target.ex_act(2) - return 1 + else if(istype(target, /turf/simulated/mineral)) + for(var/turf/simulated/mineral/M in range(chassis,1)) + if(get_dir(chassis,M)&chassis.dir) + M.GetDrilled() + log_message("Drilled through [target]") + var/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/ore_box = (locate(/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop) in chassis.equipment) + if(ore_box) + for(var/obj/item/weapon/ore/ore in range(chassis,1)) + if(get_dir(chassis,ore)&chassis.dir) + if (ore_box.contents.len >= ore_box.orecapacity) + occupant_message("The ore compartment is full.") + return 1 + else + ore.forceMove(ore_box) + else if(target.loc == C) + log_message("Drilled through [target]") + target.ex_act(2) + return 1 /obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop @@ -165,38 +165,38 @@ required_type = list(/obj/mecha/micro/utility) var/orecapacity = 500 - action(atom/target) - if(!action_checks(target)) return - set_ready_state(0) - chassis.use_power(energy_drain) - chassis.visible_message("[chassis] sweeps around with its ore scoop.") - occupant_message("You sweep around the area with the scoop.") - var/T = chassis.loc - //var/C = target.loc //why are these backwards? we may never know -Pete - if(do_after_cooldown(target)) - if(T == chassis.loc && src == chassis.selected) - for(var/obj/item/weapon/ore/ore in range(chassis,1)) - if(get_dir(chassis,ore)&chassis.dir) - if (contents.len >= orecapacity) - occupant_message("The ore compartment is full.") - return 1 - else - ore.Move(src) - return 1 +/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/action(atom/target) + if(!action_checks(target)) return + set_ready_state(0) + chassis.use_power(energy_drain) + chassis.visible_message("[chassis] sweeps around with its ore scoop.") + occupant_message("You sweep around the area with the scoop.") + var/T = chassis.loc + //var/C = target.loc //why are these backwards? we may never know -Pete + if(do_after_cooldown(target)) + if(T == chassis.loc && src == chassis.selected) + for(var/obj/item/weapon/ore/ore in range(chassis,1)) + if(get_dir(chassis,ore)&chassis.dir) + if (contents.len >= orecapacity) + occupant_message("The ore compartment is full.") + return 1 + else + ore.Move(src) + return 1 - Topic(href,href_list) - ..() - if (href_list["empty_box"]) - if(contents.len < 1) - occupant_message("The ore compartment is empty.") - return - for (var/obj/item/weapon/ore/O in contents) - contents -= O - O.loc = chassis.loc - occupant_message("Ore compartment emptied.") +/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/Topic(href,href_list) + ..() + if (href_list["empty_box"]) + if(contents.len < 1) + occupant_message("The ore compartment is empty.") + return + for (var/obj/item/weapon/ore/O in contents) + contents -= O + O.loc = chassis.loc + occupant_message("Ore compartment emptied.") - get_equip_info() - return "[..()]
Empty ore compartment" +/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/get_equip_info() + return "[..()]
Empty ore compartment" /obj/item/mecha_parts/mecha_equipment/tool/orescoop/verb/empty_box() //so you can still get the ore out if someone detaches it from the mech set name = "Empty Ore compartment" diff --git a/code/game/objects/effects/confetti_vr.dm b/code/game/objects/effects/confetti_vr.dm index a54733c126..92e5e5bdeb 100644 --- a/code/game/objects/effects/confetti_vr.dm +++ b/code/game/objects/effects/confetti_vr.dm @@ -10,33 +10,33 @@ /datum/effect/effect/system/confetti_spread var/total_sparks = 0 // To stop it being spammed and lagging! - set_up(n = 3, c = 0, loca) - if(n > 10) - n = 10 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) +/datum/effect/effect/system/confetti_spread/set_up(n = 3, c = 0, loca) + if(n > 10) + n = 10 + number = n + cardinals = c + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) - start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/sparks/confetti = new /obj/effect/effect/sparks/confetti(src.location) - src.total_sparks++ - var/direction - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) + return + spawn(0) + if(holder) + src.location = get_turf(holder) + var/obj/effect/effect/sparks/confetti = new /obj/effect/effect/sparks/confetti(src.location) + src.total_sparks++ + var/direction + if(src.cardinals) + direction = pick(cardinal) + else + direction = pick(alldirs) + for(i=0, i>4 - - if(track.overlay) - track.overlay=null - var/image/I = image(icon, icon_state=state, dir=num2dir(truedir)) - I.color = track.basecolor - - track.fresh=0 - track.overlay=I - stack[stack_idx]=track - add_overlay(I) - updatedtracks=0 // Clear our memory of updated tracks. -======= /obj/effect/decal/cleanable/blood/tracks/proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808") var/updated=0 // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. @@ -211,7 +129,7 @@ var/global/list/image/fluidtrack_cache=list() update_icon() /obj/effect/decal/cleanable/blood/tracks/update_icon() - overlays.Cut() + cut_overlays() color = "#FFFFFF" var/truedir=0 @@ -232,9 +150,8 @@ var/global/list/image/fluidtrack_cache=list() track.fresh=0 track.overlay=I stack[stack_idx]=track - overlays += I + add_overlay(I) updatedtracks=0 // Clear our memory of updated tracks. ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/effect/decal/cleanable/blood/tracks/footprints name = "wet footprints" diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 133cdb5f22..559157af29 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -24,12 +24,7 @@ mainOverlay.Blend(main,ICON_ADD) shadeOverlay.Blend(shade,ICON_ADD) -<<<<<<< HEAD - add_overlay(mainOverlay) - add_overlay(shadeOverlay) -======= - overlays += mainOverlay - overlays += shadeOverlay ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + add_overlay(mainOverlay) + add_overlay(shadeOverlay) add_hiddenprint(usr) \ No newline at end of file diff --git a/code/game/objects/items/devices/communicator/UI_tgui.dm b/code/game/objects/items/devices/communicator/UI_tgui.dm index 4745a02488..989d68078e 100644 --- a/code/game/objects/items/devices/communicator/UI_tgui.dm +++ b/code/game/objects/items/devices/communicator/UI_tgui.dm @@ -436,5 +436,3 @@ if("newsfeed") newsfeed_channel = text2num(params["newsfeed"]) - -#undef DEFAULT_MAP_SIZE \ No newline at end of file diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index a406247400..00fa10f137 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -9,61 +9,6 @@ var/icon/virtualIcon var/list/bulletholes = list() -<<<<<<< HEAD - Destroy() - // if a target is deleted and associated with a stake, force stake to forget - for(var/obj/structure/target_stake/T in view(3,src)) - if(T.pinned_target == src) - T.pinned_target = null - T.density = 1 - break - ..() // delete target - - Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - // After target moves, check for nearby stakes. If associated, move to target - for(var/obj/structure/target_stake/M in view(3,src)) - if(M.density == 0 && M.pinned_target == src) - M.forceMove(loc) - - // This may seem a little counter-intuitive but I assure you that's for a purpose. - // Stakes are the ones that carry targets, yes, but in the stake code we set - // a stake's density to 0 meaning it can't be pushed anymore. Instead of pushing - // the stake now, we have to push the target. - - - - attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - cut_overlays() - to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") - return - - - attack_hand(mob/user as mob) - // taking pinned targets off! - var/obj/structure/target_stake/stake - for(var/obj/structure/target_stake/T in view(3,src)) - if(T.pinned_target == src) - stake = T - break - - if(stake) - if(stake.pinned_target) - stake.density = 1 - density = 0 - layer = OBJ_LAYER - - loc = user.loc - if(ishuman(user)) - if(!user.get_active_hand()) - user.put_in_hands(src) - to_chat(user, "You take the target out of the stake.") - else - src.loc = get_turf(user) -======= /obj/item/target/Destroy() // if a target is deleted and associated with a stake, force stake to forget for(var/obj/structure/target_stake/T in view(3,src)) @@ -91,7 +36,7 @@ if (istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) - overlays.Cut() + cut_overlays() to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") return @@ -114,7 +59,6 @@ if(ishuman(user)) if(!user.get_active_hand()) user.put_in_hands(src) ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) to_chat(user, "You take the target out of the stake.") else src.loc = get_turf(user) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 36e20414f9..d31ed74dcf 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -430,6 +430,6 @@ /datum/stack_recipe_list var/title = "ERROR" var/list/recipes = null - New(title, recipes) - src.title = title - src.recipes = recipes +/datum/stack_recipe_list/New(title, recipes) + src.title = title + src.recipes = recipes diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index eda37941a1..59505d3f71 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -10,13 +10,13 @@ var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this var/no_message = "You aren't the appropriate taur type to wear this!" - mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) - if(..()) - if(istype(H) && istype(H.tail_style, taurtype)) - return 1 - else - to_chat(H, "[no_message]") - return 0 +/obj/item/weapon/storage/backpack/saddlebag/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(istype(H) && istype(H.tail_style, taurtype)) + return 1 + else + to_chat(H, "[no_message]") + return 0 /* If anyone wants to make some... this is how you would. /obj/item/weapon/storage/backpack/saddlebag/spider @@ -38,15 +38,15 @@ slowdown = 1 //And are slower, too... var/no_message = "You aren't the appropriate taur type to wear this!" - mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) - if(..()) - if(!istype(H))//Error, non HUMAN. - log_runtime("[H] was not a valid human!") - return +/obj/item/weapon/storage/backpack/saddlebag_common/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(!istype(H))//Error, non HUMAN. + log_runtime("[H] was not a valid human!") + return - var/datum/sprite_accessory/tail/taur/TT = H.tail_style - item_state = "[icon_base]_[TT.icon_sprite_tag]" //icon_sprite_tag is something like "deer" - return 1 + var/datum/sprite_accessory/tail/taur/TT = H.tail_style + item_state = "[icon_base]_[TT.icon_sprite_tag]" //icon_sprite_tag is something like "deer" + return 1 diff --git a/code/game/objects/random/mob_vr.dm b/code/game/objects/random/mob_vr.dm index fdb41ada59..2f8c874d8f 100644 --- a/code/game/objects/random/mob_vr.dm +++ b/code/game/objects/random/mob_vr.dm @@ -4,88 +4,88 @@ icon = 'icons/obj/gun.dmi' icon_state = "p08" spawn_nothing_percentage = 50 - item_to_spawn() - return pick(prob(11);/obj/random/ammo_all,\ - prob(11);/obj/item/weapon/gun/energy/laser,\ - prob(11);/obj/item/weapon/gun/projectile/pirate,\ - prob(10);/obj/item/weapon/material/twohanded/spear,\ - prob(10);/obj/item/weapon/gun/energy/stunrevolver,\ - prob(10);/obj/item/weapon/gun/energy/taser,\ - prob(10);/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet,\ - prob(10);/obj/item/weapon/material/knife,\ - prob(10);/obj/item/weapon/gun/projectile/luger,\ - /* prob(10);/obj/item/weapon/gun/projectile/pipegun,\ */ - prob(10);/obj/item/weapon/gun/projectile/revolver/detective,\ - prob(10);/obj/item/weapon/gun/projectile/revolver/judge,\ - prob(10);/obj/item/weapon/gun/projectile/colt,\ - prob(10);/obj/item/weapon/gun/projectile/shotgun/pump,\ - prob(10);/obj/item/weapon/gun/projectile/shotgun/pump/rifle,\ - prob(10);/obj/item/weapon/melee/baton,\ - prob(10);/obj/item/weapon/melee/telebaton,\ - prob(10);/obj/item/weapon/melee/classic_baton,\ - prob(9);/obj/item/weapon/gun/projectile/automatic/wt550/lethal,\ - prob(9);/obj/item/weapon/gun/projectile/automatic/pdw,\ - prob(9);/obj/item/weapon/gun/projectile/automatic/sol, \ - prob(9);/obj/item/weapon/gun/energy/crossbow/largecrossbow,\ - prob(9);/obj/item/weapon/gun/projectile/pistol,\ - prob(9);/obj/item/weapon/gun/projectile/shotgun/pump,\ - prob(9);/obj/item/weapon/cane/concealed,\ - prob(9);/obj/item/weapon/gun/energy/gun,\ - prob(8);/obj/item/weapon/gun/energy/retro,\ - prob(8);/obj/item/weapon/gun/energy/gun/eluger,\ - prob(8);/obj/item/weapon/gun/energy/xray,\ - prob(8);/obj/item/weapon/gun/projectile/automatic/c20r,\ - prob(8);/obj/item/weapon/melee/energy/sword,\ - prob(8);/obj/item/weapon/gun/projectile/derringer,\ - prob(8);/obj/item/weapon/gun/projectile/revolver/lemat,\ - /* prob(8);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin,\ */ - /* prob(8);/obj/item/weapon/gun/projectile/automatic/m41a,\ */ - prob(7);/obj/item/weapon/material/butterfly,\ - prob(7);/obj/item/weapon/material/butterfly/switchblade,\ - prob(7);/obj/item/weapon/gun/projectile/giskard,\ - prob(7);/obj/item/weapon/gun/projectile/automatic/p90,\ - prob(7);/obj/item/weapon/gun/projectile/automatic/sts35,\ - prob(7);/obj/item/weapon/gun/projectile/shotgun/pump/combat,\ - prob(6);/obj/item/weapon/gun/energy/sniperrifle,\ - prob(6);/obj/item/weapon/gun/projectile/automatic/z8,\ - prob(6);/obj/item/weapon/gun/energy/captain,\ - prob(6);/obj/item/weapon/material/knife/tacknife,\ - prob(5);/obj/item/weapon/gun/projectile/shotgun/pump/USDF,\ - prob(5);/obj/item/weapon/gun/projectile/giskard/olivaw,\ - prob(5);/obj/item/weapon/gun/projectile/revolver/consul,\ - prob(5);/obj/item/weapon/gun/projectile/revolver/mateba,\ - prob(5);/obj/item/weapon/gun/projectile/revolver,\ - prob(4);/obj/item/weapon/gun/projectile/deagle,\ - prob(4);/obj/item/weapon/material/knife/tacknife/combatknife,\ - prob(4);/obj/item/weapon/melee/energy/sword,\ - prob(4);/obj/item/weapon/gun/projectile/automatic/mini_uzi,\ - prob(4);/obj/item/weapon/gun/projectile/contender,\ - prob(4);/obj/item/weapon/gun/projectile/contender/tacticool,\ - prob(3);/obj/item/weapon/gun/projectile/SVD,\ - prob(3);/obj/item/weapon/gun/energy/lasercannon,\ - prob(3);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever,\ - prob(3);/obj/item/weapon/gun/projectile/automatic/bullpup,\ - prob(2);/obj/item/weapon/gun/energy/pulse_rifle,\ - prob(2);/obj/item/weapon/gun/energy/gun/nuclear,\ - prob(2);/obj/item/weapon/gun/projectile/automatic/l6_saw,\ - prob(2);/obj/item/weapon/gun/energy/gun/burst,\ - prob(2);/obj/item/weapon/storage/box/frags,\ - prob(2);/obj/item/weapon/twohanded/fireaxe,\ - prob(2);/obj/item/weapon/gun/projectile/luger/brown,\ - prob(2);/obj/item/weapon/gun/launcher/crossbow,\ - /* prob(1);/obj/item/weapon/gun/projectile/automatic/battlerifle,\ */ // Too OP - prob(1);/obj/item/weapon/gun/projectile/deagle/gold,\ - prob(1);/obj/item/weapon/gun/energy/imperial,\ - prob(1);/obj/item/weapon/gun/projectile/automatic/as24,\ - prob(1);/obj/item/weapon/gun/launcher/rocket,\ - prob(1);/obj/item/weapon/gun/launcher/grenade,\ - prob(1);/obj/item/weapon/gun/projectile/gyropistol,\ - prob(1);/obj/item/weapon/gun/projectile/heavysniper,\ - prob(1);/obj/item/weapon/plastique,\ - prob(1);/obj/item/weapon/gun/energy/ionrifle,\ - prob(1);/obj/item/weapon/material/sword,\ - prob(1);/obj/item/weapon/cane/concealed,\ - prob(1);/obj/item/weapon/material/sword/katana) +/obj/random/weapon/item_to_spawn() + return pick(prob(11);/obj/random/ammo_all,\ + prob(11);/obj/item/weapon/gun/energy/laser,\ + prob(11);/obj/item/weapon/gun/projectile/pirate,\ + prob(10);/obj/item/weapon/material/twohanded/spear,\ + prob(10);/obj/item/weapon/gun/energy/stunrevolver,\ + prob(10);/obj/item/weapon/gun/energy/taser,\ + prob(10);/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet,\ + prob(10);/obj/item/weapon/material/knife,\ + prob(10);/obj/item/weapon/gun/projectile/luger,\ + /* prob(10);/obj/item/weapon/gun/projectile/pipegun,\ */ + prob(10);/obj/item/weapon/gun/projectile/revolver/detective,\ + prob(10);/obj/item/weapon/gun/projectile/revolver/judge,\ + prob(10);/obj/item/weapon/gun/projectile/colt,\ + prob(10);/obj/item/weapon/gun/projectile/shotgun/pump,\ + prob(10);/obj/item/weapon/gun/projectile/shotgun/pump/rifle,\ + prob(10);/obj/item/weapon/melee/baton,\ + prob(10);/obj/item/weapon/melee/telebaton,\ + prob(10);/obj/item/weapon/melee/classic_baton,\ + prob(9);/obj/item/weapon/gun/projectile/automatic/wt550/lethal,\ + prob(9);/obj/item/weapon/gun/projectile/automatic/pdw,\ + prob(9);/obj/item/weapon/gun/projectile/automatic/sol, \ + prob(9);/obj/item/weapon/gun/energy/crossbow/largecrossbow,\ + prob(9);/obj/item/weapon/gun/projectile/pistol,\ + prob(9);/obj/item/weapon/gun/projectile/shotgun/pump,\ + prob(9);/obj/item/weapon/cane/concealed,\ + prob(9);/obj/item/weapon/gun/energy/gun,\ + prob(8);/obj/item/weapon/gun/energy/retro,\ + prob(8);/obj/item/weapon/gun/energy/gun/eluger,\ + prob(8);/obj/item/weapon/gun/energy/xray,\ + prob(8);/obj/item/weapon/gun/projectile/automatic/c20r,\ + prob(8);/obj/item/weapon/melee/energy/sword,\ + prob(8);/obj/item/weapon/gun/projectile/derringer,\ + prob(8);/obj/item/weapon/gun/projectile/revolver/lemat,\ + /* prob(8);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin,\ */ + /* prob(8);/obj/item/weapon/gun/projectile/automatic/m41a,\ */ + prob(7);/obj/item/weapon/material/butterfly,\ + prob(7);/obj/item/weapon/material/butterfly/switchblade,\ + prob(7);/obj/item/weapon/gun/projectile/giskard,\ + prob(7);/obj/item/weapon/gun/projectile/automatic/p90,\ + prob(7);/obj/item/weapon/gun/projectile/automatic/sts35,\ + prob(7);/obj/item/weapon/gun/projectile/shotgun/pump/combat,\ + prob(6);/obj/item/weapon/gun/energy/sniperrifle,\ + prob(6);/obj/item/weapon/gun/projectile/automatic/z8,\ + prob(6);/obj/item/weapon/gun/energy/captain,\ + prob(6);/obj/item/weapon/material/knife/tacknife,\ + prob(5);/obj/item/weapon/gun/projectile/shotgun/pump/USDF,\ + prob(5);/obj/item/weapon/gun/projectile/giskard/olivaw,\ + prob(5);/obj/item/weapon/gun/projectile/revolver/consul,\ + prob(5);/obj/item/weapon/gun/projectile/revolver/mateba,\ + prob(5);/obj/item/weapon/gun/projectile/revolver,\ + prob(4);/obj/item/weapon/gun/projectile/deagle,\ + prob(4);/obj/item/weapon/material/knife/tacknife/combatknife,\ + prob(4);/obj/item/weapon/melee/energy/sword,\ + prob(4);/obj/item/weapon/gun/projectile/automatic/mini_uzi,\ + prob(4);/obj/item/weapon/gun/projectile/contender,\ + prob(4);/obj/item/weapon/gun/projectile/contender/tacticool,\ + prob(3);/obj/item/weapon/gun/projectile/SVD,\ + prob(3);/obj/item/weapon/gun/energy/lasercannon,\ + prob(3);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever,\ + prob(3);/obj/item/weapon/gun/projectile/automatic/bullpup,\ + prob(2);/obj/item/weapon/gun/energy/pulse_rifle,\ + prob(2);/obj/item/weapon/gun/energy/gun/nuclear,\ + prob(2);/obj/item/weapon/gun/projectile/automatic/l6_saw,\ + prob(2);/obj/item/weapon/gun/energy/gun/burst,\ + prob(2);/obj/item/weapon/storage/box/frags,\ + prob(2);/obj/item/weapon/twohanded/fireaxe,\ + prob(2);/obj/item/weapon/gun/projectile/luger/brown,\ + prob(2);/obj/item/weapon/gun/launcher/crossbow,\ + /* prob(1);/obj/item/weapon/gun/projectile/automatic/battlerifle,\ */ // Too OP + prob(1);/obj/item/weapon/gun/projectile/deagle/gold,\ + prob(1);/obj/item/weapon/gun/energy/imperial,\ + prob(1);/obj/item/weapon/gun/projectile/automatic/as24,\ + prob(1);/obj/item/weapon/gun/launcher/rocket,\ + prob(1);/obj/item/weapon/gun/launcher/grenade,\ + prob(1);/obj/item/weapon/gun/projectile/gyropistol,\ + prob(1);/obj/item/weapon/gun/projectile/heavysniper,\ + prob(1);/obj/item/weapon/plastique,\ + prob(1);/obj/item/weapon/gun/energy/ionrifle,\ + prob(1);/obj/item/weapon/material/sword,\ + prob(1);/obj/item/weapon/cane/concealed,\ + prob(1);/obj/item/weapon/material/sword/katana) /obj/random/weapon/guarenteed spawn_nothing_percentage = 0 @@ -95,45 +95,45 @@ desc = "This is random ammunition. Spawns all ammo types." icon = 'icons/obj/ammo.dmi' icon_state = "666" - item_to_spawn() - return pick(prob(5);/obj/item/weapon/storage/box/shotgunammo,\ - prob(5);/obj/item/weapon/storage/box/shotgunshells,\ - prob(5);/obj/item/ammo_magazine/clip/c762,\ - prob(5);/obj/item/ammo_magazine/m380,\ - prob(5);/obj/item/ammo_magazine/m45,\ - prob(5);/obj/item/ammo_magazine/m9mm,\ - prob(5);/obj/item/ammo_magazine/s38,\ - prob(4);/obj/item/ammo_magazine/clip/c45,\ - prob(4);/obj/item/ammo_magazine/clip/c9mm,\ - prob(4);/obj/item/ammo_magazine/m45uzi,\ - prob(4);/obj/item/ammo_magazine/m9mml,\ - prob(4);/obj/item/ammo_magazine/m9mmt,\ - prob(4);/obj/item/ammo_magazine/m9mmp90,\ - prob(4);/obj/item/ammo_magazine/m10mm,\ - prob(4);/obj/item/ammo_magazine/m545/small,\ - prob(3);/obj/item/ammo_magazine/clip/c10mm,\ - prob(3);/obj/item/ammo_magazine/clip/c44,\ - prob(3);/obj/item/ammo_magazine/s44,\ - prob(3);/obj/item/ammo_magazine/m762,\ - prob(3);/obj/item/ammo_magazine/m545,\ - prob(3);/obj/item/weapon/cell/device/weapon,\ - prob(2);/obj/item/ammo_magazine/m44,\ - prob(2);/obj/item/ammo_magazine/s357,\ - prob(2);/obj/item/ammo_magazine/m762m,\ - prob(2);/obj/item/ammo_magazine/clip/c12g, - prob(2);/obj/item/ammo_magazine/clip/c12g/pellet,\ - prob(1);/obj/item/ammo_magazine/m45tommy,\ - /* prob(1);/obj/item/ammo_magazine/m95,\ */ - prob(1);/obj/item/ammo_casing/rocket,\ - prob(1);/obj/item/weapon/storage/box/sniperammo,\ - prob(1);/obj/item/weapon/storage/box/flashshells,\ - prob(1);/obj/item/weapon/storage/box/beanbags,\ - prob(1);/obj/item/weapon/storage/box/stunshells,\ - prob(1);/obj/item/ammo_magazine/mtg,\ - prob(1);/obj/item/ammo_magazine/m12gdrum,\ - prob(1);/obj/item/ammo_magazine/m12gdrum/pellet,\ - prob(1);/obj/item/ammo_magazine/m45tommydrum - ) +/obj/random/ammo_all/item_to_spawn() + return pick(prob(5);/obj/item/weapon/storage/box/shotgunammo,\ + prob(5);/obj/item/weapon/storage/box/shotgunshells,\ + prob(5);/obj/item/ammo_magazine/clip/c762,\ + prob(5);/obj/item/ammo_magazine/m380,\ + prob(5);/obj/item/ammo_magazine/m45,\ + prob(5);/obj/item/ammo_magazine/m9mm,\ + prob(5);/obj/item/ammo_magazine/s38,\ + prob(4);/obj/item/ammo_magazine/clip/c45,\ + prob(4);/obj/item/ammo_magazine/clip/c9mm,\ + prob(4);/obj/item/ammo_magazine/m45uzi,\ + prob(4);/obj/item/ammo_magazine/m9mml,\ + prob(4);/obj/item/ammo_magazine/m9mmt,\ + prob(4);/obj/item/ammo_magazine/m9mmp90,\ + prob(4);/obj/item/ammo_magazine/m10mm,\ + prob(4);/obj/item/ammo_magazine/m545/small,\ + prob(3);/obj/item/ammo_magazine/clip/c10mm,\ + prob(3);/obj/item/ammo_magazine/clip/c44,\ + prob(3);/obj/item/ammo_magazine/s44,\ + prob(3);/obj/item/ammo_magazine/m762,\ + prob(3);/obj/item/ammo_magazine/m545,\ + prob(3);/obj/item/weapon/cell/device/weapon,\ + prob(2);/obj/item/ammo_magazine/m44,\ + prob(2);/obj/item/ammo_magazine/s357,\ + prob(2);/obj/item/ammo_magazine/m762m,\ + prob(2);/obj/item/ammo_magazine/clip/c12g, + prob(2);/obj/item/ammo_magazine/clip/c12g/pellet,\ + prob(1);/obj/item/ammo_magazine/m45tommy,\ + /* prob(1);/obj/item/ammo_magazine/m95,\ */ + prob(1);/obj/item/ammo_casing/rocket,\ + prob(1);/obj/item/weapon/storage/box/sniperammo,\ + prob(1);/obj/item/weapon/storage/box/flashshells,\ + prob(1);/obj/item/weapon/storage/box/beanbags,\ + prob(1);/obj/item/weapon/storage/box/stunshells,\ + prob(1);/obj/item/ammo_magazine/mtg,\ + prob(1);/obj/item/ammo_magazine/m12gdrum,\ + prob(1);/obj/item/ammo_magazine/m12gdrum/pellet,\ + prob(1);/obj/item/ammo_magazine/m45tommydrum + ) /obj/random/cargopod name = "Random Cargo Item" diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 51f4e858e2..fea781da8b 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -1,10 +1,5 @@ -<<<<<<< HEAD -proc/createRandomZlevel() - if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing -======= /proc/createRandomZlevel() - if(awaydestinations.len) //crude, but it saves another var! ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing return var/list/potentialRandomZlevels = list() diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index b63077c0c6..ace9c8d6a9 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -140,11 +140,7 @@ return TOPIC_REFRESH else if(href_list["metadata"]) -<<<<<<< HEAD - var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message, extra = 0) //VOREStation Edit -======= - var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata) as message|null) ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) + var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message|null, extra = 0) //VOREStation Edit if(new_metadata && CanUseTopic(user)) pref.metadata = new_metadata return TOPIC_REFRESH diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b5ec162af7..8c272cac22 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -783,13 +782,13 @@ /obj/item/clothing/suit/equipped(var/mob/user, var/slot) if(ishuman(user)) var/mob/living/carbon/human/H = user - if((taurized && !isTaurTail(H.tail_style)) || (!taurized && isTaurTail(H.tail_style))) + if((taurized && !istaurtail(H.tail_style)) || (!taurized && istaurtail(H.tail_style))) taurize(user) return ..() /obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) - if(isTaurTail(Taur.tail_style)) + if(istaurtail(Taur.tail_style)) var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) icon_override = taurtail.suit_sprites @@ -1093,1048 +1092,3 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() -======= -/obj/item/clothing - name = "clothing" - siemens_coefficient = 0.9 - drop_sound = 'sound/items/drop/clothing.ogg' - pickup_sound = 'sound/items/pickup/clothing.ogg' - var/list/species_restricted = null //Only these species can wear this kit. - var/gunshot_residue //Used by forensics. - - var/list/accessories - var/list/valid_accessory_slots - var/list/restricted_accessory_slots - var/list/starting_accessories - - var/flash_protection = FLASH_PROTECTION_NONE - var/tint = TINT_NONE - var/list/enables_planes //Enables these planes in the wearing mob's plane_holder - var/list/plane_slots //But only if it's equipped into this specific slot - - /* - Sprites used when the clothing item is refit. This is done by setting icon_override. - For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. - Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), - while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). - */ - var/list/sprite_sheets_refit = null - var/ear_protection = 0 - var/blood_sprite_state - - var/index //null by default, if set, will change which dmi it uses - - var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing - - -//Updates the icons of the mob wearing the clothing item, if any. -/obj/item/clothing/proc/update_clothing_icon() - return - -// Aurora forensics port. -/obj/item/clothing/clean_blood() - . = ..() - gunshot_residue = null - - -/obj/item/clothing/New() - ..() - if(starting_accessories) - for(var/T in starting_accessories) - var/obj/item/clothing/accessory/tie = new T(src) - src.attach_accessory(null, tie) - set_clothing_index() - -/obj/item/clothing/update_icon() - overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. - if(blood_DNA) - add_blood() - . = ..() - -/obj/item/clothing/equipped(var/mob/user,var/slot) - ..() - if(enables_planes) - user.recalculate_vis() - -/obj/item/clothing/dropped(var/mob/user) - ..() - if(enables_planes) - user.recalculate_vis() - -//BS12: Species-restricted clothing check. -/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) - - //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) - if (!..()) - return 0 - - if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) - var/exclusive = null - var/wearable = null - var/mob/living/carbon/human/H = M - - if("exclude" in species_restricted) - exclusive = 1 - - if(H.species) - if(exclusive) - if(!(H.species.get_bodytype(H) in species_restricted)) - wearable = 1 - else - if(H.species.get_bodytype(H) in species_restricted) - wearable = 1 - - if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) - to_chat(H, "Your species cannot wear [src].") - return 0 - return 1 - -/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - . = ..() - if((. == 0) && LAZYLEN(accessories)) - for(var/obj/item/I in accessories) - var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) - - if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. - . = check - break - -// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. -/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_low_temperature(tempcheck)) - . = TRUE - - if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) - . = TRUE - -/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_high_temperature(tempcheck)) - . = TRUE - - if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) - . = TRUE - -// Returns the relative flag-vars for covered protection. -/obj/item/clothing/proc/get_cold_protection_flags() - . = cold_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_cold_protection_flags() - -/obj/item/clothing/proc/get_heat_protection_flags() - . = heat_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_heat_protection_flags() - -/obj/item/clothing/proc/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_PROMETHEAN) //skrell/humans can wear each other's suits - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - sprite_sheets[target_species] = sprite_sheets_refit[target_species] - - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -/obj/item/clothing/head/helmet/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - if(SPECIES_SKRELL) - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_PROMETHEAN) //skrell helmets fit humans too - - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - sprite_sheets[target_species] = sprite_sheets_refit[target_species] - - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -/////////////////////////////////////////////////////////////////////// -// Ears: headsets, earmuffs and tiny objects -/obj/item/clothing/ears - name = "ears" - w_class = ITEMSIZE_TINY - throwforce = 2 - slot_flags = SLOT_EARS - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/ears.dmi') - -/obj/item/clothing/ears/attack_hand(mob/user as mob) - if (!user) return - - if (src.loc != user || !istype(user,/mob/living/carbon/human)) - ..() - return - - var/mob/living/carbon/human/H = user - if(H.l_ear != src && H.r_ear != src) - ..() - return - - if(!canremove) - return - - var/obj/item/clothing/ears/O - if(slot_flags & SLOT_TWOEARS ) - O = (H.l_ear == src ? H.r_ear : H.l_ear) - user.u_equip(O) - if(!istype(src,/obj/item/clothing/ears/offear)) - qdel(O) - O = src - else - O = src - - user.unEquip(src) - - if (O) - user.put_in_hands(O) - O.add_fingerprint(user) - - if(istype(src,/obj/item/clothing/ears/offear)) - qdel(src) - -/obj/item/clothing/ears/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_ears() - -/obj/item/clothing/ears/MouseDrop(var/obj/over_object) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one - if(slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) - if(istype(src, /obj/item/clothing/ears/offear)) - . = O.MouseDrop(over_object) - H.drop_from_inventory(src) - qdel(src) - else - . = ..() - H.drop_from_inventory(O) - qdel(O) - else - . = ..() - - -/obj/item/clothing/ears/offear - name = "Other ear" - w_class = ITEMSIZE_HUGE - icon = 'icons/mob/screen1_Midnight.dmi' - icon_state = "block" - slot_flags = SLOT_EARS | SLOT_TWOEARS - -/obj/item/clothing/ears/offear/New(var/obj/O) - name = O.name - desc = O.desc - icon = O.icon - icon_state = O.icon_state - set_dir(O.dir) - -//////////////////////////////////////////////////////////////////////////////////////// -//Gloves -/obj/item/clothing/gloves - name = "gloves" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', - ) - gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = ITEMSIZE_SMALL - icon = 'icons/obj/clothing/gloves.dmi' - siemens_coefficient = 0.9 - blood_sprite_state = "bloodyhands" - var/wired = 0 - var/obj/item/weapon/cell/cell = 0 - var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through - var/obj/item/clothing/gloves/ring = null //Covered ring - var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping - var/glove_level = 2 //What "layer" the glove is on - var/overgloves = 0 //Used by gauntlets and arm_guards - var/punch_force = 0 //How much damage do these gloves add to a punch? - var/punch_damtype = BRUTE //What type of damage does this make fists be? - body_parts_covered = HANDS - slot_flags = SLOT_GLOVES - attack_verb = list("challenged") - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/gloves.dmi', - SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi' - ) - drop_sound = 'sound/items/drop/gloves.ogg' - pickup_sound = 'sound/items/pickup/gloves.ogg' - -/obj/item/clothing/proc/set_clothing_index() - return - -/obj/item/clothing/gloves/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_gloves() - -/obj/item/clothing/gloves/emp_act(severity) - if(cell) - cell.emp_act(severity) - if(ring) - ring.emp_act(severity) - ..() - -// Called just before an attack_hand(), in mob/UnarmedAttack() -/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) - return 0 // return 1 to cancel attack_hand() - -/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) - if (clipped) - to_chat(user, "The [src] have already been clipped!") - update_icon() - return - - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") - - clipped = 1 - name = "modified [name]" - desc = "[desc]
They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= SPECIES_UNATHI - species_restricted -= SPECIES_TAJ - return -*/ - -/obj/item/clothing/gloves/clean_blood() - . = ..() - transfer_blood = 0 - update_icon() - -/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) - var/mob/living/carbon/human/H = user - - if(slot && slot == slot_gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G)) - ring = H.gloves - if(ring.glove_level >= src.glove_level) - to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") - ring = null - return 0 - else - H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. - ring.forceMove(src) - to_chat(user, "You slip \the [src] on over \the [src.ring].") - if(!(flags & THICKMATERIAL)) - punch_force += ring.punch_force - else - ring = null - - if(!..()) - if(ring) //Put the ring back on if the check fails. - if(H.equip_to_slot_if_possible(ring, slot_gloves)) - src.ring = null - punch_force = initial(punch_force) - return 0 - - wearer = H //TODO clean this when magboots are cleaned - return 1 - -/obj/item/clothing/gloves/dropped() - ..() - - if(!wearer) - return - - var/mob/living/carbon/human/H = wearer - if(ring && istype(H)) - if(!H.equip_to_slot_if_possible(ring, slot_gloves)) - ring.forceMove(get_turf(src)) - src.ring = null - punch_force = initial(punch_force) - wearer = null - -/obj/item/clothing/gloves - var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? - var/special_attack_type = null - -/obj/item/clothing/gloves/New() - ..() - if(special_attack_type && ispath(special_attack_type)) - special_attack = new special_attack_type - - - -///////////////////////////////////////////////////////////////////// -//Rings - -/obj/item/clothing/gloves/ring - name = "ring" - w_class = ITEMSIZE_TINY - icon = 'icons/obj/clothing/rings.dmi' - gender = NEUTER - species_restricted = list("exclude", SPECIES_DIONA) - siemens_coefficient = 1 - glove_level = 1 - fingerprint_chance = 100 - punch_force = 2 - body_parts_covered = 0 - drop_sound = 'sound/items/drop/ring.ogg' - pickup_sound = 'sound/items/pickup/ring.ogg' - -/////////////////////////////////////////////////////////////////////// -//Head -/obj/item/clothing/head - name = "head" - icon = 'icons/obj/clothing/hats.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_HEAD - w_class = ITEMSIZE_SMALL - blood_sprite_state = "helmetblood" - - var/light_overlay = "helmet_light" - var/light_applied - var/brightness_on - var/on = 0 - var/image/helmet_light - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', - SPECIES_VOX = 'icons/mob/species/vox/head.dmi' - ) - drop_sound = 'sound/items/drop/hat.ogg' - pickup_sound = 'sound/items/pickup/hat.ogg' - -/obj/item/clothing/head/attack_self(mob/user) - if(brightness_on) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc]") - return - on = !on - to_chat(user, "You [on ? "enable" : "disable"] the helmet light.") - update_flashlight(user) - else - return ..(user) - -/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) - if(on && !light_applied) - set_light(brightness_on) - light_applied = 1 - else if(!on && light_applied) - set_light(0) - light_applied = 0 - update_icon(user) - user.update_action_buttons() - -/obj/item/clothing/head/attack_ai(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/attack_generic(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) - if(!Adjacent(user)) - return 0 - var/success - if(istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - else if(istype(user, /mob/living/carbon/alien/diona)) - var/mob/living/carbon/alien/diona/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - - if(!success) - return 0 - else if(success == 2) - to_chat(user, "You are already wearing a hat.") - else if(success == 1) - to_chat(user, "You crawl under \the [src].") - return 1 - -/obj/item/clothing/head/update_icon(var/mob/user) - var/mob/living/carbon/human/H - if(ishuman(user)) - H = user - - if(on) - // Generate object icon. - if(!light_overlay_cache["[light_overlay]_icon"]) - light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") - helmet_light = light_overlay_cache["[light_overlay]_icon"] - add_overlay(helmet_light) - - // Generate and cache the on-mob icon, which is used in update_inv_head(). - var/body_type = (H && H.species.get_bodytype(H)) - var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? "_[body_type]" : ""]" - if(!light_overlay_cache[cache_key]) - var/use_icon = LAZYACCESS(sprite_sheets,body_type) || 'icons/mob/light_overlays.dmi' - light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") - - else if(helmet_light) - cut_overlay(helmet_light) - helmet_light = null - - user.update_inv_head() //Will redraw the helmet with the light on the mob - -/obj/item/clothing/head/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_head() - -/////////////////////////////////////////////////////////////////////// -//Mask -/obj/item/clothing/mask - name = "mask" - icon = 'icons/obj/clothing/masks.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_MASK - body_parts_covered = FACE|EYES - blood_sprite_state = "maskblood" - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/masks.dmi', - SPECIES_VOX = 'icons/mob/species/vox/masks.dmi', - SPECIES_TAJ = 'icons/mob/species/tajaran/mask.dmi', - SPECIES_UNATHI = 'icons/mob/species/unathi/mask.dmi' - ) - - var/voicechange = 0 - var/list/say_messages - var/list/say_verbs - - drop_sound = "generic_drop" - pickup_sound = "generic_pickup" - -/obj/item/clothing/mask/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_mask() - -/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) - return - -/////////////////////////////////////////////////////////////////////// -//Shoes -/obj/item/clothing/shoes - name = "shoes" - icon = 'icons/obj/clothing/shoes.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', - ) - desc = "Comfortable-looking shoes." - gender = PLURAL //Carn: for grammarically correct text-parsing - siemens_coefficient = 0.9 - body_parts_covered = FEET - slot_flags = SLOT_FEET - blood_sprite_state = "shoeblood" - - var/can_hold_knife = 0 - var/obj/item/holding - - var/shoes_under_pants = 0 - - var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed - var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed - var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. - - var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are - - permeability_coefficient = 0.50 - slowdown = SHOES_SLOWDOWN - force = 2 - var/overshoes = 0 - species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/shoes.dmi', - SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi' - ) - drop_sound = 'sound/items/drop/shoes.ogg' - pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/clothing/shoes/proc/draw_knife() - set name = "Draw Boot Knife" - set desc = "Pull out your boot knife." - set category = "IC" - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - holding.forceMove(get_turf(usr)) - - if(usr.put_in_hands(holding)) - usr.visible_message("\The [usr] pulls a knife out of their boot!") - playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) - holding = null - overlays -= image(icon, "[icon_state]_knife") - else - to_chat(usr, "Your need an empty, unbroken hand to do that.") - holding.forceMove(src) - - if(!holding) - verbs -= /obj/item/clothing/shoes/proc/draw_knife - - update_icon() - return - -/obj/item/clothing/shoes/attack_hand(var/mob/living/M) - if(can_hold_knife == 1 && holding && src.loc == M) - draw_knife() - return - ..() - -/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) - if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ - istype(I, /obj/item/weapon/material/butterfly) || \ - istype(I, /obj/item/weapon/material/kitchen/utensil) || \ - istype(I, /obj/item/weapon/material/knife/tacknife))) - if(holding) - to_chat(user, "\The [src] is already holding \a [holding].") - return - user.unEquip(I) - I.forceMove(src) - holding = I - user.visible_message("\The [user] shoves \the [I] into \the [src].") - verbs |= /obj/item/clothing/shoes/proc/draw_knife - update_icon() - else - return ..() - -/obj/item/clothing/shoes/verb/toggle_layer() - set name = "Switch Shoe Layer" - set category = "Object" - - if(shoes_under_pants == -1) - to_chat(usr, "\The [src] cannot be worn above your suit!") - return - shoes_under_pants = !shoes_under_pants - update_icon() - -/obj/item/clothing/shoes/update_icon() - . = ..() - if(holding) - overlays += image(icon, "[icon_state]_knife") - if(ismob(usr)) - var/mob/M = usr - M.update_inv_shoes() - -/obj/item/clothing/shoes/clean_blood() - update_icon() - return ..() - -/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) - return - -/obj/item/clothing/shoes/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_shoes() - - -/////////////////////////////////////////////////////////////////////// -//Suit -/obj/item/clothing/suit - icon = 'icons/obj/clothing/suits.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', - ) - name = "suit" - var/fire_resist = T0C+100 - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - allowed = list(/obj/item/weapon/tank/emergency/oxygen) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - slot_flags = SLOT_OCLOTHING - var/blood_overlay_type = "suit" - blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. - - var/taurized = FALSE - siemens_coefficient = 0.9 - w_class = ITEMSIZE_NORMAL - preserve_item = 1 - equip_sound = 'sound/items/jumpsuit_equip.ogg' - - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi', - SPECIES_VOX = 'icons/mob/species/vox/suit.dmi' - ) - - valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) - restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/set_clothing_index() - ..() - - if(index && !icon_override) - icon = new /icon("icons/obj/clothing/suits_[index].dmi") - item_icons = list( - slot_l_hand_str = new /icon("icons/mob/items/lefthand_suits_[index].dmi"), - slot_r_hand_str = new /icon("icons/mob/items/righthand_suits_[index].dmi"), - ) - - return 1 - - return 0 - -/obj/item/clothing/suit/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_suit() - - set_clothing_index() - -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if((taurized && !istaurtail(H.tail_style)) || (!taurized && istaurtail(H.tail_style))) - taurize(user) - - return ..() - -/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) - if(istaurtail(Taur.tail_style)) - var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - taurized = TRUE - - if(!taurized) - icon_override = initial(icon_override) - taurized = FALSE - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - - -/////////////////////////////////////////////////////////////////////// -//Under clothing -/obj/item/clothing/under - icon = 'icons/obj/clothing/uniforms.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', - ) - name = "under" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - permeability_coefficient = 0.90 - slot_flags = SLOT_ICLOTHING - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - equip_sound = 'sound/items/jumpsuit_equip.ogg' - w_class = ITEMSIZE_NORMAL - show_messages = 1 - blood_sprite_state = "uniformblood" - - var/has_sensor = 1 //For the crew computer 2 = unable to change mode - var/sensor_mode = 0 - /* - 1 = Report living/dead - 2 = Report detailed damages - 3 = Report location - */ - var/displays_id = 1 - var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/teshari/uniform.dmi', - SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi' - ) - - //convenience var for defining the icon state for the overlay used when the clothing is worn. - //Also used by rolling/unrolling. - var/worn_state = null - valid_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_DECOR\ - |ACCESSORY_SLOT_MEDAL\ - |ACCESSORY_SLOT_INSIGNIA\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - restricted_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - - var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi' - var/icon/rolled_down_sleeves_icon = 'icons/mob/uniform_sleeves_rolled.dmi' - -/obj/item/clothing/under/attack_hand(var/mob/user) - if(LAZYLEN(accessories)) - ..() - if ((ishuman(usr) || issmall(usr)) && src.loc == user) - return - ..() - -/obj/item/clothing/under/New() - ..() - if(worn_state) - if(!item_state_slots) - item_state_slots = list() - item_state_slots[slot_w_uniform_str] = worn_state - else - worn_state = icon_state - - //autodetect rollability - if(rolled_down < 0) - if(("[worn_state]_d_s" in cached_icon_states(icon)) || ("[worn_state]_s" in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in cached_icon_states(icon_override))) - rolled_down = 0 - - if(rolled_down == -1) - verbs -= /obj/item/clothing/under/verb/rollsuit - if(rolled_sleeves == -1) - verbs -= /obj/item/clothing/under/verb/rollsleeves - -/obj/item/clothing/under/set_clothing_index() - ..() - - if(index && !icon_override) - icon = new /icon("icons/obj/clothing/uniforms_[index].dmi") - - item_icons = list( - slot_l_hand_str = new /icon("icons/mob/items/lefthand_uniforms_[index].dmi"), - slot_r_hand_str = new /icon("icons/mob/items/righthand_uniforms_[index].dmi"), - ) - - rolled_down_icon = new /icon("icons/mob/uniform_rolled_down_[index].dmi") - rolled_down_sleeves_icon = new /icon("icons/mob/uniform_sleeves_rolled_[index].dmi") - return 1 - - return 0 - -/obj/item/clothing/under/proc/update_rolldown_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)]) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(item_icons && item_icons[slot_w_uniform_str]) - under_icon = item_icons[slot_w_uniform_str] - else if ("[worn_state]_s" in cached_icon_states(rolled_down_icon)) - under_icon = rolled_down_icon - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_icon && ("[worn_state]_s" in cached_icon_states(under_icon))) || ("[worn_state]_d_s" in cached_icon_states(under_icon))) - if(rolled_down != 1) - rolled_down = 0 - else - rolled_down = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/proc/update_rollsleeves_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)]) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(item_icons && item_icons[slot_w_uniform_str]) - under_icon = item_icons[slot_w_uniform_str] - else if ("[worn_state]_s" in cached_icon_states(rolled_down_sleeves_icon)) - under_icon = rolled_down_sleeves_icon - else if(index) - under_icon = new /icon("[INV_W_UNIFORM_DEF_ICON]_[index].dmi") - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_sleeves_icon && ("[worn_state]_s" in cached_icon_states(under_icon))) || ("[worn_state]_r_s" in cached_icon_states(under_icon))) - if(rolled_sleeves != 1) - rolled_sleeves = 0 - else - rolled_sleeves = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_w_uniform() - - set_clothing_index() - - -/obj/item/clothing/under/examine(mob/user) - . = ..() - switch(src.sensor_mode) - if(0) - . += "Its sensors appear to be disabled." - if(1) - . += "Its binary life sensors appear to be enabled." - if(2) - . += "Its vital tracker appears to be enabled." - if(3) - . += "Its vital tracker and tracking beacon appear to be enabled." - -/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) - var/mob/M = usr - if (istype(M, /mob/observer)) return - if (usr.stat || usr.restrained()) return - if(has_sensor >= 2) - to_chat(usr, "The controls are locked.") - return 0 - if(has_sensor <= 0) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") - var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away.") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") - if(1) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") - if(2) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") - if(3) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") - - else if (istype(src.loc, /mob)) - usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") - -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - set_sensors(usr) - -/obj/item/clothing/under/verb/rollsuit() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rolldown_status() - if(rolled_down == -1) - to_chat(usr, "You cannot roll down [src]!") - return - if((rolled_sleeves == 1) && !(rolled_down)) - rolled_sleeves = 0 - - rolled_down = !rolled_down - if(rolled_down) - body_parts_covered = initial(body_parts_covered) - body_parts_covered &= ~(UPPER_TORSO|ARMS) - if("[worn_state]_s" in cached_icon_states(rolled_down_icon)) - icon_override = rolled_down_icon - item_state_slots[slot_w_uniform_str] = "[worn_state]" - else - item_state_slots[slot_w_uniform_str] = "[worn_state]_d" - - to_chat(usr, "You roll down your [src].") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_icon) - icon_override = initial(icon_override) - item_state_slots[slot_w_uniform_str] = "[worn_state]" - to_chat(usr, "You roll up your [src].") - update_clothing_icon() - -/obj/item/clothing/under/verb/rollsleeves() - set name = "Roll Up Sleeves" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rollsleeves_status() - if(rolled_sleeves == -1) - to_chat(usr, "You cannot roll up your [src]'s sleeves!") - return - if(rolled_down == 1) - to_chat(usr, "You must roll up your [src] first!") - return - - rolled_sleeves = !rolled_sleeves - if(rolled_sleeves) - body_parts_covered &= ~(ARMS) - if("[worn_state]_s" in cached_icon_states(rolled_down_sleeves_icon)) - icon_override = rolled_down_sleeves_icon - item_state_slots[slot_w_uniform_str] = "[worn_state]" - else - item_state_slots[slot_w_uniform_str] = "[worn_state]_r" - to_chat(usr, "You roll up your [src]'s sleeves.") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_sleeves_icon) - icon_override = initial(icon_override) - item_state_slots[slot_w_uniform_str] = "[worn_state]" - to_chat(usr, "You roll down your [src]'s sleeves.") - update_clothing_icon() - -/obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) - ..() ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm index 3487d0999c..a6cee840b6 100644 --- a/code/modules/clothing/glasses/hud_vr.dm +++ b/code/modules/clothing/glasses/hud_vr.dm @@ -135,10 +135,10 @@ tgarscreen_path = /datum/tgui_module/crew_monitor/glasses enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED) - ar_interact(var/mob/living/carbon/human/user) - if(tgarscreen) - tgarscreen.tgui_interact(user) - return 1 +/obj/item/clothing/glasses/omnihud/med/ar_interact(var/mob/living/carbon/human/user) + if(tgarscreen) + tgarscreen.tgui_interact(user) + return 1 /obj/item/clothing/glasses/omnihud/sec name = "\improper AR-S glasses" @@ -151,10 +151,10 @@ tgarscreen_path = /datum/tgui_module/alarm_monitor/security/glasses enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_WANTED,VIS_AUGMENTED) - ar_interact(var/mob/living/carbon/human/user) - if(tgarscreen) - tgarscreen.tgui_interact(user) - return 1 +/obj/item/clothing/glasses/omnihud/sec/ar_interact(var/mob/living/carbon/human/user) + if(tgarscreen) + tgarscreen.tgui_interact(user) + return 1 /obj/item/clothing/glasses/omnihud/eng name = "\improper AR-E glasses" @@ -166,10 +166,10 @@ action_button_name = "AR Console (Station Alerts)" tgarscreen_path = /datum/tgui_module/alarm_monitor/engineering/glasses - ar_interact(var/mob/living/carbon/human/user) - if(tgarscreen) - tgarscreen.tgui_interact(user) - return 1 +/obj/item/clothing/glasses/omnihud/eng/ar_interact(var/mob/living/carbon/human/user) + if(tgarscreen) + tgarscreen.tgui_interact(user) + return 1 /obj/item/clothing/glasses/omnihud/rnd name = "\improper AR-R glasses" @@ -226,10 +226,10 @@ action_button_name = "AR Console (All Alerts)" tgarscreen_path = /datum/tgui_module/alarm_monitor/all/glasses - ar_interact(var/mob/living/carbon/human/user) - if(tgarscreen) - tgarscreen.tgui_interact(user) - return 1 +/obj/item/clothing/glasses/omnihud/all/ar_interact(var/mob/living/carbon/human/user) + if(tgarscreen) + tgarscreen.tgui_interact(user) + return 1 /obj/item/clothing/glasses/hud/security/eyepatch name = "Security Hudpatch" diff --git a/code/modules/clothing/head/misc_vr.dm b/code/modules/clothing/head/misc_vr.dm index fc8bf9a69d..be84af47a6 100644 --- a/code/modules/clothing/head/misc_vr.dm +++ b/code/modules/clothing/head/misc_vr.dm @@ -114,7 +114,7 @@ icon_state = "talon_captain_cap" item_state = "taloncaptaincap" -obj/item/clothing/head/beret/talon +/obj/item/clothing/head/beret/talon name = "ITV beret" desc = "It's a basic baret colored to match ITV's uniforms." icon = 'icons/obj/clothing/hats_vr.dmi' @@ -122,7 +122,7 @@ obj/item/clothing/head/beret/talon icon_state = "beret_talon" item_state = "baret_talon" -obj/item/clothing/head/beret/talon/command +/obj/item/clothing/head/beret/talon/command name = "ITV officer beret" desc = "It's a basic baret colored to match ITV's uniforms with a badge pinned on the front. Perfect for commanders." icon = 'icons/obj/clothing/hats_vr.dmi' diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm index d380562a70..ba986f56fc 100644 --- a/code/modules/clothing/suits/armor_vr.dm +++ b/code/modules/clothing/suits/armor_vr.dm @@ -19,13 +19,13 @@ icon = 'icons/mob/taursuits_wolf_vr.dmi' icon_state = "wolf_item" item_state = "heavy_wolf_armor" - mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) - if(..()) - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf)) - return ..() - else - to_chat(H,"You need to have a wolf-taur half to wear this.") - return 0 +/obj/item/clothing/suit/armor/vest/wolftaur/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf)) + return ..() + else + to_chat(H,"You need to have a wolf-taur half to wear this.") + return 0 // HoS armor improved by Vorestation to be slightly better than normal security stuff. /obj/item/clothing/suit/storage/vest/hoscoat diff --git a/code/modules/food/food/drinks/drinkingglass.dm b/code/modules/food/food/drinks/drinkingglass.dm index 0e8e5d9483..b818663d86 100644 --- a/code/modules/food/food/drinks/drinkingglass.dm +++ b/code/modules/food/food/drinks/drinkingglass.dm @@ -104,12 +104,8 @@ matter = list("glass" = 175) /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change() -<<<<<<< HEAD cut_overlays() -======= - overlays.Cut() name = "shot glass" ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(!reagents.total_volume) return @@ -120,17 +116,9 @@ if(4 to 7) filling.icon_state = "[icon_state]5" if(8 to INFINITY) filling.icon_state = "[icon_state]12" -<<<<<<< HEAD - filling.color += reagents.get_color() - add_overlay(filling) - name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future. - else - name = "shot glass" -======= filling.color += reagents.get_color() - overlays += filling + add_overlay(filling) name += " of [reagents.get_master_reagent_name()]" //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future. ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask name = "fitness shaker" diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 4f863bf34a..df60dc7ca8 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -371,5 +371,4 @@ #undef LUM_FALLOFF #undef REMOVE_CORNER #undef APPLY_CORNER -#undef REMOVE_CORNER_SIMPLE #undef APPLY_CORNER_SIMPLE \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 049a443d08..f42a4f3be0 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -838,7 +837,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. plane_holder.set_vis(VIS_GHOSTS, ghostvision) -mob/observer/dead/MayRespawn(var/feedback = 0) +/mob/observer/dead/MayRespawn(var/feedback = 0) if(!client) return 0 if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) @@ -968,965 +967,3 @@ mob/observer/dead/MayRespawn(var/feedback = 0) set name = "Respawn" set category = "Ghost" src.abandon_mob() -======= -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = 0 - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = 1 // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - verbs += /mob/observer/dead/proc/dead_tele - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", "Ghost", "Admin Ghost", "Stay in body") - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. If you ghost, you won't be able to play this round until you respawn as a new character! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/area/A as anything in areas) - if(A.z in using_map?.secret_levels) - areas -= A - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - return mobs - -/mob/observer/dead/proc/dead_tele(var/area/A in jumpable_areas()) - set category = "Ghost" - set name = "Teleport" - set desc = "Teleport to a location" - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - if(!A) - A = input(usr, "Select an area:", "Ghost Teleport") as null|anything in jumpable_areas() - if(!A) - return - - usr.forceMove(pick(get_area_turfs(A))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(input in jumpable_mobs()) - set category = "Ghost" - set name = "Follow" // "Haunt" - set desc = "Follow and haunt a mob." - - if(!input) - input = input(usr, "Select a mob:", "Ghost Follow") as null|anything in jumpable_mobs() - if(!input) - return - - var/target = jumpable_mobs()[input] - if(!target) return - ManualFollow(target) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob(input in jumpable_mobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - if(!input) - input = input(usr, "Select a mob:", "Ghost Jump") as null|anything in jumpable_mobs() - if(!input) - return - - var/target = jumpable_mobs()[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!") - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

Crew Manifest

" - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices - - var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input("Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = input(src, "Select who to whisper to:", "Whisper to?", null) as null|mob in options - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - overlays.Cut() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.overlays += "pai-ghostalert" - spawn(54) - PP.overlays.Cut() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 240e557fa9..a7f55d937a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -336,7 +336,7 @@ ) wikilink="https://wiki.vore-station.net/Vox" -datum/species/harpy +/datum/species/harpy name = SPECIES_RAPALA name_plural = "Rapalans" icobase = 'icons/mob/human_races/r_harpy_vr.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm index fa822196b1..18894986e2 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -1,6 +1,3 @@ -#define ORGANICS 1 -#define SYNTHETICS 2 - /datum/trait/negative category = -1 @@ -34,9 +31,9 @@ cost = -2 var_changes = list("total_health" = 75) - apply(var/datum/species/S,var/mob/living/carbon/human/H) - ..(S,H) - H.setMaxHealth(S.total_health) +/datum/trait/negative/endurance_low/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.setMaxHealth(S.total_health) /datum/trait/negative/endurance_very_low name = "Extremely Low Endurance" @@ -44,9 +41,9 @@ cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc. var_changes = list("total_health" = 50) - apply(var/datum/species/S,var/mob/living/carbon/human/H) - ..(S,H) - H.setMaxHealth(S.total_health) +/datum/trait/negative/endurance_very_low/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.setMaxHealth(S.total_health) /datum/trait/negative/minor_brute_weak name = "Minor Brute Weakness" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index b94e26ad1f..ccf4d9614f 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -1,6 +1,3 @@ -#define ORGANICS 1 -#define SYNTHETICS 2 - /datum/trait/neutral /datum/trait/neutral/metabolism_up @@ -174,7 +171,7 @@ desc = "You're highly allergic to gluten proteins, which are found in most common grains." cost = 0 custom_only = FALSE - var/allergen = GRAINS + var/allergen = ALLERGEN_GRAINS /datum/trait/neutral/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H) S.allergens |= allergen @@ -185,63 +182,63 @@ desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = MEAT + allergen = ALLERGEN_MEAT /datum/trait/neutral/allergy/fish name = "Allergy: Fish" desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = FISH + allergen = ALLERGEN_FISH /datum/trait/neutral/allergy/fruit name = "Allergy: Fruit" desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = FRUIT + allergen = ALLERGEN_FRUIT /datum/trait/neutral/allergy/vegetable name = "Allergy: Vegetable" desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = VEGETABLE + allergen = ALLERGEN_VEGETABLE /datum/trait/neutral/allergy/nuts name = "Allergy: Nuts" desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = SEEDS + allergen = ALLERGEN_SEEDS /datum/trait/neutral/allergy/soy name = "Allergy: Soy" desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = BEANS + allergen = ALLERGEN_BEANS /datum/trait/neutral/allergy/dairy name = "Allergy: Lactose" desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = DAIRY + allergen = ALLERGEN_DAIRY /datum/trait/neutral/allergy/fungi name = "Allergy: Fungi" desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = FUNGI + allergen = ALLERGEN_FUNGI /datum/trait/neutral/allergy/coffee name = "Allergy: Coffee" desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE - allergen = COFFEE + allergen = ALLERGEN_COFFEE /datum/trait/neutral/allergen_reduced_effect name = "Reduced Allergen Reaction" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 8e97b78748..5e472605f6 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -1,6 +1,3 @@ -#define ORGANICS 1 -#define SYNTHETICS 2 - /datum/trait/positive category = 1 @@ -28,9 +25,9 @@ cost = 4 var_changes = list("total_health" = 125) - apply(var/datum/species/S,var/mob/living/carbon/human/H) - ..(S,H) - H.setMaxHealth(S.total_health) +/datum/trait/positive/endurance_high/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.setMaxHealth(S.total_health) /datum/trait/positive/nonconductive name = "Non-Conductive" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm index 9c841429d0..d01d016b2c 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -1,6 +1,3 @@ -#define ORGANICS 1 -#define SYNTHETICS 2 - /datum/trait var/name var/desc = "Contact a developer if you see this trait." diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8ce9754a37..7f8d44a742 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -79,7 +79,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define SUIT_STORE_LAYER 17 //Suit storage-slot item #define BACK_LAYER 18 //Back-slot item #define HAIR_LAYER 19 //The human's hair -<<<<<<< HEAD #define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added. #define EARS_LAYER 21 //Both ear-slot items (combined image) #define EYES_LAYER 22 //Mob's eyes (used for glowing eyes) @@ -93,26 +92,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger. #define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers #define FIRE_LAYER 32 //'Mob on fire' overlay layer -#define WATER_LAYER 33 //'Mob submerged' overlay layer +#define MOB_WATER_LAYER 33 //'Mob submerged' overlay layer #define TARGETED_LAYER 34 //'Aimed at' overlay layer #define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. -======= -#define EARS_LAYER 20 //Both ear-slot items (combined image) -#define EYES_LAYER 21 //Mob's eyes (used for glowing eyes) -#define FACEMASK_LAYER 22 //Mask-slot item -#define HEAD_LAYER 23 //Head-slot item -#define HANDCUFF_LAYER 24 //Handcuffs, if the human is handcuffed, in a secret inv slot -#define LEGCUFF_LAYER 25 //Same as handcuffs, for legcuffs -#define L_HAND_LAYER 26 //Left-hand item -#define R_HAND_LAYER 27 //Right-hand item -#define WING_LAYER 28 //Wings or protrusions over the suit. -#define TAIL_LAYER_ALT 29 //Modified tail-sprite layer. Tend to be larger. -#define MODIFIER_EFFECTS_LAYER 30 //Effects drawn by modifiers -#define FIRE_LAYER 31 //'Mob on fire' overlay layer -#define MOB_WATER_LAYER 32 //'Mob submerged' overlay layer -#define TARGETED_LAYER 33 //'Aimed at' overlay layer -#define TOTAL_LAYERS 33//<---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) ////////////////////////////////// /mob/living/carbon/human @@ -1239,15 +1221,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() tail_s.Blend(overlay, ICON_OVERLAY) qdel(overlay) -<<<<<<< HEAD var/image/working = image(tail_s) if(tail_style.em_block) working.overlays += em_block_image_generic(working) // Leaving this as overlays += - if(isTaurTail(tail_style)) -======= if(istaurtail(tail_style)) ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) var/datum/sprite_accessory/tail/taur/taurtype = tail_style working.pixel_x = -16 if(taurtype.can_ride && !riding_datum) diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index a55e884ee0..d894ad3e1c 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -235,7 +235,7 @@ var/mob/living/carbon/human/H = M - if(isTaurTail(H.tail_style)) + if(istaurtail(H.tail_style)) to_chat(src, "Too many legs. TOO MANY LEGS!!") return FALSE if(M.loc != src.loc) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/_defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/_defines.dm deleted file mode 100644 index 1567134c4d..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/_defines.dm +++ /dev/null @@ -1,13 +0,0 @@ -#define NOT_WHILE_SHIFTED 1 -#define ONLY_WHILE_SHIFTED 2 -#define SHIFTED_OR_NOT 3 - -#define BLUE_EYES 1 -#define RED_EYES 2 -#define PURPLE_EYES 3 -#define YELLOW_EYES 4 -#define GREEN_EYES 5 -#define ORANGE_EYES 6 - -#define AB_PHASE_SHIFTED 0x1 -#define AB_SHADE_REGEN 0x2 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/~defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/~defines.dm deleted file mode 100644 index 28ce75c50b..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/~defines.dm +++ /dev/null @@ -1,11 +0,0 @@ -#undef NOT_WHILE_SHIFTED -#undef ONLY_WHILE_SHIFTED -#undef SHIFTED_OR_NOT - -#undef BLUE_EYES -#undef RED_EYES -#undef PURPLE_EYES -#undef YELLOW_EYES - -#undef AB_PHASE_SHIFTED -#undef AB_SHADE_REGEN \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2540101e20..dba586b741 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1038,7 +1038,7 @@ pixel_x-- is_shifted = TRUE -mob/verb/shifteast() +/mob/verb/shifteast() set hidden = TRUE if(!canface()) return FALSE diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 5b7f3ebe58..7a3997e22a 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -8,600 +8,599 @@ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use the default hairstyles. - astolfo - name = "Astolfo" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "hair_astolfo" +/datum/sprite_accessory/hair/astolfo + name = "Astolfo" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "hair_astolfo" - awoohair - name = "Shoulder-length Messy" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "momijihair" +/datum/sprite_accessory/hair/awoohair + name = "Shoulder-length Messy" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "momijihair" - citheronia - name = "Citheronia Hair (Kira72)" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "citheronia_hair" - ckeys_allowed = list("Kira72") - do_colouration = 0 +/datum/sprite_accessory/hair/citheronia + name = "Citheronia Hair (Kira72)" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "citheronia_hair" + ckeys_allowed = list("Kira72") + do_colouration = 0 - taramaw - name = "Hairmaw (Liquidfirefly)" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "maw_hair" - ckeys_allowed = list("liquidfirefly") - do_colouration = 0 +/datum/sprite_accessory/hair/taramaw + name = "Hairmaw (Liquidfirefly)" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "maw_hair" + ckeys_allowed = list("liquidfirefly") + do_colouration = 0 - citheronia_colorable - name = "Citheronia Hair" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "citheronia_hair_c" - do_colouration = 1 +/datum/sprite_accessory/hair/citheronia_colorable + name = "Citheronia Hair" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "citheronia_hair_c" + do_colouration = 1 - sergal_plain - name = "Sergal Plain" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "serg_plain" - species_allowed = list(SPECIES_SERGAL) +/datum/sprite_accessory/hair/sergal_plain + name = "Sergal Plain" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "serg_plain" + species_allowed = list(SPECIES_SERGAL) - sergal_medicore - name = "Sergal Medicore" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "serg_medicore" - species_allowed = list(SPECIES_SERGAL) +/datum/sprite_accessory/hair/sergal_medicore + name = "Sergal Medicore" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "serg_medicore" + species_allowed = list(SPECIES_SERGAL) - sergal_tapered - name = "Sergal Tapered" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "serg_tapered" - species_allowed = list(SPECIES_SERGAL) +/datum/sprite_accessory/hair/sergal_tapered + name = "Sergal Tapered" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "serg_tapered" + species_allowed = list(SPECIES_SERGAL) - sergal_fairytail - name = "Sergal Fairytail" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "serg_fairytail" - species_allowed = list(SPECIES_SERGAL) +/datum/sprite_accessory/hair/sergal_fairytail + name = "Sergal Fairytail" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "serg_fairytail" + species_allowed = list(SPECIES_SERGAL) - braid - name = "Floorlength Braid" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "hair_braid" +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "hair_braid" - twindrills - name = "Twin Drills" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "hair_twincurl" +/datum/sprite_accessory/hair/twindrills + name = "Twin Drills" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "hair_twincurl" - crescent_moon - name = "Crescent-Moon" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "crescent_moon" +/datum/sprite_accessory/hair/crescent_moon + name = "Crescent-Moon" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "crescent_moon" - bald - name = "Bald" - icon_state = "bald" - gender = MALE - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //Lets all the races be bald if they want. +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = "bald" + gender = MALE + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //Lets all the races be bald if they want. - ponytail6_fixed //Eggnerd's done with waiting for upstream fixes lmao. - name = "Ponytail 6 but fixed" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "hair_ponytail6" - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) +/datum/sprite_accessory/hair/ponytail6_fixed + name = "Ponytail 6 but fixed" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "hair_ponytail6" + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) - una_hood - name = "Cobra Hood" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "soghun_hood" +/datum/sprite_accessory/hair/una_hood + name = "Cobra Hood" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "soghun_hood" - una_spines_long - name = "Long Unathi Spines" - icon_state = "soghun_longspines" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) //Xenochimera get most hairstyles since they're abominations. +/datum/sprite_accessory/hair/una_spines_long + name = "Long Unathi Spines" + icon_state = "soghun_longspines" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) //Xenochimera get most hairstyles since they're abominations. - una_spines_short - name = "Short Unathi Spines" - icon_state = "soghun_shortspines" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_spines_short + name = "Short Unathi Spines" + icon_state = "soghun_shortspines" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_frills_long + name = "Long Unathi Frills" + icon_state = "soghun_longfrills" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_frills_long - name = "Long Unathi Frills" - icon_state = "soghun_longfrills" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_frills_short + name = "Short Unathi Frills" + icon_state = "soghun_shortfrills" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_frills_short - name = "Short Unathi Frills" - icon_state = "soghun_shortfrills" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_horns + name = "Unathi Horns" + icon_state = "soghun_horns" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_horns - name = "Unathi Horns" - icon_state = "soghun_horns" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_bighorns + name = "Unathi Big Horns" + icon_state = "unathi_bighorn" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_bighorns - name = "Unathi Big Horns" - icon_state = "unathi_bighorn" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_smallhorns + name = "Unathi Small Horns" + icon_state = "unathi_smallhorn" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_smallhorns - name = "Unathi Small Horns" - icon_state = "unathi_smallhorn" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_ramhorns + name = "Unathi Ram Horns" + icon_state = "unathi_ramhorn" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_ramhorns - name = "Unathi Ram Horns" - icon_state = "unathi_ramhorn" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_sidefrills + name = "Unathi Side Frills" + icon_state = "unathi_sidefrills" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_sidefrills - name = "Unathi Side Frills" - icon_state = "unathi_sidefrills" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_doublehorns + name = "Double Unathi Horns" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "soghun_dubhorns" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - una_doublehorns - name = "Double Unathi Horns" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "soghun_dubhorns" - species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears + name = "Tajaran Ears" + icon_state = "ears_plain" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears - name = "Tajaran Ears" - icon_state = "ears_plain" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_clean + name = "Tajara Clean" + icon_state = "hair_clean" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_clean - name = "Tajara Clean" - icon_state = "hair_clean" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_bangs + name = "Tajara Bangs" + icon_state = "hair_bangs" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_bangs - name = "Tajara Bangs" - icon_state = "hair_bangs" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_braid + name = "Tajara Braid" + icon_state = "hair_tbraid" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_braid - name = "Tajara Braid" - icon_state = "hair_tbraid" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_shaggy + name = "Tajara Shaggy" + icon_state = "hair_shaggy" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_shaggy - name = "Tajara Shaggy" - icon_state = "hair_shaggy" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_mohawk + name = "Tajaran Mohawk" + icon_state = "hair_mohawk" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_mohawk - name = "Tajaran Mohawk" - icon_state = "hair_mohawk" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_plait + name = "Tajara Plait" + icon_state = "hair_plait" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_plait - name = "Tajara Plait" - icon_state = "hair_plait" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_straight + name = "Tajara Straight" + icon_state = "hair_straight" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_straight - name = "Tajara Straight" - icon_state = "hair_straight" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_long + name = "Tajara Long" + icon_state = "hair_long" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_long - name = "Tajara Long" - icon_state = "hair_long" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_rattail + name = "Tajara Rat Tail" + icon_state = "hair_rattail" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_rattail - name = "Tajara Rat Tail" - icon_state = "hair_rattail" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_spiky + name = "Tajara Spiky" + icon_state = "hair_tajspiky" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_spiky - name = "Tajara Spiky" - icon_state = "hair_tajspiky" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_messy + name = "Tajara Messy" + icon_state = "hair_messy" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_messy - name = "Tajara Messy" - icon_state = "hair_messy" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_curls + name = "Tajaran Curly" + icon_state = "hair_curly" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_curls - name = "Tajaran Curly" - icon_state = "hair_curly" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_wife + name = "Tajaran Housewife" + icon_state = "hair_wife" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_wife - name = "Tajaran Housewife" - icon_state = "hair_wife" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_victory + name = "Tajaran Victory Curls" + icon_state = "hair_victory" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_victory - name = "Tajaran Victory Curls" - icon_state = "hair_victory" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_bob + name = "Tajaran Bob" + icon_state = "hair_tbob" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - taj_ears_bob - name = "Tajaran Bob" - icon_state = "hair_tbob" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - - taj_ears_fingercurl - name = "Tajaran Finger Curls" - icon_state = "hair_fingerwave" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/taj_ears_fingercurl + name = "Tajaran Finger Curls" + icon_state = "hair_fingerwave" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) //Teshari things - teshari - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_altdefault - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_altdefault + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_tight - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_tight + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_excited - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_excited + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_spike - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_spike + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_long - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_long + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_burst - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_burst + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_shortburst - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_shortburst + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_mohawk - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_mohawk + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_pointy - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_pointy + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_upright - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_upright + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_mane - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_mane + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_droopy - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_droopy + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_mushroom - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_mushroom + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_twies - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_twies + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_backstrafe - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_backstrafe + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_longway - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_longway + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_tree - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_tree + icon_add = 'icons/mob/human_face_vr_add.dmi' - teshari_fluffymohawk - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' +/datum/sprite_accessory/hair/teshari_fluffymohawk + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' //Skrell 'hairstyles' - these were requested for a chimera and screw it, if one wants to eat seafood, go nuts - skr_tentacle_veryshort - name = "Skrell Very Short Tentacles" - icon_state = "skrell_hair_veryshort" - species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - gender = MALE +/datum/sprite_accessory/hair/skr_tentacle_veryshort + name = "Skrell Very Short Tentacles" + icon_state = "skrell_hair_veryshort" + species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) + gender = MALE - skr_tentacle_short - name = "Skrell Short Tentacles" - icon_state = "skrell_hair_short" - species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/skr_tentacle_short + name = "Skrell Short Tentacles" + icon_state = "skrell_hair_short" + species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - skr_tentacle_average - name = "Skrell Average Tentacles" - icon_state = "skrell_hair_average" - species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/skr_tentacle_average + name = "Skrell Average Tentacles" + icon_state = "skrell_hair_average" + species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - skr_tentacle_verylong - name = "Skrell Long Tentacles" - icon_state = "skrell_hair_verylong" - species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) - gender = FEMALE +/datum/sprite_accessory/hair/skr_tentacle_verylong + name = "Skrell Long Tentacles" + icon_state = "skrell_hair_verylong" + species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) + gender = FEMALE // Vulpa stuffs - vulp_hair_none - name = "None" - icon_state = "bald" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_none + name = "None" + icon_state = "bald" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_hair_kajam - name = "Kajam" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "kajam" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_kajam + name = "Kajam" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "kajam" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_keid - name = "Keid" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "keid" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_keid + name = "Keid" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "keid" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_adhara - name = "Adhara" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "adhara" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_adhara + name = "Adhara" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "adhara" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_kleeia - name = "Kleeia" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "kleeia" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_kleeia + name = "Kleeia" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "kleeia" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_mizar - name = "Mizar" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "mizar" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_mizar + name = "Mizar" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "mizar" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_apollo - name = "Apollo" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "apollo" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_apollo + name = "Apollo" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "apollo" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_belle - name = "Belle" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "belle" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_belle + name = "Belle" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "belle" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_bun - name = "Vulp Bun" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "bun" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_bun + name = "Vulp Bun" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "bun" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_jagged - name = "Jagged" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "jagged" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_jagged + name = "Jagged" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "jagged" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_curl - name = "Curl" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "curl" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_curl + name = "Curl" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "curl" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_hawk - name = "Hawk" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "hawk" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_hawk + name = "Hawk" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "hawk" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_anita - name = "Anita" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "anita" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_anita + name = "Anita" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "anita" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_short - name = "Short" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "short" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_short + name = "Short" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "short" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER - vulp_hair_spike - name = "Spike" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "spike" - species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) - gender = NEUTER +/datum/sprite_accessory/hair/vulp_hair_spike + name = "Spike" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "spike" + species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) + gender = NEUTER //xeno stuffs - xeno_head_drone_color - name = "Drone dome" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "cxeno_drone" - species_allowed = list(SPECIES_XENOHYBRID) - gender = NEUTER +/datum/sprite_accessory/hair/xeno_head_drone_color + name = "Drone dome" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "cxeno_drone" + species_allowed = list(SPECIES_XENOHYBRID) + gender = NEUTER // figure this one out for better coloring - xeno_head_sentinel_color - name = "Sentinal dome" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "cxeno_sentinel" - species_allowed = list(SPECIES_XENOHYBRID) - gender = NEUTER +/datum/sprite_accessory/hair/xeno_head_sentinel_color + name = "Sentinal dome" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "cxeno_sentinel" + species_allowed = list(SPECIES_XENOHYBRID) + gender = NEUTER - xeno_head_queen_color - name = "Queen dome" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "cxeno_queen" - species_allowed = list(SPECIES_XENOHYBRID) - gender = NEUTER +/datum/sprite_accessory/hair/xeno_head_queen_color + name = "Queen dome" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "cxeno_queen" + species_allowed = list(SPECIES_XENOHYBRID) + gender = NEUTER - xeno_head_hunter_color - name = "Hunter dome" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "cxeno_hunter" - species_allowed = list(SPECIES_XENOHYBRID) - gender = NEUTER +/datum/sprite_accessory/hair/xeno_head_hunter_color + name = "Hunter dome" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "cxeno_hunter" + species_allowed = list(SPECIES_XENOHYBRID) + gender = NEUTER - xeno_head_praetorian_color - name = "Praetorian dome" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "cxeno_praetorian" - species_allowed = list(SPECIES_XENOHYBRID) - gender = NEUTER +/datum/sprite_accessory/hair/xeno_head_praetorian_color + name = "Praetorian dome" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "cxeno_praetorian" + species_allowed = list(SPECIES_XENOHYBRID) + gender = NEUTER // Shadekin stuffs - shadekin_hair_short - name = "Shadekin Short Hair" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "shadekin_short" - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) - gender = NEUTER +/datum/sprite_accessory/hair/shadekin_hair_short + name = "Shadekin Short Hair" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "shadekin_short" + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + gender = NEUTER - shadekin_hair_poofy - name = "Shadekin Poofy Hair" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "shadekin_poofy" - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) - gender = NEUTER +/datum/sprite_accessory/hair/shadekin_hair_poofy + name = "Shadekin Poofy Hair" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "shadekin_poofy" + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + gender = NEUTER - shadekin_hair_long - name = "Shadekin Long Hair" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "shadekin_long" - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) - gender = NEUTER +/datum/sprite_accessory/hair/shadekin_hair_long + name = "Shadekin Long Hair" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "shadekin_long" + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + gender = NEUTER - shadekin_hair_rivyr - name = "Rivyr Hair" - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' - icon_state = "shadekin_rivyr" - ckeys_allowed = list("verysoft") - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) - gender = NEUTER +/datum/sprite_accessory/hair/shadekin_hair_rivyr + name = "Rivyr Hair" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "shadekin_rivyr" + ckeys_allowed = list("verysoft") + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + gender = NEUTER /datum/sprite_accessory/facial_hair icon = 'icons/mob/human_face_or_vr.dmi' color_blend_mode = ICON_MULTIPLY species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the facial hair styles. - shaved - name = "Shaved" - icon_state = "bald" - gender = NEUTER - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This needed to be manually defined, apparantly. +/datum/sprite_accessory/facial_hair/shaved + name = "Shaved" + icon_state = "bald" + gender = NEUTER + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This needed to be manually defined, apparantly. - neck_fluff - name = "Neck Fluff" - icon = 'icons/mob/human_face_or_vr.dmi' - icon_state = "facial_neckfluff" - gender = NEUTER - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) +/datum/sprite_accessory/facial_hair/neck_fluff + name = "Neck Fluff" + icon = 'icons/mob/human_face_or_vr.dmi' + icon_state = "facial_neckfluff" + gender = NEUTER + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) - vulp_none - name = "None" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "none" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_none + name = "None" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "none" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_blaze - name = "Blaze" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_blaze" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_blaze + name = "Blaze" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_blaze" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_vulpine - name = "Vulpine" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_vulpine" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_vulpine + name = "Vulpine" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_vulpine" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_earfluff - name = "Earfluff" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_earfluff" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_earfluff + name = "Earfluff" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_earfluff" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_mask - name = "Mask" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_mask" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_mask + name = "Mask" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_mask" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_patch - name = "Patch" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_patch" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_patch + name = "Patch" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_patch" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_ruff - name = "Ruff" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_ruff" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_ruff + name = "Ruff" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_ruff" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_kita - name = "Kita" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_kita" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_kita + name = "Kita" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_kita" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER - vulp_swift - name = "Swift" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "vulp_facial_swift" - species_allowed = list(SPECIES_VULPKANIN) - gender = NEUTER +/datum/sprite_accessory/facial_hair/vulp_swift + name = "Swift" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "vulp_facial_swift" + species_allowed = list(SPECIES_VULPKANIN) + gender = NEUTER /* //////////////////////////// diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm index 5f97785341..cb2a8cea32 100644 --- a/code/modules/overmap/disperser/disperser_console.dm +++ b/code/modules/overmap/disperser/disperser_console.dm @@ -61,7 +61,7 @@ return TRUE return FALSE -obj/machinery/computer/ship/disperser/proc/is_valid_setup() +/obj/machinery/computer/ship/disperser/proc/is_valid_setup() if(front && middle && back) var/everything_in_range = (get_dist(src, front) < link_range) && (get_dist(src, middle) < link_range) && (get_dist(src, back) < link_range) var/everything_in_order = (middle.Adjacent(front) && middle.Adjacent(back)) && (front.dir == middle.dir && middle.dir == back.dir) diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm deleted file mode 100644 index 32f213f95f..0000000000 --- a/code/modules/power/generator_type2.dm +++ /dev/null @@ -1,141 +0,0 @@ -/obj/machinery/power/generator_type2 - name = "thermoelectric generator" - desc = "It's a high efficiency thermoelectric generator." - icon_state = "teg" - anchored = 1 - density = 1 - use_power = USE_POWER_OFF - - var/obj/machinery/atmospherics/unary/generator_input/input1 - var/obj/machinery/atmospherics/unary/generator_input/input2 - - var/lastgen = 0 - var/lastgenlev = -1 - - -/obj/machinery/power/generator_type2/Initialize() - . = ..() - input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90)) - input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90)) - if(!input1 || !input2) - stat |= BROKEN - updateicon() - -/obj/machinery/power/generator_type2/proc/updateicon() - - if(stat & (NOPOWER|BROKEN)) - cut_overlays() - else - cut_overlays() - - if(lastgenlev != 0) - add_overlay("teg-op[lastgenlev]") - -#define GENRATE 800 // generator output coefficient from Q - - -/obj/machinery/power/generator_type2/process() - if(!input1 || !input2) - return - - var/datum/gas_mixture/air1 = input1.return_exchange_air() - var/datum/gas_mixture/air2 = input2.return_exchange_air() - - - lastgen = 0 - - if(air1 && air2) - var/datum/gas_mixture/hot_air = air1 - var/datum/gas_mixture/cold_air = air2 - if(hot_air.temperature < cold_air.temperature) - hot_air = air2 - cold_air = air1 - - var/hot_air_heat_capacity = hot_air.heat_capacity() - var/cold_air_heat_capacity = cold_air.heat_capacity() - - var/delta_temperature = hot_air.temperature - cold_air.temperature - - if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01) - var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency - - var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) - - var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency - - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity - cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - - //to_world("POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - - if(input1.network) - input1.network.update = 1 - - if(input2.network) - input2.network.update = 1 - - add_avail(lastgen) - // update icon overlays only if displayed level has changed - - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) - if(genlev != lastgenlev) - lastgenlev = genlev - updateicon() - - src.updateDialog() - - -/obj/machinery/power/generator_type2/attack_ai(mob/user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) - - -/obj/machinery/power/generator_type2/attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) - - -/obj/machinery/power/generator_type2/interact(mob/user) - if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) - user.unset_machine() - user << browse(null, "window=teg") - return - - user.set_machine(src) - - var/t = "
Thermo-Electric Generator
" - - t += "Output : [round(lastgen)] W

" - - t += "Cold loop
" - t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
" - t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
" - - t += "Hot loop
" - t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
" - t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
" - - t += "

Close" - - t += "
" - user << browse(t, "window=teg;size=460x300") - onclose(user, "teg") - return 1 - - -/obj/machinery/power/generator_type2/Topic(href, href_list) - ..() - - if( href_list["close"] ) - usr << browse(null, "window=teg") - usr.unset_machine() - return 0 - - return 1 - - -/obj/machinery/power/generator_type2/power_change() - ..() - updateicon() \ No newline at end of file diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm index 22f6ea9511..31e5fb7bc2 100644 --- a/code/modules/reagents/reactions/instant/instant_vr.dm +++ b/code/modules/reagents/reactions/instant/instant_vr.dm @@ -200,36 +200,26 @@ /////////////////////////////// //SLIME CORES BELOW HERE/////// /////////////////////////////// - - - /decl/chemical_reaction/instant/slime_food name = "Slime Bork" id = "m_tele2" result = null required_reagents = list("phoron" = 10, "slimejelly" = 5, "nutriment" = 20) result_amount = 1 - on_reaction(var/datum/reagents/holder) - - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK - - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) -/* Removed at some point, unsure what to replace with - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) -*/ - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) +/decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder) + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) /decl/chemical_reaction/instant/materials name = "Slime materials" @@ -237,56 +227,52 @@ result = null required_reagents = list("phoron" = 20, "slimejelly" = 40, "aluminum" = 20) //Woah there! You have the possibility of making diamonds! 8 ground up slimes required for one of these, and you still have a 10% chance for it to fail. result_amount = 1 - on_reaction(var/datum/reagents/holder) - var/fail_chance = rand(1,1000) - if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials. - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The solution begins to vibrate violently!"), 1) // It was at this moment, the Xenobiologist knew... he fucked up. - sleep(30) - playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The reaction begins to rapidly sizzle and swell outwards!"), 1) - sleep(20) - explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person. - empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast! - return - if(fail_chance < 101) // 10% chance of it not working at all. - playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime core fizzles disappointingly."), 1) - return +/decl/chemical_reaction/instant/materials/on_reaction(var/datum/reagents/holder) + var/fail_chance = rand(1,1000) + if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials. + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The solution begins to vibrate violently!"), 1) // It was at this moment, the Xenobiologist knew... he fucked up. + sleep(30) + playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The reaction begins to rapidly sizzle and swell outwards!"), 1) + sleep(20) + explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person. + empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast! + return - var/blocked = list( - /obj/item/stack/material, //Technical stacks - /obj/item/stack/hairlesshide, //Useless leather production steps - /obj/item/stack/wetleather, - /obj/item/stack/material/algae/ten) //Why is this one even a separate thing - blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs - blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway + if(fail_chance < 101) // 10% chance of it not working at all. + playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime core fizzles disappointingly."), 1) + return - var/rare_types = list( - /obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create - /obj/item/stack/material/morphium/hull, - /obj/item/stack/material/valhollide, - /obj/item/stack/material/supermatter) + var/blocked = list( + /obj/item/stack/material, //Technical stacks + /obj/item/stack/hairlesshide, //Useless leather production steps + /obj/item/stack/wetleather, + /obj/item/stack/material/algae/ten) //Why is this one even a separate thing + blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs + blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway - var/list/material = typesof(/obj/item/stack/material) - blocked + var/rare_types = list( + /obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create + /obj/item/stack/material/morphium/hull, + /obj/item/stack/material/valhollide, + /obj/item/stack/material/supermatter) - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) -/* Removed at some point, unsure what to replace with - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) -*/ - var/spawn_amount = rand(1,50) - var/chosen = pick(material) - if(chosen in rare_types) - spawn_amount = rand(1,15) - var/obj/item/stack/material/C = new chosen - C.amount = spawn_amount - C.loc = get_turf(holder.my_atom) + var/list/material = typesof(/obj/item/stack/material) - blocked + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) + + var/spawn_amount = rand(1,50) + var/chosen = pick(material) + if(chosen in rare_types) + spawn_amount = rand(1,15) + var/obj/item/stack/material/C = new chosen + C.amount = spawn_amount + C.loc = get_turf(holder.my_atom) /decl/chemical_reaction/instant/slimelight name = "Slime Glow" @@ -294,11 +280,12 @@ result = null required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 10) //Takes 10 water so it doesn't mess with the frost oil. result_amount = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text(" The contents of the slime core harden and begin to emit a warm, bright light."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) + +/decl/chemical_reaction/instant/slimelight/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text(" The contents of the slime core harden and begin to emit a warm, bright light."), 1) + var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime + F.loc = get_turf(holder.my_atom) /decl/chemical_reaction/instant/slimephoron @@ -307,10 +294,11 @@ result = null required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20) result_amount = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron - P.amount = 10 - P.loc = get_turf(holder.my_atom) + +/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder) + var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron + P.amount = 10 + P.loc = get_turf(holder.my_atom) /decl/chemical_reaction/instant/slimefreeze name = "Slime Freeze" @@ -318,17 +306,15 @@ result = null required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10) result_amount = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently!"), 1) - sleep(50) - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - to_chat(M, " You suddenly feel a chill!") - - +/decl/chemical_reaction/instant/slimefreeze/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently!"), 1) + sleep(50) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 140 + to_chat(M, " You suddenly feel a chill!") /decl/chemical_reaction/instant/slimefrost name = "Slime Frost Oil" @@ -337,24 +323,21 @@ required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5) result_amount = 10 - - - /decl/chemical_reaction/instant/slimefire name = "Slime fire" id = "m_fire" result = null required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30) result_amount = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently!"), 1) - sleep(50) - var/turf/location = get_turf(holder.my_atom.loc) - for(var/turf/simulated/floor/target_tile in range(0,location)) - target_tile.assume_gas("phoron", 25, 1400) - spawn (0) target_tile.hotspot_expose(700, 400) +/decl/chemical_reaction/instant/slimefire/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently!"), 1) + sleep(50) + var/turf/location = get_turf(holder.my_atom.loc) + for(var/turf/simulated/floor/target_tile in range(0,location)) + target_tile.assume_gas("phoron", 25, 1400) + spawn (0) target_tile.hotspot_expose(700, 400) /decl/chemical_reaction/instant/slimeify name = "Advanced Mutation Toxin" @@ -363,25 +346,22 @@ required_reagents = list("phoron" = 15, "slimejelly" = 15, "mutationtoxin" = 15) //In case a xenobiologist wants to become a fully fledged slime person. result_amount = 1 - - - - /decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not. name = "Slime Health" id = "slimeheal" result = "null" required_reagents = list("phoron" = 10, "bicaridine" = 10, "kelotane" = 10, "inaprovaline" = 10, "slimejelly" = 10) - on_reaction(var/datum/reagents/holder, var/created_volume) - for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - to_chat(C, "A wave of energy suddenly invigorates you.") - C.adjustBruteLoss(-25) - C.adjustFireLoss(-25) - C.adjustToxLoss(-25) - C.adjustOxyLoss(-25) - C.adjustBrainLoss(-25) - C.adjustCloneLoss(-25) - C.updatehealth() + +/decl/chemical_reaction/instant/slimeheal/on_reaction(var/datum/reagents/holder, var/created_volume) + for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + to_chat(C, "A wave of energy suddenly invigorates you.") + C.adjustBruteLoss(-25) + C.adjustFireLoss(-25) + C.adjustToxLoss(-25) + C.adjustOxyLoss(-25) + C.adjustBrainLoss(-25) + C.adjustCloneLoss(-25) + C.updatehealth() /decl/chemical_reaction/instant/slimejelly name = "Slime Jam" @@ -396,62 +376,58 @@ result = null required_reagents = list("phoron" = 20, "nutriment" = 20, "sugar" = 20, "mutationtoxin" = 20) //Can't do slime jelly as it'll conflict with another, but mutation toxin will do. result_amount = 1 - on_reaction(var/datum/reagents/holder) - var/mob_path = /mob/living/simple_mob - var/blocked = list( //List of things we do NOT want to spawn - /mob/living/simple_mob, //Technical parent mobs - /mob/living/simple_mob/animal, - /mob/living/simple_mob/animal/passive, - /mob/living/simple_mob/animal/space, - /mob/living/simple_mob/blob, - /mob/living/simple_mob/mechanical, - /mob/living/simple_mob/mechanical/mecha, - /mob/living/simple_mob/slime, - /mob/living/simple_mob/vore, - /mob/living/simple_mob/vore/aggressive, - /mob/living/simple_mob/illusion, //Other technical mobs - /mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs - /mob/living/simple_mob/animal/passive/cat/runtime, - /mob/living/simple_mob/animal/passive/cat/bones, - /mob/living/simple_mob/animal/passive/cat/tabiranth, - /mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar, - /mob/living/simple_mob/animal/passive/dog/corgi/Ian, - /mob/living/simple_mob/animal/passive/dog/corgi/Lisa, - /mob/living/simple_mob/animal/passive/dog/tamaskan/Spice, - /mob/living/simple_mob/animal/passive/fox/renault, - /mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter, - /mob/living/simple_mob/animal/passive/bird/parrot/poly, - /mob/living/simple_mob/animal/sif/fluffy, - /mob/living/simple_mob/animal/sif/fluffy/silky, - /mob/living/simple_mob/animal/passive/snake/noodle, - /mob/living/simple_mob/slime/xenobio/rainbow/kendrick, - /mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads - /mob/living/simple_mob/animal/space/space_worm/head/severed, - /mob/living/simple_mob/animal/borer, //Event/player-control-only mobs - /mob/living/simple_mob/vore/hostile/morph - )//exclusion list for things you don't want the reaction to create. - blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities - blocked += typesof(/mob/living/simple_mob/construct) //Should only exist - blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled - blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things - blocked += typesof(/mob/living/simple_mob/horror) - var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs - playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) -/* Removed at some point, unsure what to replace with - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) -*/ - var/spawn_count = rand(1,3) - for(var/i = 1, i <= spawn_count, i++) - var/chosen = pick(voremobs) - var/mob/living/simple_mob/C = new chosen - C.faction = "slimesummon" - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) +/decl/chemical_reaction/instant/slimevore/on_reaction(var/datum/reagents/holder) + var/mob_path = /mob/living/simple_mob + var/blocked = list( //List of things we do NOT want to spawn + /mob/living/simple_mob, //Technical parent mobs + /mob/living/simple_mob/animal, + /mob/living/simple_mob/animal/passive, + /mob/living/simple_mob/animal/space, + /mob/living/simple_mob/blob, + /mob/living/simple_mob/mechanical, + /mob/living/simple_mob/mechanical/mecha, + /mob/living/simple_mob/slime, + /mob/living/simple_mob/vore, + /mob/living/simple_mob/vore/aggressive, + /mob/living/simple_mob/illusion, //Other technical mobs + /mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs + /mob/living/simple_mob/animal/passive/cat/runtime, + /mob/living/simple_mob/animal/passive/cat/bones, + /mob/living/simple_mob/animal/passive/cat/tabiranth, + /mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar, + /mob/living/simple_mob/animal/passive/dog/corgi/Ian, + /mob/living/simple_mob/animal/passive/dog/corgi/Lisa, + /mob/living/simple_mob/animal/passive/dog/tamaskan/Spice, + /mob/living/simple_mob/animal/passive/fox/renault, + /mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter, + /mob/living/simple_mob/animal/passive/bird/parrot/poly, + /mob/living/simple_mob/animal/sif/fluffy, + /mob/living/simple_mob/animal/sif/fluffy/silky, + /mob/living/simple_mob/animal/passive/snake/noodle, + /mob/living/simple_mob/slime/xenobio/rainbow/kendrick, + /mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads + /mob/living/simple_mob/animal/space/space_worm/head/severed, + /mob/living/simple_mob/animal/borer, //Event/player-control-only mobs + /mob/living/simple_mob/vore/hostile/morph + )//exclusion list for things you don't want the reaction to create. + blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities + blocked += typesof(/mob/living/simple_mob/construct) //Should only exist + blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled + blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things + blocked += typesof(/mob/living/simple_mob/horror) + var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs + + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) + var/spawn_count = rand(1,3) + for(var/i = 1, i <= spawn_count, i++) + var/chosen = pick(voremobs) + var/mob/living/simple_mob/C = new chosen + C.faction = "slimesummon" + C.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) /decl/chemical_reaction/instant/slime/sapphire_mutation name = "Slime Mutation Toxins" diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index c3e2ea92f1..05f7f28a0d 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -73,11 +73,7 @@ return /obj/structure/bigDelivery/update_icon() -<<<<<<< HEAD cut_overlays() -======= - overlays = new() ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(nameset || examtext) var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") if(icon_state == "deliverycloset") @@ -90,11 +86,7 @@ label_x = rand(-8, 6) I.pixel_x = label_x I.pixel_y = -3 -<<<<<<< HEAD add_overlay(I) -======= - overlays += I ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(src.sortTag) var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") if(icon_state == "deliverycloset") @@ -107,11 +99,7 @@ tag_x = rand(-8, 6) I.pixel_x = tag_x I.pixel_y = -3 -<<<<<<< HEAD add_overlay(I) -======= - overlays += I ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/structure/bigDelivery/examine(mob/user) . = ..() @@ -197,20 +185,12 @@ return /obj/item/smallDelivery/update_icon() -<<<<<<< HEAD cut_overlays() -======= - overlays = new() ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if((nameset || examtext) && icon_state != "deliverycrate1") var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") if(icon_state == "deliverycrate5") I.pixel_y = -1 -<<<<<<< HEAD add_overlay(I) -======= - overlays += I ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) if(src.sortTag) var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") switch(icon_state) @@ -227,11 +207,7 @@ I.pixel_y = 3 if("deliverycrate5") I.pixel_y = -3 -<<<<<<< HEAD add_overlay(I) -======= - overlays += I ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/item/smallDelivery/examine(mob/user) . = ..() @@ -363,7 +339,6 @@ item_state = "electronic" slot_flags = SLOT_BELT -<<<<<<< HEAD /obj/item/device/destTagger/tgui_state(mob/user) return GLOB.tgui_inventory_state @@ -395,32 +370,6 @@ return FALSE currTag = new_tag . = TRUE -======= -/obj/item/device/destTagger/proc/openwindow(mob/user as mob) - var/dat = "

TagMaster 2.3

" - - dat += "" - for(var/i = 1, i <= GLOB.tagger_locations.len, i++) - dat += "" - - if (i%4==0) - dat += "" - - dat += "
[GLOB.tagger_locations[i]]

Current Selection: [currTag ? currTag : "None"]
" - - user << browse(dat, "window=destTagScreen;size=450x350") - onclose(user, "destTagScreen") - -/obj/item/device/destTagger/attack_self(mob/user as mob) - openwindow(user) - return - -/obj/item/device/destTagger/Topic(href, href_list) - src.add_fingerprint(usr) - if(href_list["nextTag"] && (href_list["nextTag"] in GLOB.tagger_locations)) - src.currTag = href_list["nextTag"] - openwindow(usr) ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/disposal/deliveryChute name = "Delivery chute" @@ -430,20 +379,11 @@ var/c_mode = 0 -<<<<<<< HEAD -/obj/machinery/disposal/deliveryChute/New() - ..() - spawn(5) - trunk = locate() in src.loc - if(trunk) - trunk.linked = src // link the pipe trunk to self -======= /obj/machinery/disposal/deliveryChute/Initialize() . = ..() trunk = locate() in src.loc if(trunk) trunk.linked = src // link the pipe trunk to self ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/disposal/deliveryChute/interact() return @@ -498,36 +438,6 @@ return if(I.is_screwdriver()) -<<<<<<< HEAD - if(c_mode==0) - c_mode=1 - playsound(src, I.usesound, 50, 1) - to_chat(user, "You remove the screws around the power connection.") - return - else if(c_mode==1) - c_mode=0 - playsound(src, I.usesound, 50, 1) - to_chat(user, "You attach the screws around the power connection.") - return - else if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1) - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You start slicing the floorweld off the delivery chute.") - if(do_after(user,20 * W.toolspeed)) - if(!src || !W.isOn()) return - to_chat(user, "You sliced the floorweld off the delivery chute.") - var/obj/structure/disposalconstruct/C = new (src.loc) - C.ptype = 8 // 8 = Delivery chute - C.update() - C.anchored = 1 - C.density = 1 - qdel(src) - return - else - to_chat(user, "You need more welding fuel to complete this task.") - return -======= c_mode = !c_mode playsound(src, I.usesound, 50, 1) to_chat(user, "You [c_mode ? "remove" : "attach"] the screws around the power connection.") @@ -549,7 +459,6 @@ C.density = 1 qdel(src) return ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) /obj/machinery/disposal/deliveryChute/Destroy() if(trunk) diff --git a/code/modules/resleeving/infomorph_software.dm b/code/modules/resleeving/infomorph_software.dm index 67a2bd47f9..34f9c4ddd4 100644 --- a/code/modules/resleeving/infomorph_software.dm +++ b/code/modules/resleeving/infomorph_software.dm @@ -301,25 +301,25 @@ ram_cost = 15 id = "ar_hud" - toggle(mob/living/silicon/infomorph/user) - user.arHUD = !user.arHUD - if(user.plane_holder) - user.plane_holder.set_vis(VIS_CH_ID,user.arHUD) - user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD) +/datum/infomorph_software/ar_hud/toggle(mob/living/silicon/infomorph/user) + user.arHUD = !user.arHUD + if(user.plane_holder) + user.plane_holder.set_vis(VIS_CH_ID,user.arHUD) + user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD) - is_active(mob/living/silicon/infomorph/user) - return user.arHUD +/datum/infomorph_software/ar_hud/is_active(mob/living/silicon/infomorph/user) + return user.arHUD /datum/infomorph_software/translator name = "Universal Translator" ram_cost = 15 id = "translator" - toggle(mob/living/silicon/infomorph/user) - user.translator.attack_self(user) +/datum/infomorph_software/translator/toggle(mob/living/silicon/infomorph/user) + user.translator.attack_self(user) - is_active(mob/living/silicon/infomorph/user) - return user.translator.listening +/datum/infomorph_software/translator/is_active(mob/living/silicon/infomorph/user) + return user.translator.listening /datum/infomorph_software/signaller diff --git a/code/modules/rogueminer_vr/asteroid.dm b/code/modules/rogueminer_vr/asteroid.dm index d1e046cfb1..c056eae02f 100644 --- a/code/modules/rogueminer_vr/asteroid.dm +++ b/code/modules/rogueminer_vr/asteroid.dm @@ -92,28 +92,28 @@ type_wall = /turf/simulated/wall type_under = /turf/simulated/floor/plating - New() - ..() - spot_add(1,1,type_wall) //Bottom left corner - spot_add(1,2,type_wall) - spot_add(1,3,type_wall) - spot_add(2,1,type_wall) - spot_add(2,2,type_under) //Center floor - spot_add(2,2,/obj/random/roguemineloot) //Loot! - spot_add(2,3,type_wall) - spot_add(3,1,type_wall) - spot_add(3,2,type_wall) - spot_add(3,3,type_wall) //Bottom right corner +/datum/rogue/asteroid/predef/cargo/New() + ..() + spot_add(1,1,type_wall) //Bottom left corner + spot_add(1,2,type_wall) + spot_add(1,3,type_wall) + spot_add(2,1,type_wall) + spot_add(2,2,type_under) //Center floor + spot_add(2,2,/obj/random/roguemineloot) //Loot! + spot_add(2,3,type_wall) + spot_add(3,1,type_wall) + spot_add(3,2,type_wall) + spot_add(3,3,type_wall) //Bottom right corner //Abandoned 1-tile hollow cargo box (ANGRY). /datum/rogue/asteroid/predef/cargo/angry type_wall = /turf/simulated/wall type_under = /turf/simulated/floor/plating - New() - ..() - spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot! - spot_add(2,2,/mob/living/simple_mob/animal/space/alien) //GRRR +/datum/rogue/asteroid/predef/cargo/angry/New() + ..() + spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot! + spot_add(2,2,/mob/living/simple_mob/animal/space/alien) //GRRR //Longer cargo container for higher difficulties /datum/rogue/asteroid/predef/cargo_large @@ -121,30 +121,30 @@ type_wall = /turf/simulated/wall type_under = /turf/simulated/floor/plating - New() - ..() - spot_add(1,2,type_wall) //-- - spot_add(1,3,type_wall) //Left end of cargo container - spot_add(1,4,type_wall) //-- +/datum/rogue/asteroid/predef/cargo_large/New() + ..() + spot_add(1,2,type_wall) //-- + spot_add(1,3,type_wall) //Left end of cargo container + spot_add(1,4,type_wall) //-- - spot_add(5,2,type_wall) //-- - spot_add(5,3,type_wall) //Right end of cargo container - spot_add(5,4,type_wall) //-- + spot_add(5,2,type_wall) //-- + spot_add(5,3,type_wall) //Right end of cargo container + spot_add(5,4,type_wall) //-- - spot_add(2,4,type_wall) //-- - spot_add(3,4,type_wall) //Top and - spot_add(4,4,type_wall) //bottom of - spot_add(2,2,type_wall) //cargo - spot_add(3,2,type_wall) //container - spot_add(4,2,type_wall) //-- + spot_add(2,4,type_wall) //-- + spot_add(3,4,type_wall) //Top and + spot_add(4,4,type_wall) //bottom of + spot_add(2,2,type_wall) //cargo + spot_add(3,2,type_wall) //container + spot_add(4,2,type_wall) //-- - spot_add(2,3,type_under) //Left floor - spot_add(3,3,type_under) //Mid floor - spot_add(4,3,type_under) //Right floor + spot_add(2,3,type_under) //Left floor + spot_add(3,3,type_under) //Mid floor + spot_add(4,3,type_under) //Right floor - spot_add(2,3,/obj/random/roguemineloot) //Left loot - spot_add(3,3,/obj/random/roguemineloot) //Mid loot - spot_add(4,3,/obj/random/roguemineloot) //Right loot + spot_add(2,3,/obj/random/roguemineloot) //Left loot + spot_add(3,3,/obj/random/roguemineloot) //Mid loot + spot_add(4,3,/obj/random/roguemineloot) //Right loot - if(prob(30)) - spot_add(3,3,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian) //And maybe a big friend for big loot. + if(prob(30)) + spot_add(3,3,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian) //And maybe a big friend for big loot. diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm index 56544479a3..4854227561 100644 --- a/code/modules/rogueminer_vr/zone_console.dm +++ b/code/modules/rogueminer_vr/zone_console.dm @@ -148,11 +148,6 @@ build_path = /obj/machinery/computer/roguezones origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 1) -// Undefine our constants to not pollute namespace -#undef OUTPOST_Z -#undef TRANSIT_Z -#undef BELT_Z - /obj/item/weapon/paper/rogueminer name = "R-38 Scanner Console Guide" info = {"

Getting Started

diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 1d3fbda3e7..40efd55ba1 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -224,31 +224,6 @@ return S.memory[address] else -<<<<<<< HEAD - newsign.data["name"] = "[html_encode(uppertext(source))]" - newsign.data["realname"] = newsign.data["name"] - newsign.data["job"] = job - newsign.data["compression"] = 0 - newsign.data["message"] = message_to_multilingual(message) - newsign.data["type"] = 2 // artificial broadcast - if(!isnum(freq)) - freq = text2num(freq) - newsign.frequency = freq - - var/datum/radio_frequency/connection = radio_controller.return_frequency(freq) - newsign.data["connection"] = connection - - - newsign.data["radio"] = hradio - newsign.data["vmessage"] = message_to_multilingual(message) - newsign.data["vname"] = source - newsign.data["vmask"] = 0 - newsign.data["level"] = list() - - var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub") - if(!pass) - S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters -======= S.memory[address] = value @@ -303,5 +278,4 @@ var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub") if(!pass) S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index cfefd5ce5c..3f5d113289 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -48,14 +48,8 @@ var/datum/shuttle/autodock/ferry/escape_pod/pod valid_actions = list("toggle_override", "force_door") -<<<<<<< HEAD /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/tgui_data(mob/user) - var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type -======= -/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) . = list( "docking_status" = docking_program.get_docking_status(), @@ -85,27 +79,15 @@ //This controller is for the escape pod berth (station side) /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth name = "escape pod berth controller" -<<<<<<< HEAD - program = /datum/computer/file/embedded_program/docking/simple/escape_pod_berth + program = /datum/embedded_program/docking/simple/escape_pod_berth valid_actions = list("toggle_override", "force_door") /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/tgui_data(mob/user) - var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type - - var/armed = null - if(istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod_berth)) - var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/P = docking_program -======= - program = /datum/embedded_program/docking/simple/escape_pod_berth - -/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type var/armed = null - if (istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth)) + if(istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth)) var/datum/embedded_program/docking/simple/escape_pod_berth/P = docking_program ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150) armed = P.armed . = list( diff --git a/code/modules/virus2/effect_vr.dm b/code/modules/virus2/effect_vr.dm index 39155ea0fa..eee9d2da8a 100644 --- a/code/modules/virus2/effect_vr.dm +++ b/code/modules/virus2/effect_vr.dm @@ -5,24 +5,25 @@ name = "Mlemington's Syndrome" stage = 1 chance_maxm = 25 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("[pick("Mlem.","MLEM!","Mlem?")]") + +/datum/disease2/effect/mlem/activate(var/mob/living/carbon/mob,var/multiplier) + mob.say("[pick("Mlem.","MLEM!","Mlem?")]") /datum/disease2/effect/spin name = "Spyndrome" stage = 1 chance_maxm = 7 - var/list/directions = list(2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8) - activate(var/mob/living/carbon/mob,var/multiplier) - if(mob.buckled()) - to_chat(viewers(mob),"[mob.name] struggles violently against their restraints!") - else - to_chat(viewers(mob),"[mob.name] spins around violently!") - for(var/D in directions) - mob.dir = D - sleep(1) - mob.dir = pick(2,4,1,8) //For that added annoyance + +/datum/disease2/effect/spin/activate(var/mob/living/carbon/mob,var/multiplier) + if(mob.buckled()) + to_chat(viewers(mob),"[mob.name] struggles violently against their restraints!") + else + to_chat(viewers(mob),"[mob.name] spins around violently!") + for(var/D in directions) + mob.dir = D + sleep(1) + mob.dir = pick(2,4,1,8) //For that added annoyance /////////////////////////////////////////////// /////////////////// Stage 2 /////////////////// @@ -32,8 +33,8 @@ stage = 2 chance_maxm = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.set_default_language(pick(mob.languages)) +/datum/disease2/effect/lang/activate(var/mob/living/carbon/mob,var/multiplier) + mob.set_default_language(pick(mob.languages)) /////////////////////////////////////////////// /////////////////// Stage 3 /////////////////// @@ -43,20 +44,20 @@ stage = 3 chance_maxm = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - var/newsize = rand (25, 200) - mob.resize(newsize/100) - to_chat(viewers(mob),"[mob.name] suddenly changes size!") +/datum/disease2/effect/size/activate(var/mob/living/carbon/mob,var/multiplier) + var/newsize = rand (25, 200) + mob.resize(newsize/100) + to_chat(viewers(mob),"[mob.name] suddenly changes size!") /datum/disease2/effect/flip name = "Flipponov's Disease" stage = 3 chance_maxm = 5 - activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...? - if(ishuman(mob)) - var/mob/living/carbon/human/H = mob - H.emote("flip") - else - to_chat(viewers(mob),"[mob.name] does a backflip!") - mob.SpinAnimation(7,1) +/datum/disease2/effect/flip/activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...? + if(ishuman(mob)) + var/mob/living/carbon/human/H = mob + H.emote("flip") + else + to_chat(viewers(mob),"[mob.name] does a backflip!") + mob.SpinAnimation(7,1) diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index b718453f2e..3c20b5dd6a 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -100,13 +100,13 @@ name = "Ivy's Courier" desc = "A bag resembling something used by college students. Contains items for ''MooMoo''." - New() - ..() - new /obj/item/clothing/head/beretg(src) - new /obj/item/device/fluff/id_kit_ivy(src) - new /obj/item/weapon/storage/fancy/cigarettes/dromedaryco(src) - new /obj/item/weapon/storage/box/matches(src) - new /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake(src) +/obj/item/weapon/storage/backpack/messenger/sec/fluff/ivymoomoo/New() + ..() + new /obj/item/clothing/head/beretg(src) + new /obj/item/device/fluff/id_kit_ivy(src) + new /obj/item/weapon/storage/fancy/cigarettes/dromedaryco(src) + new /obj/item/weapon/storage/box/matches(src) + new /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake(src) // jemli:Cirra Mayhem /obj/item/weapon/storage/box/fluff/cirra @@ -139,16 +139,16 @@ item_state = "duffle_med" slowdown = 0 - New() - ..() - new /obj/item/clothing/accessory/holster/hip(src) - new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src) - new /obj/item/clothing/head/caphat/formal/fedcover(src) - new /obj/item/clothing/suit/armor/det_suit(src) - new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src) - new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src) - new /obj/item/clothing/head/helmet/space/fluff/joan(src) - new /obj/item/clothing/suit/space/fluff/joan(src) +/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/joanrisu/New() + ..() + new /obj/item/clothing/accessory/holster/hip(src) + new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src) + new /obj/item/clothing/head/caphat/formal/fedcover(src) + new /obj/item/clothing/suit/armor/det_suit(src) + new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src) + new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src) + new /obj/item/clothing/head/helmet/space/fluff/joan(src) + new /obj/item/clothing/suit/space/fluff/joan(src) //joanrisu:Katarina Eine /obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina @@ -156,14 +156,14 @@ desc = "A duffle bag Katarina uses to carry her tools." slowdown = 0 - New() - ..() - new /obj/item/clothing/accessory/holster/hip(src) - new /obj/item/clothing/suit/storage/fluff/fedcoat(src) - new /obj/item/clothing/suit/armor/det_suit(src) - new /obj/item/clothing/accessory/storage/black_vest(src) - new /obj/item/weapon/material/knife/tacknife/combatknife/fluff/katarina(src) - new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src) +/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina/New() + ..() + new /obj/item/clothing/accessory/holster/hip(src) + new /obj/item/clothing/suit/storage/fluff/fedcoat(src) + new /obj/item/clothing/suit/armor/det_suit(src) + new /obj/item/clothing/accessory/storage/black_vest(src) + new /obj/item/weapon/material/knife/tacknife/combatknife/fluff/katarina(src) + new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src) //Razerwing:Archer Maximus /obj/item/weapon/storage/box/fluff/archermaximus diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index bdacd1e728..ff97eb7cd8 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1761,13 +1761,13 @@ Departamental Swimsuits, for general use item_state = "hasd_helm" species_restricted = null - mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) - if(..()) - if(H.ckey != "silencedmp5a5") - to_chat(H, "...The faceplate is clearly not made for your anatomy, thus, does not fit.") - return 0 - else - return 1 +/obj/item/clothing/head/helmet/space/void/security/hasd/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(H.ckey != "silencedmp5a5") + to_chat(H, "...The faceplate is clearly not made for your anatomy, thus, does not fit.") + return 0 + else + return 1 /obj/item/clothing/suit/space/void/security/hasd name = "HASD EVA bodyplates" @@ -1779,12 +1779,12 @@ Departamental Swimsuits, for general use item_state = "hasd_suit" pixel_x = -16 - mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) - if(..() && istype(H) && H.ckey == "silencedmp5a5") - return 1 - else - to_chat(H, "This suit is not designed for you.") - return 0 +/obj/item/clothing/suit/space/void/security/hasd/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..() && istype(H) && H.ckey == "silencedmp5a5") + return 1 + else + to_chat(H, "This suit is not designed for you.") + return 0 //Zigfe:Zaoozaoo Xrimxuqmqixzix /obj/item/clothing/head/fluff/zao diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 8ba4a14b3a..cf351754da 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -773,11 +773,12 @@ icon_state = "dragor_dot" w_class = ITEMSIZE_SMALL - attack_self(mob/user as mob) - if(user.ckey == "pontifexminimus") - user.verbs |= /mob/living/carbon/human/proc/shapeshifter_select_gender - else - return +/obj/item/weapon/fluff/dragor_dot/attack_self(mob/user as mob) + if(user.ckey == "pontifexminimus") + user.verbs |= /mob/living/carbon/human/proc/shapeshifter_select_gender + else + return + //LuminescentRing: Briana Moore /obj/item/weapon/storage/backpack/messenger/black/fluff/briana name = "2561 graduation bag" diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 8dc575ce20..3c7e5b7089 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -213,7 +213,7 @@ var/mob/living/carbon/human/H = src if(H.flying) return TRUE //Silently pass without a message. - if(isTaurTail(H.tail_style)) + if(istaurtail(H.tail_style)) var/datum/sprite_accessory/tail/taur/tail = H.tail_style src_message = tail.msg_owner_help_run tmob_message = tail.msg_prey_help_run @@ -223,7 +223,7 @@ src_message = "You run between [tmob]'s legs." tmob_message = "[src] runs between your legs." var/mob/living/carbon/human/H = tmob - if(isTaurTail(H.tail_style)) + if(istaurtail(H.tail_style)) var/datum/sprite_accessory/tail/taur/tail = H.tail_style src_message = tail.msg_prey_stepunder tmob_message = tail.msg_owner_stepunder @@ -304,7 +304,7 @@ var/message_pred = null var/message_prey = null var/datum/sprite_accessory/tail/taur/tail = null - if(isTaurTail(pred.tail_style)) + if(istaurtail(pred.tail_style)) tail = pred.tail_style if(a_intent == I_GRAB) diff --git a/maps/tether/tether_areas.dm b/maps/tether/tether_areas.dm index 14b9011658..b1e2b53c35 100644 --- a/maps/tether/tether_areas.dm +++ b/maps/tether/tether_areas.dm @@ -1490,7 +1490,7 @@ name = "\improper Mining Outpost Shuttle - Station" ambience = AMBIENCE_HANGAR sound_env = LARGE_ENCLOSED -area/shuttle/mining_outpost/shuttle +/area/shuttle/mining_outpost/shuttle name = "\improper Mining Outpost Shuttle" icon_state = "shuttle2" // Elevator area // diff --git a/maps/tether/tether_phoronlock.dm b/maps/tether/tether_phoronlock.dm index 3afc89ebce..88a4191f8a 100644 --- a/maps/tether/tether_phoronlock.dm +++ b/maps/tether/tether_phoronlock.dm @@ -13,13 +13,13 @@ // Pumps: (obj/machinery/atmospherics/unary/vent_pump/high_volume), frequency = 1379 id_tag = "[base]_pump" // -obj/machinery/airlock_sensor/phoron +/obj/machinery/airlock_sensor/phoron icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_sensor_off" name = "phoronlock sensor" var/previousPhoron -obj/machinery/airlock_sensor/phoron/process() +/obj/machinery/airlock_sensor/phoron/process() if(on) var/datum/gas_mixture/air_sample = return_air() var/pressure = round(air_sample.return_pressure(), 0.1) @@ -38,10 +38,10 @@ obj/machinery/airlock_sensor/phoron/process() alert = (pressure < ONE_ATMOSPHERE*0.8) || (phoron > 0.5) update_icon() -obj/machinery/airlock_sensor/phoron/airlock_interior +/obj/machinery/airlock_sensor/phoron/airlock_interior command = "cycle_interior" -obj/machinery/airlock_sensor/phoron/airlock_exterior +/obj/machinery/airlock_sensor/phoron/airlock_exterior command = "cycle_exterior" @@ -121,7 +121,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior /obj/machinery/embedded_controller/radio/airlock/phoron/Initialize() . = ..() - program = new/datum/computer/file/embedded_program/airlock/phoron(src) + program = new/datum/embedded_program/airlock/phoron(src) //Advanced airlock controller for when you want a more versatile airlock controller - useful for turning simple access control rooms into airlocks /obj/machinery/embedded_controller/radio/airlock/phoron @@ -143,7 +143,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior // //Handles the control of airlocks - +// Airlocks #define STATE_IDLE 0 #define STATE_PREPARE 1 #define STATE_CLEAN 16 @@ -153,10 +153,10 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior #define TARGET_INOPEN -1 #define TARGET_OUTOPEN -2 -/datum/computer/file/embedded_program/airlock/phoron +/datum/embedded_program/airlock/phoron var/tag_scrubber -/datum/computer/file/embedded_program/airlock/phoron/New(var/obj/machinery/embedded_controller/M) +/datum/embedded_program/airlock/phoron/New(var/obj/machinery/embedded_controller/M) ..(M) memory["chamber_sensor_phoron"] = 0 memory["external_sensor_pressure"] = VIRGO3B_ONE_ATMOSPHERE @@ -170,7 +170,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior var/obj/machinery/embedded_controller/radio/airlock/phoron/controller = M tag_scrubber = controller.tag_scrubber ? controller.tag_scrubber : "[id_tag]_scrubber" -/datum/computer/file/embedded_program/airlock/phoron/receive_signal(datum/signal/signal, receive_method, receive_param) +/datum/embedded_program/airlock/phoron/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] if(!receive_tag) return if(..()) return 1 @@ -194,7 +194,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior // Note: This code doesn't wait for pumps and scrubbers to be offline like other code does // The idea is to make the doors open and close faster, since there isn't much harm really. // But lets evaluate how it actually works in the game. -/datum/computer/file/embedded_program/airlock/phoron/process() +/datum/embedded_program/airlock/phoron/process() switch(state) if(STATE_IDLE) if(target_state == TARGET_INOPEN) @@ -257,13 +257,13 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior memory["processing"] = (state != target_state) return 1 -/datum/computer/file/embedded_program/airlock/phoron/stop_cycling() +/datum/embedded_program/airlock/phoron/stop_cycling() state = STATE_IDLE target_state = TARGET_NONE signalPump(tag_airpump, 0) signalScrubber(tag_scrubber, 0) -/datum/computer/file/embedded_program/airlock/phoron/proc/signalScrubber(var/tag, var/power) +/datum/embedded_program/airlock/phoron/proc/signalScrubber(var/tag, var/power) var/datum/signal/signal = new signal.data = list( "tag" = tag, @@ -271,13 +271,3 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior "power" = "[power]", ) post_signal(signal) - - -#undef STATE_IDLE -#undef STATE_PREPARE -#undef STATE_CLEAN -#undef STATE_PRESSURIZE - -#undef TARGET_NONE -#undef TARGET_INOPEN -#undef TARGET_OUTOPEN diff --git a/vorestation.dme b/vorestation.dme index a3ceb1519f..d101420c68 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -87,7 +87,6 @@ #include "code\__defines\sqlite_defines.dm" #include "code\__defines\stat_tracking.dm" #include "code\__defines\subsystems.dm" -#include "code\__defines\subsystems_vr.dm" #include "code\__defines\supply.dm" #include "code\__defines\targeting.dm" #include "code\__defines\tgs.config.dm" @@ -206,11 +205,8 @@ #include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" #include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" #include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -<<<<<<< HEAD:vorestation.dme #include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" #include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" -======= ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150):polaris.dme #include "code\ATMOSPHERICS\components\binary_devices\pump.dm" #include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" #include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" @@ -1742,10 +1738,7 @@ #include "code\modules\ai\interfaces.dm" #include "code\modules\ai\say_list.dm" #include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" -<<<<<<< HEAD:vorestation.dme #include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" -======= ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150):polaris.dme #include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" #include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm_handler.dm" @@ -3096,7 +3089,6 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\_defines.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" @@ -3362,12 +3354,7 @@ #include "code\modules\power\cell.dm" #include "code\modules\power\debug_items.dm" #include "code\modules\power\generator.dm" -<<<<<<< HEAD:vorestation.dme -#include "code\modules\power\generator_type2.dm" #include "code\modules\power\gravitygenerator_vr.dm" -======= -#include "code\modules\power\gravitygenerator.dm" ->>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150):polaris.dme #include "code\modules\power\grid_checker.dm" #include "code\modules\power\lighting.dm" #include "code\modules\power\lighting_vr.dm" From a8f228bc0231f701834cdddec3dd67b2325cafa8 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Mon, 21 Jun 2021 21:48:01 -0400 Subject: [PATCH 67/81] Maybe fixes heroman's complaint --- code/modules/power/lighting.dm | 38 ++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 752757762b..774c0c45ea 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -392,25 +392,33 @@ var/global/list/light_type_cache = list() ..() //VOREStation Edit Start /obj/machinery/light/proc/set_alert_atmos() - if(shows_alerts) - current_alert = "atmos" - brightness_color = "#6D6DFC" - if(on) - update() + if(!shows_alerts) + return + current_alert = "atmos" + brightness_color = "#6D6DFC" + update() /obj/machinery/light/proc/set_alert_fire() - if(shows_alerts) - current_alert = "fire" - brightness_color = "#FF3030" - if(on) - update() + if(!shows_alerts) + return + current_alert = "fire" + brightness_color = "#FF3030" + update() /obj/machinery/light/proc/reset_alert() - if(shows_alerts) - current_alert = null - brightness_color = initial(brightness_color) || "" // Workaround for BYOND stupidity. Can't set it to null or it won't clear. - if(on) - update() + if(!shows_alerts) + return + + current_alert = null + var/obj/item/weapon/light/L = get_light_type_instance(light_type) + + if(L) + update_from_bulb(L) + else + brightness_color = nightshift_enabled ? initial(brightness_color_ns) : initial(brightness_color) + + update() + //VOREstation Edit End // update lighting /obj/machinery/light/proc/update(var/trigger = 1) From 5c77d59beefaeafcf821e837638443b5e7c26bbb Mon Sep 17 00:00:00 2001 From: Verkister Date: Tue, 22 Jun 2021 12:42:39 +0300 Subject: [PATCH 68/81] Fixes shower overlays fixes shower visuals being applied permanently even after turning it off. --- code/game/objects/structures/watercloset.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 47a3733443..8a7c8c9d5f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -179,7 +179,7 @@ add_fingerprint(user) /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up - cut_overlay() //once it's been on for a while, in addition to handling the water overlay. + cut_overlays() //once it's been on for a while, in addition to handling the water overlay. if(mymist) qdel(mymist) mymist = null From e3d33334d6ed8ea4c307ccd008e58cecba9cc889 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 10:27:14 -0400 Subject: [PATCH 69/81] Buffs Adminordrazine, Myelamine - Increases the effects of Myelamine - Increases the effects of Bicaridine Overdose - Tries to fix Adminordrazine to be less useless --- code/modules/reagents/reagents/medicine.dm | 4 ++-- code/modules/reagents/reagents/other.dm | 17 +++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm index e2b175fe1f..85b6fb757a 100644 --- a/code/modules/reagents/reagents/medicine.dm +++ b/code/modules/reagents/reagents/medicine.dm @@ -60,7 +60,7 @@ /datum/reagent/bicaridine/overdose(var/mob/living/carbon/M, var/alien, var/removed) ..() - var/wound_heal = 1.5 * removed + var/wound_heal = 2.5 * removed M.eye_blurry = min(M.eye_blurry + wound_heal, 250) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -731,7 +731,7 @@ overdose = REAGENTS_OVERDOSE * 0.5 overdose_mod = 1.5 scannable = 1 - var/repair_strength = 3 + var/repair_strength = 5 /datum/reagent/myelamine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm index 0159a9832b..5bb5f41968 100644 --- a/code/modules/reagents/reagents/other.dm +++ b/code/modules/reagents/reagents/other.dm @@ -167,7 +167,7 @@ taste_description = "bwoink" reagent_state = LIQUID color = "#C8A5DC" - affects_dead = 1 //This can even heal dead people. + affects_dead = TRUE //This can even heal dead people. metabolism = 0.1 mrate_static = TRUE //Just in case @@ -178,11 +178,10 @@ affect_blood(M, alien, removed) /datum/reagent/adminordrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.setCloneLoss(0) - M.setOxyLoss(0) - M.radiation = 0 - M.heal_organ_damage(20,20) - M.adjustToxLoss(-20) + M.heal_organ_damage(40,40) + M.adjustCloneLoss(-40) + M.adjustToxLoss(-50) + M.adjustOxyLoss(-100) M.hallucination = 0 M.setBrainLoss(0) M.disabilities = 0 @@ -202,6 +201,9 @@ M.radiation = 0 M.ExtinguishMob() M.fire_stacks = 0 + M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER) + M.add_chemical_effect(CE_STABLE, 15) + M.add_chemical_effect(CE_PAINKILLER, 200) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) else if(M.bodytemperature < 311) @@ -209,6 +211,9 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/wound_heal = 5 + for(var/obj/item/organ/I in H.internal_organs) + if(I.damage > 0) //Adminordrazine heals even robits, it is magic + I.damage = max(I.damage - wound_heal, 0) for(var/obj/item/organ/external/O in H.bad_external_organs) if(O.status & ORGAN_BROKEN) O.mend_fracture() //Only works if the bone won't rebreak, as usual From e5891bc972c049ded325a06f9d3d8e9ea71f34af Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 11:13:18 -0400 Subject: [PATCH 70/81] More medicine fixes --- code/datums/uplink/medical.dm | 13 ++++++++++++- .../objects/items/weapons/storage/firstaid.dm | 2 +- .../objects/items/weapons/storage/quickdraw.dm | 15 ++++++++++++--- code/game/objects/random/unidentified/medicine.dm | 15 ++++++++++----- .../reagents/reagent_containers/hypospray.dm | 15 ++++++++++----- .../reagent_containers/unidentified_hypospray.dm | 12 ++++++++---- code/modules/reagents/reagents/medicine.dm | 6 +++--- code/modules/reagents/reagents/other.dm | 5 +++-- 8 files changed, 59 insertions(+), 24 deletions(-) diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm index 0657b62b2e..c7b0b0d123 100644 --- a/code/datums/uplink/medical.dm +++ b/code/datums/uplink/medical.dm @@ -33,7 +33,12 @@ /datum/uplink_item/item/medical/bonemeds name = "Bone Repair injector" item_cost = 10 - path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed + +/datum/uplink_item/item/medical/clonemeds + name = "Clone injector" + item_cost = 15 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed /datum/uplink_item/item/medical/bonemeds_case name = "Bone Repair case" @@ -41,6 +46,12 @@ desc = "A case of three osteodaxon injectors. Can rapidly remove and stow up to six injectors." path = /obj/item/weapon/storage/quickdraw/syringe_case/bonemed +/datum/uplink_item/item/medical/clonemeds_case + name = "Clone case" + item_cost = 30 + desc = "A case of three rezadone injectors. Can rapidly remove and stow up to six injectors." + path = /obj/item/weapon/storage/quickdraw/syringe_case/clonemed + /datum/uplink_item/item/medical/ambrosiadeusseeds name = "Box of 7x ambrosia deus seed packets" item_cost = 10 diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index c03e3e79a6..ca9709b3fb 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -167,7 +167,7 @@ name = "bone repair kit" desc = "Contains chemicals to mend broken bones." max_storage_space = ITEMSIZE_COST_SMALL * 7 - starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed = 8) + starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed = 8) /* * Pill Bottles diff --git a/code/game/objects/items/weapons/storage/quickdraw.dm b/code/game/objects/items/weapons/storage/quickdraw.dm index 98cbe58d99..07b549032c 100644 --- a/code/game/objects/items/weapons/storage/quickdraw.dm +++ b/code/game/objects/items/weapons/storage/quickdraw.dm @@ -93,7 +93,16 @@ desc = "A small case for safely carrying sharps around. This one is deluxe!" max_w_class = ITEMSIZE_SMALL starts_with = list( - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed, - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed, - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed + /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed + ) + +/obj/item/weapon/storage/quickdraw/syringe_case/clonemed + desc = "A small case for safely carrying sharps around. This one is deluxe!" + max_w_class = ITEMSIZE_SMALL + starts_with = list( + /obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed ) diff --git a/code/game/objects/random/unidentified/medicine.dm b/code/game/objects/random/unidentified/medicine.dm index f779d75a0f..444f6c3a26 100644 --- a/code/game/objects/random/unidentified/medicine.dm +++ b/code/game/objects/random/unidentified/medicine.dm @@ -19,6 +19,8 @@ much more likely to show up. This is done for several purposes; /obj/random/unidentified_medicine/item_to_spawn() return pick( + /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/unidentified, @@ -27,7 +29,6 @@ much more likely to show up. This is done for several purposes; /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified, /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified, @@ -65,6 +66,8 @@ much more likely to show up. This is done for several purposes; // 75 Good, 25 Bad. 75% chance of getting something good. // Good odds, but the contents aren't super great unless someone gets lucky. return pick( + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/unidentified, @@ -73,7 +76,6 @@ much more likely to show up. This is done for several purposes; prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, - prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, prob(25);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified) // For military PoIs like BSD. High odds of good loot since those PoIs are really hard. @@ -82,12 +84,13 @@ much more likely to show up. This is done for several purposes; // 75 Good, 30 Bad, roughly 71.4% chance to get something good. // Very high but very hard to reach and still has a chance of ending poorly if injecting blind. return pick( + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, - prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, prob(30);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/soporific/unidentified, prob(30);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide/unidentified) @@ -98,10 +101,11 @@ much more likely to show up. This is done for several purposes; // 65 Good, 160 Bad, roughly 28.8% to get something good. // Poor odds, but there are a lot of these scattered in the drug dens and illegal chem labs. return pick( + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, - prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, prob(40);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified, prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified, @@ -120,9 +124,10 @@ much more likely to show up. This is done for several purposes; // 45 Good, 45 Bad, 50% chance to get something good. // Do you feel lucky? return pick( + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, - prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified, prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified, diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 80d0e1e34d..39fe78cecf 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -186,6 +186,16 @@ icon_state = "green" filled_reagents = list("anti_toxin" = 5) +/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed + name = "bone repair injector" + desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel. This one excels at treating damage to bones." + filled_reagents = list("osteodaxon" = 5) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed + name = "clone injector" + desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel. This one excels at treating genetic damage." + filled_reagents = list("rezadone" = 5) + // These have a 15u capacity, somewhat higher tech level, and generally more useful chems, but are otherwise the same as the regular autoinjectors. /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector name = "empty hypo" @@ -247,11 +257,6 @@ desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at treating bleeding wounds and internal bleeding." filled_reagents = list("inaprovaline" = 5, "myelamine" = 10) -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed - name = "bone repair injector" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This one excels at treating damage to bones." - filled_reagents = list("inaprovaline" = 5, "osteodaxon" = 10) - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose name = "glucose hypo" desc = "A hypoinjector filled with glucose, used for critically malnourished patients and voidsuited workers." diff --git a/code/modules/reagents/reagent_containers/unidentified_hypospray.dm b/code/modules/reagents/reagent_containers/unidentified_hypospray.dm index 496e694cbc..1a3412dbe7 100644 --- a/code/modules/reagents/reagent_containers/unidentified_hypospray.dm +++ b/code/modules/reagents/reagent_containers/unidentified_hypospray.dm @@ -5,6 +5,14 @@ identity_type = /datum/identification/hypo // The good. +/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified + init_hide_identity = TRUE + flags = 0 + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified + init_hide_identity = TRUE + flags = 0 + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified init_hide_identity = TRUE flags = 0 @@ -37,10 +45,6 @@ init_hide_identity = TRUE flags = 0 -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified - init_hide_identity = TRUE - flags = 0 - /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified init_hide_identity = TRUE flags = 0 diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm index 85b6fb757a..f7effd6d08 100644 --- a/code/modules/reagents/reagents/medicine.dm +++ b/code/modules/reagents/reagents/medicine.dm @@ -8,7 +8,7 @@ reagent_state = LIQUID color = "#00BFFF" overdose = REAGENTS_OVERDOSE * 2 - metabolism = REM * 0.5 + metabolism = REM * 0.1 scannable = 1 /datum/reagent/inaprovaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -24,9 +24,9 @@ reagent_state = LIQUID color = "#00BFFF" overdose = REAGENTS_OVERDOSE * 2 - metabolism = REM * 0.5 + metabolism = REM * 0.1 scannable = 1 - touch_met = REM * 0.75 + touch_met = REM * 0.15 can_overdose_touch = TRUE /datum/reagent/inaprovaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm index 5bb5f41968..e9b702e54e 100644 --- a/code/modules/reagents/reagents/other.dm +++ b/code/modules/reagents/reagents/other.dm @@ -180,8 +180,8 @@ /datum/reagent/adminordrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.heal_organ_damage(40,40) M.adjustCloneLoss(-40) - M.adjustToxLoss(-50) - M.adjustOxyLoss(-100) + M.adjustToxLoss(-40) + M.adjustOxyLoss(-300) M.hallucination = 0 M.setBrainLoss(0) M.disabilities = 0 @@ -204,6 +204,7 @@ M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER) M.add_chemical_effect(CE_STABLE, 15) M.add_chemical_effect(CE_PAINKILLER, 200) + M.remove_a_modifier_of_type(/datum/modifier/poisoned) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) else if(M.bodytemperature < 311) From 660a9d758de8749b0f3cb1173a992ad08316834a Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 11:17:08 -0400 Subject: [PATCH 71/81] Slight adjustments --- code/game/objects/random/unidentified/medicine.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/random/unidentified/medicine.dm b/code/game/objects/random/unidentified/medicine.dm index 444f6c3a26..ffd134384a 100644 --- a/code/game/objects/random/unidentified/medicine.dm +++ b/code/game/objects/random/unidentified/medicine.dm @@ -63,7 +63,7 @@ much more likely to show up. This is done for several purposes; // Medicine belonging to a place still being occupied (or was recently), meaning the goods might still be fresh, and better. /obj/random/unidentified_medicine/fresh_medicine/item_to_spawn() // More likely to get something good, and a chance to get rare medicines. - // 75 Good, 25 Bad. 75% chance of getting something good. + // 80 Good, 25 Bad. 76% chance of getting something good. // Good odds, but the contents aren't super great unless someone gets lucky. return pick( prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, @@ -84,7 +84,7 @@ much more likely to show up. This is done for several purposes; // 75 Good, 30 Bad, roughly 71.4% chance to get something good. // Very high but very hard to reach and still has a chance of ending poorly if injecting blind. return pick( - prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, @@ -98,7 +98,7 @@ much more likely to show up. This is done for several purposes; // Hyposprays found inside various illicit places. /obj/random/unidentified_medicine/drug_den/item_to_spawn() // Combat stims are common, but so are nasty drugs. - // 65 Good, 160 Bad, roughly 28.8% to get something good. + // 70 Good, 160 Bad, roughly 30% to get something good. // Poor odds, but there are a lot of these scattered in the drug dens and illegal chem labs. return pick( prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, @@ -124,7 +124,7 @@ much more likely to show up. This is done for several purposes; // 45 Good, 45 Bad, 50% chance to get something good. // Do you feel lucky? return pick( - prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/unidentified, prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, From 109c8bc15a28a64e5dc6f812181890da38d1a0a3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 11:20:05 -0400 Subject: [PATCH 72/81] Maybe too much of a buff in this case --- code/modules/reagents/reagents/medicine.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm index f7effd6d08..fce96ffff6 100644 --- a/code/modules/reagents/reagents/medicine.dm +++ b/code/modules/reagents/reagents/medicine.dm @@ -8,7 +8,7 @@ reagent_state = LIQUID color = "#00BFFF" overdose = REAGENTS_OVERDOSE * 2 - metabolism = REM * 0.1 + metabolism = REM * 0.2 scannable = 1 /datum/reagent/inaprovaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -24,9 +24,9 @@ reagent_state = LIQUID color = "#00BFFF" overdose = REAGENTS_OVERDOSE * 2 - metabolism = REM * 0.1 + metabolism = REM * 0.2 scannable = 1 - touch_met = REM * 0.15 + touch_met = REM * 0.3 can_overdose_touch = TRUE /datum/reagent/inaprovaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) From 10bcf6e55cc8e1654209f8ba3afc9ce1f8356c92 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 11:23:30 -0400 Subject: [PATCH 73/81] Adds missing comment --- code/modules/reagents/reagent_containers/hypospray.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 39fe78cecf..5f05faeb70 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -186,6 +186,7 @@ icon_state = "green" filled_reagents = list("anti_toxin" = 5) +//Special autoinjectors, while having potent chems like the 15u ones, the chems are usually potent enough that 5u is enough /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed name = "bone repair injector" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel. This one excels at treating damage to bones." From 4ab52cd52e660acd9cb866a36506a2609d666947 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 12:08:37 -0400 Subject: [PATCH 74/81] Nerfs ghetto surgery on staff request --- code/game/objects/structures/stool_bed_chair_nest/bed.dm | 2 +- code/modules/tables/tables.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 639db4191b..25ca2cbd01 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -198,7 +198,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "rollerbed" anchored = 0 - surgery_odds = 75 + surgery_odds = 50 //VOREStation Edit var/bedtype = /obj/structure/bed/roller var/rollertype = /obj/item/roller diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 952e7af45a..3f16372ed7 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -10,7 +10,7 @@ var/list/table_icon_cache = list() climbable = 1 layer = TABLE_LAYER throwpass = 1 - surgery_odds = 66 + surgery_odds = 33 //VOREStation Edit var/flipped = 0 var/maxhealth = 10 var/health = 10 From be87675c03755a44abf2608eb352492e20db52f9 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 12:24:18 -0400 Subject: [PATCH 75/81] Tones it back a bit. --- code/game/objects/structures/stool_bed_chair_nest/bed.dm | 2 +- code/modules/tables/tables.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 25ca2cbd01..4860099109 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -198,7 +198,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "rollerbed" anchored = 0 - surgery_odds = 50 //VOREStation Edit + surgery_odds = 66 //VOREStation Edit var/bedtype = /obj/structure/bed/roller var/rollertype = /obj/item/roller diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 3f16372ed7..e37b684d3d 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -10,7 +10,7 @@ var/list/table_icon_cache = list() climbable = 1 layer = TABLE_LAYER throwpass = 1 - surgery_odds = 33 //VOREStation Edit + surgery_odds = 50 //VOREStation Edit var/flipped = 0 var/maxhealth = 10 var/health = 10 From b3dc5744ca3d2fdffabf367a2f5a7bac05bebb85 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 22 Jun 2021 12:46:12 -0400 Subject: [PATCH 76/81] 50 for rollers --- code/game/objects/structures/stool_bed_chair_nest/bed.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 4860099109..25ca2cbd01 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -198,7 +198,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "rollerbed" anchored = 0 - surgery_odds = 66 //VOREStation Edit + surgery_odds = 50 //VOREStation Edit var/bedtype = /obj/structure/bed/roller var/rollertype = /obj/item/roller From 16c1902b3a261832889af67130c9038868166b6a Mon Sep 17 00:00:00 2001 From: klaasjared Date: Tue, 22 Jun 2021 15:16:37 -0400 Subject: [PATCH 77/81] Adds the code and icons Add the required code and icons for the status indicator upgrade on the weapon. --- .../projectiles/guns/energy/netgun_vr.dm | 36 +++++++++++++++++- icons/obj/gun_vr.dmi | Bin 59293 -> 59141 bytes 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/guns/energy/netgun_vr.dm b/code/modules/projectiles/guns/energy/netgun_vr.dm index 7352a22aba..b19169196b 100644 --- a/code/modules/projectiles/guns/energy/netgun_vr.dm +++ b/code/modules/projectiles/guns/energy/netgun_vr.dm @@ -1,13 +1,45 @@ +//Contains the Energy Net Gun code and information/lore + /obj/item/weapon/gun/energy/netgun name = "energy net gun" - desc = "Specially made-to-order by Xenonomix, the XX-1 \"Varmint Catcher\" is designed to trap even the most unruly of creatures for safe transport." + desc = "Specially made-to-order by Xenonomix, the \"Varmint Catcher\" is designed to trap even the most unruly of creatures for safe transport." + description_fluff = "The Xenonomix Brand XX-1 Energy Net Cannon is a marvel of technology that is used heavily by several departments within NanoTrasen. \ + Whether by scientific departments when capturing specimens on alien worlds to study or by security forces to detain unruly crew, NanoTrasen is deeply \ + appreciative of the \"Varmint Catcher\" Netgun System. WARNING!: Xenonomix and NanoTrasen are not responsible for any injuries caused by the device \ + in any aspect, thank you for understanding." icon = 'icons/obj/gun_vr.dmi' icon_state = "netgun" item_state = "gun" // Placeholder - charge_meter = 0 fire_sound = 'sound/weapons/eluger.ogg' origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3) projectile_type = /obj/item/projectile/beam/energy_net charge_cost = 800 fire_delay = 50 + +/obj/item/weapon/gun/energy/netgun/update_icon() + if(power_supply == null) + if(modifystate) + icon_state = "[modifystate]_open" + else + icon_state = "[initial(icon_state)]_open" + return + else if(charge_meter) + var/ratio = power_supply.charge / power_supply.maxcharge + + //make sure that rounding down will not give us the empty state even if we have charge for a shot left. + if(power_supply.charge < charge_cost) + ratio = 0 + else + ratio = max(round(ratio, 0.25) * 100, 25) + + if(modifystate) + icon_state = "[modifystate][ratio]" + else + icon_state = "[initial(icon_state)][ratio]" + + else if(power_supply) + if(modifystate) + icon_state = "[modifystate]" + else + icon_state = "[initial(icon_state)]" \ No newline at end of file diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi index e274e2c1fd0c359c9273d57d3608494ded1bafc1..b083843f412de92d14e75e00cf9504db2ffd501b 100644 GIT binary patch literal 59141 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 literal 59293 zcmb@u2UJtvw=TLt5fua#0i_p}ng9X`>-njRU@iImd_RijW&9&An-<<1Pd{9?ax^kKBG6X?a9x2N| zgCOF1!u#R{a3+!O_cjEP9C^NY=`3&NWa4OL?`&mf3qkJR^S-Is&2!%T)6X-?wqGW$GncU&4yODoCuB!1#Mi zf9I56e|4vqr!MVbXlR7SkEg>d*7KIeW(?%HVFCV{4*YACbFwp3xs_LU&hx;}OEiR% z5vdi<$-ZZlrZPFNiQs6=*(|z6`es&uIp6ipwP$hth545vnoUxR7|^pt5-P8hZ7bhu zJ&1$B-m$;&P`P#eIn5Id`|x-4HzqDLWZ8Jeon1vpQ&Ag^K92kBdTYo#xqNlfk2q|l zVU`*(mgzPcr+RU47kp%J&^Pn^YNU1!DW?u}7VQ;&^{{+N*NMdlMjA0Av;6F0{~MOM z>6f=dOZvZLaJ}P3mQg#?n$g+$Mdrgi)yv9Pu9^Q(`S~OY8=HAtiu_^q`%CGo;ra_L zh3hKzYx4GE#)(a-%JeQmy^4(Fr5dE?Yz7-%wFv(V`Q-IQE+CAv3GLy{cVpAz`4jp? z^^=Ur+9i&zrN7cv_fZraU5z!X31;;Qf3D>DPuX_{pUP?O1qD6#t}p(6*}r%UqE8Pn z>i?!1C^#^utgCyY^^pqkC96j)^f0mcy%S4m$K$7@GLPDDcfRNjIKNe8yrpz^DB8x< zm2p%tb0peEw5Pm7Oi!rc?#D)*p>lotTdIs53baiPyyY|$T17wX3q$kX2WYzcM;tB> zaeszgiTiZ!Bh6!GQZ03jJaL7<&YbMj-fC#quMaD!?`M{+x4N3 zMhq(-eUN38slK*6wb(S;UjNuWXw&e=j90(OmL$!7H~nP)M63OAr0HF^nwt+8`0(n_ zZhYZ4W)?6W?Yi>V&?tT3E@H=|&AuFqIH~r;UV6PUs@RqCGl!);=lOE_O*zecNfD&&j95t(xM3Z_op5K z#zG}^q7!qBWC&65!r5oeEYV--Ua=G^(uCwkCz2JFF<)Q5)D&XjH(vH>Wp+fGSV72H zh$St6h?G&GZ zqxCW&-y^v3*^K~Z;}+vb^3&HYEHLWGOh%LZW*og(!CdH+>n?YtC)(}}g=8729&>Yj zh6^n^``*Q6c}aATtjBWE_C>j#j$83FI_Df_`(%E52wm-93eWg3C+^=S@rn6rYI;Ek z5pi_{Z^~LL@wW)xv}^+?o6BqCRPLzr{;JM=D%pLn$Ukzllj)pDs;`~w7>(30gVLKC zLe390m1wRQyy$xtD(iYdT*TpRhV?>jOJD1)PwCMmTuSr#Dht2+gH43E%p&y1(YqHl zAIGz6A0ilBDa?{vd}MGQQ*1&PN}AIh0vpJWENABL!IHRsYEXFTmGZMCC=j*rUTQUa zB*U!|WN_aZxAb*bSR}6FVD@P2_`S2!_*BD=2v_KI!!`5bA1VGdfi(W_vK+fv651NA zL=kR-!Ske_l^RyA-Ck|T;b#BfdEX#?#V}OTk)t!9Naz3-wJsi^*exZ=Af|C(zwmvi zDf%A!N)q>ie^1C{eKz4orRUy z4Z8XS^CKzR3$Vl+qsaNq7SD!qwutbkTayx^ba8~w6aDxeuQu#=2?R=QE18KFe{TAS z$szfUCKCj)K#$}fzHtA(G3kZ4aZo3X8-|EwE8i!aCx87Vqdzo1?M!2_L(A)}${TAH zp4U(`bop}l-9L1*kl||unaekLiQDh!M!3uKdS)xt2=#yGjxu>6l)824(pMRl1exo$ zjmt+$dphO?qaFILZiYQA?2)4zW`<7V@kc&~f+e9%v(Pp0iq>@I_aY7 zABxs4(_>G9Q4MJdVG>Cqp8J;j@ah{^bg~dZ!IaE@W*P!C^z}E~bZf~ThEy48P%fE6k9{JSS*59xAdZwh{38YE4h%f&z|qroKiW9?O5p}of7l#uL34P za|L&LjmQ>e^5fDgD{o>j7)~y(hHQ;=gzoLL=s+6i$hyD3AEC=bWIWp#xHa@>i9WgK zp9y$k;!2d6bYXPwCFrt1zA}Rp;-+dA6%-X4dm(FJm5F#~b*=$ng7&!1K#ROZL}IiMM+zrT4FqRHT+6qlJ^d^ds^^(I{_g{Wh*8vyO)ezDqp+2QmL2 zlWf%quP1&Q&>0I0PVH35h_f?6?qdE?kJcCFw8oBfgOj|bxQ}aZKDvq`;BA=)Wuc%6 zA6cUdHbb59tVSaI(Km&si;xJ5uJ2s;Hxb-vRv-6W%)`u+*t^1795_Pdy$kHdFkh74 z9~3Nm^|daV{62|l{&=#d{j6vbejg}YtMq|&EuO6_ZjxUyoQ|ZvWcb@|%+k=B2DT)A0~{t1PCw6l@}bS_c3jg;s&}K*MH|r6O^H&q z&Tc)H9%>pziJsX{q`wCTUl{yhULV)a-bXOsUGp+P;^(~2)Z*_ctY8eEJbfy>aIV19 zTSEI~wqEQg$=8JfC@wG3(?W211p6N5*AmH03AxXQi?A`Z(A(8sa}%G@HuBaaN=w*Q zZ{6)!WUyXvw(;>Xk}sIXVx>$ovaH1(Ro6_J%PD$#{zfx!9}pGQrpd;Ad^wGj6)
    #D%%q2YtRpKpf=zXB6UujSDJWKV8*D}A$+6#x-MiM!<6WtHyNV!zq`|cK} zu99qNL*=*_pae5^dfd^;$;|!5z^G__$De(8rEPSD1&Ivu1=mSvsHc$EoU9ctiCy=k z;oL3s4wSX^^{k^zpKJ+~t%HALnf7&@rY~4G+7j7E@F||MO5a#Jo24Qlsm`M;A>+5( z`$eVeT4e0AvB>e3sP@gl8#ACATLHZrqa|`vL|sXe;|ADvMjZ)i+30RJ&f3^3T6uV$e$6f_{a|VlUQ+@32c6poxVI%L|MLPs!`1f@Pdf zE7jc#$kKtVZ@@5{fJWGuhNXL}ZGVj;tB2R?j=K*xZ%X?}G@eBW%di2D4QDvspkZ8XEL*a!#!pn6ATUF7waKMZP6xk{FpkY3fv)z^Zyid=I&< zR?B4h;kpJJ;wlUdKjid-@Tj#+QVcu2x%XKQ0=+j%`~-x8ObvW{0`L2-71G=!iu96r zJA~9fG3Q?5D9KG7vj2!bU*03h=?D=iTI7F5qL+k_b1nKuA#|4zs#IP9@xUv#@qZV} z5^J|->>LR3N@J-r2{wrL-E<~~TsKBuDPL(sSTFHV1UH@afH)%WQ_+-O*v ztCWnU=`p9B>9jz`W8~$v?pYkZ?du&`!Qqd0=Phl0Zb1B|truQsPA(snOVf+kl3OK9 zdhD69Ce!=i25#On4QasS#cOJ6+8oix`w9$HV$D(Uy2~|serCHh|1A_QEH9tls7qIh zRMhCRZf&m?nJKKS9I;~+u2$*j%5)m>oCmtBv5`h~fTD|Z|d6I|ru9o?) zxR{)r90~e5yR#~H^WJT0D-jZ=_T_VVd9B4!HzhrVAbemUuhf)}uXKJD#ukCu^*zs9 z?<;I`2j{feL=+r-V@7v@8HB3F z)wqex6ADe*p0EGceo?)A|_ z@n-T6O!>uf3o?l0l3Zs+QDi?Wd#6{s!JLMmt)u_eR@Rt>h}Z%Ng(VTEvkOp4z;;k z=~i?Os`EVhGoU7&2i4blpeF{XYoKIPf|Po0bC8o){(){$9^0E#FNZN}S-Y9D%XfovPbkVo99^$?U=7HxRI= zNfJ8WMIDI8%Wc9eb+@Y5;e90*Js~H~@vt!uN=;tA^qQ?|6=>#UIGU!za;om=WHO6W z+bG-)bwpie2fFu=N2?uZdyzleta&X(o{#Zcg2FHr7&l4gP!%y2le6OFit1&Bc2hP4VPc z&0hE}>2#rsLyZ`Elk=TE$$<}UDcCAiGE}YwhlMIF9|j)@p_#ZN&4e}) zoz$U@w=(h^8pPPe(hic#{{*^EKxy$u>K?r5i34ed_~PR)f$46;{)FE22T{7wCNYsL zMX}Q2?P?fphtHLu&vxNHxAVy0OM2qd-i*fEf;0YMXSaqkGGF&+JZj87hx%vKn8`5F zpHNx2Q-!cEd{U?6qXXUPKpNHWqSyNQ7Fr7;==I&$y~aFH^ARr5-Co(Xaect=PmKGI zcC>n(jk~JKjnQe3tV`R3la(h9NH7U{P03QP)&{qG-LfjeneAeL26Ev-dkEud(h`xK z_p4D3g|8#7Kbsi)#Z6vwsEattOkjgcrFX?uFrS=ldmA!S_!{|k%w=`|eGl_>SgGzY zLmup%l|$!f3wDeL{gHLVi11{iq1RGqsyjy3$=4e~8)DC*hI~=Y zqz)(31&=}wnAboTrtkI3at5yZ_eeDj6x3yQ)*Knmo=toX4_|rp3^~LxMntQJAB6cT zzDBz2i4!G}`g)}Lc+5p^J-_PLN6<)S6-@L?q2M zh0&0Fj|-<4;Rep)I!8W6-1Bf_70yPGQ`5@on!)QomV^Pv!q`17CBJ;B=s$%2;ETFY zes$Ql4Q2FMeO>yC2W1S(?8fE^Wrg3q50dw>fa%2`11}hsy47>Zy1C{+%>etg@1zxB zz2H>}bx1|-on$Hs)Ib(eXp_xz#u-?~_Z(_TydWRV7-^}!%TTj*Ag*>OP;iO#F4r~+ zk9>L1ui_vwEwg}T`sMyou_3l0U8yDH$2nI_;+9fm#5ENT*39KRNrIG}x{8}+z3pt3 zG$%K*br06B1Xgcn-TG>mhj1g(fA;JhaM51aCpmq?FyWkk+GjQ5+sm0YCP_i?GVys) zKj9>_VW8;f89?o~SLB{harpk;cIrKoTYH3HWn@uoN(U0^2b>Q7*J$kDg@ykK=T>jqb;e8TWiua-t)7QAMv9uErUT58Wk5_& zuSgSRpdkD#By_)eTfzq`8hc;l9F)X(@4T9pCZ=w)=TA7j9QW6|KmitJw5b4N6LR&xNOqcCCo%(5oIllW2M@oO^9Ot0D#wrpr8wt`tT#~ zL>E72?rwsum6&vWykCm;QDY?VPUqxWh#x0T~0qrCW(uXsP~Cb5TzZ= zp?&Ofl8jV0_Poe;W!sr=Pm&}%-1e*8CRP~$N}ezp*!5zlTy{6%^JjL*c(mB;l4Npp zYg^kjEnT>xE!l_Kw^`DndJ_-c+;*ge(=HpR9-Vb%^^kfeqRiNaA9-DO(YfAChB9D@ z_)lQM*g(A=oU&;q>bRiX>Me8j3QSGY52;?~)&6G5eJSWpyZ>Dd4yBQ|_sQw+lLJ_! zy7KP!vyNEU^W0*6M@L8b3foD3_Z{Q6BZUvY#Kx|b=W(pvJ6p8dqK537XNWA{yph#K zMJUs~A+u(fI;Bs5l@5ao?u61N5VOz&LOe*NbnS_uJds^PBH%ZB-6A7yf-ZGxIK?t^$CnqPKV5=;y_z6|+sg0=sFX zVspYT@U=3K73t+wIQq64=Ih%bL^I@4I^{VptPr7xOr~I#B8P5DxZ5jN)R9erMiY6jl!Tb2)^=YSoN2R8B5`Be?zP?1qys8^b%SRwW3(e;_s4pQ#$&4HQm-lX z*xX*n>7=d1Xnu>Vpt9f9EtvN;r;UWY{76f)P?c=|TaEoW-?(KYo*jm`y`(214Q860 zPUs?lXf4s~O1*VnZbBj=UgV4OYo|mrekBKMR0GW4H!Buj+5n_a&^yvP3aMfeWggJ) zJ~N9uVbl4Oo{**FC_jx`h-Vi{+Hrh0)5SG~p`>k#$uZ%0zvHofmPzc9cTr(}`oR!= z0hi8E&vnV?K^SlBi|6YYatmEuJr}i#@8_ZYwYWK-ZoJQs?$wI#R-1eipy!bet*477 zar-wR$WlTpy_wg&cfASOW!|K8$IF>VzBFz5&{FH#FI>5xmf57Vit~E^wTcM3pBY0WWvAuZiT z1kGM5`}(?IsX$Q<(xr4?lg?Xu_$yaDp!!bo}iv8}b;UM&bN ztk2R@{bRaICNGWm&yEXYurrv~Idbd^)ezIwDSsQ!R&fcE8urReXQW}?w$(I4V{~Y{U#9Hd1J`|bs}&eTBfC`xd?w( z#>59XZw{RU!x%cMVz4H#?dPG8-5Jv%P4koN1$)->u!CISVP zkWSXP60CkA&PuP&)1_YDV@6F?RZ&GHOevav9me-e2+bUF=XPmRqtc)Bo7s z_xZ?`P3=pVIfk?&bl7DR_9aasfHU=r|4DKa`N)N zsI77Nz1H2MN0_jUU?$q=PG6R(jvp57{QCWaA>iTP;Bm%cyNzBRLdjCh2YZyU)CKEf zdX@8VPqUab__swH4;1!l0ZxXEd0>5AKc4l7vClbp$H$;{!XkeCH@{cL6FO2WHGjr)g;(4#qz7 zDr@prp4MR#zJ1$?Df!desAoNE>pOdrZA#hR(IN2KvLIxrWSYi!^d!p`BX}L17sDsb zy0owmLg-$8A6}aar>i!Y%>UO&uDvB3w@|wk+2e&+yrj=7OAzaNF6WNaP76kV z=Yt2X$AA7jZ%Cm;*K=BWxZZ3OhL-aTUfW3jB-xuLEEP3GDJ~4beMT;EG)LBL zoe!lHg9dD!-!4>1(MA593H>tF+S*zVTp_lc)3d_8-PU}!8tWg1_5}|Dkib;g`<+?x zbmZg188EcudKW&_V&z70YQ^f23iZNC%@B2TgKzVf_>TO70<>){Ja z3U7HcSA9$jPZIAJG`lIqJ$mjyO`p_pYVkJ^k)X+666Vc1U#R`qbpTHxVbOi@1g+r9KOpxJvFVxod0xO`Ku> zcr5ir;PgLC1a>rk!Z>{a-+{G%?AC*0?^Mz)!oU>u&9cC5~c(dp7dj zRjWPtV;wqadvxslreeHV&#pETan>wNW!|z38~IP6Ixer*Kk?U<>$2Px`XsShSiYAN zRh~n5L|Kf{twUDczBts4N7e{Y(;Sbcz9xc^xrAHDc_z-;i}K?vT>GTO+Lj-t>*5J$ zh^KgbvvJm*)6w#9|7Knt=Kh;1drU&I*oojjcZpMa)X0I#P0v2Zn!{pp8PE=derA!19B_5upI< ziRSuetuW+ze2-Z#Au9;Ee(V2hIq`p@{{Q15?!VK9xnB?xk2?)K@+Ki6Ndu**Wgh~j zXY;)g-1O>D=zXUV(Z*(swxPzyuQY`7p=tsH#BVFcM?+Nz!d8dH(-`YO;tUZ{diI;H zHBmj<({~@=h=jGe`SK%PHLx{R*ySu!UDJ4duMSF*@Nj$qL)Cd65JQ81|5k0UPot!@ za$hzCm@!;5JHvy8+_|tbqxtBGAFPuohxtEI!*!#W28nVOqmQ^<%UaZ?HzYHxQd53P z2Md$WS$=-Zq!-2aQJ-|m!{!PXn4RC96$u~eZ7Ymqtm|eBhs+DCLnY1asAiFP@l^p0 zLYz}5$i3{r`cX#nw+?#?Z08vNBhIj~(qW$8>+o#@o9JO1CBMJ^C<8I+D_{+10_#h*w9A?-W8c*6WSBORWYVnWFK{Wg=%sQHI!6U5>C9 zEVXve#&2a2&x~6QWMV${Y`EA^Bk-qL&8J3jG&6)a2apZhAe*S0zUi6o^Xk*7iX;8Y z@2?(vZ0jNh`aO-N{_MD3=qrDGn(mU5F^bVG3oVaxF_}(3-kMRtN*y-OI*oWCASlIp zcxb2r#B7OUd}2dUCfQ~e@s>`Z+$CY(Ids7+n1FQWCJD$M&$s+M5x+zq<}m7qJbsNI zcE?A8a@gHYe0q;JF4PnggAa*jhafYrcKb}6PK-t_l5J9!0?q}J|) z3s81$_V3>PRL=3|L1P8hQQyCB2ui!SxZD)AXE8+VDxlVz)-Xk_wiRLJjN(K223|x0 z`XhM;HCj&+?ms;WNMS&AK9|;d`H~ZNGK~6zC`zH$j25A6m1%>~dQnz)Z6 zbDMAoex|NIBhdZw<*-)$5sEKw3a?QCErT#*))A{9oNhsCK(7%;;xfw{HcQX<(?MD) zTW{Td*A!3Un$lQVr`2HJ3f{lvaCTc<_4K~*-(f0D&F`{?NEnp7FsV0|eBBo~h^9AS zFc_2EPorluHYnf72*^*Guk{AKNcr@$(_keZHd7w{Ew8b3>JcL(ud|9sCt93wI75G~ zJ5FKeyO@)_j?OLH;^~h$_wpM#e9vw+DS6Xso9UB4H>K8UnC6dZmNmTAE^c`k6Ms{? ze-3)!w)N4D8|8pnQuipE#_VcibtH{=$TnOBcKk1`3{G6@W4K7L11Sf@#H+dAA7}}8 zO2PQ#9G9n{UREtiA85zs2t876lh9joM>)a`6l&+jx0cVOmLtTs)HhsD1C_&!4~PzX zm%1#=rx{8ntr;kS3&%GZfBpJ3^I+W1i|MOhne}jJSAvLJWt$H=&@xkx28Ck^i*aF8 zIT_!avqIvZPT!UF#w%$OM*3nx*OC*yT3U*E=*iJ0{Y=fKE3ZdMnO_&91+8!w?Y7z~ zh1>deifx`RPB)BJt(?qP!QRBgM1COsE?LbjLGz2y@j-#_W>Fu2I>Iye`q`K(N4S5w zArVNob-N4U6^lTv&D8_G)V`QgEQkDOSeup4h`? zyyNs#wM&kgl>IX(4>lNgu(r~7!lM^ehcS99Kkum_k&IBUTmT|ZXxvV5Gug1Ep7gFff<=9M##)W>;ZGB0&&*Pvl-l_S z@vBc?WmPcIeo_ZBzTsL^dA2OwkIk_j75)PZf-vylH$;*X_SnIHC?C4E_$v;d+LfU3 zIodx-L$xAlEcC?@{zrs&;i#RAs%m#2sI>Ep$;yj?f(~?i!vG|ECS5m9yW9`d3g*Eq z&Ci`NYY=@0VDF|tDJ@8hL57UXwyB%f>|g`GS7V$Esel zdKP_A%J1TCG+C-ikmq^nkHHDj-3!>d6PIzH*qq{@&(y8mE>+58kIauVEX*Z$#G~oX0Bo88y^^x9$IwtAXiJ2 zn033kMfx;nIoNup-d}_H;-L63D1E&KWETK>XrpOd6-UdgY2hfWqqCgIzS?SJb$j}^ z2>g>XtNotJ%Zzl?rKP3D!}$hVEiX=S6kbPLSMcGPb9LDHhN(KQS$okh1o8@uEV|C? zh}Z^oD@6+Vtt#K-)--+>jibzgv}jSF4$_-r^w|A5^ZV+M@C9h`jP8Kax>f6y%W#PN za)D<5@a4R}LkH?m2z&T)Q@byGnWzul4~P7yvbv1{$)??eY)=8* zX70S*#|Ywuvm|u|QkuI1+P z0?Gv`$dzsiyq2$-lmKBcDmr?$C?HP3H@DM--?hddBQrCtx|&Yw!SdvAeR|e*cv**k}IW+Mt?bqh8}kdg*I& zRblP}Y34=9eM_yNx?;P9W+6=Ffve*4$xF8nwm_pIsq>556y?Xlc!_h;#)@B!n0 zx!3b&&P%CNJsU;U{FT22(yECP{z={^Rm+SaZ>3?8M2@51v!#Pny!Peiiyq|al*^;% zhNt%;Y1cMyf8XSLwp*DW-gxA@VMoR4;xD@GIG6qnO~A`p-{>5GwF$+)di6?0D-(_# zgl|q!dz0=zRB>Y#Bb+0e0^L`3^`Z6z7Y+MfuLW3)y#=`+aF}Xb?n2s>~bj&6isO zggat6!&}zuts;|XDbM@$_{-puFOqsclH3MoXMkxa7of0nVSLA&vV_+;g?clh!CDF2jnco&U zXJtVDVH-a(dDj`kWy;1@%{j>Emd3C@ubBqN%O@7NHyruCef=NAi|e1Ivy=#+I)nEA zH?GFNVgA4J1P%R;jt;8P(NRzYFM%>Efmv~Y+OF(WFBL2~BqaCF1aZ$}HXV54{@1H) zc?*k+9~Kr&K~0_4u=b^fw0X(sL}bnt#s@b52TrOdvIQhFp*9{K9*v8RuO_QqsyERk zB_-Yw!p_kWs=*}`AcIJqzkMxG(ZKRo6)4OHCC0`s`RIH5ii!uy*j+6FD-oPhZF673 znU({tEgqNpFce~zSKB9PiVrtB(=2khK`QT2+9}LGEd+W zXlPsmv7@-SSb~WMc!I*=UoE>Jpb=Yom+Ws%(nE!&ZP%MO5O@_H&nlCRwAr~v%*Ad@3t6Xu4E&RtnNwBK|hke5o&q4NM1u%mpe2xlzen~3Ct|; zT)FyH*JVt@A6?RfI@qY8!N50P=3hVvahtJH3W(ofPCjy%PV)<$0d`6n!<2k#Gd^Mi3$hm>zqZv>RLCCe54UJ{ zeZ;z~4{=57KV{?LAuI2gQtF$&z`hkL2qQT_o2@2!dcu5IMuM~ ztoQ=rkY_g5jQ$1HgB2iQ`iiF6tH1;Q{Pjx~6cSsA4QpKU+(A~Vus!!8!gq75Otw3H z3VE_-5|QS`lQxd<7W5e3xXJ8s`#roDRI53s)}iVPek`1 z%fh2E9zkUWl*z?9*Hf;iyPKwB(v^N~eOAKsR!# zrIeJJra0y($Ze{j@rR_t^7Nld=D5HjH-GG3{{jd6f|vTUy-SMW)oqhw^r5x260E5F zSXhRd6eeSDqon7u&ie~%_X}+&AKVcU(H0UCGM+|yU%daNC-Sb*WGIhaMI1fv^rGYJ zq}z00$D*v6*&Tg&+$j&EFs2O2ur-Zh4o1F}FrF%2+hHW{ zQ8Y6aNgj&v;%@m-dB{6=lF!%Cy%*X3oMBpY$vsJveuXE(vLNH?8|1eWjP62C@Y?H% zQy!nuWoqb6WFk>7zGHmq$iwZ94)9*jUc9)ypsJ9>!fBLc;lrZ1c=ejq!!2=k z*m*O5+Jb#s60HiHB9AfcMVCHd`!j?sqdc#@ zphfK}PS-E}+7{&_OW1cTh(;?67TU74)kiJuyLX=ltsy}m!O+rDgWX2#{XOrKp) z%7nq)i~(M$Oqr|!+^_*ES@0gSkn&@@NH85TdKy`-peS;ZwSUA}{auvU~PFTG!92Vq0jI&?91hluOf6drG(KxX(S zf{}hlcX0~9gWn@XCI?9plQFTeukpCEZ^^!_J!F@h>u~lS`WK$k7~Hyb>!z4vM$O7t zsnzE#?FYS~-@6}uzWZTq?G1qMuYlQb^6|BVTw^apU>v)a8bD?XI`=|bd!AJKOe{jY zL%2<&AQ<4n;})-RR;SYHT0Q<^lAF*Fvh?191SSBKllTKlU;WFt$TFsa$${vmtv^7EXU~=C@6`bn_{kGNFsc(fY?* zNl>*353`ZHDp{ciYuSYRouf7Y^qSBdYU7G=>QP;uFk@KQb2|Xz6bgLK9M%>t?Qab9 zB%YIZg}olF<{fVOaAHzfss!qMIZfZpPR`!Kn*kYHy#yVehKrFE)IDWSJrL?BU|1~s zy68?+iAsx!YaK}M)iAoQ?j8OH=2V)oxEEQmspg}8&$=e6YR_}F$ewXZIke3Eq?c;@ z0TC`NKf!083OruWZH+Bu>zBRNG*Knje2pl;!`=h;qKHy*b3437RX)-0H>|o8t}54N zC80&DDH2F)gwP;@m-BKoda{Hnt?@Yj?s)hp5=@Ad)xnP)$j0}sgnIeyELJV6D(t+~ zDH-NWG;GlD6Chzo+M)(@ z?t`B5oizl3xUAuhxctvvnl$+(K$|1fpws04{O>r*|4-cee@=4#@}AQVfLH|(Ttbe> zL0gw?SHbShXeB0rP4`ah?^ci=M;x&6i;L?WSqZW=DIZPyqP~hbnaiVvyic43z?;?X zT>bk?R9K2SW(%on*Axi3AAmFvbo$lkEYC(X-Nrqv0kb?7gnvs9zb`ud_x{Ah{qJqq zUQUW&_Jv*$RzWS~pD3F9^XXLrSQit!6-LXa`W2JR|LWaWQ3o~V?5-M zOu$v&uKph?fz`*OMJBhNI_GsIlS6W0Ao}y_6#p(g^B={eKBJXh zU0r30G&489V3Vt?rltf^c2M@v(AFl6>!5bs{f+(IL0LsIvX+N>mR3fr_Lcu3L4=r? z80E*0i6J3jVInAqf-w~E15=U6sWa@)=UFGPn+26~m)}m+-lF1A{S72{IN7)Q2)N52 zH38}3)+-<@lmckJkl$wxwZ?Xg^-%7kkj;<~wsg3RMd#O92Nr3^g^SQkaR;32*z-V2 z9x3(xEELFlF{^%81UnNziABN(**;=E#4|r5;ti9cssB*Hdsp>4r_W9Ra|*~sz#8gS zn%dNb8Jsi-uV*I*WTN>58I4drOg%>;FV;tj*mJ+*Pu2@s&hE?0M<+;l6ravap?rO@ zhZU%1P&Ocfz^)cyXr_Y?bsiE@d)rWHf+B`$N4KSkATOc`BS)Cu5ak^3_9K-JCatH` zCFp>*&dwWcZEeTsRJmiApEM-Z#O$^`wdIbb){T#kPpc#59YP-wuh`1s3?Y$kQ3c(9 z*`zILLx566$Hb68m!9t^Sc6n8RN`8GX(=JV-0G*}9S-a=9}rpx5@qM-yV9D2q2Fp* z*i4lRPW$<@E&bTq%IYCt8JyxlSs!yF7<5$*5Pw?Kms%UQLBd6&)y=`S{ta|*Wvq%^!#YoJ^ANhfpl0gx2NVOFCfrwzjVL0mAwG zM3s}Wii%St?ZqiNYgc53?d&*E+cX?NjIZp*ZG4;7^J^$T(@jY4)2Nu3K)@GI#tQ;E znm%tuwfG8 z0q5FcW}X=oC)({Vu@3g^=YsSkW#X6<<^V(-~;~ z*cl!G#mNdlY1l-cEG?M>stzfGZyelUV)FV@cVZYoe;4YT(*`#X!U=f?Be8(hw4gmE zvwjOtV#6UxT`H+9`6T~WBiM81urVTl0Gnd6_t3taa{?&w84=uN)$7+;hcAf8@0nnwe0)9BlP6PtvrWNr+gip4)vfLA{X)xx`Eada z1RO>pGMNMI<7dyGe?G+wWU0}D72dyp|BAY9+yvp>yzASKC&1E5hx@G#5P7R*b!Z02 zX|>F-?2F~H($`me3vFyL*cE68?2d825sEr)=94!uVFxwVz6v`dK>r%q7B%h25pvto zPhLLHEkEAjd%9Uc4Y|*K;CLU40lEk>_A0geheNE(dUd zw&v7neD}ma2RY$zil4_Np2#7PN5GqZbu1EJJ=K;GC{`Cqn|Yq>bhX2@f}cH0uy3gB zHp=F}Hqo0PV$CERngQIS=EXRpEjSDC1+34WJu3u^|H$FauL5$dubn{Jf84~31OHZ_ zYicZQ$wN{06ti~-c3xx=E?9})Hs}Skyusn&^s1^`K#h;A91f9ee$tzX^38zEbZSGS zRUztgJR9sVxt4ArJ-M;*)?wVHVs-2?1KIlPiAo2ixZO{a7i!fmi@R=og&S>0(u=6> zul*$hmJP}Y?{8tGv9pu{V2jz4Z$fQ5So>Dl+dz}=Cp;~&BY$1D6Jwg1wpe@m9Kh(u zDk?6p5Yr%D?s+o|y;vflRFdt&NH*;^vgsO~loTNsOfkFH!FS~Twm0SB%R*!S=~Xnc zS`Gvadoah@`9m|3-O6Y)d?#2Ce4(Y4=8MN==j5D&fNRx>Hu|8(1#2dYGm4dg&S~79nYN89}>2A`&bfJj&ucC9#h;bpgE%f4SRib&axC_x$6&@V`5IqiCY@0 zqnZnjY(}NEycf?&5@L$Tg#Ecp)x^*$r{&imxQ0e!?2wqud#@VL&pJPN8jrVc{VW7l zXF%69bac3q5PNNfl#V@8r@1Zbol-l&>|-8wJtaL-JYd%I^Ae|S?G|I}vIe}w`*qoJ z*Oh4B5~P>1v%T_2EhE)=V(skz}tz;-T9SaStMaPh5r z_DBgfZf^(_vyfw$rWB^e-!7=i$tH&pogc0+4yXgESlfW3q%Uu$%Oj zi1?H-;YiY_(SzVq2Ugz$KYE9KXt;U30F@5{S5=sF9coY8D79e)J8a}@5FJ=?3zHg^ zhjJ8;7XNJTi`1j(_5Z`%k(PLL*lLz;@o*uLb(w1@4ux7BFkw9I;D2q<(ui~GAy1hw z^hc@Hx|4hpwjSanqv2I2tO|m-Y_dDoOcd7yPTx34rWwdk@ByB=M$@(>g7Gm}69Ee= zlN|DGf=B15r2z){>TPGeZlt;XBg{K!*ogVKx}>wh9H~aM0RRV>_^1aoE!99-f$@bB zrqHv#pNE}kD3F)7wJVQFa*Boe|NJDNCa2?s*!ttOZArkkN#Is{i2Npu2t* zYtr7|<~G2-zY*6#lF${jHCbZ!modYnEq^JHPeBdTSt zHm4a+vb3V^sKj!f9&R@ErpoozxNW=EtboEQs8fowQk=|odwG3)dH+KxmS}U>UqkFe zIa5fhG)?^tH>?3?0`_zBLpiwsHRh+nqb;SWsjROkPE!Blj!JOH5aEt$a0hLTjJke2 zz=+C^9=)Qy2+(Wj&3_X|T>V)H(E0y-m*4*_f`0s)WCu)DGr^WhzuzP@#twWCsF(n5 ziTP8?TRd~bmH!P2SB(WFj0Xt{$3Gy37Vd^$1N4*3IqWYqB>CbuTfkOZ00*nVyjR)lj zC&)rP+WGr6dmZiV5;$go*YA6r2(=4^jwc7l=D_clc9Jisi4Z%LGO(gS!)$3$ZF3{z zO3dEpJy0iy0KwR==T%%_7~6COYi7hlmu1~!S!!H2`yE{``T>rRtWR{wuvr&(EiT$B_XaZ&{(PU*-4%MCeA427}G$OUP+Zu-$E8K62jz z8=Pl-o_Jz+Tbkg?Wvwr0mjPD&@Qa0_>>#JGP<@~=0n-T*i96gNa@kg|-Ua@UW9yXg z7qnBU=8YQTNJhK^R-3C=LE&fDNB1#}^P(2?87B+(YvQs$yCMy|HL8G2>wJNJ)w2n( ztD5zx5erxo49`~3D&Ja5M7?glOay@~TZgCL-@PLi0If$AYvt(%Ha5!sNJ)`-f6r73 zod>o{44Hws>@xpfq`d`Hlx^EKdJioiAp#--f`LjJfKr2iViAgT42lIvO2-VPfS?$J zMHnDTDcwVg(jnd5T?145oacStZ?FCBwZHxU>tE~fah$m4o-2>@JdfkJG;C~+Lz+U2 z%6S1EWo2g%Q0v8vwey(x`T4Ear&|~MAhm7W;(+=9xCa&>=jj&Feikd4;nVX_eJnmt zVI62_xYlZkVn-mIzevo0{A=PlDzG~cV1p}wc(nm^_ zIDgs$<-3sEwd1#VKf!Nu1z$vnhHzo3l{M`c#Y0A&g|GZ%`2e%=KxMIYEyo2izJ7vL z@zwu?H5dBwi;cW}EDqAf(%p%==uasrEK6m?j9P2B{YA0UEp|aVt}GG1GrxU157}5i z7qYbq;OIFO=P??limxi)oiCfP9n;9%o%#HCT~oZu+#1fytB^>I zh+v264AIq5Z*R?4#%>IMD6@#~^6n+#-V58i!!c`xARs(_dO({B0neiJZvQD>5z=KH z9S&nc9Thgu61HKzXF^Jb=Gg6tg88ia7g15c5*Y<_psTHhnty5pyjDV7EUv4ImU!GL zo*)p72DpJj(3F)(l|_%U2QKO8xQpc64L6qc81xc{TMq(W`ls*TSv8)puL#h3paA4_ z%g&o8Bq6T^zrnD{(c_C|)C*uS?2~`E4}r=xJ?#OR%5)X!z%o9#Fu2Zb*5Z5Z*UvwZ$G%!(Q|RU-Uji_hC3dUi4ALZ}(2o-urE1qfT;i1)z z_Tf1Dn`IxEa1nK!noA_A&egS^&76j=wzRjWYrc1+j;$j5j(?sqX;zlVz&jmoD^hhD zM!-8mIb(9~2{*eRdov$rc0k^tY5<*IRwfL)t7~osY>;V#~x^3?_U^ju7W@=NWKSw@M(WYG+ zLSD~}4kPQ^SoIb2TOW^Qri6ONSIOB;UV90&0C852r_kC$p$@)jWFq zn3iX`xVOT^kLCwaR5rnR?RR~gVqBBIRQaIA!M{ds%ML5{OZ)LZn_fwk)9^r{Is69+ ziLL3a;!inyhZGOg-9sXkS3@BWzI+UunwpA23bXx}Fl?l?(?cV#3__MGm_PEC`O7^W zdhnZ13h6F<^mT+8_s`F$h!8;wo8>*M0Ly^qNmpZ^Iz4?s`>PpEJs=?Jo6UDM!*NcL z|BrHr9bn#16Mv6KF`rX7^3EAY*`7j7yR1veC2`AQ zdMjqvuLtyO$sck%_~I0ja&A_MG%Qm7!Rw>rfqVRk7jr3fnSLM{-?x05k`;X|4{PK0 z1GInXA2Rv3-4>#b>uW+jzae$A^&_udYJW#%GUK^su={vQPu(&4 zy>>v_gv$cVF@WG+tBc#wZ#*@=igy~JqnTzLu`E9SyVDtIv9l=I8uYmh5~k^vkMw0* zrAsqyZE09E%?zV&XSr*SWG-*s5ZyFO4qpYJWff!?N8Q2=_yu*KjXtnk_`&O$gQS|> zn@DOI-{t&hs)-lr$J6Bl2tb*as8<7ijGEBRcR-HQ`_GyV-6|M2;NuWd9CyYLte-}3 zZ__h#XkNKeSHtrtkYz&Ba}wm&lV-Wzxu;-MiJCcE?A|SkmlqDl438>*O-{bu-C-0W z*9_UK6oHu;nzaXM{VTfTjD|GTQwoc+?yLc82_N5fu=tQ!CzON5ie5fLJ+)MLiNRbl z3Ni!F!0)1Ntokfp=}N5yf?jJltt#ON?N1iuVs^Xu0~7KJ}bznf}!bgVuhFZ^j9 zr|w{tlPT^NGdw6LB&OyrASvH7F6L_!Pg)Ijzrc9dQ@S1tGdi6SSygw#cA%YS zPUFvvleu(IKC^$1tB5~l-?OSK3Itux7%8)(WuT1yQHG`Ubr92TbsZfY^SwKRVsEGP zRH&pib&JG|&W{&l2V?Q?;^*j)drcpXBL(Pj6$)W&SE(wj{L7Rig*?(P85)0Kufpwb z2gS(Y^Twa015J?He;ZJUj_z^{3;4H9(iP@xaeo@a`S+#&UA+1K>99njI?PzrJmn3f z;il{V&?~+K0esL8NB)_rnhP|R^p_yOH#H4n{@V@tE~?jk{`pu+a`KaZJ{3WG%irf; zPFiagNSUl|KYsl9O374eZ7oR5#d{W#9dVkbb9XiwxVUSwx_(7)*W$=_5X~e4fqFUf zQF=UQ4xfI5f;jq*1Ap@~!TYm2;%z}k8JCBA`Xwntee1thoR{tskP{q zFGbCksuxLCRZ@sD=lHClY&yp>2xL9V6zd~=O-TD+>fT|h8FA7i-Nx0#zP#WhIq}|t z^!}wxI7aSJ`0!!$_C>ym3GC`K$w187YsWj>ALhh|ev29N;cZ{;t;pJ#E5niK1prtQ zrR!dM0BY)Q-tbV@&G9?%ub|-Vk?(xNRF73_=rqaB)o1tam;vbl@`wl;x=Lr<8E3&u0EZzH8d>s#Y(ZBchfVo9FeW3&x#ZL*Qg&KM8}Bnn{2ec$$W{Rl;ZWMHY$%yPmX z(m(9Ux&Q@DS{{9EB7Ld=^-L%5bn%h4+3kC$*BH*06Jjuq_u>)eeM75rjSW1*{=dzz zC@N;g(8wr6MR;4zIi*Tzsf0&&eOrhrZ{y@$ShwGB&a)~>ym@>2{!_@Q^}Ezdb^mLt zEjb0yj$7yB!qPSn=k|K@-ZE8moqj=!=*8YHIsJBagqxwgpRnGpD`$4m`+1+BOwdKm z7y~o2Z~$DkE?(k2E_}02&FsUAQ_vZ6lL|IwRJsRJSw;{h&~P}c>9+xTi}D9~^F6y5 z>RMJc0&9h7E-P&Pu*sfOaln02-1R*4*r0ZtVu#;dW=53GHqi z3MXRRLsAXXE1@1AGH;ODl4BQJ3Ap|oI_(G7A08rPEgwTwF=D@5odvr$|Kq`}*r=#b zP|443<`&2QU0WE~b3ps#yrV!;a&i&d-=6IIS|w@g2RwYb!7?Xi(odE>AA!=Z8_xc~ zEEgi&%_ezEbxkThGX#eCmoHxm!WX5?@>t5(sxsb{VDgk9@Y}LpX(OXpaPWglBixq; zpG8IO)yB@6Hajy{C8!@2yKxTu){Jp&kc!dR-`Uwo1E)>{e!R4JQfMz9-w7BO!cxs@ zc0ZQ}SihI)l6`xm4qHCO94y)92=OIH;z-t!&dfV2F_(VrR$Ft<50QeE^Tf*>#S+qL zy&mpa*We3SkIJy1k`RS_SF!FqWJgy1>gzJjk10X7(jI!bwnG~m|GfRUWlh3UB^a=Z zUVhW}*q3~CQn*r3IC8(dQh?!~b$+!Ad@wqErT(O<|1K;4_U)S|#J9>j(HX`+)k&+d zcvrM^c&4ZA_6A>_Z-@pT-dpm}=~(nX8H6jwvtp^=zt@fJuK;}w3TUrOaIf9={5nj zo2&owh%-@lXxq2)RWKmgqBsf`-D-NDfFs&F=Fg>KQl^wXbj=h-G+0vpvqf|>2GaJ7 z|9`W+{{wXl&tE}_U#v8g(Agj^_G#D{5kHvCS@zEg5qd1f?UWDQZ+zw;*{hnl)h_cX zHWxev8Wdy_LLXE;*^S-O*c$LixV@fpSZwi|b&Jsw#eCk(wUSJI_8kfq3QAy46D??QHjI{{kd-KzwQ<=l_g%=ak4@}!d}dQj;j8Q0nO+n7qp3T@uYszy zDcktgxu2!>xY+3u^4oJ%O--8c@X*DGW#YcABfVCr13{|99W(P&8SjbIQytc;o7s^= zVQbo$e5DLpeD64@9C^#$UaB(_BeLAcb9MWaE(iX;Rhc5u$Flk4i6Nz~6w*@CwoJ*h zy4W?$F$EhK9*q_ zyP>MbsI8G-IQo`q-^tTxJ}3!)8B(DX6tf()|A{=mjxmhyx}!WOK3+nhm=?G%GIVCb zcfA$)4B{!|g-4&^f#QV|!>DGzHUKmXG@TI&p+)NMsjT|ueC4zi5b7fURCT*~DLq|7 zv+|32J0kz-Jr;xyN3a_o$mH?WcQX|*70 zW?JC zgH%F~?ypJ`^Hh`l`rx{#nEgv@WaPf2q3msx)YoX%PQK8AOV>Hy9Sr2El;Yo`u9kJ! zJm@SQE#EBbgKwU{hhFNE$c$@fY9PLSJJ8dN-Fhp453y?9uGo&Z%_yYX|vKV7V6rjl4!QY+dwskqkM?oR=qL8W^ zPmp(R`Cl(w7b=<4)=cDkU*~{0Jl&qkX$}g0j1oS-A?~zRU9PjF!)!|KAZ0Unmhvbh zIV;m%l+MY`P41||CTeh{|B(yg(3vIxEliI*=*yGJFfXh`=8vl4c|P1F#DSDxy@nri z2{IXf8=)LScderB{Y3M71>LT6GllWV$=gt*`C(qBaIEiv0Ji3Bzp1FIUhd9vQUZ1- zcdfVzTI9>`PI1|^#`nS^Jf&}qBz%7kX3+k5WlY>zd;h6qNAj-n?*$(H|0NpFpSFo$n~} zD?%WM)*l=dby~VHQoYA2m!Npr0=M}=#ix^B+aoNAP5e@%4ohsR?kK&%w%FQKhz#^n zX55e&C66Mie3qE$Inp6SSa|fJtWdEweUsg8EqT2%Rmq9)7i0f~q;_HckZxBWZ*?B( zTHp5j)QVi+T;n3Az%waEZ1@FcN6c78Vn4rWDQ7&6;*|!gJX@}Q;K}t9D_0S|5f3OG zyqZpyz1Oghw3a|!@7Z;5wCM`CJHCuv3TMrJFa$a9@#WMDTg*OZy?MT`j9f*N*X^b} zq7zhBq$o==_+R81>X^G)fe@D7+M@sN)V=1;KHjLldsCB`v9BPoE_B?nouOdL-VuoP zp$eJKMnC%bAMYQ)jdoZ{EYF&$mB@RCgpO(aV7isy5ukU&%uK>VpVn+JZzr=^f0Rzp zCv(kdx5R@XXbu?lWiOkVna!o%Q>wAt_|vLfM*4S`5(E1chW?V*V?{Hg=r{zl+I|%BZ-LSyx;bbsUQJDg`dFFtx zv|G%T$r&xwZytj`eWkmeyzBY$ZKMk!O}=-WjS|iM^ob6jP8IN}d{@ObYFA;%i34O{ zhuX@$k*>}#zkt9_kusQPxZz+-0E@0n=3x5OP|m7?drL}j_sz4nUUG>X%?vlbD9dLWAD#q179pJix1>>b>5x2%L+v* zJxj~Qwffj?+il3e1pNK1#aaF9*Ju?dx*B}JZub2g4RY1X$Z|#Q3#>>t z`ZWK!ST^6hcHf_*GHh1;G;OC@#r|EG{ z%Z;AT|I9QV_0S` z!^QKhHYWa=0XUz+nEX?Da`7XvT%(-vo};^j^+};e^VORQ%@fz|5;i(kW%&0_yZ8hYY<+bVJQg%4wNaxFX7?GUzxuklgpo}<6nGJ<~uA@f<5ZMBcN9>CO2Vh0IpKV&@ zbd5zcAmk|OP4`7o)U0$_8nzXhrqf)0pKF~~dG2!K@>O_4m@OFOK2k1?iO*EE0+@>J zikY)D6Tt2gJuG_*IU3BR&LS%M7?Vj4SA&0CN~}Qs^+=tS$qHTz=Gt>Z7U7{idhsF< z^@jHT;NZRN<^O#0@E5E9T!WEbRy6p``BSG(eOaG*q*7D}?>pn>DRD<#k`^^EAh5x+ z>=b)$-?pee#SlF-l98t?G4u}id7(dtEAqOuMo;yso)~<$yh#gUq*W@ekc)!mT2+f z@rPyGKFWT>6`woT&4?UScak*-l!99@FZR7$#m6Wjru=jye+aAeU=!_BOa@HeUUXdh z)ds$^Pepi9sf!-@;j`u7We)8&UVkFZ(s5|$a|o4eI`)t}U}6NFC&~5E1NQSapehS3 zivkn9rfmtkr4+|f0n7#hSeG_*R+-hptGf|e&{S#>g}HoiS^NBV zT|Y?onFW9GGdFtsk1m}&L-?`;g@2^$!5Q^nk8+~45EKajFe3=ivNTQe9-5Tfvmv0K zTAf+_eluZU`YNbdV28OE--zrzWBQ!tzzkw5dJ@Wi=)QwI(`!j6_#f{O&@gWvTDa zeFj{9D8GQa`5|h(R7i)suA(JBoo8Ns!!P}~Rpq-M8~6--JUvURS!^5i}`d@*OV~4#PTocZJ74pC9K7?E&FXOB`VSfR~ zVUGD;(bj&}94qjEh#M^NYJ-9=%}~pAzMH#_oM=es@TLN{Za@Yd&?m;ViD$w0{h@dd0UD^_d;UV z%a<<=n^m^QU!#n)-+-dPw=y2x;!TyHEq2hA8I&Cf(h0vSIsH_c45R53VzN23!E8E@ z1E>sphwJM2<@Kc@5h>H0a>$c75teV|*mX5I67gwi?7;EJ-!Jljh}V8EPk>@{sp;a8 z&)0?JEsKKTrX{_}ZpCxQcjlkktb3Q{NT~{&gm50J4C?yaNztP%(dJe(1ewLkpw@nc zM(_LSy5Op=_Z}$5k0n`bSv&XGN#M z<+jZcM>K=4j~nYcjr({+Sl7h-8yYPO~zYO`}JXaXn}pM0Q!lL`vXMny+|1ZRWq;0%nw_wT7>wYEB4ar z*EQ&Zdm|n|*MX#8e$SCs(s>{)`TF&!i7P1y+Su4&w^9nJ7YL! zeA9_P&XdDy74Qz6R%dN*B)xPY5*mLA*{|3oUat3b6UiG1A3i*E zkMTOV1`@MjDrJd!^P6!ht-bP1=5(gJlLT!uLJr-Z@$IO}ESP+F@bf*vj&3UOzv!Ka zPxwq9V~_`3t1-P-@(T?-e$7d9jUGNzubNG(rfhW^gK6wj*6b-wF5XCPAtlqtwP25& zzcX{+UO*zw$eeNw%uzNRpECF{8cP8|h1ppxs- zv*rSejhj;M5*UZwe%z#Y>?^QoKN@%T*0taZey(TMTU*ci5`K`nROAgQbNjea&MsdF zYZoTYh^MQ$;U{(!Htd*~-58AooRjcdqMsRDRg5y9sLLdyU)M+x=F18*CK} zuTq>(#Ag!{54GPb;0e94 z6J7<&FjxB{HMQU&;4a!ExeNHj+O3Jh`yk^GtLm3=(`)D0o;@XVuf5l&uLFU~Y;D;G zHa1{O*nM;l2jlNgK>N0osyel9QQ*ECfhAZvQVD*OvNCKLUfqMcJ^Ks8-yg9hzW1Is z_+&@2IwUP?{fqsZL8>9PwExv-Qx`c<3?$)(eve^R6vY*fzA4%MC zm*2OVSp z=1I-bd?`(?=EC{+R!cI0NpZnv#pL7+Sc8YJHvIYh`$e@-S5rsFNA3EU>2C#s?>~O8 zn;k!W*W;4sTTVTn9w-FoFBL^DRTe*9BZe zc-DbF^E)y+fu9vdfC=Xm#wDuez}}Vm?&X)_dPtoAfC0cJwMro9};i zW3yjC)eGa3l_pjD>xvDT)pyjx!z3sKyPI9$A!{1K#3>M=F(e#VTqUNa8@H3+vH;J@Kr+R+>k`TUd$EtsL%iO*dz-Fa+gk8ev&#*s7A^YQN} zdQet5w}+Mh9c#u>UibAGG*AJ+dgtgq+~z&sa1_YKilvq^0_;q2Xi}a0SvEYy6lbK7 zkIu(S*e`eLvLM&u6bBb_h+?UR_1A$cLlSRrg z%t!mTxsa0ewySOFW{tj!9@UPgPAB1x93JM^imY5++4AzjQvKhmQoW9kOyEYQ+c4#; zD{;9J@XjMIj#tH&4{#mzbbWU`!k%1?_1x2b%=t`d@v$xw_Q+zQ@cTKhv0vKRRI^-L zQBK+uNO>)8C;*r`SDNy|RAODqn1wGz*DAU6n3g4B1bnCNOFjB~=56k|t6cmF<+i>i zJ>1nbyVc;Y`6lWfo?p-0ZM;4FRY$OXAsUc-b-gHAkDgnRNLj7hvel4x7x=O5%eHjv5 zO&9h%>Rhg5XEePoVRVT}FtW@&?4TT!M~gpRQI^@KvUA_K%=fKU^fm5>8y=B)0!VbT zgr5X9zwX{KCS}fF*$E#)XzjOM%sTEIo`35)$uco=r2| zP`uatHe|ywqYC1xp!TnI<4$QJUt`&~nHskkbpsD!MUClyq%YGW;<_K?iI`wfvvyz7 z3P(xI+Pj`pon>Ww(6Syo`e(@>7d#%b^?6)sb&J*O_;^TCr1*=@CXu*MRdw-OnfBgZ zO!||Fv8eOhs_B6g(v*kwO!(EtU(FWFXDltiieS0_)6~o2$=&bQBHy3olaawZN0E05 z|0ZjF)sDq(id>fWt9^ce30W7E{hhHC@1wt5=d$L-^W^aGWUigC{cBpA;;92vE0APD z9lC_X@}_dUAk12*DFL6V#_=6*Lb5|P@$7`EyKH8>!$+>h*Jj<7F#nEZHkt$uY-4WM z4te|uI4A9ZC|-08DEnFZNj;7I&nK}43$q3;c>Z2q=0ctIo6@)OE(m%TCoY4|shU<8NZ4jhTdv67qSm z42!`cI~sjUq0--8yX{7bkRQG`>Ggk?avY@Vj4Zp`R{DCG7@e8uk;(8u*==vB&ynHo zmsOq)tx#&R*5atIsOMuYQ}su26tNY~&M8>ExLQVyeQzh{&^Q|{O_Vw=m5UWZl~Xde zG)&TS6`t+6AMGS(aV19TwBK8k_t^|PVc&GV8oAqd$5E3y*6bd|B&N-?Ox~BO>iux! zO+s$ONEe5a2R222lb#RUq2DvbTln~lf8TZ?_-*#wH#aR~DT{vvdvbr?hx)Q+TEfp5 zvbN8wLh$G9(_0_Vs^OW4eY_^t$B6p2ltmhs6V9<#<)6L&~ zPK*JA@3is>3`+PD1nhoUWEjL??y+5pB}a4;PGl1cY&+(VYy3R2`#yLC9g{@g-(OJG zA?G4Q%U%%rHaStq$&&+(zc8iV0zO;&=bO5|8(h`A=>Dry>ix^8_0wMsG!dfCw*Lb@1lnjG_|~WLzfoW%+rdW1gvmRdrdic zk&^NAY6-={^j3pI?l5)>)|$%h)dMS^!DFz8->xg&Wjd>02U=sMsrym~DL0oNh4}6C zhmFU=TAtcRyb{-K2QaaU%KY>v4CIU+jUv3m7ZIz;td=!XNSb@17;N%<3nW z+7L7lDBm!(RN7)aJfSGP3hk67{j~wwDSOYEmUM?%bVD8vi)Zy4Eyu)^8MnKB*Br zd)--hqD!nXgKLCcH!tWN1^V_C3;z1?ud=rpmRGVY-9w_!_waop24QcXc*3ru+4NL0 z;=s8*%$&k*`~CSPy$qg)KGg&eqUckVk(T}S4n!W$_MyIPNVN0_Zsx90h+i-9>=l1S zC%Z9Z;2Q8?tMm5ydi-)fan zUY&Y)YFd+pY|^%n@Dn{mO(H!iRWlE)zfLvB>?oAjTM7uLii|x%BkLuP&Z-Vkk4Se~ zR0#=HI)55fc99ow{S+R+@^O%XthOAU!G-9Non?GUKW$1%Z*gOV;?9c4o54D8^5jYB z{JV`=Q?5-<$d`3`7ZUF~c6W8BBJ{FzbSn)cYGssjOP-3bfl65!WGF090;G(&f~879h0^Pg><`+gcvo| zj)b}^Iq8%fikdcF$%3b?{p-~_ zo=HiWk4I0GBQ3dh44~71A#TDh^v)l~(w^e;Zw{R(j}cEhUaU6Hw7kACwMVQ5^t$FaX&=vwcLn;I0WHsN*FN`M?0Uo+5hXF3T z`Ha5h9yWiokq}DDCJzrx)8k{YuYW#j#*ZWJS|LtI^6lszWn`NMecG22M>ukpieRM{jy{vR9Sk|S1tU|5?1xA z+u=_KO1o~6_r?hzIQf$_CiW?G@3jcg{qVGzk|!`Ac5O+h-=)-ILWZ)viH;S*gjMrE z6yofkH8jR)7`q&IPRrNe82t2;nuCr8hR~4HX8!~3(bJ6ov-X@ z#0g?uFqRQ^bKAH#<|p7XO#T;#W@95+mNE^HX|Y#A=Nb+s*V z)JZ5!Z+P3(McH^xzCEWnF)*ab&l1r3KvVnKOQRq?tJIxhSlHjZ@-BY=XHmtcB|CP8 zNiC#I%B4HjqrbrCFxkJ)sFmB#--k* zhNYuL5IK*gLge!?SPI&$j>~uZmsE}&?~~UFe!=(S--bAkExt70RY74Xy#gI&qj{4m zS;dJ&MH>)G+q7^Gh=1&JIIK*GcnP`Qc`VlnEJk#P)yyy;%x-<2_x>ieCVYrqb_12i zk7a~4=`@kLx?4e!`d#z%)N8Iiy`eD8)_L5zeU{mg-xXIE5{7a&-xmssEKPT3tZ+Dg z9NA)=nQ2e@sKImadwKc7>yc1mzq8hT+MkGh=l0||d`$b2k|q+x=svkK zzM#!Rb>E=Xr(9P&={}s>EIM;cBV*#sCfyIqB?3Q##}d<&%>NyozlJawV)*|Sr_-MM z-zjhY4V1$Eb+NlDwcuYoSVKn&mgUS**J6pTFPqlR#!}ecZqQ_a&qp3=nV0 z?z`zF1*Ljf!p5`nHGJ`T9dT|R<6AkqE3y`5wxk-#g-)YrO#*|zrJuJtJAFAgF4)N1 z-}`l77qTi}I+M-+x|4QgeO;9!8{jtv3@9~AVc@OmnVZw3nLxI&n16h7r9uTx6ib}~ z+!7Abp+jc^Ag{~E$^ofq7Xm+Kd8DIur6tH>x#=z2o551H_|R`1w2~(LhDY^|GftCv z;OFqYz;?_W@8V>+~&Ox3Sx2`Q~;f{7#J!hl1KHP2is)ERHO$P}uW)BtjYRQCZTalOe*1RupRu9FzKEzOpXEwN z%a@$D@nrJVdopV2RKpo9 zB$-g{*nnY3Wbhb})6>UQ=PXDQo&S(9Qe+)^r^pG;&mn~S741z&x6YXozkb-+`yewu z^UF9x#88)Y_446MBc&*0Olj-F_S-98zVy>0XI+0w3-(ObqdJwav-#Kzk2mb4=hy5cS<6`3gZjeHgBPB zO)y`gIiuhZ#)kp!B(@f~n!VqA#zZXLx*2cZx8`TjC1ni%rmiG~tmOYn7@q0s6xj>X zsOdniW0Y`yZJFTJ)6r_yjD{qP%lsP>ZU{>rAAx4!8j-{4s(QOdo@|tfp|@&YRFQtH zlTKb-{ym7kWY1K4%ewlocBSh~KIf&a2>USWTxx0bSH=fYao~J6}pDw+Esh7q@=aswW5X@bJLV*b&iogB8=&SZTKa zr&`W}&7DW%`SXEXw%B@UF4GGf>PxrLfz3^NiomM_W~Bd3nAXX%a~r zx4d1`Jnz3C%>op?3gDvtl&2~d8M(juV31h4q6C0G_AY)q_q0bhc^QD{p7S+FobF5<^ zjg1XVcYGC(DapAcymT1~1iGPyq4h^Wjn9G5ibV;M9x$KfiHWuo`CYr!cjG@V^PlL$ z*i(V?XRgRWtY1n=$SYuvKAmrT5zgG2{yH>;?V@wC=0~coX6Noo6dgBWYURgxbAXvb zFwQqiu#QrQIKekZMSXao@hvkWH+5a2D#H}3o}=dV_A8uNl`X*l5O}7HxJZxu?d+_4 za0Wu#wQH9yl_y<M>%*_u(T>MOG z2h0}kdiq|&3!TT2TD1Y~RwOHK*Px4uW92pl>-YP_?R$zZrsrd4mJKzp^*z5j|xt8tI_6|=nb)@>Q0!4l zG+|vw@P+Ve7Fei|GY(6c?<`79Q`j}N5*R6^`l`+9UgW>9kWWiFs18fub(oPcE+L_3 z6&^#XX{mFWTCVFl!y9p2x%+Zycc-?lyW}wIjdJ}5<+~pZ-lOW_!1WjOdA5b3sL*fuKnvqa}={zoH+IfJ9aV27s4u z3p_8fB=jb{efzDxp}{q^bh9_PbMq_u44Fm}91R91S!&#GM(=hcpq!zuAUB&-fo;HNbfm(f>|B{9i@rT#*8TNzEMc z=zrA%SyrA}u~jGrRSYM@&@LPN!vE;Wlh;=#R>7RmwPN`GzgUjDZh<3b3CG9Q*4BH} zVxHjK<@as@gjh=%l-ej>c*SPF2k$=|aooY20PF&WKKMn;=b|FhE&_8s9)x=9b2+?Z zMSHii<^~2ws8GkwNbRtYBDpYn&i?(@25A20UNwh1hmm2x6HsV&h|W@Z3~l1knCZxV zd2>0ZF(a?y<D-fP6f<2yis4d`($1MRuZp*9p^#;VXK^gJx={LPzD${1JIGwe+C zkU$t-bZ%IpOd`vmvAGOZ=@+kDVSN!B0t%qL{QRFmfNCh^vN<9V`cT=wPs7WK)(I9{ zoC2p9fXngIdvUfS_0qL#!2s&}SBm?Xw6MDUi#v>)n~#k*;U?4L(LS4!d5%LgvxtX% zd5xbpwzLG5H-I*qz*VcY3%Py!ww|87zs)}P5EMA1n_7nM%ScO$f~Wg;RbaOi`00VZ z!;D1Ty(cCu!|7aL@fdLsnFdb)nyJ!9jeM)^{_B_iLCl}7Vyby%G;iM)1M8^eSqbVh z2sRJww*Txj+j8FP91We<#tJ{VUsXJ~P@*af-Sj{XOs%aJ#K*Voe{A(Y4~W>w3TdsFFOewIHLGzekM{7zh9zOQt} z52?n<^DPGWL|R-y*8i&GMmTZ=O3{|dr$Uw1!0io1b3;kp4dD}Ed3MZmxs)6y^ z(jcR5_1{?sU=>2_?v+FN)Yw$1AR0_SvJdt~ks49MP(}v}D0wA>W<0SNiy6gum#(t~ zoflW+hgo^+_Y2XpdWHNNhD*UGaoqlUV7Zh=XMVZrDdBqg%Bg(IQ`9bf>PJ$3W4|pi z1ORq7Te4O<$<%?WwmRh2r4~!hzk;Tdtr4ftkoUt}(&q1mhBJ0SjSG(S_w9cu7nbur zEY9>iZYgA5k#LHs=`4AV4f|DB;eCt>9{zZP-kBV^wDUoJ?S5_VNG- z08*#s4a#?kR_{_oXr@dI2m~1yfiHtXfW%3o`k|6v_eAj;pYIKIExaLkj54|NE68q2 zC$8ZuWksuSkLWafEx6Hz{udB76gxC#aUi8X+!5!4KH9u^2!}KSlxCj$$+v^nIJJ*m z(UBw|fcfo!d?zwTnjJ@DNqzVK)2kdybpGL3H9XNRfgp9g%26OI+84~Sz#dOTmhps9 z??D|&uEwgjDP*IWyCfFzy4#m$ZS+{%I!V9AQ0ZTrac@k}>K5ov>g<1|vq zm?{pa+TUo6d%O40SsbOrjBSt*VkAUiAOUXmzmRYd)`}rHDgft~U~B>^w-V$%YG{MZ` zp!rHjNXX}uluLt5G;bj|dl`8{Cxg)JGvF9!7B;p=gd^prLW^h7aLy@>)&_hd2*>`k zKb4jIWdt_B^75UFn=7tlRF@?VtZnEjv5Q$l0%2icuZsEeyXZJ|a#ljEdW3DqG8aB| zVs~HsikO(V^+<~Y|6xND5nPf02Wb{8y__kunTcMwN z<%bLzz=f6jo?ql=%&lj_gRD(W-@yjV{JHfQRWkoUtJnYtmA>eYjI}xspV@~tW*A81 zo<8feUz*&reOa)Mm5ZjRdNyPz_%4{*;TxM8Z<~%UZTXfv^vWuY)caj^r)VkV6ob}< z3(uq^CC?DDN6*P$kttpO%6}3F3j+YzNPH>2&+?>E9uKxp5X}kaH)AOGZmW4QWu*sYruc{1Hqnqh;smw}!^Qbd zGtFa(?Yv?|?&7@^qO;c^U|%!2U!7p zMg-ahEk@VI;LTx-`vG+n>rB|QqWH6)e^C-vz#Auy9V-V8RFV}d9$BVMjFJ*_?}?ui zGQ>kbGbDcJSltYT%Q1Kp7#$LZxE@d@>u|k!_H%8OPs76}=)Yw@4NRwB1g`kQCar%| zVn%tlXwaO=*@y&5zCFk`Ln#ojjT@JA@maecXR0o4>Qc*=eS$i%YQE(TzW`LD)NF^! zRNC4e4wcHZ=usGe=j+`NuhPfQKb$`o`t<3mUl(UEn;l2uA70n9|BY3?j9*VemxclZ zh;Vg`2P{%tL74n9D&Vuo4!vwaSp@e?cj4OgGz?z2VlNhz_~i@3v*@9RxO1%EcNgVw z@61~t+a$))-zB7_rD^sO_9SlJeR#b8p~u;yM=zGC?{-r1^=`X}Bf5>cT&d%{GI3r` zN=lo~9|*T_JP`+I57+CTB*To)UF)+85~o1$eAz4e|KjaUprH)^zv0_XVnk8dqqHF@ zOJQtL5!w(jT2u%n`!Ztr~4bC2v!aFY{CrhdGK)xiFNn5MnX z=M7VdWiR@L` zy}#s`SI2XWU09Z_sXZV;%5Ou-a`eciP=x0~Zt(K)?Y;f0S!93}bDYv3tom^jcB@wd zClkPPP9em5TrJrOQDmvMJx(J>BR1wkOar>As%paf*NR_0aH_t_c+-<5a2`Gr;2RlX z-4;vVZe3@(hdPcHuMfZdKzNUMkJfI>b7Yx@u!SC?NCooHfc*VkSPQW?_!T|1Ko3$h z*=^1qd!Y6QbjU7#jty#w|C`uFa^l`v=c_*v4Ag|qG!OltjQ#m4^VTxS2_UfTlw+nx zK~)#wQ=n3erK$Zf%c#dL}1Q%<6| zsmo4(`bmemVedi8)?#Cz^RBf(9zwB`o>=H)Fo>1AUd67htLrrigSwvBp$t&F!$0e` zq~4gO!w{Q$-tDtZ$Gw@uIX+=Jf@q&Q`!}8TsQE1?X z+Gj~fLTAhr@M^zar;%#Vj0kom4fD%B%na*g-%^n&^nvi;&kwTk_=2nD_Q^|uf+u%m(woTuWY_3m-oDst7sihrJ3>)gsD~EZvmlfq(@syuaJV? zE$XO{E)CshBa4M>&+)mAvX>M$Q$y)55TkzCV#b`!^V0TRhuarvpEKHjFDJSgjjsqy zP2)j|WSs^K&I|~!*1158{%kk>!4`(Sz-G)OSHljC(8boHDWdzQGdrlVvr$$L$fTZR z5qq2o)0eUlv0-Zjynv2PV9(~I`(Plua7F}k;R0iFOGswXCDR7^Ma{zxxkc`}y|mu3 zBj00b-vH3@?Hea3iR~yz++jORe}PyZb-H}Tm*#QZEqu9_&^NHvwV5GLul_$l#f#R0 z)7@Z)pOJQ%oq>pA`z67?ORa=UoAmAzeSQ71jR+lya2*MHPMO{c9#%vA{&2Vcrpr;p zYLsQ#gN_mSSSsQ>8IdNbrY7QhAh1ZYc^!SIy^(fB9O3H3w;VEROSBs@?nRg1QAKrO zRPil$s>-#3pFkNyfEjWgmo~fQT5UxPDRaiY3@>;KTkb?v)&R$!GjN$c5n_1)_f~&y z1A)!i((UyJv=RmCL(S7G8bcW{%9nrgC|CLEqxLG8fj6Xy234KKcEc%(^$(fRcDn)&{h;+p_ z-{$%MehHRSI-y^N2k`|i9VXv4gBq$o_;W;a*O|zW5MTIRz}kPy%5tfjM8sre4P#+o z$B!L*la$1OjOzZ`df^}Ry-g7|tA(X3{$@iwo-*8U+k^ig0^z_keDytWG+Nxc_2J#7 z>*S=O#ecp7b5$~poE!u5OAm(Vo!V)oyCd9|k8bpyUuxCXMhs;!6%EAYgQm-Dcszvb2|tc6o0qP)Kcw3O`u@G9 zD#K!BO(I5-tL?Hq7%9tXlX-5rAI<*9C48T>ZjKrPmx9-3@7}U{*&Fr08%_&i7~4z3 zrGtJ~0-)xWfH411=-1{!Tt>)$P1 zPMdby>6>2R=t(z);~~{UnoIx8VVXlJI~oFKCgkE^b{jv0={;|QFv|M)`OQC;D>K4O`QE7Gy(tDsWi&LirBaqJbveL@-Ro0!pBgvY0=b;M4q>*2|}Xu z;=D#>?YnorTV4af%muORGimoySIKM@x%&c{`RQB3(=%rrn!5T>_F!oevtV~Mxp+~6 zp$r%}-vc{Pe5d`E?Q|31I~ia_N6+`k^w9!&^gssjP=x+jO>n*j=j6(5Sd?Ikt!rp- znG{@ujW-e09z)3|Noz`_$bwOR%ZmBUd_Jk-R8IoRG)}GILi3^5 z-M6v^+={k^6&_1iVI&hsn+fF%n_Uu`!W4q7)XSc0t zE)SSh$o>45QPFXricaO~d?SC_@Vn0Tx!R7Z#77axn?j5`i!E7KKf&&Jq;W6i&F^X1 z_AWehn@kY$WchDdPa2Ppp8mdfFYtV^QkE4t@Xw&FGYhruH#WwdLd(!arQIKkSaRoO z_WzFCSG{~=@%@*%Ph|SY39V@{_>pvZ?v%AW9H{)AC{yw78Nt&w@Rt{QIq}ymb+K_i zzW>eE{>{c;SR(y52yT?UCwn3vm|~xiNbZQbg++XP$8sYkH3|P^;k-RA>AQ+8nbU35 ztRZ=fYSJq@HSKt8_kCisIMChJu}P699S>qP⪙bj5oSjfj$pH*NPo3d3ud|{LE)R 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 Date: Tue, 22 Jun 2021 17:03:12 -0400 Subject: [PATCH 78/81] Probably fixes #10728 --- code/game/machinery/computer/supply.dm | 2 +- code/modules/shuttles/shuttle_supply.dm | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index 7783fa7eb0..6b9b0f7380 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -65,7 +65,7 @@ if(shuttle.has_arrive_time()) shuttle_status["location"] = "In transit" shuttle_status["mode"] = SUP_SHUTTLE_TRANSIT - shuttle_status["time"] = shuttle.eta_seconds() + shuttle_status["time"] = shuttle.eta_deciseconds() // tgui expects time for it's formatTime() in DS else shuttle_status["time"] = 0 diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index a51fe50d56..55ee7d83b4 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -84,8 +84,13 @@ //returns the ETA in minutes /datum/shuttle/autodock/ferry/supply/proc/eta_minutes() - return round((arrive_time - world.time) / (1 MINUTE), 1) // Floor, so it's an actual timer + return round((arrive_time - world.time) / (1 MINUTE)) // Floor, so it's an actual timer // returns the ETA in seconds /datum/shuttle/autodock/ferry/supply/proc/eta_seconds() return round((arrive_time - world.time) / (1 SECOND)) // Floor, so it's an actual timer + +//returns the ETA in deciseconds +/datum/shuttle/autodock/ferry/supply/proc/eta_deciseconds() + return round(arrive_time - world.time) + \ No newline at end of file From 1a58150468f61fe28a421521529d60b6bc7a2727 Mon Sep 17 00:00:00 2001 From: ResidentCody Date: Tue, 22 Jun 2021 15:57:42 -0600 Subject: [PATCH 79/81] Update loadout_fluffitems_vr.dm --- .../preference_setup/loadout/loadout_fluffitems_vr.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index a1d1c8cb7b..fa3e2ef5d2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -854,6 +854,12 @@ display_name = "LUNA's Distinguished Conduct Medal" ckeywhitelist = list("residentcody") character_name = list("LUNA") + +/datum/gear/fluff/pathfinder_id + path = /obj/item/weapon/card/id/event/polymorphic/itg + display_name = "Pathfinder's ITG ID" + ckeywhitelist = list("residentcody") + character_name = list("Pathfinder") /datum/gear/fluff/nikki_dorky_outfit path = /obj/item/weapon/storage/box/fluff From 3c36a3864f37d1584a22a29ec8cae7763b1736c4 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Tue, 22 Jun 2021 18:15:09 -0400 Subject: [PATCH 80/81] Add approved fluff item https://forum.vore-station.net/viewtopic.php?f=26&t=2002 --- .../preference_setup/loadout/loadout_fluffitems_vr.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index a1d1c8cb7b..1e5e9fadc3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -1205,6 +1205,12 @@ ckeywhitelist = list("verysoft") character_name = list("Harmony") +/datum/gear/fluff/shine-runner_id + path = /obj/item/weapon/card/id/event/polymorphic/itg + display_name = "Shine-Runner's ITG-ID card" + ckeywhitelist = list("verysoft") + character_name = list("Shine-Runner") + // W CKEYS /datum/gear/fluff/sthasha_bracer path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha From b96d8934d09476315bd067c54dc6ccef2fe99b96 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Tue, 22 Jun 2021 18:19:56 -0400 Subject: [PATCH 81/81] remove da hyphen --- .../client/preference_setup/loadout/loadout_fluffitems_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 1e5e9fadc3..c34db63767 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -1205,7 +1205,7 @@ ckeywhitelist = list("verysoft") character_name = list("Harmony") -/datum/gear/fluff/shine-runner_id +/datum/gear/fluff/shinerunner_id path = /obj/item/weapon/card/id/event/polymorphic/itg display_name = "Shine-Runner's ITG-ID card" ckeywhitelist = list("verysoft")