From bb8817380c7d92c34c608d809591932f420d7677 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 12 Apr 2018 20:04:53 -0400 Subject: [PATCH 01/89] i am sure theres cleaners ways to do this.. --- code/modules/clothing/glasses/glasses.dm | 3 +++ code/modules/clothing/glasses/hud.dm | 2 ++ .../living/carbon/human/species/station.dm | 5 ++++- icons/obj/surgery.dmi | Bin 37307 -> 37593 bytes 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index b60f7407229..71c71966470 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -148,6 +148,7 @@ icon_state = "monocle" item_state = "headset" // lol prescription_upgradable = 1 + species_restricted = list() species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', @@ -176,6 +177,7 @@ item_state = "eyepatch" flags = NODROP flags_cover = null + species_restricted = list() /obj/item/clothing/glasses/regular name = "prescription glasses" @@ -496,6 +498,7 @@ flags = NODROP flags_cover = null invis_view = SEE_INVISIBLE_MINIMUM + species_restricted = list() /obj/item/clothing/glasses/godeye/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index ff8de1a6a82..8101c6967c8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -31,6 +31,7 @@ icon_state = "healthhud" origin_tech = "magnets=3;biotech=2" HUDType = DATA_HUD_MEDICAL_ADVANCED + species_restricted = list() species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', @@ -83,6 +84,7 @@ origin_tech = "magnets=3;combat=2" var/global/list/jobs[0] HUDType = DATA_HUD_SECURITY_ADVANCED + species_restricted = list() species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index abeb10d0e1f..1815a7bd852 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -462,7 +462,7 @@ eyes = "blank_eyes" - species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) + species_traits = list(NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) bodyflags = HAS_TAIL dietflags = DIET_OMNI //should inherit this from vox, this is here just in case @@ -947,8 +947,11 @@ bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE + + exotic_blood = "oil" blood_color = "#1F181F" flesh_color = "#AAAAAA" + //Default styles for created mobs. default_hair = "Blue IPC Screen" can_revive_by_healing = 1 diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index a47c56cba87028431da263ce5d2e857580c2db73..9a2c3b45b524096a453a134b6f86ac9aa1677c9d 100644 GIT binary patch delta 18468 zcmb5VWmHvP^e(*Vkd*FHK#*>bR=PnzIz+ltiA^IdD%}mz(jAgYcXv0^hXdU0??2u# z-aE#8%>AJnPa5ZCIEW?ks6cwb!{`1pR@8o0TZdqdBYFcfFfaqy@raS)4xYB!F+gwxwe_N{+DG_KS#kC)d=3;$ijke-`0ZNTN6 z9Gy#;-O#!Jy~jjWkUW)Exoi4CA68>j5ndO!G$&&fs!9}ZzBBI|)Wj*|>BuobQ>8$P zpX{vzIa-3IgS0Xf@3J`4I2mK@L&c@i13=T}X9It?Ch#BIS47>Fv->WVX|jjyHi&Ir zet3TD5lgt{rLw#@^kr9yM>}_dgWhrG{a7H=Bnf&JM_oqOaI0-GGe4W?wl^M?U zY)SE$KH~COkIh#XQTfKu_W&;2I7`9`7b1D6u<++}Kz>!9@QLus9!V?6ZWTIjN}NtL zE@e?fRUnEheN=ff(kSApozL!GYz&HpaNu?~;&;;B{E*HH=@nWDxeJZNXP;s}5~Mfy z5yCgZ=$dVbbGOgF!n22^tbb<9p}b*(R|;mgQ}i@1}F!g}gN#tt3>#e#8;zpj<2B~GRDUlJ@FQ-23oKI=?6!ALI=4*q~u zARDmJUR#J@#(}>&HUIg`OQ~hdenI4!1-DLtNOs!~jClG;?2%X>oPCX_>S-$WFYgwv zn2Z8q!Y2)kPph4g$`!yq0rhPV&eJNlP(x((BqY#3BtdaZLnzo7>3}|rmNx6>Zx?2l zLl#^7)4Za7y2}nCH4>3h$V$Da); zrEK2$wZasHd6GwXzHQ!a-ubqTU^xxmku*db_rHnqAx-(wJ@&U}5YsN3vuq^7B9{?}bLhB81Z+p5l|`!l|_HH9r12LpPJJv}!~ z%iVEvm&qr~Vq#dW?To@-Uyr)B@4EK>34Y(Bb?unocY$DBaX20chf%lZiZ4^CqN*y%^Z_}!(-F)a85Ol_VSxg0g5NmX zt+Y{9TaNUG6EJbw&2r`y6wr%_QA6G847k5LJN6gvKx_hp*<}2@FsOvx`~@S3DRzHa z{Nc17e^zauF6Ju?n2hDT0sQ-DKuV|`{)N!zs^Za_V2(N9KUJc$5kg{Axub=TOvm7} zj}JU0Ab6*sfZ6u=;N5bw9x3Q`O4}Pv5w^H!z)XlqNJPXX8{2*c!#MlVDVeKf?Q)

^TJZ4jOioj}x}>1d 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

  • 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 Date: Fri, 13 Apr 2018 15:02:58 -0400 Subject: [PATCH 02/89] forgot this --- code/modules/surgery/organs/subtypes/vox.dm | 27 ++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm index bb56c41030d..8d801737c22 100644 --- a/code/modules/surgery/organs/subtypes/vox.dm +++ b/code/modules/surgery/organs/subtypes/vox.dm @@ -1,16 +1,37 @@ /obj/item/organ/internal/liver/vox + name = "Vox liver" alcohol_intensity = 1.6 species = "Vox" /obj/item/organ/internal/stack name = "cortical stack" - icon_state = "brain-prosthetic" + icon_state = "cortical-stack" parent_organ = "head" organ_tag = "stack" - slot = "vox_stack" + slot = "vox_stack" robotic = 2 vital = 1 + var/stackdamaged = 0 /obj/item/organ/internal/stack/vox - name = "vox cortical stack" \ No newline at end of file + name = "vox cortical stack" + +/obj/item/organ/internal/stack/vox/on_life() + if(damage < 1 && stackdamaged) + owner.mutations.Remove(SCRAMBLED) + owner.dna.SetSEState(SCRAMBLEBLOCK,0) + genemutcheck(owner,SCRAMBLEBLOCK,null,MUTCHK_FORCED) + stackdamaged = 0 + ..() + + +/obj/item/organ/internal/stack/vox/emp_act(severity) + if(owner) + owner.mutations.Add(SCRAMBLED) + owner.dna.SetSEState(SCRAMBLEBLOCK,1,1) + genemutcheck(owner,SCRAMBLEBLOCK,null,MUTCHK_FORCED) + owner.AdjustConfused(20) + if(!stackdamaged) + stackdamaged = 1 + ..() \ No newline at end of file From e8dc2db9d3e86e1222a08a9a46a23c54b93626cd Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 13 Apr 2018 15:26:06 -0400 Subject: [PATCH 03/89] mreh --- code/modules/clothing/glasses/glasses.dm | 3 --- code/modules/clothing/glasses/hud.dm | 2 -- 2 files changed, 5 deletions(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 71c71966470..b60f7407229 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -148,7 +148,6 @@ icon_state = "monocle" item_state = "headset" // lol prescription_upgradable = 1 - species_restricted = list() species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', @@ -177,7 +176,6 @@ item_state = "eyepatch" flags = NODROP flags_cover = null - species_restricted = list() /obj/item/clothing/glasses/regular name = "prescription glasses" @@ -498,7 +496,6 @@ flags = NODROP flags_cover = null invis_view = SEE_INVISIBLE_MINIMUM - species_restricted = list() /obj/item/clothing/glasses/godeye/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 8101c6967c8..ff8de1a6a82 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -31,7 +31,6 @@ icon_state = "healthhud" origin_tech = "magnets=3;biotech=2" HUDType = DATA_HUD_MEDICAL_ADVANCED - species_restricted = list() species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', @@ -84,7 +83,6 @@ origin_tech = "magnets=3;combat=2" var/global/list/jobs[0] HUDType = DATA_HUD_SECURITY_ADVANCED - species_restricted = list() species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', From ca5dca4cd87dcb5e6707a749d30d6a170a3801b6 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 17 Apr 2018 23:41:22 -0400 Subject: [PATCH 04/89] blood damage tweak --- code/modules/mob/living/carbon/human/species/station.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 1815a7bd852..6e729a8ec74 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -942,7 +942,7 @@ oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet @@ -950,7 +950,7 @@ exotic_blood = "oil" blood_color = "#1F181F" - flesh_color = "#AAAAAA" + blood_damage_type = BURN //Default styles for created mobs. default_hair = "Blue IPC Screen" From 1aa28c5d7118b77969937a8e23546c8925f2a8fb Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 18 Apr 2018 20:39:10 -0400 Subject: [PATCH 05/89] revert out ipc blood, up kidan biolum --- code/modules/mob/living/carbon/human/species/station.dm | 5 ++--- code/modules/surgery/organs/subtypes/kidan.dm | 2 +- code/modules/surgery/organs/subtypes/vox.dm | 8 ++++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 6e729a8ec74..6bf8ceeb859 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -942,14 +942,13 @@ oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE - exotic_blood = "oil" - blood_color = "#1F181F" + blood_color = "#030303" blood_damage_type = BURN //Default styles for created mobs. diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm index 37fd74a6d2a..000e2984443 100644 --- a/code/modules/surgery/organs/subtypes/kidan.dm +++ b/code/modules/surgery/organs/subtypes/kidan.dm @@ -4,7 +4,7 @@ #define KIDAN_LANTERN_HUNGERCOST 0.5 #define KIDAN_LANTERN_MINHUNGER 150 -#define KIDAN_LANTERN_LIGHT 4 +#define KIDAN_LANTERN_LIGHT 5 /obj/item/organ/internal/lantern name = "Bioluminescent Lantern" diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm index 8d801737c22..8cdaecb8a69 100644 --- a/code/modules/surgery/organs/subtypes/vox.dm +++ b/code/modules/surgery/organs/subtypes/vox.dm @@ -12,7 +12,7 @@ slot = "vox_stack" robotic = 2 vital = 1 - var/stackdamaged = 0 + var/stackdamaged = FALSE /obj/item/organ/internal/stack/vox name = "vox cortical stack" @@ -22,7 +22,7 @@ owner.mutations.Remove(SCRAMBLED) owner.dna.SetSEState(SCRAMBLEBLOCK,0) genemutcheck(owner,SCRAMBLEBLOCK,null,MUTCHK_FORCED) - stackdamaged = 0 + stackdamaged = FALSE ..() @@ -31,7 +31,7 @@ owner.mutations.Add(SCRAMBLED) owner.dna.SetSEState(SCRAMBLEBLOCK,1,1) genemutcheck(owner,SCRAMBLEBLOCK,null,MUTCHK_FORCED) - owner.AdjustConfused(20) + owner.AdjustConfused(4) if(!stackdamaged) - stackdamaged = 1 + stackdamaged = TRUE ..() \ No newline at end of file From 72a3c66cf5ed8ecbccbd852ba2a2790e3a9e1094 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 22 Apr 2018 00:21:48 -0400 Subject: [PATCH 06/89] IPC bleeding v2 --- code/game/objects/items/weapons/tools.dm | 6 ++++++ code/modules/mob/living/carbon/human/examine.dm | 7 ++++--- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/carbon/human/species/species.dm | 4 ++++ code/modules/mob/living/carbon/human/species/station.dm | 9 +++++---- code/modules/reagents/chemistry/reagents/misc.dm | 5 +++++ code/modules/surgery/organs/blood.dm | 4 ++-- code/modules/surgery/organs/lungs.dm | 2 +- code/modules/surgery/robotics.dm | 3 +++ 9 files changed, 31 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 31ba83fc444..03789291cad 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -397,6 +397,11 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.bodyparts_by_name[user.zone_sel.selecting] + + if(H.bleed_rate > 1 && H.isSynthetic()) + if(get_fuel() >= 1) + H.bleed_rate = 0 + user.visible_message("\The [user] welds a leak on \the [M] with \the [src].") if(!S) return @@ -417,6 +422,7 @@ playsound(src.loc, usesound, 50, 1) S.heal_damage(15,0,0,1) user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") + else if(S.open != 2) to_chat(user, "Need more welding fuel!") return 1 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index d970b696ca4..f0ad4855d50 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -324,16 +324,17 @@ else msg += "[t_He] [t_is] quite chubby.\n" - if(blood_volume < BLOOD_VOLUME_SAFE) + if(!isSynthetic() && blood_volume < BLOOD_VOLUME_SAFE) msg += "[t_He] [t_has] pale skin.\n" if(bleedsuppress) msg += "[t_He] [t_is] bandaged with something.\n" else if(bleed_rate) + var/bleed_message = !isSynthetic() ? "bleeding" : "leaking" if(reagents.has_reagent("heparin")) - msg += "[t_He] [t_is] bleeding uncontrollably!\n" + msg += "[t_He] [t_is] [bleed_message] uncontrollably!\n" else - msg += "[t_He] [t_is] bleeding!\n" + msg += "[t_He] [t_is] [bleed_message]!\n" if(reagents.has_reagent("teslium")) msg += "[t_He] is emitting a gentle blue glow!\n" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ccddc56ca16..8e8c1a18ae8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -248,7 +248,7 @@ if(!L || L && (L.status & ORGAN_DEAD)) if(health >= config.health_threshold_crit) adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) - else + else if(!(NOCRITDAMAGE in species.species_traits)) adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) failed_last_breath = TRUE diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d8c80c8b3fe..bc9f58be6d2 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -304,6 +304,10 @@ H.setOxyLoss(0) H.SetLoseBreath(0) + var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits)) + if((H.health <= config.health_threshold_crit) && takes_crit_damage) + H.adjustBruteLoss(1) + /datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here return diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 6bf8ceeb859..63479b98366 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -935,20 +935,21 @@ remains_type = /obj/effect/decal/remains/robot eyes = "blank_eyes" - brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150% - burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall. + brute_mod = 2.28 // 100% * 2.28 * 0.6 (robolimbs) ~= 150% + burn_mod = 2.28 // So they take 50% extra damage from brute/burn overall. tox_mod = 0 clone_mod = 0 oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE - blood_color = "#030303" + blood_color = "#3C3C3C" + exotic_blood = "oil" blood_damage_type = BURN //Default styles for created mobs. diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index a67fcd0f751..586b197945d 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -194,6 +194,11 @@ reagent_state = LIQUID color = "#3C3C3C" taste_message = "motor oil" + process_flags = ORGANIC | SYNTHETIC + +/datum/reagent/oil/reaction_turf(turf/T, volume) + if(volume >= 3 && !isspaceturf(T) && !locate(/obj/effect/decal/cleanable/blood/oil) in T) + new /obj/effect/decal/cleanable/blood/oil(T) /datum/reagent/iodine name = "Iodine" diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 88e8341d37c..f2e2c8d83a5 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -1,4 +1,4 @@ -/**************************************************** +F/**************************************************** BLOOD SYSTEM ****************************************************/ @@ -64,7 +64,7 @@ var/obj/item/organ/external/BP = X var/brutedamage = BP.brute_dam - if(BP.status & ORGAN_ROBOT) + if((BP.status & ORGAN_ROBOT) && !isSynthetic()) continue //We want an accurate reading of .len diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 39c79865b62..ed70de522f1 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -83,7 +83,7 @@ if(!breath || (breath.total_moles() == 0)) if(H.health >= config.health_threshold_crit) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else + else if(!(NOCRITDAMAGE in H.species.species_traits)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) H.failed_last_breath = TRUE diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 53219ed8a14..da99e3620e0 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -205,6 +205,9 @@ if(!affected) return -1 + if(target.bleed_rate > 1)//heal bleeding if it exists while we are here. + target.bleed_rate = 0 + if(implement_type in implements_heal_burn) current_type = "burn" var/obj/item/stack/cable_coil/C = tool From 34809e208ab0875e0c84ab364342d552463c23fa Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 22 Apr 2018 02:09:54 -0400 Subject: [PATCH 07/89] Fox twerks --- code/game/objects/items/weapons/tools.dm | 4 ---- code/modules/surgery/organs/blood.dm | 2 +- code/modules/surgery/robotics.dm | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 03789291cad..45cdd3970a5 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -398,10 +398,6 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.bodyparts_by_name[user.zone_sel.selecting] - if(H.bleed_rate > 1 && H.isSynthetic()) - if(get_fuel() >= 1) - H.bleed_rate = 0 - user.visible_message("\The [user] welds a leak on \the [M] with \the [src].") if(!S) return diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index f2e2c8d83a5..6f4be587fc4 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -1,4 +1,4 @@ -F/**************************************************** +/**************************************************** BLOOD SYSTEM ****************************************************/ diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index da99e3620e0..53219ed8a14 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -205,9 +205,6 @@ if(!affected) return -1 - if(target.bleed_rate > 1)//heal bleeding if it exists while we are here. - target.bleed_rate = 0 - if(implement_type in implements_heal_burn) current_type = "burn" var/obj/item/stack/cable_coil/C = tool From b7fdbc946670c0aa3ccb5cf6e723cc1b71408806 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 22 Apr 2018 19:55:06 -0400 Subject: [PATCH 08/89] correcting a commit --- code/modules/mob/living/carbon/human/species/station.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 63479b98366..dc8373b178d 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -935,7 +935,7 @@ remains_type = /obj/effect/decal/remains/robot eyes = "blank_eyes" - brute_mod = 2.28 // 100% * 2.28 * 0.6 (robolimbs) ~= 150% + brute_mod = 2.28 // 100% * 2.28 * 0.66 (robolimbs) ~= 150% burn_mod = 2.28 // So they take 50% extra damage from brute/burn overall. tox_mod = 0 clone_mod = 0 From 141d8487ca8410c4d33a7e29f5ce04c78c173794 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Wed, 30 May 2018 13:34:51 -0700 Subject: [PATCH 09/89] Fix atom Initializations not inheriting /New arguments --- code/game/atoms.dm | 7 ++----- code/game/atoms_movable.dm | 17 +++++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 136c8950028..50205d3c579 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -47,12 +47,9 @@ /atom/New(loc, ...) if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() _preloader.load(src) - . = ..() - attempt_init(...) -// This is distinct from /tg/ because of our space management system -// This is overriden in /atom/movable and the parent isn't called if the SMS wants to deal with it's init -/atom/proc/attempt_init(loc, ...) + . = ..() + var/do_initialize = SSatoms.initialized if(do_initialize != INITIALIZATION_INSSATOMS) args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 7ab561f0814..30f52e8e952 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -24,19 +24,24 @@ var/area/areaMaster -/atom/movable/New() - . = ..() - areaMaster = get_area_master(src) +// This needs to not call parent until the space_manager is either dead or integrated properly with SSmapping +/atom/movable/New(loc, ...) + if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() + _preloader.load(src) -/atom/movable/attempt_init() + areaMaster = get_area_master(src) if(ticker && ticker.current_state >= GAME_STATE_SETTING_UP) var/turf/T = get_turf(src) if(T && space_manager.is_zlevel_dirty(T.z)) space_manager.postpone_init(T.z, src) return - . = ..() - + var/do_initialize = SSatoms.initialized + if(do_initialize != INITIALIZATION_INSSATOMS) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + // we were deleted + return /atom/movable/Destroy() if(loc) From a6ebad6b180d7688f1856c72da77e6ad4d02fb17 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Wed, 30 May 2018 13:35:19 -0700 Subject: [PATCH 10/89] Add Picture in Picture & AI Multivis support tgstation/tgstation#28360 tgstation/tgstation#37695 This commit adds a system for picture-in-picture UI windows using vis_contents, a new feature to BYOND 512. Essentially, it allows you to make UI windows that show an area of turfs. It also refactors how cameranet visibility works, and makes the Adv. Camera Console code a bit cleaner and more inheritance-based, especially with it's action buttons. Currently, this is hesitantly implemented on AIs. They gain two new UI buttons - "Enter Multicam Mode", and "Create Multicam". When they go into Multicam Mode, they see a background of animated binary numbers, and they are allowed to create an infinite amount of these picture in picture windows, which subsequently creates an aiEye for each one. They are able to control each AI eye individually, by first clicking on the PIP window to select it as "active" and then using the normal arrow key controls. The PIP windows can be freely resized and moved around the area. The AI implementation may be considered controversial; Thus, it's locked by default, requiring an administrator to var-edit "multicam_allowed" on the AI before it is able to use the function. Otherwise, the buttons just do nothing and alert the user to "Contact an administrator to use these". There's not really any easy way to completely hide the UI elements until they are available. As this relies on 512 features, Travis has been bumped up to use 512. --- .travis.yml | 4 +- _maps/map_files/MetaStation/z2.dmm | 80 +++--- _maps/map_files/cyberiad/z2.dmm | 94 +++---- code/_onclick/ai.dm | 8 + code/_onclick/hud/_defines.dm | 2 + code/_onclick/hud/ai.dm | 29 ++ code/_onclick/hud/picture_in_picture.dm | 144 ++++++++++ code/_onclick/hud/screen_objects.dm | 14 + code/game/machinery/camera/camera.dm | 1 + .../machinery/computer/camera_advanced.dm | 3 +- code/modules/mob/living/silicon/ai/ai.dm | 20 +- .../living/silicon/ai/freelook/cameranet.dm | 71 +++-- .../mob/living/silicon/ai/freelook/chunk.dm | 18 +- .../mob/living/silicon/ai/freelook/eye.dm | 20 +- code/modules/mob/living/silicon/ai/life.dm | 1 + code/modules/mob/living/silicon/ai/login.dm | 2 + .../modules/mob/living/silicon/ai/multicam.dm | 260 ++++++++++++++++++ .../research/xenobiology/xenobio_camera.dm | 1 - icons/misc/pic_in_pic.dmi | Bin 0 -> 3370 bytes icons/mob/screen_ai.dmi | Bin 4750 -> 2494 bytes icons/turf/areas.dmi | Bin 33869 -> 34124 bytes paradise.dme | 2 + 22 files changed, 650 insertions(+), 124 deletions(-) create mode 100644 code/_onclick/hud/picture_in_picture.dm create mode 100644 code/modules/mob/living/silicon/ai/multicam.dm create mode 100644 icons/misc/pic_in_pic.dmi diff --git a/.travis.yml b/.travis.yml index 526ebde75ea..0034576ec7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ addons: env: global: - - BYOND_MAJOR="511" - - BYOND_MINOR="1385" + - BYOND_MAJOR="512" + - BYOND_MINOR="1426" - BYOND_MACRO_COUNT=4 matrix: - DM_MAPFILE="cyberiad" diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index a1ba2572fd4..b7f7ecad66a 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -84,7 +84,7 @@ "bF" = (/obj/structure/stool,/turf/simulated/floor/holofloor{tag = "icon-carpet11-12 (EAST)"; icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_theatre) "bG" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_emptycourt) "bH" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_emptycourt) -"bI" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"bI" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) "bJ" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre) "bK" = (/obj/machinery/light{dir = 1; on = 1},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "bL" = (/obj/machinery/light{dir = 4},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) @@ -92,8 +92,8 @@ "bN" = (/obj/machinery/door/airlock/external{id_tag = "syndicate_away"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "bO" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_away"; name = "syndicate recon outpost"; turf_type = /turf/unsimulated/floor/snow; width = 18},/turf/space,/area/space) "bP" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTHEAST)"; icon_state = "gravsnow_corner"; dir = 5},/area/syndicate_mothership) -"bQ" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) -"bR" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) +"bQ" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) +"bR" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "bS" = (/turf/simulated/floor/holofloor{tag = "icon-carpet3-0 (EAST)"; icon_state = "carpet3-0"; dir = 4},/area/holodeck/source_theatre) "bT" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/vox_station) "bU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor/snow,/area/syndicate_mothership) @@ -117,8 +117,8 @@ "cm" = (/obj/structure/sign/double/map/right{pixel_y = -32},/obj/structure/rack/skeletal_bar/right,/obj/item/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) "cn" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) "co" = (/obj/machinery/door/airlock/centcom{name = "Shuttle Dock #2"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"cp" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) -"cq" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"cp" = (/turf/unsimulated/wall,/area/ai_multicam_room) +"cq" = (/turf/unsimulated/ai_visible,/area/ai_multicam_room) "cr" = (/turf/simulated/floor/holofloor{tag = "icon-1 (NORTHEAST)"; icon_state = "1"; dir = 5},/area/holodeck/source_space) "cs" = (/turf/simulated/floor/holofloor{tag = "icon-17 (NORTHEAST)"; icon_state = "17"; dir = 5},/area/holodeck/source_space) "ct" = (/turf/simulated/floor/holofloor{tag = "icon-22 (NORTHEAST)"; icon_state = "22"; dir = 5},/area/holodeck/source_space) @@ -332,7 +332,7 @@ "gt" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "gu" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/suppy) "gv" = (/obj/structure/closet/crate,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/suppy) -"gw" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) +"gw" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) "gx" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "gy" = (/obj/structure/toilet{dir = 8},/obj/structure/window/reinforced/tinted{dir = 1},/obj/machinery/door/window{dir = 8; name = "Tactical Toilet"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "gz" = (/turf/unsimulated/wall/fakeglass,/area/centcom/suppy) @@ -515,29 +515,29 @@ "jU" = (/obj/machinery/door/poddoor/preopen{id_tag = "CentComPort"; name = "security door"},/turf/unsimulated/floor{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/area/centcom/control) "jV" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac) "jW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac) -"jX" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) +"jX" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) "jY" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "jZ" = (/obj/structure/stool,/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/east,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "ka" = (/obj/item/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"kb" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) -"kc" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"kb" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) +"kc" = (/obj/effect/landmark/ai_multicam_room,/turf/unsimulated/ai_visible,/area/ai_multicam_room) "kd" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "Mission Launch Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "151"},/obj/item/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "ke" = (/turf/unsimulated/floor{tag = "icon-darkgreencorners"; icon_state = "darkgreencorners"},/area/centcom/ferry) "kf" = (/turf/unsimulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/centcom/evac) "kg" = (/turf/unsimulated/floor{tag = "icon-yellowsiding"; icon_state = "yellowsiding"},/area/centcom/evac) "kh" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (WEST)"; icon_state = "yellowcornersiding"; dir = 8},/area/centcom/evac) -"ki" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod) +"ki" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) "kj" = (/turf/unsimulated/wall/fakeglass,/area/centcom/ferry) -"kk" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) +"kk" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) "kl" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) "km" = (/turf/unsimulated/floor{tag = "icon-redcorner (WEST)"; icon_state = "redcorner"; dir = 8},/area/centcom/evac) "kn" = (/obj/structure/table/reinforced,/obj/item/paper_bin,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) "ko" = (/obj/structure/table/reinforced,/obj/item/pen,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) "kp" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (NORTHEAST)"; icon_state = "red"; dir = 5},/area/centcom/evac) -"kq" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) -"kr" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"kq" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"kr" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod) "ks" = (/obj/structure/stool,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership) -"kt" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"kt" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) "ku" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry) "kv" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/ferry) "kw" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/ferry) @@ -545,7 +545,7 @@ "ky" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/evac) "kz" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) "kA" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/evac) -"kB" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"kB" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) "kC" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/space/transit,/area/wizard_station) "kD" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion"},/turf/space/transit,/area/wizard_station) "kE" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship) @@ -650,6 +650,9 @@ "mz" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) "mA" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) "mB" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry) +"mC" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"mD" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"mE" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "mH" = (/obj/structure/lattice,/turf/space/transit,/area/wizard_station) "mI" = (/obj/item/shard{color = "#008000"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) "mK" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) @@ -895,7 +898,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGbraHaHaHaHaJbsbtbubtbvaJbwbxbybzbwaJaOaObeaOaOaJaPaPaPaPaPaJaQaQaQaQaQaJbgbhbhbhbiaU aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGaHbraHaHbAaJbBbtbubtbCaJbwbDbEbFbwaJaOaObeaOaOaJaPaPaPaPaPaJaQaQaQaQaQaJbGbhbhbhbHaU aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGaHaZbraHbmaJboboboboboaJbJbDbEbFbJaJaOaOaOaOaOaJaPaPaPaPaPaJaQaQaQaQaQaJbGbhbhbhbHaU -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGaHaHaHbraHaJbQbRbQbRbQaJbSbDbEbFbSaJaOaOaOaOaOaJaPaPaPaPaPaJaQaQaQaQaQaJbGbhbhbhbHaU +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGaHaHaHbraHaJbIbQbIbQbIaJbSbDbEbFbSaJaOaOaOaOaOaJaPaPaPaPaPaJaQaQaQaQaQaJbGbhbhbhbHaU aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacaeacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGaHbVaHaHbraJbbbcbbbcbbaJbSbDbEbFbSaJaObeaObeaOaJaPaPaPaPaPaJaQbfaQbfaQaJbGbhbhbhbHaU aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaGbmaHbXaHaZaJaKaLaKaLaKaJbYbZcacbbYaJaOaOaOaOaOaJaPaPaPaPaPaJaQaQaQaQaQaJcccdcdcdceaU aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaadzaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaiaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababchcicicicicicjcicicicicicjcicicicicicjckckckckckcjckckckckckcjckckckckckcjckckckckckcl @@ -1055,29 +1058,29 @@ ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamfmgmhmiaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamiSayiSayiSaCamaWiSayiSayiSaCamamamamamamamatamiSababababababababababababababababababababababababababgVmuilillplplplpiBilililililmvgVmwltmwlvlwlxmwltmwkVabababababababababababababababababababababiOabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHaamIgamKmLmMaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamaAmnaAmnaAaCamaWaAmnaAmnaAaCamamatamamamamamamiSababababababababababababababababababababababababababgVmYililiFiliFilililililililnagVnbltltlvlwlxltltnckVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHnlnmnnmKnonpaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamavamaBmnaBmnaBaEaxaDaBmnaBmnaBaEavaxaxamamavamamamiSababababababababababababababababababababababababababgVnBilililililililnCnDnEnFnanGgVnHnInIlvlwlxnJnJnKkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaanpnXnYnonZoanpaaaaaaaaaaaaaaaaaaaaabababababababiSamavamamatavamamaWiSayiSayiSaYoelniSayiSayiSiSiSiSiSbIamamatamamiSababababababababababababababababababababababababababgVgVgVgVgVohgVgVgVgVgVgVgVgVgVgVkVkVkVkVlwkVkVkVkVkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamLmMolomolonooaaaaaaaaaaaaaaaaaaaaabababababababiSamamavamamamamataWiSbKmnmnmnbKmnmnmnbKmnmnmnbKmnmniSaCamamamavamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHoooyozoAmLaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamavamamamaWiSmnmnmnmnmnmnmnmnmnmnmnmnmnmnmniSaCatamamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVkYkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaoKoLoMoNoOoPmKoQmHaaaaaaaaaaaaaaaaaaaaabababababababiSavamamamamavamavaWiSaYoeoeoeoeoeoeoeoeoeoeoelniSbLiSaCamavamatamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaakCpipjpkploOmKnYpmpnmHmHaaaaaaaaaaaaaaaaabababababababiSamamavatamamaxaxaxbWbWbWbWcncncncncncncncncnbPiSmniSbIamatamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaamHaaoMpDpDpEoOmKpFnYpnaapGpHaaaaaaaaaaaaaaabababababababiSamamamamamazabababababababazatamamavamamaxaxaDiSmniSaCamamamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaoQmHaaaamHpTpUnnpVnnoQmHmHaaaaaaaaaaaaaaaaabababababababiSatavamamamabababababababababbIamamamataDiSiSqOiScoiScpaxcqaxcqaxiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaonqiqjqkqlqmqlqlqiqnqkqlqlqmqlqlaamHaaaaaaaaaaabababababababiSamamamamamabababababababababaCamamamaWiSiSlPlQhkmniSiSiSiSiSiSiSiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaqwqxmKmKqxqwqyqzmKmKmKqAqBqwqCozoQqDmHmHaaaaaaabababababababiSamamamamamabababababababababaCavamauaWiSaXmnmnmnmnhnmompiSgtiwhIiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaqYqZmKmKqZqYqDqDmKmKmKmKraqYrbrcpDpDrdaaaaaaaaabababababababiSamhTamamamazabababababababazamamamamgwiSmRmnjYjYmTmnmUmVpcpdpdgxiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaarnromKnYmKrppFnYmKgbmKmKrrrnrsrtrurvrwkDaaaaaaabababababababiSamamamamamamamabababababcpaxaxaxaxcqaDiSnujYnvixjYmnjZnyiSpdgyiSiSgBgDgCgEgEgJgEgEgKgLiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaarGqZmKnnpFrHnnmKmKrImKmKmKrGrJrKrdrLoKaaaaaaaaabababababababiSamamamavamamamabababababodoeoeoeoeoelniSkajYofogjYmnjZnyiSiSiSiSiSgDgChijXhjhlhjkbhmgKiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaamirWmKmKrWmirXmKnYnnmKmKrXmirYrZsasbaaaaaaaaaaabababababababiSatamazabababababababababopoqoroqoqoqoqotmnbMmnmnmnmnjZnyiSiSiSiSiSgDhojXhjhwhyhxhjkbhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaamLqisfqkqlsgqlqiolsholqkqlsgqlqimHmHmHaaaaaaaaabababababababiSamamababababababababababoDbNlmoeoeoelniSkdjYjYjYkamnjZnylmoeoeoeoeoeoehjhwhyhAhyhxhjhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaapTnYaamHaamHsooPpTaaaamHaaaaaaaamHaaaaaaaaabababababababiSamamabababababababababababbOabazamambPiSoXoYoZoYiymnpapbhChBhBhDhBhBhChlhyhEhGhFhyhlhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaamHmHaastnYaasusvpTmHaapFaaaaaaaaaaaaaaaaaaabababababababiSbUamababababababababababababababkcamaWiScfpvpwpxpymnmnmnlmoeoeoeoeoeoehjhwhyhHhyhyhjhziSabababababababababababababababababababababababababababsJsJsJsJsJsJsJsJiPsJsJsJsJsJsJsJsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHaasBnYsCaaaaaamHaaaaaaaaaaaaaaaaabababababababiSavamababababababababababababababaCamaWiSiSnypPcgcmiSpSmniSiSiSiSiSgDhokihjhwhyhxhjkkhziSabababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHqmqisIqkqmmHaamHmHaaaaaaaaaaaaaaabababababababiSamamababababababababababababababaEamamamiSiSiSiSiSiSqcqcqdqeqfqgiSgDhVhUkihjhWhjkkidieiSabababababababababababababababababababababababababababiTiQiQiQiUiQiQiQiQiQiQiQiUiQiQiQiTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaqwsMsNsOqwstrcplsPsQmHaaaaaaaaaaabababababababiSamazabababababababababababababababazamamamcncnkqbPiSqrqsqsqsqsqsiSifgDhVigigihigigieifiSabababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaolsVsWsXolnYsYpksZmKnpaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamatamamaWqOqsqsqsqsqsksiSiSiSiSiSiSiSiSiSiSiSiSabababababababababababababababababababababababababababsJsxsysysysysysysysysysysysysyszsJababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaoPmHmitatbtcminntdpksZaamHaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamaukrktaDiSrjrjrjrjrjrkiSababababababababababababababababababababababababababababababqtqtqtqtqtqtqtqtqtquqvqvqvqvqvqvqvqvqvqvqvqvqvquqtqtqtqtqtqtqtqtqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaanpnXnYnonZoanpaaaaaaaaaaaaaaaaaaaaabababababababiSamavamamatavamamaWiSayiSayiSaYoelniSayiSayiSiSiSiSiSbRamamatamamiSababababababababababababababababababababababababababgVgVgVgVgVohgVgVgVgVgVgVgVgVgVgVkVkVkVkVlwkVkVkVkVkVabababababababababababababababababababababababababababababababababababababababababababababababababababababcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamLmMolomolonooaaaaaaaaaaaaaaaaaaaaabababababababiSamamavamamamamataWiSbKmnmnmnbKmnmnmnbKmnmnmnbKmnmniSaCamamamavamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHoooyozoAmLaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamavamamamaWiSmnmnmnmnmnmnmnmnmnmnmnmnmnmnmniSaCatamamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVkYkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaoKoLoMoNoOoPmKoQmHaaaaaaaaaaaaaaaaaaaaabababababababiSavamamamamavamavaWiSaYoeoeoeoeoeoeoeoeoeoeoelniSbLiSaCamavamatamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaakCpipjpkploOmKnYpmpnmHmHaaaaaaaaaaaaaaaaabababababababiSamamavatamamaxaxaxbWbWbWbWcncncncncncncncncnbPiSmniSbRamatamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaamHaaoMpDpDpEoOmKpFnYpnaapGpHaaaaaaaaaaaaaaabababababababiSamamamamamazabababababababazatamamavamamaxaxaDiSmniSaCamamamamamiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaoQmHaaaamHpTpUnnpVnnoQmHmHaaaaaaaaaaaaaaaaabababababababiSatavamamamabababababababababbRamamamataDiSiSqOiScoiSgwaxjXaxjXaxiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaonqiqjqkqlqmqlqlqiqnqkqlqlqmqlqlaamHaaaaaaaaaaabababababababiSamamamamamabababababababababaCamamamaWiSiSlPlQhkmniSiSiSiSiSiSiSiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaqwqxmKmKqxqwqyqzmKmKmKqAqBqwqCozoQqDmHmHaaaaaaabababababababiSamamamamamabababababababababaCavamauaWiSaXmnmnmnmnhnmompiSgtiwhIiSabababababababababababababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaqYqZmKmKqZqYqDqDmKmKmKmKraqYrbrcpDpDrdaaaaaaaaabababababababiSamhTamamamazabababababababazamamamamkbiSmRmnjYjYmTmnmUmVpcpdpdgxiSiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaarnromKnYmKrppFnYmKgbmKmKrrrnrsrtrurvrwkDaaaaaaabababababababiSamamamamamamamabababababgwaxaxaxaxjXaDiSnujYnvixjYmnjZnyiSpdgyiSiSgBgDgCgEgEgJgEgEgKgLiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqkccqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaarGqZmKnnpFrHnnmKmKrImKmKmKrGrJrKrdrLoKaaaaaaaaabababababababiSamamamavamamamabababababodoeoeoeoeoelniSkajYofogjYmnjZnyiSiSiSiSiSgDgChikihjhlhjkkhmgKiSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaamirWmKmKrWmirXmKnYnnmKmKrXmirYrZsasbaaaaaaaaaaabababababababiSatamazabababababababababopoqoroqoqoqoqotmnbMmnmnmnmnjZnyiSiSiSiSiSgDhokihjhwhyhxhjkkhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaamLqisfqkqlsgqlqiolsholqkqlsgqlqimHmHmHaaaaaaaaabababababababiSamamababababababababababoDbNlmoeoeoelniSkdjYjYjYkamnjZnylmoeoeoeoeoeoehjhwhyhAhyhxhjhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaapTnYaamHaamHsooPpTaaaamHaaaaaaaamHaaaaaaaaabababababababiSamamabababababababababababbOabazamambPiSoXoYoZoYiymnpapbhChBhBhDhBhBhChlhyhEhGhFhyhlhziSababababababababababababababababababababababababababababababababababkVlwkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaamHmHaastnYaasusvpTmHaapFaaaaaaaaaaaaaaaaaaabababababababiSbUamababababababababababababababkqamaWiScfpvpwpxpymnmnmnlmoeoeoeoeoeoehjhwhyhHhyhyhjhziSabababababababababababababababababababababababababababsJsJsJsJsJsJsJsJiPsJsJsJsJsJsJsJsJababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHmHaasBnYsCaaaaaamHaaaaaaaaaaaaaaaaabababababababiSavamababababababababababababababaCamaWiSiSnypPcgcmiSpSmniSiSiSiSiSgDhokrhjhwhyhxhjkthziSabababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHqmqisIqkqmmHaamHmHaaaaaaaaaaaaaaabababababababiSamamababababababababababababababaEamamamiSiSiSiSiSiSqcqcqdqeqfqgiSgDhVhUkrhjhWhjktidieiSabababababababababababababababababababababababababababiTiQiQiQiUiQiQiQiQiQiQiQiUiQiQiQiTababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaqwsMsNsOqwstrcplsPsQmHaaaaaaaaaaabababababababiSamazabababababababababababababababazamamamcncnkBbPiSqrqsqsqsqsqsiSifgDhVigigihigigieifiSabababababababababababababababababababababababababababsJiQiRiRiRiRiRiQiQiQiRiRiRiRiRiQsJababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaolsVsWsXolnYsYpksZmKnpaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamatamamaWqOqsqsqsqsqsksiSiSiSiSiSiSiSiSiSiSiSiSabababababababababababababababababababababababababababsJsxsysysysysysysysysysysysysyszsJababababababababababababababababababababababababababababababababababababababababababababababababababcpcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcqcpabababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaoPmHmitatbtcminntdpksZaamHaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamaumCmDaDiSrjrjrjrjrjrkiSababababababababababababababababababababababababababababababqtqtqtqtqtqtqtqtqtquqvqvqvqvqvqvqvqvqvqvqvqvqvquqtqtqtqtqtqtqtqtqtababababababababababababababababababababababababababababababababababababababababababcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpabababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqmteqiolqkteqmtftgsZaamHaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamaWiSiSiSiSiSiSiSiSiSiSiSababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqwmKtitjtimKqwaatkaaaamHaaaaaaaaaaabababababababiSamabababababababababababababababababkBavamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaamHqwmKtitjtimKqwaatkaaaamHaaaaaaaaaaabababababababiSamabababababababababababababababababmEavamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaamHnYtxmKmKmKmKmKtxaaaaaaaanYaaaaaaaaaaabababababababiSamabababababababababababababababababaCamamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSrCqSqSqTqUqvqvqvqvqvrDrErDqvqvqvqvqvqVqTqWqWrFqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaamHmHoPmKmitBmKmKmKtBmiaaaaaaaaaaaaaaaaaaaaabababababababiSamabababababamabababababamabababababaCamamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSqSqSqSqSqTqUqvqvqvqvqvrDrVrDqvqvqvqvqvqVqTqWqWqWqWqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaamHqlqltHtItItItItItJaaaaaaaaaaaaaaaaaaaaabababababababiSamabababababamazabababazamabababababaCamamamiSababababababababababababababababababababababababababababababababababababababababqtqQqRqSrlqSrlqSqTqUqvqvqvqvqvqvqvqvqvqvqvqvqvqVqTqWrmqWrmqWqRqXqtababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab @@ -1143,4 +1146,3 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab "} - diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index a92790d6579..00513db67dc 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -42,9 +42,9 @@ "aP" = (/obj/structure/window/reinforced,/turf/unsimulated/wall{tag = "icon-iron12"; icon_state = "iron12"},/area/space) "aQ" = (/turf/unsimulated/wall{tag = "icon-iron14"; icon_state = "iron14"},/area/space) "aR" = (/turf/unsimulated/wall{tag = "icon-iron10"; icon_state = "iron10"},/area/space) -"aS" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) +"aS" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding2 (EAST)"; icon_state = "wood_siding2"; dir = 4},/area/holodeck/source_picnicarea) "aT" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) -"aU" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"aU" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding2 (EAST)"; icon_state = "wood_siding2"; dir = 4},/area/holodeck/source_picnicarea) "aV" = (/obj/machinery/door/airlock/external{id_tag = "syndicate_away"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "aW" = (/obj/docking_port/stationary{area_type = /area/syndicate_mothership; dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_away"; name = "syndicate recon outpost"; turf_type = /turf/unsimulated/floor/snow; width = 18},/turf/space,/area/space) "aX" = (/turf/unsimulated/floor/snow,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTHEAST)"; icon_state = "gravsnow_corner"; dir = 5},/area/syndicate_mothership) @@ -91,8 +91,8 @@ "bM" = (/turf/simulated/floor/holofloor,/area/holodeck/source_emptycourt) "bN" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_emptycourt) "bO" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid2 (EAST)"; icon_state = "asteroid2"; dir = 4},/area/holodeck/source_desert) -"bP" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding2 (EAST)"; icon_state = "wood_siding2"; dir = 4},/area/holodeck/source_picnicarea) -"bQ" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding2 (EAST)"; icon_state = "wood_siding2"; dir = 4},/area/holodeck/source_picnicarea) +"bP" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding5"; icon_state = "wood_siding5"; dir = 2},/area/holodeck/source_picnicarea) +"bQ" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding9"; icon_state = "wood_siding9"; dir = 2},/area/holodeck/source_picnicarea) "bR" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor{tag = "icon-asteroid"; icon_state = "asteroid"; dir = 2},/area/holodeck/source_desert) "bS" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid11 (EAST)"; icon_state = "asteroid11"; dir = 4},/area/holodeck/source_desert) "bT" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor{tag = "icon-asteroid"; icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) @@ -103,10 +103,10 @@ "bY" = (/obj/docking_port/stationary/transit{dir = 2; dwidth = 8; height = 15; id = "admin_transit"; name = "admin in transit"; width = 18},/turf/space/transit/horizontal,/area/space) "bZ" = (/turf/unsimulated/wall,/area/space) "ca" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid7"; icon_state = "asteroid7"; dir = 2},/area/holodeck/source_desert) -"cb" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding5"; icon_state = "wood_siding5"; dir = 2},/area/holodeck/source_picnicarea) +"cb" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding6"; icon_state = "wood_siding6"; dir = 2},/area/holodeck/source_picnicarea) "cc" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor{tag = "icon-asteroid"; icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) "cd" = (/obj/structure/table/wood,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor{tag = "icon-asteroid"; icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) -"ce" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding9"; icon_state = "wood_siding9"; dir = 2},/area/holodeck/source_picnicarea) +"ce" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding10"; icon_state = "wood_siding10"; dir = 2},/area/holodeck/source_picnicarea) "cf" = (/turf/simulated/floor/holofloor{tag = "icon-wood (EAST)"; icon_state = "wood"; dir = 4},/area/holodeck/source_theatre) "cg" = (/turf/simulated/floor/holofloor{tag = "icon-carpet6-2 (EAST)"; icon_state = "carpet6-2"; dir = 4},/area/holodeck/source_theatre) "ch" = (/turf/simulated/floor/holofloor{tag = "icon-carpet14-10 (EAST)"; icon_state = "carpet14-10"; dir = 4},/area/holodeck/source_theatre) @@ -122,8 +122,8 @@ "cr" = (/turf/unsimulated/floor{name = "plating"},/area/space) "cs" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry) "ct" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid5"; icon_state = "asteroid5"; dir = 2},/area/holodeck/source_desert) -"cu" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding6"; icon_state = "wood_siding6"; dir = 2},/area/holodeck/source_picnicarea) -"cv" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding10"; icon_state = "wood_siding10"; dir = 2},/area/holodeck/source_picnicarea) +"cu" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) +"cv" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) "cw" = (/obj/structure/stool,/turf/simulated/floor/holofloor{tag = "icon-carpet7-3 (EAST)"; icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_theatre) "cx" = (/obj/structure/stool,/turf/simulated/floor/holofloor{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_theatre) "cy" = (/obj/structure/stool,/turf/simulated/floor/holofloor{tag = "icon-carpet11-12 (EAST)"; icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_theatre) @@ -172,8 +172,8 @@ "dp" = (/obj/structure/flora/ausbushes/stalkybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) "dq" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) "dr" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_knightarena) -"ds" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) -"dt" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{tag = "icon-wood_siding1"; icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) +"ds" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) +"dt" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine{pixel_x = 1},/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "du" = (/turf/simulated/floor/holofloor{tag = "icon-carpet3-0 (EAST)"; icon_state = "carpet3-0"; dir = 4},/area/holodeck/source_theatre) "dv" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor,/area/holodeck/source_knightarena) "dw" = (/obj/docking_port/stationary{dir = 8; dwidth = 5; height = 7; id = "supply_away"; name = "supply centcom"; width = 12},/turf/space,/area/space) @@ -751,8 +751,8 @@ "ow" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod) "ox" = (/turf/simulated/floor/pod,/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod) "oy" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) -"oz" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) -"oA" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"oz" = (/turf/unsimulated/floor/snow,/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"oA" = (/turf/unsimulated/floor/snow,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/snow{icon_state = "gravsnow_corner"},/area/syndicate_mothership) "oB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) "oC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership) "oD" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) @@ -916,7 +916,12 @@ "rF" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops) "rG" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/obj/machinery/door/poddoor{id_tag = "specopsoffice"; name = "Super Privacy Shutters"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "rH" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) +"rI" = (/turf/unsimulated/wall,/area/ai_multicam_room) +"rJ" = (/turf/unsimulated/ai_visible,/area/ai_multicam_room) "rK" = (/turf/unsimulated/wall/splashscreen,/area/start) +"rL" = (/obj/effect/landmark/ai_multicam_room,/turf/unsimulated/ai_visible,/area/ai_multicam_room) +"rM" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"rN" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) "sq" = (/turf/unsimulated/wall,/area/centcom/control) "sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -1397,10 +1402,8 @@ "GX" = (/obj/structure/stool/bed,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "GY" = (/obj/effect/decal/cleanable/blood,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "GZ" = (/obj/effect/decal/cleanable/fungus,/turf/unsimulated/wall{tag = "icon-wall3 (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "wall3"; dir = 4},/area/admin) -"Ha" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) "Hb" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "engine"},/area/admin) "Hc" = (/obj/machinery/door/window{dir = 1; name = "Suit Storage"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hd" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) "He" = (/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "Hf" = (/obj/machinery/door/window/southleft{name = "Cell B"; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "Hg" = (/obj/structure/rack,/obj/item/clothing/suit/space/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) @@ -1498,12 +1501,12 @@ ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaOaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaR ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdhdgdgdgdibsbqbqbrbqbqbsbtbubtbubtbsbwbvbvbvbvbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbAbBbBbBbCbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbEbqbqbFbsbGbHbGbHbGbsbIbIbIbIbIbsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsbLbMbMbMbNbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbObqbqbqbsbPbQbPbQbPbsbIbIbIbIbIbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbObqbqbqbsaSaUaSaUaSbsbIbIbIbIbIbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdkdjdjdjdlbsbqbqbRbSbqbsbTbTbTbTbTbsbUbUbUbUbVbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdndmdmdmdrbscabqbqbqbqbscbcccdcccebscfcgchcicfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdxdvdvdvdybsbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdndmdmdmdrbscabqbqbqbqbsbPcccdccbQbscfcgchcicfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdxdvdvdvdybsbqcabqbqctbscbcccdcccebscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbEcabqbRbsbTbTbTbTbTbsdbcwcxcydbbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD -ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbqbqcabqbsdsdtdsdtdsbsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD +ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqbqbqcabqbscucvcucvcubsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapaparapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdzdjdjdjdAbsbqdGbqbqcabsbGbHbGbHbGbsducwcxcydubsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsczbMbMbMcAbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpdCdBdBdBdDbsbRbqdNbqbEbsbtbubtbubtbsdOdPdQdRdObsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsdSdTdTdTdUbD ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNapapapapapapapapapapapapapapapapapapapapapapapapaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNhyhzhzhzhzhzbZejejejejejbZejejejejejbZejejejejejbZekekekekekbZekekekekekbZekekekekekbZekekekekekel @@ -1565,14 +1568,14 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababababababahababababababababababababababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababaonjafnjafnjalabaonjafnjafnjalababababababacabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababababaoajoOajoOajalabaoajoOajoOajalabacababababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbXbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaeabamakoOakoOakanagamakoOakoOakaSagagababaeabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaeababacaeababaonjnjafnjafnjaTpvoCnjafnjafnjnjnjnjaUababacababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbXbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaeabamakoOakoOakanagamakoOakoOakdsagagababaeabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaeababacaeababaonjnjafnjafnjaTpvoCnjafnjafnjnjnjnjdtababacababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaeababababacaonjaZoOoOoOaZoOoOoOaZoOoOoOaZoOoOnjalabababaeabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababababaeabababaonjoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOnjalacababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaeababababaeabaeaonjaTpvpvpvpvpvpvpvpvpvpvpvoCnjbbnjalabaeabacabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaeacababagagagbcbcbcbcbababababababababaaXnjoOnjaUabacabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaeacababagagagbcbcbcbcbababababababababaaXnjoOnjdtabacabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiacababaeababagagamnjoOnjalabababababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjacaeabababaNaNaNaNaNaNaNaNaNaUabababacamnjnjqXnjbdnjiwagiHagiHagnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjacaeabababaNaNaNaNaNaNaNaNaNdtabababacamnjnjqXnjbdnjiwagiHagiHagnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababaonjnjoHoIjtoOnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalaeabadaonjaLoOoOoOoOfZoQoRnjfYjMmgnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabacabababaiaNaNaNaNaNaNaNaiababababjsnjpaoOmfmfpcoOpdpepWpXpXganjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1586,7 +1589,7 @@ rErErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaq rKrErErErErErErErErErErErErErEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWcPbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaNaNaNanabababnjnjnjnjnjnjqDqDqEqFqGqHnjgjjvjuowivjwivoxjxjynjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaiabababbabaoyaXnjqLqMqMqMqMqMnjjzgjjvjJjJjKjJjJjyjznjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababacababaoqXqMqMqMqMqMmlnjnjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababadoAozamnjrerererererfnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababadozoAamnjrerererererfnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalababaonjnjnjnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNoDaeababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabababnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1619,27 +1622,27 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqsrssstsqsqsqsqsusvsvsvsqsqsqsqsqsqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqswsssssxsyszmmsBsCmnsEsEsysysqsFsGsHsIsqsJsKsLsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqsqsqsqsqsysEmnsMsNmnsEsEsOmosqsQsQsQsQsqsRsSsTsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsvsEsEsEsEsEsEsEsEsysysqsQsUsVsVsqsqsWsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsqaNaNaNsvsEsEsEsEsEsEsEsEsEsEsusQmpmpsQsQsQsQsZsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXoSrqtdtesXtarrrstdsqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititjtktitititjtltmtntdtdrttdtdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtdsXtatttdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititvtktitititvtwtmtntdtdrttdtdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqcScRcUcTcWcVcXsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtAsXtatttdtdsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqdodedqdpdLdKdesufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdrttdtdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtdsXtatttdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtntdrurttdtdtdrusXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmsXrwrvsXsXsXsXubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoEoEoEoEoFfmfofnfqfpfsfrfnfEfmufujujuhuiugujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGoNoJoWoPoGfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpgpfpfpfphoGfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipfpkpopfptfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXrFrGrFsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNsXrxujujujujujryujuXrzooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNsXrAujsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNsXrBujsXvkvkpqprujujujvyvyujujujvzvdrCvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXvkvkvksXvIvJujujujujvLujsXvdrDmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXuKsqvWtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsvsEsEsEsEsEsEsEsEsysysqsQsUsVsVsqsqsWsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsqaNaNaNsvsEsEsEsEsEsEsEsEsEsEsusQmpmpsQsQsQsQsZsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXoSrqtdtesXtarrrstdsqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititjtktitititjtltmtntdtdrttdtdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtdsXtatttdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititvtktitititvtwtmtntdtdrttdtdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqcScRcUcTcWcVcXsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtAsXtatttdtdsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqdodedqdpdLdKdesufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdrttdtdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtdsXtatttdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtntdrurttdtdtdrusXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmsXrwrvsXsXsXsXubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrLrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoEoEoEoEoFfmfofnfqfpfsfrfnfEfmufujujuhuiugujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGoNoJoWoPoGfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpgpfpfpfphoGfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipfpkpopfptfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXrFrGrFsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNsXrxujujujujujryujuXrzooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNsXrAujsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNsXrBujsXvkvkpqprujujujvyvyujujujvzvdrCvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXvkvkvksXvIvJujujujujvLujsXvdrDmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXuKsqvWtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXuKsqwkudwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvxsXsXaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXoXsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvksXaNaNaNaNaNaNaNaNaNaNaNsXpEujuTujujwCwDwEwFwGwCwHwIwJwKwLwMwNwOwPwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1726,7 +1729,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNDAGRGPFvFvFvGPGSDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKDKDAaNDAGTFvFvGPFvFvGUDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDuaNEMDxDyDyDzEIDKDKDAaNDAGVFvFvFvFvFvGWDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwHaHbHcHbHdDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwrMHbHcHbrNDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWjVjYjXkajZaNjUjWktkvkukajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1751,4 +1754,3 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN "} - diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 59c44bf0fff..b4412f56329 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -31,6 +31,14 @@ return changeNext_click(1) + if(multicam_on) + var/turf/T = get_turf(A) + if(T) + for(var/obj/screen/movable/pic_in_pic/ai/P in T.vis_locs) + if(P.ai == src) + P.Click(params) + break + if(control_disabled || stat) return diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 26fb60335c8..20f871d9534 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -146,6 +146,8 @@ #define ui_ai_take_picture "SOUTH:6,WEST+12" #define ui_ai_view_images "SOUTH:6,WEST+13" #define ui_ai_sensor "SOUTH:6,WEST+14" +#define ui_ai_multicam "SOUTH+1:6,WEST+13" +#define ui_ai_add_multicam "SOUTH+1:6,WEST+14" // Bots #define ui_bot_radio "EAST-1:28,SOUTH:7" diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index c8864f36d8a..0b1a6d1c6c4 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -140,6 +140,25 @@ var/mob/living/silicon/robot/borg = usr borg.sensor_mode() +/obj/screen/ai/multicam + name = "Multicamera Mode" + icon_state = "multicam" + +/obj/screen/ai/multicam/Click() + if(..()) + return + var/mob/living/silicon/ai/AI = usr + AI.toggle_multicam() + +/obj/screen/ai/add_multicam + name = "New Camera" + icon_state = "new_cam" + +/obj/screen/ai/add_multicam/Click() + if(..()) + return + var/mob/living/silicon/ai/AI = usr + AI.drop_new_multicam() /mob/living/silicon/ai/create_mob_hud() if(client && !hud_used) @@ -228,3 +247,13 @@ using = new /obj/screen/ai/sensors() using.screen_loc = ui_ai_sensor static_inventory += using + +//Multicamera mode + using = new /obj/screen/ai/multicam() + using.screen_loc = ui_ai_multicam + static_inventory += using + +//Add multicamera camera + using = new /obj/screen/ai/add_multicam() + using.screen_loc = ui_ai_add_multicam + static_inventory += using \ No newline at end of file diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm new file mode 100644 index 00000000000..bbac6e36df3 --- /dev/null +++ b/code/_onclick/hud/picture_in_picture.dm @@ -0,0 +1,144 @@ +/obj/screen/movable/pic_in_pic + name = "Picture-in-picture" + screen_loc = "CENTER" + plane = GAME_PLANE + var/atom/center + var/width = 0 + var/height = 0 + var/list/shown_to = list() + var/list/viewing_turfs = list() + var/obj/screen/component_button/button_x + var/obj/screen/component_button/button_expand + var/obj/screen/component_button/button_shrink + + var/mutable_appearance/standard_background + var/const/max_dimensions = 10 + +/obj/screen/movable/pic_in_pic/Initialize() + . = ..() + make_backgrounds() + +/obj/screen/movable/pic_in_pic/Destroy() + for(var/C in shown_to) + unshow_to(C) + QDEL_NULL(button_x) + QDEL_NULL(button_shrink) + QDEL_NULL(button_expand) + return ..() + +/obj/screen/movable/pic_in_pic/component_click(obj/screen/component_button/component, params) + if(component == button_x) + qdel(src) + else if(component == button_expand) + set_view_size(width+1, height+1) + else if(component == button_shrink) + set_view_size(width-1, height-1) + +/obj/screen/movable/pic_in_pic/proc/make_backgrounds() + standard_background = new /mutable_appearance() + standard_background.icon = 'icons/misc/pic_in_pic.dmi' + standard_background.icon_state = "background" + standard_background.layer = SPACE_LAYER + +/obj/screen/movable/pic_in_pic/proc/add_buttons() + var/static/mutable_appearance/move_tab + if(!move_tab) + move_tab = new /mutable_appearance() + //all these properties are always the same, and since adding something to the overlay + //list makes a copy, there is no reason to make a new one each call + move_tab.icon = 'icons/misc/pic_in_pic.dmi' + move_tab.icon_state = "move" + move_tab.plane = HUD_PLANE + var/matrix/M = matrix() + M.Translate(0, (height + 0.25) * world.icon_size) + move_tab.transform = M + overlays += move_tab + + if(!button_x) + button_x = new /obj/screen/component_button(null, src) + var/mutable_appearance/MA = new /mutable_appearance() + MA.name = "close" + MA.icon = 'icons/misc/pic_in_pic.dmi' + MA.icon_state = "x" + MA.plane = HUD_PLANE + button_x.appearance = MA + M = matrix() + M.Translate((max(4, width) - 0.75) * world.icon_size, (height + 0.25) * world.icon_size) + button_x.transform = M + vis_contents += button_x + + if(!button_expand) + button_expand = new /obj/screen/component_button(null, src) + var/mutable_appearance/MA = new /mutable_appearance() + MA.name = "expand" + MA.icon = 'icons/misc/pic_in_pic.dmi' + MA.icon_state = "expand" + MA.plane = HUD_PLANE + button_expand.appearance = MA + M = matrix() + M.Translate(world.icon_size, (height + 0.25) * world.icon_size) + button_expand.transform = M + vis_contents += button_expand + + if(!button_shrink) + button_shrink = new /obj/screen/component_button(null, src) + var/mutable_appearance/MA = new /mutable_appearance() + MA.name = "shrink" + MA.icon = 'icons/misc/pic_in_pic.dmi' + MA.icon_state = "shrink" + MA.plane = HUD_PLANE + button_shrink.appearance = MA + M = matrix() + M.Translate(2 * world.icon_size, (height + 0.25) * world.icon_size) + button_shrink.transform = M + vis_contents += button_shrink + +/obj/screen/movable/pic_in_pic/proc/add_background() + if((width > 0) && (height > 0)) + var/matrix/M = matrix() + M.Scale(width + 0.5, height + 0.5) + M.Translate((width-1)/2 * world.icon_size, (height-1)/2 * world.icon_size) + standard_background.transform = M + overlays += standard_background + +/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) + width = Clamp(width, 0, max_dimensions) + height = Clamp(height, 0, max_dimensions) + src.width = width + src.height = height + + y_off = -height * world.icon_size - 16 + + overlays.Cut() + add_background() + add_buttons() + if(do_refresh) + refresh_view() + +/obj/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) + center = target + if(do_refresh) + refresh_view() + +/obj/screen/movable/pic_in_pic/proc/refresh_view() + vis_contents -= viewing_turfs + if(!width || !height) + return + var/turf/T = get_turf(center) + if(!T) + return + var/turf/lowerleft = locate(max(1, T.x - round(width/2)), max(1, T.y - round(height/2)), T.z) + var/turf/upperright = locate(min(world.maxx, lowerleft.x + width - 1), min(world.maxy, lowerleft.y + height - 1), lowerleft.z) + viewing_turfs = block(lowerleft, upperright) + vis_contents += viewing_turfs + + +/obj/screen/movable/pic_in_pic/proc/show_to(client/C) + if(C) + shown_to[C] = 1 + C.screen += src + +/obj/screen/movable/pic_in_pic/proc/unshow_to(client/C) + if(C) + shown_to -= C + C.screen -= src \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5bf3a483cd8..1bba1506f37 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -23,6 +23,9 @@ master = null return ..() +/obj/screen/proc/component_click(obj/screen/component_button/component, params) + return + /obj/screen/text icon = null icon_state = null @@ -384,3 +387,14 @@ icon_state = "healthdoll_DEAD" screen_loc = ui_healthdoll var/list/cached_healthdoll_overlays = list() // List of icon states (strings) for overlays + +/obj/screen/component_button + var/obj/screen/parent + +/obj/screen/component_button/Initialize(mapload, obj/screen/new_parent) + . = ..() + parent = new_parent + +/obj/screen/component_button/Click(params) + if(parent) + parent.component_click(src, params) \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 0e9f261d73d..4b5d1cee2a6 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -30,6 +30,7 @@ var/emped = 0 //Number of consecutive EMP's on this camera var/toggle_message = 'sound/items/Wirecutter.ogg' + var/in_use_lights = 0 // TO BE IMPLEMENTED /obj/machinery/camera/New() ..() diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 00f6a98f2bc..fd91843d862 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -136,7 +136,8 @@ return T = get_turf(T) loc = T - cameranet.visibility(src) + if(use_static) + cameranet.visibility(src, GetViewerClient()) if(visible_icon) if(eye_user.client) eye_user.client.images -= user_image diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index bf11356b3a5..5f8c575ef53 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -104,6 +104,13 @@ var/list/ai_verbs_default = list( var/arrivalmsg = "$name, $rank, has arrived on the station." + var/multicam_allowed = FALSE + var/multicam_on = FALSE + var/obj/screen/movable/pic_in_pic/ai/master_multicam + var/list/multicam_screens = list() + var/list/all_eyes = list() + var/max_multicams = 6 + /mob/living/silicon/ai/proc/add_ai_verbs() verbs |= ai_verbs_default verbs |= silicon_subsystems @@ -693,10 +700,13 @@ var/list/ai_verbs_default = list( light_cameras() if(istype(A, /obj/machinery/camera)) current = A + if(A != GLOB.ai_camera_room_landmark) + end_multicam() . = ..() if(.) if(!A && isturf(loc) && eyeobj) + end_multicam() client.eye = eyeobj client.perspective = MOB_PERSPECTIVE eyeobj.get_remote_view_fullscreens(src) @@ -1249,4 +1259,12 @@ var/list/ai_verbs_default = list( to_chat(src, "Unable to locate an airlock near [target].") else - to_chat(src, "Target is not on or near any active cameras on the station.") \ No newline at end of file + to_chat(src, "Target is not on or near any active cameras on the station.") + +/mob/living/silicon/ai/proc/camera_visibility(mob/camera/aiEye/moved_eye) + cameranet.visibility(moved_eye, client, all_eyes) + +/mob/living/silicon/ai/forceMove(atom/destination) + . = ..() + if(.) + end_multicam() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index b18c011bb23..2771725a96d 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -38,29 +38,64 @@ var/datum/cameranet/cameranet = new() // Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. -/datum/cameranet/proc/visibility(mob/camera/aiEye/ai) - // 0xf = 15 - var/x1 = max(0, ai.x - 16) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, ai.y - 16) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, ai.x + 16) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, ai.y + 16) & ~(CHUNK_SIZE - 1) +/datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes) + if(!islist(moved_eyes)) + moved_eyes = moved_eyes ? list(moved_eyes) : list() + if(islist(other_eyes)) + other_eyes = (other_eyes - moved_eyes) + else + other_eyes = list() - var/list/visibleChunks = list() + var/list/chunks_pre_seen = list() + var/list/chunks_post_seen = list() - for(var/x = x1; x <= x2; x += 16) - for(var/y = y1; y <= y2; y += 16) - visibleChunks += getCameraChunk(x, y, ai.z) + for(var/V in moved_eyes) + var/mob/camera/aiEye/eye = V + if(C) + chunks_pre_seen |= eye.visibleCameraChunks + // 0xf = 15 + var/static_range = eye.static_visibility_range + var/x1 = max(0, eye.x - static_range) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, eye.y - static_range) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, eye.x + static_range) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, eye.y + static_range) & ~(CHUNK_SIZE - 1) - var/list/remove = ai.visibleCameraChunks - visibleChunks - var/list/add = visibleChunks - ai.visibleCameraChunks + var/list/visibleChunks = list() - for(var/chunk in remove) - var/datum/camerachunk/c = chunk - c.remove(ai) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + visibleChunks |= getCameraChunk(x, y, eye.z) + + var/list/remove = eye.visibleCameraChunks - visibleChunks + var/list/add = visibleChunks - eye.visibleCameraChunks + + for(var/chunk in remove) + var/datum/camerachunk/c = chunk + c.remove(eye, FALSE) + + for(var/chunk in add) + var/datum/camerachunk/c = chunk + c.add(eye, FALSE) + + if(C) + chunks_post_seen |= eye.visibleCameraChunks + + if(C) + for(var/V in other_eyes) + var/mob/camera/aiEye/eye = V + chunks_post_seen |= eye.visibleCameraChunks + + var/list/remove = chunks_pre_seen - chunks_post_seen + var/list/add = chunks_post_seen - chunks_pre_seen + + for(var/chunk in remove) + var/datum/camerachunk/c = chunk + C.images -= c.obscured + + for(var/chunk in add) + var/datum/camerachunk/c = chunk + C.images += c.obscured - for(var/chunk in add) - var/datum/camerachunk/c = chunk - c.add(ai) // Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index 6737be463d6..ec2fd378ed5 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -21,10 +21,11 @@ // Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(mob/camera/aiEye/eye) - var/client/client = eye.GetViewerClient() - if(client) - client.images += obscured +/datum/camerachunk/proc/add(mob/camera/aiEye/eye, add_images = TRUE) + if(add_images) + var/client/client = eye.GetViewerClient() + if(client) + client.images += obscured eye.visibleCameraChunks += src visible++ seenby += eye @@ -33,10 +34,11 @@ // Remove an AI eye from the chunk, then update if changed. -/datum/camerachunk/proc/remove(mob/camera/aiEye/eye) - var/client/client = eye.GetViewerClient() - if(client) - client.images -= obscured +/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_images = TRUE) + if(remove_images) + var/client/client = eye.GetViewerClient() + if(client) + client.images -= obscured eye.visibleCameraChunks -= src seenby -= eye if(visible > 0) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 67e86f1643c..1d2288eff72 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -14,6 +14,8 @@ var/list/visibleCameraChunks = list() var/mob/living/silicon/ai/ai = null var/relay_speech = FALSE + var/use_static = TRUE + var/static_visibility_range = 16 // Use this when setting the aiEye's location. @@ -25,12 +27,15 @@ return T = get_turf(T) loc = T - cameranet.visibility(src) - if(ai.client) + if(use_static) + ai.camera_visibility(src) + if(ai.client && !ai.multicam_on) ai.client.eye = src //Holopad if(ai.holo) ai.holo.move_hologram() + if(ai.master_multicam) + ai.master_multicam.refresh_view() /mob/camera/aiEye/Move() return 0 @@ -40,18 +45,16 @@ return ai.client return null - /mob/camera/aiEye/proc/RemoveImages() var/client/C = GetViewerClient() - if(C) + if(C && use_static) for(var/V in visibleCameraChunks) var/datum/camerachunk/chunk = V C.images -= chunk.obscured - /mob/camera/aiEye/Destroy() if(ai) - //ai.all_eyes -= src + ai.all_eyes -= src ai = null for(var/V in visibleCameraChunks) var/datum/camerachunk/chunk = V @@ -61,9 +64,9 @@ /atom/proc/move_camera_by_click() if(istype(usr, /mob/living/silicon/ai)) var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && AI.client.eye == AI.eyeobj) + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) AI.cameraFollow = null - if(isturf(src.loc) || isturf(src)) + if(isturf(loc) || isturf(src)) AI.eyeobj.setLoc(src) // AI MOVEMENT @@ -123,6 +126,7 @@ if(eyeobj) return eyeobj = new /mob/camera/aiEye() + all_eyes += eyeobj eyeobj.ai = src eyeobj.setLoc(loc) eyeobj.name = "[name] (AI Eye)" diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 42f132e39d4..553e72b0aef 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -67,6 +67,7 @@ spawn(20) to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.") + end_multicam() sleep(50) my_area = get_area(src) T = get_turf(src) diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 7d3a65445ff..f2c37415e38 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -10,4 +10,6 @@ for(var/obj/machinery/ai_status_display/O in machines) //change status O.mode = 1 O.emotion = "Neutral" + if(multicam_on) + end_multicam() view_core() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm new file mode 100644 index 00000000000..254d5a9b794 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -0,0 +1,260 @@ +//Picture in picture + +/obj/screen/movable/pic_in_pic/ai + var/mob/living/silicon/ai/ai + var/mutable_appearance/highlighted_background + var/highlighted = FALSE + var/mob/camera/aiEye/pic_in_pic/aiEye + +/obj/screen/movable/pic_in_pic/ai/Initialize() + . = ..() + aiEye = new /mob/camera/aiEye/pic_in_pic() + aiEye.screen = src + +/obj/screen/movable/pic_in_pic/ai/Destroy() + set_ai(null) + QDEL_NULL(aiEye) + return ..() + +/obj/screen/movable/pic_in_pic/ai/Click() + ..() + if(ai) + ai.select_main_multicam_window(src) + +/obj/screen/movable/pic_in_pic/ai/make_backgrounds() + ..() + highlighted_background = new /mutable_appearance() + highlighted_background.icon = 'icons/misc/pic_in_pic.dmi' + highlighted_background.icon_state = "background_highlight" + highlighted_background.layer = SPACE_LAYER + +/obj/screen/movable/pic_in_pic/ai/add_background() + if((width > 0) && (height > 0)) + var/matrix/M = matrix() + M.Scale(width + 0.5, height + 0.5) + M.Translate((width-1)/2 * world.icon_size, (height-1)/2 * world.icon_size) + highlighted_background.transform = M + standard_background.transform = M + overlays += highlighted ? highlighted_background : standard_background + +/obj/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) + aiEye.static_visibility_range = (round(max(width, height) / 2) + 1) + if(ai) + ai.camera_visibility(aiEye) + ..() + +/obj/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) + ..() + aiEye.setLoc(get_turf(target)) + +/obj/screen/movable/pic_in_pic/ai/refresh_view() + ..() + aiEye.setLoc(get_turf(center)) + +/obj/screen/movable/pic_in_pic/ai/proc/highlight() + if(highlighted) + return + highlighted = TRUE + overlays -= standard_background + overlays += highlighted_background + +/obj/screen/movable/pic_in_pic/ai/proc/unhighlight() + if(!highlighted) + return + highlighted = FALSE + overlays -= highlighted_background + overlays += standard_background + +/obj/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) + if(ai) + ai.multicam_screens -= src + ai.all_eyes -= aiEye + if(ai.master_multicam == src) + ai.master_multicam = null + if(ai.multicam_on) + unshow_to(ai.client) + ai = new_ai + if(new_ai) + new_ai.multicam_screens += src + ai.all_eyes += aiEye + if(new_ai.multicam_on) + show_to(new_ai.client) + +//Turf, area, and landmark for the viewing room + +/turf/unsimulated/ai_visible + name = "" + icon = 'icons/misc/pic_in_pic.dmi' + icon_state = "room_background" + flags = NOJAUNT + +/turf/unsimulated/ai_visible/Initialize() + . = ..() + obscured = image(null, src, null) + +/area/ai_multicam_room + name = "ai_multicam_room" + icon_state = "ai_camera_room" + dynamic_lighting = FALSE + valid_territory = FALSE + ambientsounds = list() + +GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) + +/obj/effect/landmark/ai_multicam_room + name = "ai camera room" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "x" + +/obj/effect/landmark/ai_multicam_room/Initialize() + . = ..() + qdel(GLOB.ai_camera_room_landmark) + GLOB.ai_camera_room_landmark = src + +/obj/effect/landmark/ai_multicam_room/Destroy() + if(GLOB.ai_camera_room_landmark == src) + GLOB.ai_camera_room_landmark = null + return ..() + +//Dummy camera eyes + +/mob/camera/aiEye/pic_in_pic + name = "Secondary AI Eye" + var/obj/screen/movable/pic_in_pic/ai/screen + var/list/cameras_telegraphed = list() + var/telegraph_cameras = TRUE + var/telegraph_range = 7 + +/mob/camera/aiEye/pic_in_pic/GetViewerClient() + if(screen && screen.ai) + return screen.ai.client + +/mob/camera/aiEye/pic_in_pic/setLoc(turf/T) + T = get_turf(T) + forceMove(T) + if(screen && screen.ai) + screen.ai.camera_visibility(src) + else + cameranet.visibility(src) + update_camera_telegraphing() + +/mob/camera/aiEye/pic_in_pic/proc/update_camera_telegraphing() + if(!telegraph_cameras) + return + var/list/obj/machinery/camera/add = list() + var/list/obj/machinery/camera/remove = list() + var/list/obj/machinery/camera/visible = list() + for(var/VV in visibleCameraChunks) + var/datum/camerachunk/CC = VV + for(var/V in CC.cameras) + var/obj/machinery/camera/C = V + if (!C.can_use() || (get_dist(C, src) > telegraph_range)) + continue + visible |= C + + add = visible - cameras_telegraphed + remove = cameras_telegraphed - visible + + for(var/V in remove) + var/obj/machinery/camera/C = V + if(QDELETED(C)) + continue + cameras_telegraphed -= C + C.in_use_lights-- + C.update_icon() + for(var/V in add) + var/obj/machinery/camera/C = V + if(QDELETED(C)) + continue + cameras_telegraphed |= C + C.in_use_lights++ + C.update_icon() + +/mob/camera/aiEye/pic_in_pic/proc/disable_camera_telegraphing() + telegraph_cameras = FALSE + for(var/V in cameras_telegraphed) + var/obj/machinery/camera/C = V + if(QDELETED(C)) + continue + C.in_use_lights-- + C.update_icon() + cameras_telegraphed.Cut() + +/mob/camera/aiEye/pic_in_pic/Destroy() + disable_camera_telegraphing() + return ..() + +//AI procs + +/mob/living/silicon/ai/proc/drop_new_multicam(silent = FALSE) + if(!multicam_allowed) + if(!silent) + to_chat(src, "This action is currently disabled. Contact an administrator to enable this feature.") + return + if(!eyeobj) + return + if(multicam_screens.len >= max_multicams) + if(!silent) + to_chat(src, "Cannot place more than [max_multicams] multicamera windows.") + return + var/obj/screen/movable/pic_in_pic/ai/C = new /obj/screen/movable/pic_in_pic/ai() + C.set_view_size(3, 3, FALSE) + C.set_view_center(get_turf(eyeobj)) + C.set_ai(src) + if(!silent) + to_chat(src, "Added new multicamera window.") + return C + +/mob/living/silicon/ai/proc/toggle_multicam() + if(!multicam_allowed) + to_chat(src, "This action is currently disabled. Contact an administrator to enable this feature.") + return + if(multicam_on) + end_multicam() + else + start_multicam() + +/mob/living/silicon/ai/proc/start_multicam() + if(multicam_on || aiRestorePowerRoutine || !isturf(loc)) + return + if(!GLOB.ai_camera_room_landmark) + to_chat(src, "This function is not available at this time.") + return + multicam_on = TRUE + refresh_multicam() + to_chat(src, "Multiple-camera viewing mode activated.") + +/mob/living/silicon/ai/proc/refresh_multicam() + reset_perspective(GLOB.ai_camera_room_landmark) + if(client) + for(var/V in multicam_screens) + var/obj/screen/movable/pic_in_pic/P = V + P.show_to(client) + +/mob/living/silicon/ai/proc/end_multicam() + if(!multicam_on) + return + multicam_on = FALSE + select_main_multicam_window(null) + if(client) + for(var/V in multicam_screens) + var/obj/screen/movable/pic_in_pic/P = V + P.unshow_to(client) + reset_perspective() + to_chat(src, "Multiple-camera viewing mode deactivated.") + + +/mob/living/silicon/ai/proc/select_main_multicam_window(obj/screen/movable/pic_in_pic/ai/P) + if(master_multicam == P) + return + + if(master_multicam) + master_multicam.set_view_center(get_turf(eyeobj), FALSE) + master_multicam.unhighlight() + master_multicam = null + + if(P) + P.highlight() + eyeobj.setLoc(get_turf(P.center)) + P.set_view_center(eyeobj) + master_multicam = P diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index dcae187b028..29a3cd26600 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -64,7 +64,6 @@ actions += monkey_recycle_action - /obj/machinery/computer/camera_advanced/xenobio/attack_hand(mob/user) if(!ishuman(user)) //AIs using it might be weird return diff --git a/icons/misc/pic_in_pic.dmi b/icons/misc/pic_in_pic.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9c550f3c25ecdf6817afd63dc0843875e245dfaa GIT binary patch literal 3370 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 E2DHmSY5)KL literal 0 HcmV?d00001 diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi index 61905492ce1866e9ff55ec8bfaef7c89e866ceb6..78071da391f0f8a9563d11b7351fb4a47ab16378 100644 GIT binary patch literal 2494 zcmV;v2|@OWP)004jp0{{R3ySnmH5MUF z3r7HGPylsT0Dk~BW&ko?01zPnb?N|a-N3-W08pR+3>mXfTVwzL00DGTPE!Ct=GbNc z008fLR9JLGWpiV4X>fFDZ*Bkpc$|&Xv2Ft)3;@vi_zINlRois!QYES~G{1mc&dFH; z6B*y#?}tm4PW5fZdNN?c)_)zok0-zXIl2j@Qepq;KVDv4H&d@eTkPIlHy~XGeJ-kk zVhcAwAr`@n>w1#fGHr$mILp@FZtc$Y|NrKd#5)pT;%>=@C~Mpu1zS8w0u=h`(?gES=c?R` z{;4AN6SvlX`usFi52n3Z1AJ9w> z2I?ibK}v95O(tL4bhv8WQL1pucVgy&X@wSnP z&_zmD2(loE0MWpJFzCs*f`N`-Mi6d?5Q6{^KCnQ%snW-S zfs9}@4+&~Ukb=kio}yF%2=^0Avls$gz{1497{b;-k1!!Pw+Sk|oqNPG)1^WXL?Afj zg16I*U~1r11l`@2*#c!KR7r4Y6Z9eM5K;^eJeUy-!U;y{_#nne7R4T*H;_1$c~S*}zUcYD+#iKtP{rtC=GNVFfd%+nFqi z?|tKb2c?a+{vi*!x!gJk`uaOhGq}pTfLE__L<9B1Kv2a2Dp%A>ozYLvMGP>4vA$C7%1T57^+Q}D>ng#p<@yQ|wp}Sf z8(tJ@b%M;%f`OMyuYQO()m0yq4NM6d3NKA1Qd9Fm=4e^{@N$Xu!_g?l=YG?5g062m zR`@tUB{*72&@#65L%|2zc@XaW&3v2Z@5|Tki$();qg4S0G5eE*-5_KNJWy zqI8I$<)=A8FtBvAdi`*k47`Lq_l$2ZFE1tG=z|LooUM}yK6pY$K^>1`96RP{wOyZ~ zUkuYfKR@H;zZZev&M5W{h;;*jVBu)>nE*N}>FF`AlSmNL_yPdGFBtD7LDzXIU5ayY zwrll{Rv~BzA-pp^j?=5`gB^mdf65K7;DcV2lCn#&w599j=%1OXo2jzzJ*^^c#e_U!&{ zt|XH)0}t&fw4{HvPq~gDnXFujIY_Xo*V!k>*MsV36tTv~W@jX~NJv^$P!dIR8I)Y1w zz)`*5*=Rpsj}d$erPVhO-ovAM8j1yGhyY>r+dMkSv^&3b_FSiee2enMlZA0n= z)jGSc+VOP2<*n>tuHQO(-hQ&jkE#Tf{gU4a{D%`<9D(Ix){U(PNsp&3)@7^c-{0Rg z{9yZwu%1*)onU#OK-ksU2fWh*G#J1MfgU#hpx-Kb=zzfvK>LeuX2Bi#5DBs~8OfeV zAh=cuk^x&q|4yZycWf^aB!)GDRCJ{Z$n1V;5i}KoRNQ>GLoDcR9a^JaA~^Zlsz?wI zWZ5IIbfBb35QcD(2n7Qw`jt9RY40PME}Y;(1Tj$Xj2rwc4T3a;B0)QZRlWC7N$(l* zJeQx_QCbVqLRz&hj3fK&-qqu8dAx*oizrpKBgl@0Ab zMo_y~9AZW=Bw83EiO?~9hhQ*pu|cv3J_vKvW<{PU)@?hWr>d**74RB|+y^#Z@Lqsxg8)&i|o-$tVv-`C)?n^M7Pu9Oc0%Kk9=! z&i`2hi&!r6U~PyGNAZsHf6l->mdhwU71s~TgFDXuc>}XpE~9uVt{FjLsv3ymt`7mb z#6bOLn4mOO4b86B*B`#w;rraRY#(DjNl=C-@tp{xZi#0;~|ISf3oTqN0)*FsQ>@~07*qo IM6N<$g5ma$$^ZZW literal 4750 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 Z<6^PTuceX8&Kpd0cQx;!E7Wa+{vV(>R7wB< diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index f4a0157fd866f6af51c038420a70029469126597..74f68f69944e8d75ce0dda01542e05b231920f34 100755 GIT binary patch delta 5593 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 Date: Thu, 12 Jul 2018 19:05:53 -0400 Subject: [PATCH 11/89] Oil tank, OIL TANK --- .../MetaStation/MetaStation.v41A.II.dmm | 3 ++- _maps/map_files/cyberiad/cyberiad.dmm | 4 ++-- .../mob/living/silicon/robot/component.dm | 4 ++++ code/modules/reagents/reagent_dispenser.dm | 7 +++++++ icons/obj/objects.dmi | Bin 143000 -> 143760 bytes 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 514eda508c9..d0f05651574 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -8401,6 +8401,7 @@ "dfC" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard) "dfD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop) "dfE" = (/obj/structure/closet/emcloset,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard) +"dfF" = (/obj/structure/reagent_dispensers/oil,/turf/simulated/floor/plasteel,/area/assembly/robotics) "dfG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "dfH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "Mechanic Workshop APC"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop) "dfI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop) @@ -8650,7 +8651,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaaaaaaaaaaaaabZUbZUcfccKCcPFcPxcEYcEYcEYcEYcEYcEYcEYcEYcPycPycPycPzcPycPycPycPycPycPBcPAcPDcKZcKZcQbcLdcQfcLdcImcyqcMdcQzcIncIocQAcQCcQBcImcJgcnscgxcvmcwEcQKcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcKEcLlcKFcEKbZUcFGbZUcFHcJxcJycLqcJAaRharAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcKJcJDcKJcIPcJEcIPcKKcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupaaaaaaaaaaaaaaaaaabZUbZUbZUbZUcJRcogcogcogcogcNTcogcogcQVcogcogcogcLzcNTcNTcRlcRocPycRpcNUcRLcREcwjcRMcwjcRMcSvcImcSBcMdcSCcIocSPcSMcTncTecImcMScEXcgxcvmcKpcTwcLAcMmcMjcMjcMjcMtcKvcJpcgCcCOcKwdgScKxcfHcfscgLdgTcYScKBcMvcMucMycEKcrUcKGceDcfYcFHcFHcFHcFHcFHcHfcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcALcALcLDcIPcIPcIPcLEcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaaabqabqabqaaaaaacKLabqaaaaaaabqabqaaaaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaabZUbZUbZUbZUbZUbZUbZUbZUbZUbZUbZUcoDcuVcTFchycoDcTZcjicUacUocUecUqcUpcUpcUrcUpcUFcUVcUUcVbcUWcVmcVlcVucVtcVEcVvcWkcVKcWGcWlcWHcIxcIxcMZcLmcLncLocLpcNgcLrcJpcLscLtcLucBNcKxcfHchuchuchEcLxcLycIEcKEcNqcEKcdNcLBceNchycLCbZUabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcLFcRFcPncALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaacHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaaaaaabqaaaabqabqabqaaabZUcWIchychychychycNZchycDUcWUcwncXrcXlcXlcXwcXAcXycXYcImcYocYncyFcIncYIcYycYNcYLcImcMgcMhcgxcmmcIxcMicOacMkcLocLocMlcObcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcOrcOccPmcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcRGcFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaacHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaaaaaabqaaaabqabqabqaaabZUcWIchychychychycNZchycDUcWUcwncXrcXlcXlcXwcXAcXycXYcImcYocYncyFcIncYIcYycYNcYLcImcMgcMhcgxcmmcIxcMicOacMkcLodfFcMlcObcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcOrcOccPmcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcRGcFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqcHZcIRcIScIRcITcIRcHZcHZcFvcHZcFvcHZcHZaaaaaaabqaaaaaacHZcHZcHZcHZcHZbZUcKVbZUcDUcYOcDecRLcRUcRUcRUcRUcRUcRUcRUcImcImcImcImcYWcImcImcImcImbZUcNdcgxcmmcIxcNecOacLocLpcLocNfcPEcNhckzcNjcNkcNldgVdgUdgUdgUdgUdgUcNocNncNpcQgcNrcEKchychyceNchybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaacHZcJHcJIcJJcJKcJHcGXcJMcJNcJOcJPcJQcHZaaacZmcIacIacIacLRcLTcJccLUcHZcZvcZqcZwcDUcZIcZycZQcZOcZXdeidafdaddakcRUcNRcmVcmVcmWcQhcjecmYcmYcQicNVcNWcNXcBIcIxcNYcQkcQvcQvcQvcQwcQDcOdcOecOfcOgcOhcOicOjcOkcOlcJLcOncOocOpclncQEcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqabqcHZcKMcHjcKOcHucKMcKMcKQcKRcKScKTcKUcHZaaadaodaucMMcMNcMOcLVcMBcMPcMRdaydaxdaMdaLdaOdaNdaPcYCdaUdaQdbbdaVdbfcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTdblcOVcOWcLpcOXclCcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdenclGcQFclJcQGclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 9924d4708ad..21d155d3680 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -3546,6 +3546,7 @@ "bqj" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqk" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bql" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) +"bqm" = (/obj/machinery/camera{c_tag = "Research Robotics Lab"; dir = 2; network = list("Research","SS13")},/obj/structure/reagent_dispensers/oil,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics) "bqn" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bqo" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape) "bqp" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape) @@ -4481,7 +4482,6 @@ "bIj" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/closet/wardrobe/medic_white,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/paramedic) "bIk" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/medical/research{name = "Research Division"}) "bIl" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics) -"bIm" = (/obj/machinery/camera{c_tag = "Research Robotics Lab"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics) "bIn" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics) "bIo" = (/obj/machinery/computer/guestpass{pixel_y = 30},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bIp" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) @@ -9042,7 +9042,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCybCubzCbCvbCzbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbDybCAbDsbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbDAbDbbDbbDbbDbbDbbDbbDbaRybAkbAkbAkbAkbAkbDabAkaRAaRCaRBaRCaRCaRCaREaRHaRFaSFaROaSHbFsaSKaSIaTHaSVbwvbwvbwvcXfbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqcXhcXgcXjcXibmmbGhbjRbwDbwCbxzbjRbGobmmbmmcXlcXkbjRbGNbGMbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbDGbCbbCbbCbbCbbCbbCbbCbbDHbDCaOQbDCaSfbDIbCfbDEbDJbDLbDKbDMbChbDObDNbDQbDQbDWbKHbvsbvsbvsbynbDYbymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDZbDRbDSbDTbyvbxbbDUbzJbEbbzFbBnbBnbEfbDXbEjbzLcXqbxlbHpbHobzPbzPbzPbzPbzUbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbErbEgbEhbEibEsbEkbEvbxvbEwbEnbEnbEpbEpbEpbEpbEpbEpbEqbEybEpaTLaTKaTMbEpbNebEobEobEobEobEobEubEubEuaTNbEubEubEubEubEubEuaTObEubEubEubteaTPaTQbwvaTRaTRbEAbEAbEAbEAbEAbEJbDqbDqbDrbDqbwvbDqbDqbDqbDqbEMbEDbEDbEDbEDcXncXibmmbAJbEFbjRbjRbjRbAKbALbmmbmmbAMbjRbjRbjRbqnbjRbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbEKbELbELbCbbELbELbELbARbERaSdaSdaSdaTobEVbCfbEYbEXbEXbEXbFcbChbnKbFfbESbETbEUbFgbvsbwPbEWbynbFhbymbFibEZbFabFbbFlbFdbFdbFebFdbFnbFobxbbFqbFpbFjbFkbFrbFmbNsbyBbFubFtbBnboxbFybFxbEjbzLcYPbxlbFAbFvbJabFFbFIbFGbFMbxmbxmbFBbFCbFDbFEbFNbFEbFPbFCaaabFHbxvbFRbFJbFKbFLbEsbzYbFSbxvbFUbFObFWbEpaTTaTSaTVaTUaTYaTWaUPaUObGabGabGaaVxaVIaVyaWOaWIaWSaWRbEuaYkaYoaYlaYraYqaZUaZTbobbbybuOaZTaZTbzibGrbGrbBJbGrbBKbBKbEAbGubGAbGwbEAbGBbGEbGBbEAbGFbDqbEMbEDbGKbGLbGKbEDbGCbGDbEDcXocXibmmbmmcXscXpcYdcXpcYebmmbmmbmmcYgbAEboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbBgbmSbHabCfbHdbCfbHebEXbHfbGQbChbHgbGSbGTbGUbFgbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHhbxbbxbbxbbHbbxbbHcbHibHjbBnbBnbBnbHnbDXcZfbzLcZjbxlbHqbFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEpbBMbBLbJFbGabGabCWbDdbDcbDfbDebDhbDgbDjbDibSnbDlbDnbDmbEubEtbEzbExbECaZTbEEaZTbFQbEIbuObFTbFXbFVbGrbIfbFYbIgbFZbBmbIabGcbIdbIdbImbIcbIlbInbEAbIibIrbIkbEDbItbIwbIvbIobIpbIybEDcYhcXibmmbmmbmmbmmcYmcYkcYkcYkcYkcYkcYnbqnbjRbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGPbARbARbARbARbARbARbARbARbERaaaaaaaSdbBgbmSbHabCfbHdbCfbHebEXbHfbGQbChbHgbGSbGTbGUbFgbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHhbxbbxbbxbbHbbxbbHcbHibHjbBnbBnbBnbHnbDXcZfbzLcZjbxlbHqbFvbxlbxlbxlbxmbHrbxmbHkbHlbHmbHubHBbHzbHDbHCbHsbHtbHFbxvbHvbzYbHwbHxbEsbHybzYbxvbHHbHAbHIbEpbBMbBLbJFbGabGabCWbDdbDcbDfbDebDhbDgbDjbDibSnbDlbDnbDmbEubEtbEzbExbECaZTbEEaZTbFQbEIbuObFTbFXbFVbGrbIfbFYbIgbFZbBmbIabGcbIdbIdbqmbIcbIlbInbEAbIibIrbIkbEDbItbIwbIvbIobIpbIybEDcYhcXibmmbmmbmmbmmcYmcYkcYkcYkcYkcYkcYnbqnbjRbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaToaSfbIGbCfbIHbIBbIIbIDbIDbIJbILbIKbIMbIMbIObINbDQbDQbDQbDQbDQbDQbIQbIPbIPbIRbITbxbbIVbIUbIYbIXbISbIZbJfbJbbxbbIWbJibyBbyCbDXbHjbBnbBnbJjbzJbzJbJmdaQdbnbJcbJdbJebJpbJgbJhbJsbJtbJkbJlbJubHsbJnbJvbJnbJvbJwbHsbHtbJqbJrbJybJxbJDbJzbJGbJEbJHbJrbJIbFObFObEpbGebGdbGgbGfbGabGibGqbHObDebDebDebGtbGxbGvbSnbDlbGzbGybEubHEbHJbHGbHLbHKbHMaZTbFQbEIbuObFTbFXaZTbGrbHNbHQbHPbHSbHRbHUbHTbHVbJYbJYbKhbJYbIbbKbbGbbKdbGkbKfbKqbKrbKibKibKibKjbEDcYpcYocYqcYqcYqcYrcYvcYscYwcYwcYwcYxcYybAEboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbGmbGlbKpaMdaMdaMdbmSaSfaSfbCfbKCbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBbPabzFbKIbKKbKJbKMbKLbKObKNbKQbKPbKSbKRdbYbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbLrbIechhbIjbIhbJAbIqbJCbJBbJJbHObJLbJKbJTbJPbJXbJWbKabJZbKcbOUbEubEubEubEubEubKebKgaZTbFQbEIbLjbFTbFXaZTbGrbLNbLEbLPbLmbLlbLIbLTbLobLLbLMbLUbLObKkbEAbGRbLRbKnbEDbKobKybKxbIpbLWbNCbEDcYhbmmcYObjRcZkcYYcZlboDcZmbjRcZnbuHcZobqnbjRbjRbjRbjRaYUdsqdsldslbEObicaaabicbEPbDwbDwbEQbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbLYbLXbKpbLZbLZbMabMbbLZbMcbCfbMebIBbMlbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMdbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObLschhbLubLtbLwbLvbLybLxbLxbLzbGabLAbLBbEobEobLDbLFbDlbLQbLKbLVbLSbMYbMXbLKbMZbNdbNabFTbEIbNfbFTbEIaZTbGrbNgbHXbHXbLmbNhbNEbNibNjbNHbNIbNJbNObNNbEAbMfbLRbMibEDbMjbNPbMtbIpbIpbNUbEDcZpbmmcZDbAKcZkbDvcZGcZEcZmbAKcZIcZHcZJbEGaaaaaaaaaaaabicdsudswdsvdsvbicaaabicbGObDwbGObDwbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 5802bdeb9ec..4ab485391dc 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -238,6 +238,7 @@ continue organ_found = 1 to_chat(user, "[E.name]: [round(E.brute_dam)] [round(E.burn_dam)]") + if(!organ_found) to_chat(user, "No prosthetics located.") to_chat(user, "
    ") @@ -252,4 +253,7 @@ if(!organ_found) to_chat(user, "No prosthetics located.") + if(H.isSynthetic() && H.bleed_rate) + to_chat(user, "Warning:Component leak detected!") + src.add_fingerprint(user) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index bcbcad6bc98..c057425afdd 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -62,6 +62,13 @@ tank_volume = 100000 +/obj/structure/reagent_dispensers/oil + name = "oil tank" + desc = "A tank of oil, commonly used to by robotics to fix leaking IPCs or just to loosen up those rusted underused parts." + icon_state = "oil" + reagent_id = "oil" + tank_volume = 2000 + /obj/structure/reagent_dispensers/fueltank name = "fuel tank" desc = "A tank full of industrial welding fuel. Do not consume." diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 900d322779351cab55b13f1ee7579ddec3917a1a..012656838a9abbb565176af9b802881c3fbb1b22 100644 GIT binary patch delta 2496 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 delta 1730 zcmYjRdtB0a7L}jkBcGtFS@{@xkm;zUGfHGagV{)CIzRt+e0!EY%I|fXeRskAVo*R#}>XtL}eJ=-Ot|tzMs$iobNg3o_m?2<~Ih- znY-{6SzpIwU=q?VTue;MNK7Re8D-wSe?v+dJ!&P9FMVY$yzak0^DQi=E znzIYrXEuv_PF9cGiMND{fG~mQTm6bu9m1lz_1OnlV zyT^7tBNmB7$Y_YaCI0QX zhQWzb+9}!LCGVHaVMF6q{-N4$NX<(n`mkIK3NpEvHdU+Btva*ah$?xV(( z{HQ8C4&8C!E(oyHRpTLoW zH2Dvzaf|NTyIy1P+72+#Rn% z*BkroTzTI#;5;P^g0Rgh8+#9I&bzQ6U}PN1uEi4Zh4(OFSH>(fJplzoNV#RG(j>Td z^N+TGkzVU)qtQp2sIW?~W5P2$1S9q*_k_>*N&g((Bo$F>Y-+cArn+Nm!@x{~$i`e9 z@Vi^O{c7y|hB%v{@5RR+|3-hp4UFW{au$Z&TI-VYxk;O*MTGxiJAbf{rytanS>0Lp zX#Ib3wydF|{GG6l=0o4$>vT0|3I79KBDY$lxr1CYYEDpZQv>ajzFn~bOB(;awilb0 zF8`BP=XXmU9ebQ^`TT7d4a|Tu?QB&zYhBd@ca1@VUOs=6EF9e}`AQzN;nJjbzk_3a zFCqDsbw9wnqqxMhe&u&LL?TmhPI>qUYA(yJ6dWhUccC(lx>>uF%q;iIoE)sF-n~trC?<@7gw&D_vL8ke|6jT zxlH(gl1maO2638%+%mG)Z$RVhygpF>v6FfvUad9Uq64?YSR7xZ;xIoy%cj=mfGpFoPHw=@O^2Tv?u zMiw%xTk+|iIl7zLp&u%MI7mz$-~Wa)Wll$UdZzp}q_`f#DyC G%l`ukO-|JS From 96a59a2b5316b2c9e57d2cf3d9ccac731bc1c0e0 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 20 Jul 2018 22:58:02 -0400 Subject: [PATCH 12/89] ups tank to 3000 --- code/modules/reagents/reagent_dispenser.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index c057425afdd..4a68c95ecb9 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -67,7 +67,7 @@ desc = "A tank of oil, commonly used to by robotics to fix leaking IPCs or just to loosen up those rusted underused parts." icon_state = "oil" reagent_id = "oil" - tank_volume = 2000 + tank_volume = 3000 /obj/structure/reagent_dispensers/fueltank name = "fuel tank" From 384bdc4d0aa23d2cc0f09d2a9fd1bf2fc43e5f4d Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 10 Aug 2018 01:53:28 -0400 Subject: [PATCH 13/89] Tweaks Fixed the errent space Added a glass 'oil can' put two in robotcists locker (IPCS can drink oil to replenish it, this just makes it faster for the robos.) --- .../crates_lockers/closets/secure/scientist.dm | 2 ++ code/modules/food_and_drinks/drinks/drinks.dm | 9 ++++++++- code/modules/mob/living/carbon/human/life.dm | 2 +- .../mob/living/carbon/human/species/_species.dm | 3 +++ .../mob/living/carbon/human/species/machine.dm | 11 ++++++++--- code/modules/surgery/organs/lungs.dm | 2 +- code/modules/surgery/organs/subtypes/vox.dm | 2 +- 7 files changed, 24 insertions(+), 7 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 0309b4b6447..016d014e576 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -44,6 +44,8 @@ new /obj/item/clothing/suit/storage/labcoat(src) new /obj/item/radio/headset/headset_sci(src) new /obj/item/radio/headset/headset_sci(src) + new /obj/item/reagent_containers/food/drinks/oilcan(src) + new /obj/item/reagent_containers/food/drinks/oilcan(src) /obj/structure/closet/secure_closet/RD name = "research director's locker" diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 91ee910c8d4..2e8124dee50 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -390,4 +390,11 @@ amount_per_transfer_from_this = 20 /obj/item/reagent_containers/food/drinks/waterbottle/large/empty - list_reagents = list() \ No newline at end of file + list_reagents = list() + +/obj/item/reagent_containers/food/drinks/oilcan + name = "Oil Injection Device" + desc = "A device with a spout on one end for use in replacing fluid in synthtics who have sprung leaks." + icon = 'icons/obj/surgery.dmi' + icon_state = "fixovein_old" + volume = 100 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index b021954a54c..c74cbd13987 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -248,7 +248,7 @@ if(!L || L && (L.status & ORGAN_DEAD)) if(health >= config.health_threshold_crit) adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) - else if(!(NOCRITDAMAGE in species.species_traits)) + else if(!(NOCRITDAMAGE in dna.species.species_traits)) adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) failed_last_breath = TRUE diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 250377520b8..ebbf8f67726 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -291,6 +291,9 @@ H.adjustBruteLoss(1) return +/datum/species/proc/handle_dna(mob/living/carbon/human/H, remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here + return + /datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). return diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index fa3e4e321a9..3bf442b60d0 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -15,20 +15,25 @@ skinned_type = /obj/item/stack/sheet/metal // Let's grind up IPCs for station resources! eyes = "blank_eyes" - brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150% - burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall. + brute_mod = 2.28 // 100% * 2.28 * 0.66 (robolimbs) ~= 150% + burn_mod = 2.28 // So they take 50% extra damage from brute/burn overall tox_mod = 0 clone_mod = 0 oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE blood_color = "#1F181F" flesh_color = "#AAAAAA" + + blood_color = "#3C3C3C" + exotic_blood = "oil" + blood_damage_type = STAMINA + //Default styles for created mobs. default_hair = "Blue IPC Screen" can_revive_by_healing = 1 diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 6182f1f4138..71b68d96735 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -89,7 +89,7 @@ if(!breath || (breath.total_moles() == 0)) if(H.health >= config.health_threshold_crit) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else if(!(NOCRITDAMAGE in H.species.species_traits)) + else if(!(NOCRITDAMAGE in H.dna.species.species_traits)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) H.failed_last_breath = TRUE diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm index e53c02040cc..8af6f8bf740 100644 --- a/code/modules/surgery/organs/subtypes/vox.dm +++ b/code/modules/surgery/organs/subtypes/vox.dm @@ -7,7 +7,7 @@ icon_state = "cortical-stack" parent_organ = "head" organ_tag = "stack" - slot = "vox_stack" + slot = "vox_stack" status = ORGAN_ROBOT vital = TRUE var/stackdamaged = FALSE From 1c748871248288a9414f24bf360e143443ddb820 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 10 Aug 2018 23:13:02 -0400 Subject: [PATCH 14/89] Adds a small bit of info the to the cyborg analyzer --- code/modules/mob/living/silicon/robot/component.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index b9f7505c70d..efc55db9117 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -252,7 +252,9 @@ if(!organ_found) to_chat(user, "No prosthetics located.") - if(H.isSynthetic() && H.bleed_rate) - to_chat(user, "Warning:Component leak detected!") + if(H.isSynthetic()) + to_chat(user, "Internal Fluid Level:[H.blood_volume]/[H.max_blood]") + if(H.bleed_rate) + to_chat(user, "Warning:External component leak detected!") src.add_fingerprint(user) From 17a5454fbc1cce63133f0dcdc70ba117b71a7a6b Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Tue, 4 Sep 2018 23:19:30 +0800 Subject: [PATCH 15/89] Port over three PRs from TG about component. --- code/__DEFINES/components.dm | 3 + code/_onclick/hud/screen_objects.dm | 2 +- code/_onclick/item_attack.dm | 2 +- code/controllers/subsystem/garbage.dm | 3 +- code/datums/components/README.md | 19 +++-- code/datums/components/_component.dm | 88 ++++++++++++++------ code/datums/components/material_container.dm | 8 +- code/datums/datum.dm | 14 ++++ code/game/atoms.dm | 2 +- 9 files changed, 99 insertions(+), 42 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 6f14b75b2ec..235071549bd 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -1,3 +1,5 @@ +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) + //shorthand #define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) #define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) @@ -13,6 +15,7 @@ // All signals. Format: // When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument // /datum signals #define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b61cb69e0e4..74080a908a5 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -167,7 +167,7 @@ if(master) var/obj/item/I = usr.get_active_hand() if(I) - master.attackby(I, usr, params) + master.attackby(null, I, usr, params) return 1 /obj/screen/zone_sel diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 0299a7ec2fc..78dde4e95f9 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -14,7 +14,7 @@ // No comment /atom/proc/attackby(obj/item/W, mob/user, params) - return SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params) + return SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) /obj/attackby(obj/item/I, mob/living/user, params) return ..() || (can_be_hit && I.attack_obj(src, user)) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 823294e4d4e..e81e90dd974 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -295,11 +295,12 @@ SUBSYSTEM_DEF(garbage) if(isnull(D.gc_destroyed)) - D.SendSignal(COMSIG_PARENT_QDELETED) + SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force) // Give the components a chance to prevent their parent from being deleted D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/start_tick = world.tick_usage var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy if(world.time != start_time) I.slept_destroy++ else diff --git a/code/datums/components/README.md b/code/datums/components/README.md index ee156e45525..4eecdce18ca 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -2,7 +2,7 @@ ## Concept -Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. +Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SEND_SIGNAL` call. Now every component that want's to can also know about this happening. ### In the code @@ -28,6 +28,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo 1. `COMPONENT_INCOMPATIBLE` Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. `parent` must not be modified if this is to be returned. + ### Vars 1. `/datum/var/list/datum_components` (private) @@ -61,6 +62,11 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise 1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)` * Shorthand for `var/component_type/varname = src.GetComponent(component_type)` +1. `SEND_SIGNAL(target, sigtype, ...)` (public, final) + * Use to send signals to target datum + * Extra arguments are to be specified in the signal definition + * Returns a bitflag with signal specific information assembled from all activated components + * Arguments are packaged in a list and handed off to _SendSignal() 1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final) * Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum @@ -77,10 +83,9 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Properly transfers ownership of a component from one datum to another * Signals `COMSIG_COMPONENT_REMOVING` on the parent * Called on the datum you want to own the component with another datum's component -1. `/datum/proc/SendSignal(signal, ...)` (public, final) - * Call to send a signal to the components of the target datum - * Extra arguments are to be specified in the signal definition - * Returns a bitflag with signal specific information assembled from all activated components +1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final) + * Handles most of the actual signaling procedure + * Will runtime if used on datums with an empty component list 1. `/datum/component/New(datum/parent, ...)` (private, final) * Runs internal setup for the component * Extra arguments are passed to `Initialize()` @@ -108,13 +113,13 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Clears `parent` and removes the component from it's component list 1. `/datum/component/proc/_JoinParent` (private, final) * Tries to add the component to it's `parent`s `datum_components` list -1. `/datum/component/proc/RegisterSignal(signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz) +1. `/datum/component/proc/RegisterSignal(datum/target, signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) * If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments * Makes a component listen for the specified `signal` on it's `parent` datum. * When that signal is recieved `proc_ref` will be called on the component, along with associated arguments * Example proc ref: `.proc/OnEvent` * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this * These callbacks run asyncronously - * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it + * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `_SendSignal()` that initiated it ### See/Define signals and their arguments in __DEFINES\components.dm diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 775a8667b3f..2b12d92937e 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -56,9 +56,10 @@ if(!force) _RemoveFromParent() if(!silent) - P.SendSignal(COMSIG_COMPONENT_REMOVING, src) + SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) parent = null - LAZYCLEARLIST(signal_procs) + for(var/target in signal_procs) + UnregisterSignal(target, signal_procs[target]) return ..() /datum/component/proc/_RemoveFromParent() @@ -77,26 +78,67 @@ if(!dc.len) P.datum_components = null -/datum/component/proc/RegisterSignal(sig_type_or_types, proc_or_callback, override = FALSE) - if(QDELETED(src)) +/datum/component/proc/RegisterSignal(datum/target, sig_type_or_types, proc_or_callback, override = FALSE) + if(QDELETED(src) || QDELETED(target)) return + var/list/procs = signal_procs if(!procs) - procs = list() - signal_procs = procs + signal_procs = procs = list() + if(!procs[target]) + procs[target] = list() + var/list/lookup = target.comp_lookup + if(!lookup) + target.comp_lookup = lookup = list() + + if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now + proc_or_callback = CALLBACK(src, proc_or_callback) var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types) for(var/sig_type in sig_types) - if(!override) - . = procs[sig_type] - if(.) - stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") + if(!override && procs[target][sig_type]) + stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") - if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now - proc_or_callback = CALLBACK(src, proc_or_callback) - procs[sig_type] = proc_or_callback + procs[target][sig_type] = proc_or_callback + if(!lookup[sig_type]) // Nothing has registered here yet + lookup[sig_type] = src + else if(lookup[sig_type] == src) // We already registered here + continue + else if(!length(lookup[sig_type])) // One other thing registered here + lookup[sig_type] = list(lookup[sig_type]=TRUE) + lookup[sig_type][src] = TRUE + else // Many other things have registered here + lookup[sig_type][src] = TRUE enabled = TRUE +/datum/component/proc/UnregisterSignal(datum/target, sig_type_or_types) + var/list/lookup = target.comp_lookup + if(!signal_procs || !signal_procs[target] || !lookup) + return + if(!islist(sig_type_or_types)) + sig_type_or_types = list(sig_type_or_types) + for(var/sig in sig_type_or_types) + switch(length(lookup[sig])) + if(2) + lookup[sig] = (lookup[sig]-src)[1] + if(1) + stack_trace("[target] ([target.type]) somehow has single length list inside comp_lookup") + if(src in lookup[sig]) + lookup -= sig + if(!length(lookup)) + target.comp_lookup = null + break + if(0) + lookup -= sig + if(!length(lookup)) + target.comp_lookup = null + break + else + lookup[sig] -= src + + signal_procs[target] -= sig_type_or_types + if(!signal_procs[target].len) + signal_procs -= target /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return @@ -121,28 +163,20 @@ current_type = type2parent(current_type) . += current_type -/datum/proc/SendSignal(sigtype, ...) - var/list/comps = datum_components - if(!comps) - return NONE - var/list/arguments = args.Copy(2) - var/target = comps[/datum/component] +/datum/proc/_SendSignal(sigtype, list/arguments) + var/target = comp_lookup[sigtype] if(!length(target)) var/datum/component/C = target if(!C.enabled) return NONE - var/datum/callback/CB = C.signal_procs[sigtype] - if(!CB) - return NONE + var/datum/callback/CB = C.signal_procs[src][sigtype] return CB.InvokeAsync(arglist(arguments)) . = NONE for(var/I in target) var/datum/component/C = I if(!C.enabled) continue - var/datum/callback/CB = C.signal_procs[sigtype] - if(!CB) - continue + var/datum/callback/CB = C.signal_procs[src][sigtype] . |= CB.InvokeAsync(arglist(arguments)) /datum/proc/GetComponent(c_type) @@ -224,7 +258,7 @@ new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy - SendSignal(COMSIG_COMPONENT_ADDED, new_comp) + SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) return new_comp return old_comp @@ -244,7 +278,7 @@ qdel(C) return C._RemoveFromParent() - helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) + SEND_SIGNAL(helicopter, COMSIG_COMPONENT_REMOVING, C) C.parent = src if(C == AddComponent(C)) C._JoinParent() diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index f08181cb5f4..4ae7d08f3ea 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -30,8 +30,8 @@ precondition = _precondition after_insert = _after_insert - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/OnExamine) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine) var/list/possible_mats = list() for(var/mat_type in subtypesof(/datum/material)) @@ -42,14 +42,14 @@ var/mat_path = possible_mats[id] materials[id] = new mat_path() -/datum/component/material_container/proc/OnExamine(mob/user) +/datum/component/material_container/proc/OnExamine(datum/source, mob/user) for(var/I in materials) var/datum/material/M = materials[I] var/amt = amount(M.id) if(amt) to_chat(user, "It has [amt] units of [lowertext(M.name)] stored.") -/datum/component/material_container/proc/OnAttackBy(obj/item/I, mob/living/user) +/datum/component/material_container/proc/OnAttackBy(datum/source, obj/item/I, mob/living/user) var/list/tc = allowed_typecache if(user.a_intent != INTENT_HELP) return diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 70c783d634e..2db8c0cad89 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -2,6 +2,7 @@ var/gc_destroyed //Time when this object was destroyed. var/list/active_timers //for SStimer var/list/datum_components //for /datum/components + var/list/comp_lookup var/var_edited = FALSE //Warranty void if seal is broken var/tmp/unique_datum_id = null @@ -37,6 +38,19 @@ qdel(C, FALSE, TRUE) dc.Cut() + var/list/lookup = comp_lookup + if(lookup) + for(var/sig in lookup) + var/list/comps = lookup[sig] + if(length(comps)) + for(var/i in comps) + var/datum/component/comp = i + comp.UnregisterSignal(src, sig) + else + var/datum/component/comp = comps + comp.UnregisterSignal(src, sig) + comp_lookup = lookup = null + return QDEL_HINT_QUEUE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3c541a308ff..c0da13073fd 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -283,7 +283,7 @@ else to_chat(user, "Nothing.") - SendSignal(COMSIG_PARENT_EXAMINE, user) + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) return distance == -1 || (get_dist(src, user) <= distance) || isobserver(user) //observers do not have a range limit From 4d924f7c97c25934d45318589011717ba84b4902 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Wed, 5 Sep 2018 17:03:43 +0800 Subject: [PATCH 16/89] fix --- code/datums/components/_component.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 2b12d92937e..7621828d970 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -81,7 +81,7 @@ /datum/component/proc/RegisterSignal(datum/target, sig_type_or_types, proc_or_callback, override = FALSE) if(QDELETED(src) || QDELETED(target)) return - + var/list/procs = signal_procs if(!procs) signal_procs = procs = list() @@ -90,7 +90,7 @@ var/list/lookup = target.comp_lookup if(!lookup) target.comp_lookup = lookup = list() - + if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now proc_or_callback = CALLBACK(src, proc_or_callback) @@ -105,7 +105,7 @@ else if(lookup[sig_type] == src) // We already registered here continue else if(!length(lookup[sig_type])) // One other thing registered here - lookup[sig_type] = list(lookup[sig_type]=TRUE) + lookup[sig_type] = list(lookup[sig_type]=TRUE) lookup[sig_type][src] = TRUE else // Many other things have registered here lookup[sig_type][src] = TRUE @@ -137,7 +137,7 @@ lookup[sig] -= src signal_procs[target] -= sig_type_or_types - if(!signal_procs[target].len) + if(length(signal_procs[target])) signal_procs -= target /datum/component/proc/InheritComponent(datum/component/C, i_am_original) From c86bb1773920159a8ad5ef8129bd54eb838f670d Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sun, 9 Sep 2018 17:11:13 +0800 Subject: [PATCH 17/89] 511 compatibility horror. --- code/controllers/subsystem/garbage.dm | 11 +++++++++-- code/datums/components/_component.dm | 18 +++++++++++++++--- code/game/atoms.dm | 7 +++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index e81e90dd974..a2a65683d72 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -282,6 +282,8 @@ SUBSYSTEM_DEF(garbage) qdel(D, force) #endif +/proc/KillMeIn512(sendsignal) + return 1 // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force = FALSE, ...) @@ -295,12 +297,17 @@ SUBSYSTEM_DEF(garbage) if(isnull(D.gc_destroyed)) - SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force) // Give the components a chance to prevent their parent from being deleted + #if DM_VERSION > 511 + #warn Remove the garbage bypass code below + #endif + var/Removein512 = SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force) // Give the components a chance to prevent their parent from being deleted + KillMeIn512(Removein512) D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/start_tick = world.tick_usage var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. - SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy + var/Removein512too = SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy + KillMeIn512(Removein512too) if(world.time != start_time) I.slept_destroy++ else diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 7621828d970..43fa6f23f78 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -56,7 +56,11 @@ if(!force) _RemoveFromParent() if(!silent) - SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) + #if DM_VERSION > 511 + #warn Remove the garbage bypass code below + #endif + var/Removein512 = SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) + KillMeIn512(Removein512) parent = null for(var/target in signal_procs) UnregisterSignal(target, signal_procs[target]) @@ -258,7 +262,11 @@ new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy - SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) + #if DM_VERSION > 511 + #warn Remove the garbage bypass code below + #endif + var/Removein512 = SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) + KillMeIn512(Removein512) return new_comp return old_comp @@ -278,7 +286,11 @@ qdel(C) return C._RemoveFromParent() - SEND_SIGNAL(helicopter, COMSIG_COMPONENT_REMOVING, C) + #if DM_VERSION > 511 + #warn Remove the garbage bypass code below + #endif + var/Removein512 = SEND_SIGNAL(helicopter, COMSIG_COMPONENT_REMOVING, C) + KillMeIn512(Removein512) C.parent = src if(C == AddComponent(C)) C._JoinParent() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c0da13073fd..94fc46d463b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -282,8 +282,11 @@ to_chat(user, "[reagents.total_volume] units of various reagents.") else to_chat(user, "Nothing.") - - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) + #if DM_VERSION > 511 + #warn Remove the garbage bypass code below + #endif + var/Removein512 = SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) + KillMeIn512(Removein512) return distance == -1 || (get_dist(src, user) <= distance) || isobserver(user) //observers do not have a range limit From 45c61f599abc4126da482af8b0e7618870832837 Mon Sep 17 00:00:00 2001 From: Purpose Date: Mon, 15 Oct 2018 22:45:52 +0100 Subject: [PATCH 18/89] arrays start at 0 damnit --- code/controllers/subsystem/timer.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index e2539ebdf06..20ab9d47e0c 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -122,7 +122,7 @@ SUBSYSTEM_DEF(timer) if(!resumed) timer = null - while(practical_offset <= BUCKET_LEN && head_offset + (practical_offset*world.tick_lag) <= world.time) + while(practical_offset <= BUCKET_LEN && head_offset + ((practical_offset-1)*world.tick_lag) <= world.time) var/datum/timedevent/head = bucket_list[practical_offset] if(!timer || !head || timer == head) head = bucket_list[practical_offset] @@ -170,7 +170,7 @@ SUBSYSTEM_DEF(timer) qdel(timer) continue - if(timer.timeToRun < head_offset + TICKS2DS(practical_offset)) + if(timer.timeToRun < head_offset + TICKS2DS(practical_offset-1)) bucket_resolution = null //force bucket recreation CRASH("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") if(timer.callBack && !timer.spent) @@ -521,4 +521,4 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX \ No newline at end of file +#undef TIMER_ID_MAX From 75fdf0095d3f2d9e189f3cf9d476eb18ac77cd26 Mon Sep 17 00:00:00 2001 From: Purpose Date: Thu, 18 Oct 2018 20:54:22 +0100 Subject: [PATCH 19/89] more --- code/controllers/subsystem/timer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 20ab9d47e0c..2a25c3d05a9 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -1,5 +1,5 @@ #define BUCKET_LEN (world.fps*1*60) //how many ticks should we keep in the bucket. (1 minutes worth) -#define BUCKET_POS(timer) ((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag) % BUCKET_LEN)||BUCKET_LEN) +#define BUCKET_POS(timer) (((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) #define TIMER_MAX (world.time + TICKS2DS(min(BUCKET_LEN-(SStimer.practical_offset-DS2TICKS(world.time - SStimer.head_offset))-1, BUCKET_LEN-1))) #define TIMER_ID_MAX (2**24) //max float with integer precision From bbdd501fe01999ca38b27bb1f62b6e53e2f31392 Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sat, 20 Oct 2018 22:56:29 +0200 Subject: [PATCH 20/89] teslium and liquid dark matter --- .../reagents/chemistry/recipes/pyrotechnics.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index b08e96a8d9e..3901bdffc3e 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -97,9 +97,9 @@ /datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume) if(holder.has_reagent("stabilizing_agent")) return - holder.remove_reagent("sorium", created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, 5, 6) + goonchem_vortex(T, 1, round(created_volume / 33), round(created_volume / 25)) + holder.remove_reagent("sorium", created_volume) /datum/chemical_reaction/sorium_vortex name = "sorium_vortex" @@ -110,7 +110,7 @@ /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, 5, 6) + goonchem_vortex(T, 1, round(created_volume / 33), round(created_volume / 25)) /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" @@ -121,10 +121,10 @@ /datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume) if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("liquid_dark_matter", created_volume) + return FALSE var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, 5, 6) + goonchem_vortex(T, 0, round(created_volume / 33), round(created_volume / 25)) + holder.remove_reagent("liquid_dark_matter", created_volume) /datum/chemical_reaction/ldm_vortex name = "LDM Vortex" @@ -135,7 +135,7 @@ /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, 5, 6) + goonchem_vortex(T, 0, round(created_volume / 33), round(created_volume / 25)) /datum/chemical_reaction/blackpowder name = "Black Powder" @@ -411,9 +411,9 @@ datum/chemical_reaction/flash_powder /datum/chemical_reaction/shock_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - for(var/mob/living/carbon/C in view(6, T)) + for(var/mob/living/carbon/C in view(max(1, round(created_volume / 3)), T)) C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results. - C.electrocute_act(3.5, "electrical blast") + C.electrocute_act(max(1, round(created_volume / 5)), "electrical blast") holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. holder.del_reagent("uranium") From 17ecbdcfc558f2e92ab931aadfcfb50fddd8c3a1 Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sat, 20 Oct 2018 23:43:13 +0200 Subject: [PATCH 21/89] removed FALSE --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 3901bdffc3e..ffd89d6419e 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -121,7 +121,7 @@ /datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume) if(holder.has_reagent("stabilizing_agent")) - return FALSE + return var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 0, round(created_volume / 33), round(created_volume / 25)) holder.remove_reagent("liquid_dark_matter", created_volume) From 93f48eced0b638297b4a8f2d74ccef1aa640190f Mon Sep 17 00:00:00 2001 From: Dave Date: Sat, 20 Oct 2018 20:50:41 -0400 Subject: [PATCH 22/89] Fixes Fancy Table Smoothing --- icons/obj/smooth_structures/fancy_table.dmi | Bin 9243 -> 9420 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/smooth_structures/fancy_table.dmi b/icons/obj/smooth_structures/fancy_table.dmi index 401452360acb950ab411cdce78f5d71572f5d29f..c675550ed5a8a819e66f02193a21bd80aecfaa30 100644 GIT binary patch literal 9420 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 literal 9243 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 QeA@?5l2el{lQs_dUt5dD%K!iX From 2f2546e3c019112b127381e5fd59c58be47dda29 Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sun, 21 Oct 2018 14:33:28 +0200 Subject: [PATCH 23/89] Cap it, instead of trying to do magic. --- .../reagents/chemistry/recipes/pyrotechnics.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index ffd89d6419e..720a897b3ab 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -98,7 +98,7 @@ if(holder.has_reagent("stabilizing_agent")) return var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, round(created_volume / 33), round(created_volume / 25)) + goonchem_vortex(T, 1, min(10, created_volume), min(12, round(created_volume * 2))) holder.remove_reagent("sorium", created_volume) /datum/chemical_reaction/sorium_vortex @@ -110,7 +110,7 @@ /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, round(created_volume / 33), round(created_volume / 25)) + goonchem_vortex(T, 1, min(10, created_volume), min(12, round(created_volume * 2))) /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" @@ -123,7 +123,7 @@ if(holder.has_reagent("stabilizing_agent")) return var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, round(created_volume / 33), round(created_volume / 25)) + goonchem_vortex(T, 0, min(10, created_volume), min(12, round(created_volume * 2))) holder.remove_reagent("liquid_dark_matter", created_volume) /datum/chemical_reaction/ldm_vortex @@ -135,7 +135,7 @@ /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, round(created_volume / 33), round(created_volume / 25)) + goonchem_vortex(T, 0, min(10, created_volume), min(12, round(created_volume * 2))) /datum/chemical_reaction/blackpowder name = "Black Powder" @@ -411,9 +411,9 @@ datum/chemical_reaction/flash_powder /datum/chemical_reaction/shock_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - for(var/mob/living/carbon/C in view(max(1, round(created_volume / 3)), T)) + for(var/mob/living/carbon/C in view(min(12, round(created_volume * 2)), T)) C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results. - C.electrocute_act(max(1, round(created_volume / 5)), "electrical blast") + C.electrocute_act(min(7, created_volume, "electrical blast") holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. holder.del_reagent("uranium") From b6632428e07bffc6b8623c5a402a32346f239633 Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sun, 21 Oct 2018 14:42:00 +0200 Subject: [PATCH 24/89] actually closed min(). oops. --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 720a897b3ab..3b31bf8822a 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -413,7 +413,7 @@ datum/chemical_reaction/flash_powder var/turf/T = get_turf(holder.my_atom) for(var/mob/living/carbon/C in view(min(12, round(created_volume * 2)), T)) C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results. - C.electrocute_act(min(7, created_volume, "electrical blast") + C.electrocute_act(min(7, created_volume), "electrical blast") holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. holder.del_reagent("uranium") From 0dc7b39740b2b1aa25c2aec57b6640ec93455a52 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Sun, 21 Oct 2018 21:54:50 +0800 Subject: [PATCH 25/89] Remove 511 compatibility things --- code/controllers/subsystem/garbage.dm | 8 +------- code/datums/components/_component.dm | 18 +++--------------- code/game/atoms.dm | 6 +----- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index c9521a4f3c3..457ea9513ab 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -248,8 +248,6 @@ SUBSYSTEM_DEF(garbage) qdel(D, force) #endif -/proc/KillMeIn512(sendsignal) - return 1 // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force = FALSE, ...) @@ -263,17 +261,13 @@ SUBSYSTEM_DEF(garbage) if(isnull(D.gc_destroyed)) - #if DM_VERSION > 511 - #warn Remove the garbage bypass code below - #endif if(SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force)) // Give the components a chance to prevent their parent from being deleted return D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/start_tick = world.tick_usage var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. - var/Removein512too = SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy - KillMeIn512(Removein512too) + SEND_SIGNAL(D, COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy if(world.time != start_time) I.slept_destroy++ else diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 43fa6f23f78..7621828d970 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -56,11 +56,7 @@ if(!force) _RemoveFromParent() if(!silent) - #if DM_VERSION > 511 - #warn Remove the garbage bypass code below - #endif - var/Removein512 = SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) - KillMeIn512(Removein512) + SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) parent = null for(var/target in signal_procs) UnregisterSignal(target, signal_procs[target]) @@ -262,11 +258,7 @@ new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy - #if DM_VERSION > 511 - #warn Remove the garbage bypass code below - #endif - var/Removein512 = SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) - KillMeIn512(Removein512) + SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) return new_comp return old_comp @@ -286,11 +278,7 @@ qdel(C) return C._RemoveFromParent() - #if DM_VERSION > 511 - #warn Remove the garbage bypass code below - #endif - var/Removein512 = SEND_SIGNAL(helicopter, COMSIG_COMPONENT_REMOVING, C) - KillMeIn512(Removein512) + SEND_SIGNAL(helicopter, COMSIG_COMPONENT_REMOVING, C) C.parent = src if(C == AddComponent(C)) C._JoinParent() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b3be386ff7f..3d2ce12268b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -290,11 +290,7 @@ to_chat(user, "[reagents.total_volume] units of various reagents.") else to_chat(user, "Nothing.") - #if DM_VERSION > 511 - #warn Remove the garbage bypass code below - #endif - var/Removein512 = SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) - KillMeIn512(Removein512) + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) return distance == -1 || (get_dist(src, user) <= distance) || isobserver(user) //observers do not have a range limit From 437d192d2ff56297fb448262b277bfaa1ec7d25b Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sun, 21 Oct 2018 16:21:52 +0200 Subject: [PATCH 26/89] Revert electrocute_act --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 3b31bf8822a..15ce01da5dd 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -413,7 +413,7 @@ datum/chemical_reaction/flash_powder var/turf/T = get_turf(holder.my_atom) for(var/mob/living/carbon/C in view(min(12, round(created_volume * 2)), T)) C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results. - C.electrocute_act(min(7, created_volume), "electrical blast") + C.electrocute_act(3.5, "electrical blast") holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. holder.del_reagent("uranium") From 90451e8a9549846b1941497577b817ac8b2a8425 Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sun, 21 Oct 2018 16:26:23 +0200 Subject: [PATCH 27/89] Maintains ratio of vortexes --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 15ce01da5dd..f531e597a03 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -98,7 +98,7 @@ if(holder.has_reagent("stabilizing_agent")) return var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, min(10, created_volume), min(12, round(created_volume * 2))) + goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume++)) holder.remove_reagent("sorium", created_volume) /datum/chemical_reaction/sorium_vortex @@ -110,7 +110,7 @@ /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, min(10, created_volume), min(12, round(created_volume * 2))) + goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume++)) /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" @@ -123,7 +123,7 @@ if(holder.has_reagent("stabilizing_agent")) return var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, min(10, created_volume), min(12, round(created_volume * 2))) + goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume++)) holder.remove_reagent("liquid_dark_matter", created_volume) /datum/chemical_reaction/ldm_vortex @@ -135,7 +135,7 @@ /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, min(10, created_volume), min(12, round(created_volume * 2))) + goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume++)) /datum/chemical_reaction/blackpowder name = "Black Powder" From a7715c7d1f6646c46bd887e0b242d3d9e07c3b5e Mon Sep 17 00:00:00 2001 From: lass9030 Date: Sun, 21 Oct 2018 16:28:42 +0200 Subject: [PATCH 28/89] shock reach is now max 8 --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index f531e597a03..ff8e995822e 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -411,7 +411,7 @@ datum/chemical_reaction/flash_powder /datum/chemical_reaction/shock_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - for(var/mob/living/carbon/C in view(min(12, round(created_volume * 2)), T)) + for(var/mob/living/carbon/C in view(min(8, round(created_volume * 2)), T)) C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results. C.electrocute_act(3.5, "electrical blast") holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. From f8958af68bcbb3c5f6a0c21788018c07aa82e3a0 Mon Sep 17 00:00:00 2001 From: Purpose Date: Sun, 21 Oct 2018 16:11:59 +0100 Subject: [PATCH 29/89] removes some empty icon files --- icons/mob/species/armalis/mask.dmi | 0 icons/obj/gate.dmi | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/mob/species/armalis/mask.dmi delete mode 100644 icons/obj/gate.dmi diff --git a/icons/mob/species/armalis/mask.dmi b/icons/mob/species/armalis/mask.dmi deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/icons/obj/gate.dmi b/icons/obj/gate.dmi deleted file mode 100644 index e69de29bb2d..00000000000 From cc4a245f97e7f25b02c31902f60d6a1a50c8e77f Mon Sep 17 00:00:00 2001 From: Purpose Date: Sun, 21 Oct 2018 16:22:42 +0100 Subject: [PATCH 30/89] Doesn't exist --- code/modules/clothing/masks/breath.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index b47856fb38c..55c305cf449 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -10,10 +10,9 @@ permeability_coefficient = 0.50 actions_types = list(/datum/action/item_action/adjust) burn_state = FIRE_PROOF - species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin", "Grey" ) + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey" ) sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', - "Vox Armalis" = 'icons/mob/species/armalis/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', From 01fa39a5e66ef81d09a35dd5172ff38aacb52027 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 21 Oct 2018 12:04:13 -0400 Subject: [PATCH 31/89] Helps Reagents GC Better --- code/modules/reagents/chemistry/holder.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 4a6bf2bdcb1..cbe8c43b936 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -764,5 +764,7 @@ var/const/INGEST = 2 processing_objects -= src QDEL_LIST(reagent_list) reagent_list = null + QDEL_LIST(addiction_list) + addiction_list = null if(my_atom && my_atom.reagents == src) my_atom.reagents = null From 00e3d2c097fbb264d3b9fffdcd2b751adc71c7bf Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 21 Oct 2018 12:09:45 -0400 Subject: [PATCH 32/89] uhhhhhh --- code/modules/mob/living/living.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 591c62ff862..2a384dec214 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -333,7 +333,7 @@ /mob/living/is_injectable(allowmobs = TRUE) return (allowmobs && reagents && can_inject()) - + /mob/living/is_drawable(allowmobs = TRUE) return (allowmobs && reagents && can_inject()) @@ -365,9 +365,8 @@ C.update_inv_legcuffed() if(C.reagents) - for(var/datum/reagent/R in C.reagents.reagent_list) - C.reagents.clear_reagents() - C.reagents.addiction_list.Cut() + C.reagents.clear_reagents() + QDEL_LIST(C.reagents.addiction_list) // rejuvenate: Called by `revive` to get the mob into a revivable state // the admin "rejuvenate" command calls `revive`, not this proc. From 1378705c4b46b5f0a3d1112854fb51e8191b728c Mon Sep 17 00:00:00 2001 From: Purpose Date: Sun, 21 Oct 2018 17:34:03 +0100 Subject: [PATCH 33/89] removes a revolution spawn --- code/game/gamemodes/revolution/revolution.dm | 23 +++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 11baf813890..2a5652df389 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -51,9 +51,9 @@ lenin.restricted_roles = restricted_jobs if(head_revolutionaries.len < required_enemies) - return 0 + return FALSE - return 1 + return TRUE /datum/game_mode/revolution/post_setup() @@ -72,10 +72,7 @@ for(var/datum/mind/head_mind in heads) mark_for_death(rev_mind, head_mind) - spawn(rand(10,100)) - // equip_traitor(rev_mind.current, 1) //changing how revs get assigned their uplink so they can get PDA uplinks. --NEO - // Removing revolutionary uplinks. -Pete - equip_revolutionary(rev_mind.current) + addtimer(CALLBACK(src, .proc/equip_revolutionary, rev_mind.current), rand(10, 100)) for(var/datum/mind/rev_mind in head_revolutionaries) greet_revolutionary(rev_mind) @@ -92,7 +89,7 @@ check_heads() ticker.mode.check_win() check_counter = 0 - return 0 + return FALSE /datum/game_mode/proc/forge_revolutionary_objectives(datum/mind/rev_mind) @@ -223,7 +220,7 @@ command_announcement.Announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg') return ..() if(finished != 0) - return 1 + return TRUE else return ..() @@ -304,9 +301,9 @@ for(var/datum/mind/rev_mind in head_revolutionaries) for(var/datum/objective/mutiny/objective in rev_mind.objectives) if(!(objective.check_completion())) - return 0 + return FALSE - return 1 + return TRUE ///////////////////////////// //Checks for a head victory// @@ -316,8 +313,8 @@ var/turf/T = get_turf(rev_mind.current) if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != DEAD) && rev_mind.current.client && T && is_station_level(T.z)) if(ishuman(rev_mind.current)) - return 0 - return 1 + return FALSE + return TRUE ////////////////////////////////////////////////////////////////////// //Announces the end of the game with all relavent information stated// @@ -330,7 +327,7 @@ feedback_set_details("round_end_result","loss - rev heads killed") to_chat(world, "The heads of staff managed to stop the revolution!") ..() - return 1 + return TRUE /datum/game_mode/proc/auto_declare_completion_revolution() var/list/targets = list() From 4cda6d009d17cae61cd8e91f8c7c80aac509796b Mon Sep 17 00:00:00 2001 From: Purpose Date: Sun, 21 Oct 2018 17:42:13 +0100 Subject: [PATCH 34/89] Removes unused proc --- code/game/gamemodes/nuclear/nuclear.dm | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 552f9ab7063..6a25349423a 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -168,10 +168,6 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code) var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - /* - spawn(1) - NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen - */ synd_mind.current.real_name = "[syndicate_name()] Team [leader_title]" to_chat(synd_mind.current, "You are the Syndicate leader for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") @@ -407,15 +403,6 @@ proc/issyndicate(mob/living/M as mob) return newname -/proc/NukeNameAssign(var/lastname,var/list/syndicates) - for(var/datum/mind/synd_mind in syndicates) - switch(synd_mind.current.gender) - if(MALE) - synd_mind.name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" - if(FEMALE) - synd_mind.name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" - synd_mind.current.real_name = synd_mind.name - return /datum/game_mode/nuclear/set_scoreboard_gvars() var/foecount = 0 From ecb466507efde733e32b772eb123ff30663d930a Mon Sep 17 00:00:00 2001 From: Purpose Date: Sun, 21 Oct 2018 18:23:55 +0100 Subject: [PATCH 35/89] super important --- code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index 0d0573e3760..56fcab49293 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -60,7 +60,7 @@ /datum/SDQL_parser/proc/parse_error(error_message) error = 1 - to_chat(usr, "SQDL2 Parsing Error: [error_message]") + to_chat(usr, "SDQL2 Parsing Error: [error_message]") return query.len + 1 /datum/SDQL_parser/proc/parse() From b5e8e5e88f73b0042608b3f7c31620e530da1505 Mon Sep 17 00:00:00 2001 From: Certhic Date: Sun, 21 Oct 2018 20:41:32 +0200 Subject: [PATCH 36/89] fix: autopsy scanner unresponsiveness --- code/game/objects/items/devices/autopsy.dm | 147 +++++++++--------- code/modules/surgery/organs/organ.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 2 + 3 files changed, 76 insertions(+), 75 deletions(-) diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index f5aa02d6eb4..f0e85af177e 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -41,38 +41,37 @@ W.time_inflicted = time_inflicted return W -/obj/item/autopsy_scanner/proc/add_data(obj/item/organ/external/O) - if(!O.autopsy_data.len && !O.trace_chemicals.len) - return +/obj/item/autopsy_scanner/proc/add_data(obj/item/organ/O) + if(O.autopsy_data.len) + for(var/V in O.autopsy_data) + var/datum/autopsy_data/W = O.autopsy_data[V] - for(var/V in O.autopsy_data) - var/datum/autopsy_data/W = O.autopsy_data[V] - - if(!W.pretend_weapon) - if(1) - W.pretend_weapon = W.weapon - else - W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet") + if(!W.pretend_weapon) + if(1) + W.pretend_weapon = W.weapon + else + W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet") - var/datum/autopsy_data_scanner/D = wdata[V] - if(!D) - D = new() - D.weapon = W.weapon - wdata[V] = D + var/datum/autopsy_data_scanner/D = wdata[V] + if(!D) + D = new() + D.weapon = W.weapon + wdata[V] = D - if(!D.organs_scanned[O.name]) - if(D.organ_names == "") - D.organ_names = O.name - else - D.organ_names += ", [O.name]" + if(!D.organs_scanned[O.name]) + if(D.organ_names == "") + D.organ_names = O.name + else + D.organ_names += ", [O.name]" - qdel(D.organs_scanned[O.name]) - D.organs_scanned[O.name] = W.copy() + qdel(D.organs_scanned[O.name]) + D.organs_scanned[O.name] = W.copy() - for(var/V in O.trace_chemicals) - if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V)) - chemtraces += V + if(O.trace_chemicals.len) + for(var/V in O.trace_chemicals) + if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V)) + chemtraces += V /obj/item/autopsy_scanner/attackby(obj/item/P, mob/user) if(istype(P, /obj/item/pen)) @@ -90,71 +89,71 @@ user.put_in_hands(R) /obj/item/autopsy_scanner/attack_self(mob/user) - if(!wdata.len && !chemtraces.len) - return - var/scan_data = "" if(timeofdeath) scan_data += "Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]

    " + else + scan_data += "Time of death: Unknown / Still alive

    " - var/n = 1 - for(var/wdata_idx in wdata) - var/datum/autopsy_data_scanner/D = wdata[wdata_idx] - var/total_hits = 0 - var/total_score = 0 - var/list/weapon_chances = list() // maps weapon names to a score - var/age = 0 + if(wdata.len) + var/n = 1 + for(var/wdata_idx in wdata) + var/datum/autopsy_data_scanner/D = wdata[wdata_idx] + var/total_hits = 0 + var/total_score = 0 + var/list/weapon_chances = list() // maps weapon names to a score + var/age = 0 - for(var/wound_idx in D.organs_scanned) - var/datum/autopsy_data/W = D.organs_scanned[wound_idx] - total_hits += W.hits + for(var/wound_idx in D.organs_scanned) + var/datum/autopsy_data/W = D.organs_scanned[wound_idx] + total_hits += W.hits - var/wname = W.pretend_weapon + var/wname = W.pretend_weapon - if(wname in weapon_chances) - weapon_chances[wname] += W.damage - else - weapon_chances[wname] = max(W.damage, 1) - total_score+=W.damage + if(wname in weapon_chances) + weapon_chances[wname] += W.damage + else + weapon_chances[wname] = max(W.damage, 1) + total_score+=W.damage - var/wound_age = W.time_inflicted - age = max(age, wound_age) + var/wound_age = W.time_inflicted + age = max(age, wound_age) - var/damage_desc + var/damage_desc - var/damaging_weapon = (total_score != 0) + var/damaging_weapon = (total_score != 0) - // total score happens to be the total damage - switch(total_score) - if(0) - damage_desc = "Unknown" - if(1 to 5) - damage_desc = "negligible" - if(5 to 15) - damage_desc = "light" - if(15 to 30) - damage_desc = "moderate" - if(30 to 1000) - damage_desc = "severe" + // total score happens to be the total damage + switch(total_score) + if(0) + damage_desc = "Unknown" + if(1 to 5) + damage_desc = "negligible" + if(5 to 15) + damage_desc = "light" + if(15 to 30) + damage_desc = "moderate" + if(30 to 1000) + damage_desc = "severe" - if(!total_score) - total_score = D.organs_scanned.len + if(!total_score) + total_score = D.organs_scanned.len - scan_data += "Weapon #[n]
    " - if(damaging_weapon) - scan_data += "Severity: [damage_desc]
    " - scan_data += "Hits by weapon: [total_hits]
    " - scan_data += "Approximate time of wound infliction: [station_time_timestamp("hh:mm", age)]
    " - scan_data += "Affected limbs: [D.organ_names]
    " - scan_data += "Possible weapons:
    " - for(var/weapon_name in weapon_chances) - scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]
    " + scan_data += "Weapon #[n]
    " + if(damaging_weapon) + scan_data += "Severity: [damage_desc]
    " + scan_data += "Hits by weapon: [total_hits]
    " + scan_data += "Approximate time of wound infliction: [station_time_timestamp("hh:mm", age)]
    " + scan_data += "Affected limbs: [D.organ_names]
    " + scan_data += "Possible weapons:
    " + for(var/weapon_name in weapon_chances) + scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]
    " - scan_data += "
    " + scan_data += "
    " - n++ + n++ if(chemtraces.len) scan_data += "Trace Chemicals:
    " diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 991a5d252ce..a6165c77f41 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -203,7 +203,7 @@ // Let's not drag this on, medbay has only so much antibiotics //Adds autopsy data for used_weapon. -/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage) +/obj/item/organ/proc/add_autopsy_data(var/used_weapon = "Unknown", var/damage) var/datum/autopsy_data/W = autopsy_data[used_weapon] if(!W) W = new() diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 74d498704aa..f39967cc3a2 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -175,6 +175,8 @@ owner.handle_splints() if(used_weapon) add_autopsy_data("[used_weapon]", brute + burn) + else + add_autopsy_data(null, brute + burn) // Make sure we don't exceed the maximum damage a limb can take before dismembering if((brute_dam + burn_dam + brute + burn) < max_damage) From e8597c897d6608b06b7d56c7cab40244574e1cec Mon Sep 17 00:00:00 2001 From: Certhic Date: Sun, 21 Oct 2018 21:04:01 +0200 Subject: [PATCH 37/89] removed unused pretend weapon code --- code/game/objects/items/devices/autopsy.dm | 33 +++------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index f0e85af177e..65afc0f64ef 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -27,7 +27,6 @@ /datum/autopsy_data var/weapon = null - var/pretend_weapon = null var/damage = 0 var/hits = 0 var/time_inflicted = 0 @@ -35,7 +34,6 @@ /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 @@ -46,13 +44,6 @@ for(var/V in O.autopsy_data) var/datum/autopsy_data/W = O.autopsy_data[V] - if(!W.pretend_weapon) - if(1) - W.pretend_weapon = W.weapon - else - W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet") - - var/datum/autopsy_data_scanner/D = wdata[V] if(!D) D = new() @@ -102,19 +93,11 @@ var/datum/autopsy_data_scanner/D = wdata[wdata_idx] var/total_hits = 0 var/total_score = 0 - var/list/weapon_chances = list() // maps weapon names to a score var/age = 0 for(var/wound_idx in D.organs_scanned) var/datum/autopsy_data/W = D.organs_scanned[wound_idx] total_hits += W.hits - - var/wname = W.pretend_weapon - - if(wname in weapon_chances) - weapon_chances[wname] += W.damage - else - weapon_chances[wname] = max(W.damage, 1) total_score+=W.damage @@ -122,13 +105,8 @@ age = max(age, wound_age) var/damage_desc - - var/damaging_weapon = (total_score != 0) - // total score happens to be the total damage switch(total_score) - if(0) - damage_desc = "Unknown" if(1 to 5) damage_desc = "negligible" if(5 to 15) @@ -137,20 +115,17 @@ damage_desc = "moderate" if(30 to 1000) damage_desc = "severe" + else + damage_desc = "Unknown" - if(!total_score) - total_score = D.organs_scanned.len - + var/damaging_weapon = (total_score != 0) scan_data += "Weapon #[n]
    " if(damaging_weapon) scan_data += "Severity: [damage_desc]
    " scan_data += "Hits by weapon: [total_hits]
    " scan_data += "Approximate time of wound infliction: [station_time_timestamp("hh:mm", age)]
    " scan_data += "Affected limbs: [D.organ_names]
    " - scan_data += "Possible weapons:
    " - for(var/weapon_name in weapon_chances) - scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]
    " - + scan_data += "Weapon: [D.weapon]
    " scan_data += "
    " n++ From 882861ce133ab39559af22c895c42162a66690cc Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 18:58:26 -0400 Subject: [PATCH 38/89] Automatic changelog generation for PR #9937 [ci skip] --- html/changelogs/AutoChangeLog-pr-9937.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9937.yml diff --git a/html/changelogs/AutoChangeLog-pr-9937.yml b/html/changelogs/AutoChangeLog-pr-9937.yml new file mode 100644 index 00000000000..a183418e3cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9937.yml @@ -0,0 +1,4 @@ +author: "Purpose" +delete-after: True +changes: + - rscdel: "Removes some empty icon files." From 34aaccbd7ed5856cac1bbb11122f5fe96afb363d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 19:07:39 -0400 Subject: [PATCH 39/89] Automatic changelog generation for PR #9870 [ci skip] --- html/changelogs/AutoChangeLog-pr-9870.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9870.yml diff --git a/html/changelogs/AutoChangeLog-pr-9870.yml b/html/changelogs/AutoChangeLog-pr-9870.yml new file mode 100644 index 00000000000..6c99e0a2201 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9870.yml @@ -0,0 +1,4 @@ +author: "MrStonedOne" +delete-after: True +changes: + - bugfix: "Fixes a cause of lag in the Timer subsystem" From 03beafe59147ad7a75727b5c382b3adc4c4bdce3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 21 Oct 2018 19:10:46 -0400 Subject: [PATCH 40/89] Automatic changelog generation for PR #9940 [ci skip] --- html/changelogs/AutoChangeLog-pr-9940.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9940.yml diff --git a/html/changelogs/AutoChangeLog-pr-9940.yml b/html/changelogs/AutoChangeLog-pr-9940.yml new file mode 100644 index 00000000000..aa5e4509522 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9940.yml @@ -0,0 +1,4 @@ +author: "Purpose" +delete-after: True +changes: + - rscdel: "Removes unused code in Nuclear gamemode." From 522cc3c3e3475f751a30dde90583355008adc145 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 22 Oct 2018 03:45:50 +0000 Subject: [PATCH 41/89] Automatic changelog compile, [ci skip] --- html/changelog.html | 11 +++++++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-9870.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9937.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9940.yml | 4 ---- 5 files changed, 17 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9870.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9937.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9940.yml diff --git a/html/changelog.html b/html/changelog.html index 11cff1b1270..9a3e6210dc6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,17 @@ -->
    +

    22 October 2018

    +

    MrStonedOne updated:

    +
      +
    • Fixes a cause of lag in the Timer subsystem
    • +
    +

    Purpose updated:

    +
      +
    • Removes unused code in Nuclear gamemode.
    • +
    • Removes some empty icon files.
    • +
    +

    21 October 2018

    Alonefromhell updated: