From 37ea59108715ca417562d8f35f37ee40fdcd397b Mon Sep 17 00:00:00 2001 From: DZD Date: Wed, 23 Sep 2015 13:00:58 -0400 Subject: [PATCH 01/69] Shadowling, changeling, and vision fixes/changes --- code/datums/vision_override.dm | 16 ++++++++++++ .../gamemodes/changeling/changeling_power.dm | 3 +++ .../gamemodes/changeling/evolution_menu.dm | 6 +++-- .../changeling/powers/augmented_eyesight.dm | 15 +++++------ code/game/gamemodes/shadowling/shadowling.dm | 7 +++--- .../shadowling/shadowling_abilities.dm | 25 +++++++++---------- .../gamemodes/shadowling/shadowling_items.dm | 6 +---- .../special_shadowling_abilities.dm | 4 ++- code/game/machinery/flasher.dm | 3 +++ code/game/objects/items/devices/flash.dm | 5 ++++ .../objects/items/devices/laserpointer.dm | 2 ++ .../items/weapons/grenades/flashbang.dm | 12 +++++++-- .../mob/living/carbon/human/human_defines.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 20 +++++++++------ code/modules/mob/mob_defines.dm | 5 +++- paradise.dme | 1 + 16 files changed, 87 insertions(+), 45 deletions(-) create mode 100644 code/datums/vision_override.dm diff --git a/code/datums/vision_override.dm b/code/datums/vision_override.dm new file mode 100644 index 00000000000..a634a77f6fb --- /dev/null +++ b/code/datums/vision_override.dm @@ -0,0 +1,16 @@ +/datum/vision_override + var/name = "vision override" + var/see_in_dark = 0 + var/see_invisible = 0 + var/light_sensetive = 0 + var/sight_flags = 0 + +/datum/vision_override/nightvision + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + +/datum/vision_override/nightvision/thermals + sight_flags = SEE_MOBS + +/datum/vision_override/nightvision/thermals/ling_augmented_eyesight + light_sensetive = 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 496688835bb..a365a45673c 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -19,6 +19,9 @@ /obj/effect/proc_holder/changeling/proc/on_purchase(var/mob/user) return +/obj/effect/proc_holder/changeling/proc/on_refund(mob/user) + return + /obj/effect/proc_holder/changeling/Click() var/mob/user = usr if(!user || !user.mind || !user.mind.changeling) diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 0ffce0ba172..9475dda8035 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -406,8 +406,10 @@ var/list/sting_paths mind.changeling.changeling_speak = 0 mind.changeling.reset() for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) - if(!(p.dna_cost == 0 && keep_free_powers)) - mind.changeling.purchasedpowers -= p + if(p.dna_cost == 0 && keep_free_powers) + continue + mind.changeling.purchasedpowers -= p + p.on_refund(src) /datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index d40da71fff1..d303d022753 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -7,18 +7,15 @@ helptext = "Grants us night vision and thermal vision. It may be toggled on or off." chemical_cost = 0 dna_cost = 2 //Would be 1 without thermal vision - var/active = 0 //Whether or not vision is enhanced /obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(var/mob/user) - active = !active - if(active) + if(!user.vision_type) user << "We feel a minute twitch in our eyes, and darkness creeps away." + user.vision_type = new /datum/vision_override/nightvision/thermals/ling_augmented_eyesight else user << "Our vision dulls. Shadows gather." - user.sight &= ~SEE_MOBS - while(active) - user.see_in_dark = 8 - user.see_invisible = 2 - user.sight |= SEE_MOBS - sleep(1) //BAD THINGS HAPPEN WITHOUT THIS. + user.vision_type = null return 1 + +/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) + user.vision_type = null \ No newline at end of file diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 1cc2cd9d469..05d778c8b5a 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -135,6 +135,7 @@ Made by Xhuis var/mob/living/carbon/human/S = shadow_mind.current shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_hatch) shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/enthrall) + shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision) spawn(0) shadow_mind.current.add_language("Shadowling Hivemind") update_shadow_icons_added(shadow_mind) @@ -154,7 +155,7 @@ Made by Xhuis new_thrall_mind.current.add_language("Shadowling Hivemind") new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare) new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) - //new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/thrall_vision) //Uncomment when vision code is unfucked. + new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall) new_thrall_mind.current << "You see the truth. Reality has been torn away and you realize what a fool you've been." new_thrall_mind.current << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." new_thrall_mind.current << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." @@ -210,7 +211,7 @@ Made by Xhuis else shadowling_dead = 1 //but shadowling was kill :( return 1 - + /datum/game_mode/proc/remove_shadowling(datum/mind/ling_mind) if(!istype(ling_mind) || !(ling_mind in shadows)) return 0 update_shadow_icons_removed(ling_mind) @@ -304,7 +305,7 @@ Made by Xhuis flesh_color = "#222222" flags = NO_BLOOD | NO_BREATHE | NO_SCAN | NO_INTORGANS - burn_mod = 2 //2x burn damage + burn_mod = 1.5 //1.5x burn damage, 2x is excessive /datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind) spawn(0) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index f1778935ef8..9decbe31e72 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -170,8 +170,8 @@ user.visible_message("[user] appears from nowhere!", "Your shadowy guise slips away.") user.alpha = initial(user.alpha) -/* -/obj/effect/proc_holder/spell/targeted/thrall_vision //Uncomment this if we ever update our vision code to not be absolute garbage. + +/obj/effect/proc_holder/spell/targeted/shadow_vision name = "Darksight" desc = "Gives you night vision." panel = "Thrall Abilities" @@ -179,23 +179,22 @@ range = -1 include_user = 1 clothes_req = 0 - var/active = 0 + var/datum/vision_override/vision_path = /datum/vision_override/nightvision/thermals -/obj/effect/proc_holder/spell/targeted/thrall_vision/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets) for(var/mob/living/user in targets) if(!istype(user) || !ishuman(user)) return var/mob/living/carbon/human/H = user - active = !active - if(active) - user << "You shift the nerves in your eyes, allowing you to see in the dark." - H.see_in_dark = 8 - H.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM + if(!H.vision_type) + H << "You shift the nerves in your eyes, allowing you to see in the dark." + H.vision_type = new vision_path else - user << "You return your vision to normal." - H.see_in_dark = 0 - H.dna.species.invis_sight = initial(H.dna.species.invis_sight) -*/ + H << "You return your vision to normal." + H.vision_type = null + +/obj/effect/proc_holder/spell/targeted/shadow_vision/thrall + vision_path = /datum/vision_override/nightvision /obj/effect/proc_holder/spell/aoe_turf/flashfreeze name = "Icy Veins" diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index e494c7507f0..863ea9c43a6 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -66,17 +66,13 @@ flags = ABSTRACT | NODROP -/obj/item/clothing/glasses/night/shadowling +/obj/item/clothing/glasses/shadowling name = "crimson eyes" desc = "A shadowling's eyes. Very light-sensitive and can detect body heat through walls." icon = null icon_state = null item_state = null origin_tech = null - vision_flags = SEE_MOBS - darkness_view = 8 - see_darkness = 0 - invisa_view = 2 unacidable = 1 flash_protect = -1 flags = ABSTRACT | NODROP diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index bb4fc80c7d6..72ba07fbdc7 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -79,6 +79,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.undershirt = "None" H.socks = "None" H.faction |= "faithless" + if(!H.weakeyes) + H.weakeyes = 1 H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes) @@ -86,7 +88,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(usr), slot_glasses) H.set_species("Shadowling") sleep(10) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index e32146ff69f..f22c68bb0f0 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -79,6 +79,9 @@ continue O.Weaken(strength) + if(O.weakeyes) + O.Weaken(strength * 1.5) + O.visible_message("[O] gasps and shields their eyes!") if (istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 42653c3ff1b..3d37f120bc6 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -77,6 +77,8 @@ /obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, convert = 1) add_logs(M, user, "flashed", object="[src.name]") + if(M.weakeyes) + M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash var/safety = M:eyecheck() if(safety <= 0) M.confused += power @@ -85,6 +87,9 @@ terrible_conversion_proc(M, user) M.Stun(1) user.visible_message("[user] blinds [M] with the [src.name]!") + if(M.weakeyes) + M.Stun(2) + M.visible_message("[M] gasps and shields their eyes!") return 1 else if(user) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index ec5f18283a8..a43928a5689 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -101,6 +101,8 @@ //eye target check outmsg = "You blind [C] by shining [src] in their eyes." + if(C.weakeyes) + C.Stun(1) var/eye_prot = C.eyecheck() if(C.blinded || eye_prot >= 2) eye_prot = 4 diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 7eca6aa719b..ad56e541fd4 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -36,9 +36,17 @@ ear_safety++ //Flash + var/mob/living/carbon/human/H = M + var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] + if(M.weakeyes) + M.visible_message("[M] screams and collapses!") + M << "AAAAGH! IT BURNS!" + M.Weaken(15) //hella stunned + M.Stun(15) + if(E) + E.damage += 8 + if(!eye_safety && ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] flick("e_flash", M.flash) if (E) E.damage += rand(1, 3) M.Stun(max(10/distance, 3)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index eead644cc58..ef88db4a6dc 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -84,4 +84,4 @@ var/fire_dmi = 'icons/mob/OnFire.dmi' var/fire_sprite = "Standing" - var/datum/body_accessory/body_accessory = null + var/datum/body_accessory/body_accessory = null \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 875a3a85260..c9d441d77e8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -768,7 +768,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc light_amount = T.get_lumcount()*10 if(light_amount > species.light_dam && !incorporeal_move) //if there's enough light, start dying if(species.light_effect_amp) - adjustFireLoss(5) //This gets doubled by Shadowling's innate fire weakness, so it ends up being 10. + adjustFireLoss(4.7) //This gets multiplied by 1.5 due to Shadowling's innate fire weakness, so it ends up being about 7. else adjustFireLoss(1) adjustBruteLoss(1) @@ -968,7 +968,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/obj/item/organ/vision if(species.vision_organ) vision = internal_organs_by_name[species.vision_organ] - + if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means. eye_blind = 0 blinded = 0 @@ -977,7 +977,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc eye_blind = 1 blinded = 1 eye_blurry = 1 - else + else //blindness if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own blinded = 1 @@ -987,7 +987,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster eye_blurry = max(eye_blurry-3, 0) blinded = 1 - + //blurry sight if(vision.is_bruised()) // Vision organs impaired? Permablurry. eye_blurry = 1 @@ -1220,13 +1220,17 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(ANTAGHUD) process_antag_hud(src) - - - else if(!seer) see_in_dark = species.darksight see_invisible = SEE_INVISIBLE_LIVING - + + if(vision_type) + see_in_dark = max(see_in_dark, vision_type.see_in_dark, species.darksight) + see_invisible = vision_type.see_invisible + if(vision_type.light_sensetive) + weakeyes = 1 + sight |= vision_type.sight_flags + if(see_override) //Override all see_invisible = see_override diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index cee943541d3..3837f3d2b48 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -203,6 +203,7 @@ var/area/lastarea = null var/digitalcamo = 0 // Can they be tracked by the AI? + var/weakeyes //Are they vulnerable to flashes? var/list/radar_blips = list() // list of screen objects, radar blips var/radar_open = 0 // nonzero is radar is open @@ -234,4 +235,6 @@ var/last_movement = -100 // Last world.time the mob actually moved of its own accord. - var/resize = 1 //Badminnery resize \ No newline at end of file + var/resize = 1 //Badminnery resize + + var/datum/vision_override/vision_type = null //Vision override datum. \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index dba397639c5..f469f33be4f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -186,6 +186,7 @@ #include "code\datums\spell.dm" #include "code\datums\supplypacks.dm" #include "code\datums\uplink_item.dm" +#include "code\datums\vision_override.dm" #include "code\datums\cache\air_alarm.dm" #include "code\datums\cache\apc.dm" #include "code\datums\cache\cache.dm" From 0a7f50bbe22ffe309b9a9879a8e92b0383c40ca0 Mon Sep 17 00:00:00 2001 From: DZD Date: Wed, 23 Sep 2015 16:20:06 -0400 Subject: [PATCH 02/69] Spelling and sanity fixes --- code/datums/vision_override.dm | 4 ++-- code/game/objects/items/weapons/grenades/flashbang.dm | 11 ++++++----- code/modules/mob/living/carbon/human/life.dm | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/code/datums/vision_override.dm b/code/datums/vision_override.dm index a634a77f6fb..140ceb8d5fa 100644 --- a/code/datums/vision_override.dm +++ b/code/datums/vision_override.dm @@ -2,7 +2,7 @@ var/name = "vision override" var/see_in_dark = 0 var/see_invisible = 0 - var/light_sensetive = 0 + var/light_sensitive = 0 var/sight_flags = 0 /datum/vision_override/nightvision @@ -13,4 +13,4 @@ sight_flags = SEE_MOBS /datum/vision_override/nightvision/thermals/ling_augmented_eyesight - light_sensetive = 1 \ No newline at end of file + light_sensitive = 1 diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index ad56e541fd4..260160a63c3 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -36,19 +36,20 @@ ear_safety++ //Flash - var/mob/living/carbon/human/H = M - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] + var/eye_damage = rand(1,3) if(M.weakeyes) M.visible_message("[M] screams and collapses!") M << "AAAAGH! IT BURNS!" M.Weaken(15) //hella stunned M.Stun(15) - if(E) - E.damage += 8 + eye_damage += 8 if(!eye_safety && ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] flick("e_flash", M.flash) - if (E) E.damage += rand(1, 3) + if (E) + E.damage += eye_damage M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) if (istype(E) && E.damage >= E.min_bruised_damage) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c9d441d77e8..8967e1519d6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1227,7 +1227,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(vision_type) see_in_dark = max(see_in_dark, vision_type.see_in_dark, species.darksight) see_invisible = vision_type.see_invisible - if(vision_type.light_sensetive) + if(vision_type.light_sensitive) weakeyes = 1 sight |= vision_type.sight_flags From d57d42e8ddd980cbb5a466c776963bbad2e9c255 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 26 Sep 2015 02:36:44 -0400 Subject: [PATCH 03/69] Spacemove Fixup --- code/game/atoms_movable.dm | 4 ++-- code/modules/power/singularity/singularity.dm | 17 +++++++---------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a38d22e6ff6..eb28028cac4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -80,10 +80,10 @@ last_move = 0 return + last_move = direct src.move_speed = world.timeofday - src.l_move_time src.l_move_time = world.timeofday - last_move = direct spawn(5) // Causes space drifting. /tg/station has no concept of speed, we just use 5 @@ -154,7 +154,7 @@ if(pulledby) return 1 - if(locate(/obj/structure/lattice) in orange(1, get_turf(src))) //Not realistic but makes pushing things in space easier + if(locate(/obj/structure/lattice) in range(1, get_turf(src))) //Not realistic but makes pushing things in space easier return 1 return 0 diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 9e27818eb8b..c4170888d3d 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -60,6 +60,9 @@ consume(user) return 1 +/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man! + return 0 + /obj/singularity/blob_act(severity) return @@ -268,8 +271,6 @@ step(src, movement_dir) -/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man! - return 0 /obj/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0) if(!direction) @@ -360,18 +361,13 @@ /obj/singularity/proc/toxmob() var/toxrange = 10 - var/toxdamage = 4 var/radiation = 15 var/radiationmin = 3 - if (src.energy>200) - toxdamage = round(((src.energy-150)/50)*4,1) - radiation = round(((src.energy-150)/50)*5,1) - radiationmin = round((radiation/5),1)// + if (energy>200) + radiation += round((energy-150)/10,1) + radiationmin = round((radiation/5),1) for(var/mob/living/M in view(toxrange, src.loc)) M.apply_effect(rand(radiationmin,radiation), IRRADIATE) - toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) - M.apply_effect(toxdamage, TOX) - return /obj/singularity/proc/combust_mobs() @@ -382,6 +378,7 @@ C.IgniteMob() return + /obj/singularity/proc/mezzer() for(var/mob/living/carbon/M in oviewers(8, src)) if(istype(M, /mob/living/carbon/brain)) //Ignore brains From 441391168863cce7562d285975e02b9f62b9b619 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 26 Sep 2015 06:17:29 -0400 Subject: [PATCH 04/69] Janicart and Janitor Update --- _maps/map_files/cyberiad/cyberiad.dmm | 21 +- code/game/jobs/job/support.dm | 2 +- code/game/objects/items/devices/PDA/cart.dm | 8 +- code/game/objects/items/weapons/mop.dm | 16 +- code/game/objects/items/weapons/soap.dm | 6 +- code/game/objects/structures/janicart.dm | 377 ++++++++---------- code/game/objects/structures/segway.dm | 163 -------- code/game/objects/structures/watercloset.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../research/designs/janitorial_designs.dm | 10 + code/modules/vehicle/train/trains/janicart.dm | 342 ---------------- icons/obj/vehicles.dmi | Bin 41115 -> 50091 bytes paradise.dme | 2 - 13 files changed, 195 insertions(+), 756 deletions(-) delete mode 100644 code/game/objects/structures/segway.dm delete mode 100644 code/modules/vehicle/train/trains/janicart.dm diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 6a06003f63b..a887cef66f2 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -225,7 +225,7 @@ "aeq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/interrogationobs) "aer" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/permabrig) "aes" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/energy/advtaser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/advtaser{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/advtaser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury) -"aet" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) +"aet" = (/obj/structure/rack,/obj/item/key/security,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) "aeu" = (/obj/structure/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury) "aev" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/hos) "aew" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) @@ -242,7 +242,7 @@ "aeH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Interrogation Observation APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/interrogationobs) "aeI" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) "aeJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) -"aeK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) +"aeK" = (/obj/structure/stool/bed/chair/janicart/secway,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) "aeL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) "aeM" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) "aeN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor{icon_state = "dark"},/area/security/hos) @@ -5237,8 +5237,8 @@ "bWK" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bWL" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor,/area/janitor) "bWM" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor,/area/janitor) -"bWN" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/camera{c_tag = "Custodial Closet"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/janitor) -"bWO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor,/area/janitor) +"bWN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury) +"bWO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor,/area/janitor) "bWP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/janitor) "bWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor,/area/janitor) "bWR" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) @@ -5395,7 +5395,7 @@ "bZM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bZN" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/hallway/primary/aft) "bZO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bZP" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; name = "Janitor Requests Console"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/janitor) +"bZP" = (/obj/machinery/camera{c_tag = "Custodial Closet"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor,/area/janitor) "bZQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/janitor) "bZR" = (/obj/machinery/light,/obj/structure/janitorialcart,/turf/simulated/floor,/area/janitor) "bZS" = (/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/janitor) @@ -8217,6 +8217,7 @@ "dca" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyc"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/patient_c) "dcb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/medical/patients_rooms) "dcc" = (/obj/machinery/light,/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 10; icon_state = "blue"},/area/medical/patients_rooms) +"dcd" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; name = "Janitor Requests Console"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/key/janitor,/turf/simulated/floor,/area/janitor) "dce" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/patients_rooms) "dcf" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) "dcg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/medical/patients_rooms) @@ -8298,9 +8299,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgacNacOacPacQacRacSacCaalacEacEacTacUacVacEacEacEaaaaaaaaaaaaabKacGactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgacgacgacgacgacgadcaddacEacEadeadfadgadhadiacEacEaaaaaaaaaaaaaaaabKactadjadkadladmadnadoactadpadqadradsadtaduadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwadxadyadzadAadwadBadCacEadDadEadFadGadHadIadJacEaaaaaaaaaaaaaaaaaaactadKadLadMadNacXadOactadPadtadtadtadtaduadvaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQadQadQadQadQadRadSadTadUadwachacdacEadVadWadXadGadYadZaeaacEaaaaaaaaaaaaaaaaebactaecaedaeeaefaegaehactaeiadtaejadtadtaduadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAaaaaaaabAabAabAabAabAabAabAaaaaaaabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQaekaelaemadQaenaeoaepaepaeqaeracCacEaesadWadXaetadYadZaeuacEaaaaaaaaaaaaaaaaaaactaevadLaewadNacXaexactaeyadtadtadtadtaezadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAaeAaeAaeAaeAaeAaeAaeAaeAaaaadQaeBaeCaeDaeEaeFaeGaeFaeHaeqacSacCacEacEaeIaeJaeKaeLaeMacEacEaaaaaaaaaaaaaaaaaaactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQadQadQadQadQadRadSadTadUadwachacdacEadVadWadXaetadYadZaeaacEaaaaaaaaaaaaaaaaebactaecaedaeeaefaegaehactaeiadtaejadtadtaduadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAaaaaaaabAabAabAabAabAabAabAaaaaaaabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQaekaelaemadQaenaeoaepaepaeqaeracCacEaesadWadXaeKadYadZaeuacEaaaaaaaaaaaaaaaaaaactaevadLaewadNacXaexactaeyadtadtadtadtaezadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAaeAaeAaeAaeAaeAaeAaeAaeAaaaadQaeBaeCaeDaeEaeFaeGaeFaeHaeqacSacCacEacEaeIaeJbWNaeLaeMacEacEaaaaaaaaaaaaaaaaaaactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAaeWaeXaeYaeAaeZaeXafaaeAaaaadQafbafcafdadQadwafeadwadwadwaffafgaalacEafhafiafjafkaflacEafmafmafmafmafmafmafmactafnafoafpafqafractactafsaftafuafuafwadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafxafxafxacGacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAafyafzafAaeAafyafzafAaeAaaaadQafBafCafDafEafFafGafHafIafJafKafLafMacEacEafNafOafPacEacEafmafQafRafSafTafUafVafWafXafYafZagaagaagbagcagdageagfaggaghadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaafxaaaaabaaaagiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAagjafAagkaeAaglafAagmaeAaaaadQadQadQadQadQagnagoagpagqagragsagtaguagvagwagxagyagzagAagBagCagDagEagFagFagFagGagHagIagJagFagFagFagFagKafuagLagMagNagOagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabagRaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8380,9 +8381,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbF aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQNbubbSgbShbSibSjbSkbSlbvvbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSFbSGbLgbSHbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUbSVbSWbSXbSYbSZbTabTbbTcbTdbNabOMbwobTeaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaabTfbTgbThbTgbTiaaaaaaaaabOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTIbTJbTKbTsbTLbTMbTNbTObTPbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybUzbNabOMbUAbUBbUAbUCbUDbUCbUCbUCaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUEbUFbUGbUHbUEbUIbUIbUIbOVbUJbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbVcbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWjbWkbWjbThbUIbWlbWmbWnbWobWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZbWDbWEbWFbWGbWHbUZbWIbWJbWKbVfbWLbWMbWNbWObWPbWQbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAbXBbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXVbXWbUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWjbWkbWjbThbUIbWlbWmbWnbWobWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZbWDbWEbWFbWGbWHbUZbWIbWJbWKbVfbWLbWMbZPbWObWPbWQbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAbXBbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXVbXWbUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUEbYbbWjbWjbYcbYdbTkbYebYfbYgbTkbWqbYhbYibNzbNzbNzbNzbNzbNzbYjbUTbYkbYlbYmbYnbYnbYnbYobUZbYpbYqbYqbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbYCbVfbVibYDbVkbYEbYFbYGbYHbYIbVkbSmbQVbSnbSobYJbYKbYLbYMbYNbYObYPbYQbYRbVubYSbYTbYUbYVbYWbYXbYYbYZbZabZbbLgbLgbLgbLgbLgbZcbZdbZebLhbZfbXEbXEbZgbZhbXEbZibZjbZkbZlbRAbZmbZmbPTbPVbZnbPXbEXbUAbZobUAbUAbUAbUAbUAbUAbUAbZpbZqbUCbZrbZsbZtbUCaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbZubXXbXXbZvbWhbWhbXZbXZbZwbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWkbWkbWkbThbUIbZxbZybZzbZAbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfbZPbZQbZRbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcakcalcamcancaocapcaqcarcascasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbPTcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWkbWkbWkbThbUIbZxbZybZzbZAbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfdcdbZQbZRbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcakcalcamcancaocapcaqcarcascasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbPTcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaabUEcaVcaWcaXbUEbUIbUIbUIbOVcaYcaZcaZcaZbOVbOVbUTcbacbacbbcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfcbncbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlbPlcbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNcbOcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbPTcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcchcciccjcckcclccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwbTgccxbTgccycczaabaaabOVbOVbUIbUIbUIbOVaaabUTccAccBccCccDbZFccEccFbUVccGccHccIbYnccJccKccLccMccNccOccPbUZccQccRccSccTccUccUccUccUccVccWccXccYccYccZccZcdacdbcdcbVibPlcddcdecdfcdgcdhbYKcdicbtcdjcdkcdlcdmbSwcdncdocdpcdqcdrcdrcdscdrcdrcdrcdtbVAcducdvcdwcdxcdycdzcdAcbPcdBcdCcdDcdEcdFcdCcdGcdHcdCcdIcdJbRBbPTbPTcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebceaceccebcebcebcedceecefcegcehaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabcejbUTbUTbUTcekbUTbUTcelbUVcemcenceocepceqcercescetceucevcewccKcexceycezceAceBceBceBceBceCceDceEceFceGceFceHceIceJceKceLceMceNceOcePceQceRceSceTceUceVceWceXceYceZcfacfbcfccfdcfdcfdcfecffcfgcfhcficfjcfjcfkcfjcflcfmcfncfocbPcfpcfqcfrcfscfrcftcfucfvcdCbPTcfwbPTbPTcfxcfybZnbBxbEXbUAcfzbUAbUAcfAcfBcfCcfDcfEcebcfFcfGcfHcdUcfHcdUcfIcdUcdUbUAcfJcfKcfLcfMaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcfObXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index b5ad01dd92d..256eb2ca69c 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -294,7 +294,7 @@ title = "Janitor" flag = JANITOR department_flag = SUPPORT - total_positions = 1 + total_positions = 2 spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index e44fb712774..ba3316b3ce0 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -174,7 +174,7 @@ /obj/item/weapon/cartridge/rd/initialize() radio = new /obj/item/radio/integrated/signal(src) - ..() + ..() /obj/item/weapon/cartridge/captain name = "Value-PAK Cartridge" @@ -191,7 +191,7 @@ /obj/item/weapon/cartridge/captain/initialize() radio = new /obj/item/radio/integrated/beepsky(src) - ..() + ..() /obj/item/weapon/cartridge/supervisor name = "Easy-Record DELUXE" @@ -282,7 +282,7 @@ /* Power Monitor (Mode: 43 / 433) */ - if(mode==43 || mode==433) + if(mode==43 || mode==433) values["powermonitors"] = powermonitor_repository.powermonitor_data() if (powmonitor && !isnull(powmonitor.powernet)) @@ -500,7 +500,7 @@ if(!CbotData.len) CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CartData[0] - for(var/obj/structure/stool/bed/chair/cart/janicart/B in world) + for(var/obj/structure/stool/bed/chair/janicart/B in world) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 874f96271fe..0bceaa54fcf 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -1,3 +1,5 @@ +#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) + /obj/item/weapon/mop desc = "The world of janitalia wouldn't be complete without a mop." name = "mop" @@ -12,7 +14,7 @@ var/mopping = 0 var/mopcount = 0 var/mopcap = 5 - var/mopspeed = 40 + var/mopspeed = 30 /obj/item/weapon/mop/New() @@ -23,7 +25,7 @@ if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1)) A.clean_blood() for(var/obj/effect/O in A) - if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay) || istype(O,/obj/effect/rune)) + if(is_cleanable(O)) qdel(O) reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. reagents.remove_any(1) //reaction() doesn't use up the reagents @@ -33,20 +35,20 @@ if(!proximity) return if(reagents.total_volume < 1) - user << "Your mop is dry!" + user << "Your mop is dry!" return var/turf/simulated/turf = A - if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) + if(is_cleanable(A)) turf = A.loc A = null if(istype(turf)) - user.visible_message("[user] begins to clean \the [turf] with [src].") + user.visible_message("[user] begins to clean \the [turf] with [src].", "You begin to clean \the [turf] with [src]...") - if(do_after(user, mopspeed, target = src)) + if(do_after(user, src.mopspeed, target = turf)) + user << "You finish mopping." clean(turf) - user << "You have finished mopping!" /obj/effect/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 7f5f6b7861e..4ebf6b257e8 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -16,11 +16,9 @@ icon_state = "soapnt" /obj/item/weapon/soap/deluxe - icon_state = "soapdeluxe" - -/obj/item/weapon/soap/deluxe/New() desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms." - cleanspeed = 40 //same speed as mop because deluxe -- captain gets one of these + icon_state = "soapdeluxe" + cleanspeed = 40 //slightly better because deluxe -- captain gets one of these /obj/item/weapon/soap/syndie desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster." diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index c9a624fad8c..d22db9cc1d7 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -1,54 +1,98 @@ -/obj/structure/stool/bed/chair/cart/ +//old style PIMP-CART +/obj/structure/stool/bed/chair/janicart + name = "janicart" + desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." icon = 'icons/obj/vehicles.dmi' - anchored = 1 + icon_state = "pussywagon" + anchored = 0 density = 1 - var/empstun = 0 - var/health = 100 - var/destroyed = 0 - var/move_delay = 1 - var/keytype = /obj/item/key - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread + var/obj/item/weapon/storage/bag/trash/mybag = null + var/callme = "pimpin' ride" //how do people refer to it? + var/move_delay = 0 + var/floorbuffer = 0 + var/keytype = /obj/item/key/janitor -/obj/structure/stool/bed/chair/cart/process() - if(empstun > 0) - empstun-- - if(empstun < 0) - empstun = 0 - -/obj/structure/stool/bed/chair/cart/New() - processing_objects |= src +/obj/structure/stool/bed/chair/janicart/New() handle_rotation() -/obj/structure/stool/bed/chair/cart/examine(mob/user) - if(..(user, 1)) - switch(health) - if(75 to 99) - usr << "\blue It appears slightly dented." - if(40 to 74) - usr << "\red It appears heavily dented." - if(1 to 39) - usr << "\red It appears severely dented." - if((INFINITY * -1) to 0) - usr << "It appears completely unsalvageable" +/obj/structure/stool/bed/chair/janicart/Move(a, b, flag) + ..() + if(floorbuffer) + var/turf/tile = loc + if(isturf(tile)) + tile.clean_blood() + if (istype(tile, /turf/simulated/floor)) + var/turf/simulated/floor/F = tile + F.dirt = 0 + for(var/A in tile) + if(istype(A, /obj/effect)) + if(is_cleanable(A)) + qdel(A) -/obj/structure/stool/bed/chair/cart/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0)) - if(destroyed) - user << "\red The [src.name] is destroyed beyond repair." - add_fingerprint(user) - user.visible_message("\blue [user] has fixed some of the dents on [src].", "\blue You fix some of the dents on \the [src]") - health += 20 - HealthCheck() - else - user << "Need more welding fuel!" +/obj/structure/stool/bed/chair/janicart/examine(mob/user) + ..() + if(floorbuffer) + user << "It has been upgraded with a floor buffer." + + +/obj/structure/stool/bed/chair/janicart/attackby(obj/item/I, mob/user, params) + if(istype(I, keytype)) + user << "Hold [I] in one of your hands while you drive this [callme]." + else if(istype(I, /obj/item/weapon/storage/bag/trash)) + if(keytype == /obj/item/key/janitor) + if(!user.drop_item()) + return + user << "You hook the trashbag onto the [callme]." + I.loc = src + mybag = I + else if(istype(I, /obj/item/janiupgrade)) + if(keytype == /obj/item/key/janitor) + floorbuffer = 1 + qdel(I) + user << "You upgrade the [callme] with the floor buffer." + update_icon() + +/obj/structure/stool/bed/chair/janicart/update_icon() + overlays.Cut() + if(mybag) + overlays += "cart_garbage" + if(floorbuffer) + overlays += "cart_buffer" + +/obj/structure/stool/bed/chair/janicart/attack_hand(mob/user) + if(mybag) + mybag.loc = get_turf(user) + user.put_in_hands(mybag) + mybag = null + update_icon() + else + ..() + + +/obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction) + if(user.stat || user.stunned || user.weakened || user.paralysis) + unbuckle_mob() + if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) + if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc)) return - if(istype(W, /obj/item/key)) - user << "Hold [W] in one of your hands while you drive this [name]." + step(src, direction) + update_mob() + handle_rotation() + if(istype(src.loc, /turf/simulated)) + var/turf/simulated/T = src.loc + if(T.wet == 2) //Lube! Fall off! + playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) + buckled_mob.Stun(7) + buckled_mob.Weaken(7) + unbuckle_mob() + step(src, dir) + move_delay = 1 + spawn(2) + move_delay = 0 + else + user << "You'll need the keys in one of your hands to drive this [callme]." - -/obj/structure/stool/bed/chair/cart/user_buckle_mob(mob/living/M, mob/user) +/obj/structure/stool/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user) if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated return for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. @@ -59,19 +103,14 @@ ..() update_mob() -/obj/structure/stool/bed/chair/cart/post_buckle_mob(mob/living/M) - update_mob() - return ..() +/obj/structure/stool/bed/chair/janicart/unbuckle_mob() + if(buckled_mob) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + ..() -/obj/structure/stool/bed/chair/cart/unbuckle_mob() - var/mob/living/M = ..() - if(M) - M.pixel_x = 0 - M.pixel_y = 0 - return M - -/obj/structure/stool/bed/chair/cart/handle_rotation() - if(dir == SOUTH) +/obj/structure/stool/bed/chair/janicart/handle_rotation() + if((dir == SOUTH) || (dir == WEST) || (dir == EAST)) layer = FLY_LAYER else layer = OBJ_LAYER @@ -83,7 +122,8 @@ update_mob() -/obj/structure/stool/bed/chair/cart/proc/update_mob() + +/obj/structure/stool/bed/chair/janicart/proc/update_mob() if(buckled_mob) buckled_mob.dir = dir switch(dir) @@ -91,190 +131,85 @@ buckled_mob.pixel_x = 0 buckled_mob.pixel_y = 7 if(WEST) - buckled_mob.pixel_x = 13 + buckled_mob.pixel_x = 12 buckled_mob.pixel_y = 7 if(NORTH) buckled_mob.pixel_x = 0 buckled_mob.pixel_y = 4 if(EAST) - buckled_mob.pixel_x = -13 + buckled_mob.pixel_x = -12 buckled_mob.pixel_y = 7 -/obj/structure/stool/bed/chair/cart/emp_act(severity) - switch(severity) - if(1) - src.empstun = (rand(5,10)) - if(2) - src.empstun = (rand(1,5)) - src.visible_message("\red The [src.name]'s motor short circuits!") - spark_system.attach(src) - spark_system.set_up(5, 0, src) - spark_system.start() - -/obj/structure/stool/bed/chair/cart/bullet_act(var/obj/item/projectile/Proj) - var/hitrider = 0 - if(istype(Proj, /obj/item/projectile/ion)) - Proj.on_hit(src, 2) - return +/obj/structure/stool/bed/chair/janicart/bullet_act(obj/item/projectile/Proj) if(buckled_mob) - if(prob(75)) - hitrider = 1 - var/act = buckled_mob.bullet_act(Proj) - if(act >= 0) - visible_message("[buckled_mob.name] is hit by [Proj]!") - if(istype(Proj, /obj/item/projectile/energy)) - unbuckle_mob() - return - if(istype(Proj, /obj/item/projectile/energy/electrode)) - if(prob(25)) - unbuckle_mob() - visible_message("The [src.name] absorbs the [Proj]") - if(!istype(buckled_mob, /mob/living/carbon/human)) - return buckled_mob.bullet_act(Proj) - else - var/mob/living/carbon/human/H = buckled_mob - return H.electrocute_act(0, src, 1, 0) - if(!hitrider) - visible_message("[Proj] hits the [name]!") - if(!Proj.nodamage && Proj.damage_type == BRUTE || Proj.damage_type == BURN) - health -= Proj.damage - HealthCheck() - -/obj/structure/stool/bed/chair/cart/proc/HealthCheck() - if(health > 100) health = 100 - if(health <= 0 && !destroyed) - destroyed = 1 - density = 0 - if(buckled_mob) - unbuckle_mob() - visible_message("The [name] explodes!") - explosion(src.loc,-1,0,2,7,10) - icon_state = "pussywagon_destroyed" - -/obj/structure/stool/bed/chair/cart/ex_act(severity) - switch (severity) - if(1.0) - health -= 100 - if(2.0) - health -= 75 - if(3.0) - health -= 45 - HealthCheck() - - -///////////////////////////////////////////////////////////////////////// - -/obj/structure/stool/bed/chair/cart/janicart - name = "janicart" - icon_state = "pussywagon" - flags = OPENCONTAINER - //copypaste sorry - var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite - var/obj/item/weapon/storage/bag/trash/mybag = null - -/obj/structure/stool/bed/chair/cart/janicart/New() - ..() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src - -/obj/structure/stool/bed/chair/cart/janicart/examine(mob/user) - if(!..(user, 1)) - return - - user << "\icon[src] This [name] contains [reagents.total_volume] unit\s of [reagents]!" - if(mybag) - user << "\A [mybag] is hanging on the [name]." - -/obj/structure/stool/bed/chair/cart/janicart/attackby(obj/item/W, mob/user, params) - ..() - if(istype(W, /obj/item/weapon/mop)) - if(reagents.total_volume >= 2) - reagents.trans_to(W, 2) - user << "You wet the mop in the pimpin' ride." - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - if(reagents.total_volume < 1) - user << "This pimpin' ride is out of water!" - else if(istype(W, /obj/item/weapon/storage/bag/trash)) - user << "You hook the trashbag onto the pimpin' ride." - user.drop_item() - W.loc = src - mybag = W - - -/obj/structure/stool/bed/chair/cart/janicart/attack_hand(mob/user) - if(mybag) - mybag.loc = get_turf(user) - user.put_in_hands(mybag) - mybag = null - else - ..() - - -/obj/structure/stool/bed/chair/cart/janicart/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis || destroyed) - unbuckle_mob() - return - if(empstun > 0) - if(user) - user << "\red \the [src] is unresponsive." - return - if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) - if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc)) - return - step(src, direction) - update_mob() - handle_rotation() - move_delay = 1 - spawn(2) - move_delay = 0 - else - user << "You'll need the keys in one of your hands to drive this pimpin' ride." - -//////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/structure/stool/bed/chair/cart/ambulance - name = "ambulance" - icon = 'icons/obj/vehicles.dmi' - icon_state = "docwagon" - anchored = 0 - density = 1 -/var/brightness = 4 -/var/strobe = 0 - -/obj/structure/stool/bed/chair/cart/ambulance/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis || destroyed) - unbuckle_mob() - return - if(empstun > 0) - if(user) - user << "\red \the [src] is unresponsive." - return - if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) - if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc)) - return - step(src, direction) - update_mob() - handle_rotation() - move_delay = 1 - spawn(2) - move_delay = 0 - else - user << "You'll need the keys in one of your hands to drive this ambulance." - + buckled_mob.bullet_act(Proj) /obj/item/key name = "key" - desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." + desc = "A small grey key." icon = 'icons/obj/vehicles.dmi' - icon_state = "keys" + icon_state = "key" w_class = 1 +/obj/item/key/janitor + desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." + icon_state = "keyjanitor" + +/obj/item/key/security + desc = "A keyring with a small steel key, and a rubber stun baton accessory." + icon_state = "keysec" + /obj/item/key/ambulance name = "ambulance key" desc = "A keyring with a small steel key, and tag with a red cross on it." icon_state = "keydoc" +/obj/item/key/snowmobile + name = "snowmobile key" + desc = "A keyring with a small steel key, and tag with a red cross on it; clearly it's not implying you're going to the hospital for this..." + icon_state = "keydoc" //get a better icon, sometime. + +/obj/item/janiupgrade + name = "floor buffer upgrade" + desc = "An upgrade for mobile janicarts." + icon = 'icons/obj/vehicles.dmi' + icon_state = "upgrade" + +/obj/structure/stool/bed/chair/janicart/secway + name = "secway" + desc = "A brave security cyborg gave its life to help you look like a complete tool." + icon = 'icons/obj/vehicles.dmi' + icon_state = "secway" + callme = "secway" + keytype = /obj/item/key/security + +/obj/structure/stool/bed/chair/janicart/secway/update_mob() + if(buckled_mob) + buckled_mob.dir = dir + buckled_mob.pixel_y = 4 + + +/obj/structure/stool/bed/chair/janicart/ambulance + name = "ambulance" + desc = "For getting to patients in a hurry--or running them over." + icon = 'icons/obj/vehicles.dmi' + icon_state = "docwagon" + callme = "ambulance" + keytype = /obj/item/key/ambulance + +/obj/structure/stool/bed/chair/janicart/secway/snowmobile + name = "red snowmobile" + desc = "Wheeeeeeeeeeee." + icon = 'icons/obj/vehicles.dmi' + icon_state = "snowmobile" + callme = "snowmobile" + +/obj/structure/stool/bed/chair/janicart/secway/snowmobile/blue + name = "blue snowmobile" + icon_state = "bluesnowmobile" + +//////////////////////////////////////////////////////////////////////////////////////////////// + //TG style Janicart /obj/structure/janitorialcart diff --git a/code/game/objects/structures/segway.dm b/code/game/objects/structures/segway.dm deleted file mode 100644 index 4e781364af5..00000000000 --- a/code/game/objects/structures/segway.dm +++ /dev/null @@ -1,163 +0,0 @@ -/obj/structure/stool/bed/chair/segway - name = "security segway" - desc = "Gives the illusion of authority." - icon = 'icons/obj/vehicles.dmi' - icon_state = "sec_seg_idle" - anchored = 1 - density = 1 - - var/health = 100 - var/delay = 3 //Move delay to simulate a speed - var/allowMove = 1 - var/datum/global_iterator/space_move //Handling space movement (i.e. drift forever) - -/obj/structure/stool/bed/chair/segway/New() - handle_rotation() - space_move = new /datum/global_iterator/space_movement(null,0) - return - -/obj/structure/stool/bed/chair/segway/user_buckle_mob(mob/living/M, mob/user) - if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated - return - for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. - if(A.density) - if(A != src && A != M) - return - M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. - ..() - -/obj/structure/stool/bed/chair/segway/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle_mob() - icon_state = "sec_seg_idle" - if(istype(user.l_hand, /obj/item/sec_seg_key) || istype(user.r_hand, /obj/item/sec_seg_key)) - if(!allowMove) - return - if(src.space_move.active()) - return - allowMove = 0 - icon_state = "sec_seg_move" - step(src, direction) - update_mob() - handle_rotation() - if(istype(src.loc, /turf/space)) - src.space_move.start(list(src,direction)) - if(istype(src.loc, /turf/simulated)) - var/turf/simulated/T = src.loc - if(T.wet == 2) //Lube! Fall off! - playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) - buckled_mob.Stun(8) - buckled_mob.Weaken(5) - unbuckle_mob() - step(src, dir) - sleep(delay) - allowMove = 1 - else - user << "Requires key in hand to drive." - -/obj/structure/stool/bed/chair/segway/Move() - . = ..() - -/obj/structure/stool/bed/chair/segway/Bump(var/atom/obstacle) - if(istype(obstacle, /mob)) - step(obstacle, src.dir) - else - obstacle.Bumped(src) - return - -/obj/structure/stool/bed/chair/segway/post_buckle_mob(mob/living/M) - update_mob() - add_fingerprint(M) - M.pixel_x = 0 - M.pixel_y = 5 - return ..() - -/obj/structure/stool/bed/chair/segway/unbuckle_mob() - var/mob/living/M = ..() - if(M) - M.pixel_x = 0 - M.pixel_y = 0 - return M - -/obj/structure/stool/bed/chair/segway/handle_rotation() - if(dir == NORTH) - layer = OBJ_LAYER - else - layer = FLY_LAYER - - update_mob() - -/obj/structure/stool/bed/chair/segway/proc/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - -/obj/structure/stool/bed/chair/segway/bullet_act(var/obj/item/projectile/Proj) - if(buckled_mob) - return buckled_mob.bullet_act(Proj) - else if(istype(Proj, /obj/item/projectile/beam)) - damage(Proj.damage) - -/obj/structure/stool/bed/chair/segway/proc/damage(amount) - health -= amount - if(health <= 0) - if(buckled_mob) - buckled_mob << "The [src.name] was destroyed!" - qdel(src) - -/obj/item/sec_seg_key - name = "security segway key" - desc = "A key for a security segway. You feel the choice of keyring could be more professional." - icon = 'icons/obj/vehicles.dmi' - icon_state = "keys" //Needs a proper sprite - w_class = 1 - -/datum/global_iterator/space_movement //moon_theme.mp3 - delay = 5 - - process(var/obj/structure/stool/bed/chair/segway/seg as obj,direction) - if(!step(seg, direction)) - src.stop() - - -/obj/structure/stool/bed/chair/segway/snowmobile - name = "red snowmobile" - desc = "Wheeeeeeeeeeee." - icon = 'icons/obj/vehicles.dmi' - icon_state = "snowmobile" - anchored = 1 - density = 1 - -/obj/structure/stool/bed/chair/segway/snowmobile/blue - name = "blue snowmobile" - desc = "Wheeeeeeeeeeee." - icon = 'icons/obj/vehicles.dmi' - icon_state = "bluesnowmobile" - anchored = 1 - density = 1 - -/obj/structure/stool/bed/chair/segway/snowmobile/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle_mob() - if(!allowMove) - return - if(src.space_move.active()) - return - allowMove = 0 - step(src, direction) - update_mob() - handle_rotation() - if(istype(src.loc, /turf/space)) - src.space_move.start(list(src,direction)) - if(istype(src.loc, /turf/simulated)) - damage(5) - usr << "Your snowmobile takes damage from not being on snow!" - var/turf/simulated/T = src.loc - if(T && T.wet == 2) //Lube! Fall off! - playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) - buckled_mob.Stun(8) - buckled_mob.Weaken(5) - unbuckle_mob() - step(src, dir) - sleep(delay) - allowMove = 1 - diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 44ee7ef52db..3262ac5ece2 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -299,7 +299,7 @@ var/turf/tile = loc loc.clean_blood() for(var/obj/effect/E in tile) - if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay)) + if(is_cleanable(E)) qdel(E) /obj/machinery/shower/process() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3f5ed10edc5..cb84b8d2265 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1135,7 +1135,7 @@ var/list/robot_verbs_default = list( S.dirt = 0 for(var/A in tile) if(istype(A, /obj/effect)) - if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) + if(is_cleanable(A)) qdel(A) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A diff --git a/code/modules/research/designs/janitorial_designs.dm b/code/modules/research/designs/janitorial_designs.dm index 76a469d04e6..06fce1ca135 100644 --- a/code/modules/research/designs/janitorial_designs.dm +++ b/code/modules/research/designs/janitorial_designs.dm @@ -11,6 +11,16 @@ build_path = /obj/item/weapon/mop/advanced category = list("Janitorial") +/datum/design/buffer + name = "Floor Buffer Upgrade" + desc = "A floor buffer that can be attached to vehicular janicarts." + id = "buffer" + req_tech = list("materials" = 5, "engineering" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 200) + build_path = /obj/item/janiupgrade + category = list("Janitorial") + /datum/design/holosign name = "Holographic Sign Projector" desc = "A holograpic projector used to project various warning signs." diff --git a/code/modules/vehicle/train/trains/janicart.dm b/code/modules/vehicle/train/trains/janicart.dm deleted file mode 100644 index a1fae332782..00000000000 --- a/code/modules/vehicle/train/trains/janicart.dm +++ /dev/null @@ -1,342 +0,0 @@ -/obj/vehicle/train/janitor/engine - name = "janitor train tug" - desc = "A ridable electric car designed for pulling janitor trolleys." - icon = 'icons/obj/vehicles.dmi' - icon_state = "pussywagon" //mulebot icons until I get some proper icons - on = 0 - powered = 1 - locked = 0 - layer = MOB_LAYER + 0.1 - load_item_visible = 1 - load_offset_x = 0 - load_offset_y = 7 - - var/car_limit = 3 //how many cars an engine can pull before performance degrades - active_engines = 1 - var/obj/item/weapon/key/janitor_train/key - flags = OPENCONTAINER - var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite - var/obj/item/weapon/storage/bag/trash/mybag = null - -/obj/item/weapon/key/janitor_train - name = "key" - desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"." - icon = 'icons/obj/vehicles.dmi' - icon_state = "keys" - w_class = 1 - -/obj/vehicle/train/janitor/trolley - name = "janitor train trolley" - icon = 'icons/obj/janitor.dmi' - icon_state = "trashcart" - anchored = 0 - passenger_allowed = 0 - locked = 0 - load_item_visible = 1 - load_offset_x = 1 - load_offset_y = 7 - - var/openTop = 0 - var/organs = 0 -//------------------------------------------- -// Standard procs -//------------------------------------------- -/obj/vehicle/train/janitor/engine/New() - ..() - cell = new /obj/item/weapon/stock_parts/cell/high - verbs -= /atom/movable/verb/pull - key = new() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src - -/obj/vehicle/train/janitor/engine/Move() - . = ..() - handle_rotation() - update_mob() - -/obj/vehicle/train/janitor/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(openTop) - W.loc = src - user.visible_message("[user] puts [W] in [src].","You put [W] in [src].") - if(istype(W,/obj/item/weapon/organ)) - organs = 1 - update_icon() - else - user << "The top is closed!" - -/obj/vehicle/train/janitor/trolley/attack_hand(mob/user) - openTop = !openTop - user.visible_message("[user] [openTop ? "opens" : "closes"] the top of [src].","You [openTop ? "open" : "close"] the the top of [src].") - update_icon() - ..() - -/obj/vehicle/train/janitor/trolley/update_icon() - if(openTop) - if(organs) - icon_state = "trashcartopengib" - else - icon_state = "trashcartopen" - else - if(organs) - icon_state = "trashcartgib" - else - icon_state = "trashcart" - -/obj/vehicle/train/janitor/engine/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/key/janitor_train)) - if(!key) - user.drop_item() - key = W - W.loc = src - verbs += /obj/vehicle/train/janitor/engine/verb/remove_key - return - else if(istype(W, /obj/item/weapon/mop)) - if(reagents.total_volume >= 2) - reagents.trans_to(W, 2) - user << "You wet the mop in the pimpin' ride." - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - if(reagents.total_volume < 1) - user << "This pimpin' ride is out of water!" - return - else if(istype(W, /obj/item/weapon/storage/bag/trash)) - user << "You hook the trashbag onto the pimpin' ride." - user.drop_item() - W.loc = src - mybag = W - return - ..() - -/obj/vehicle/train/janitor/engine/attack_hand(mob/user) - if(mybag) - mybag.loc = get_turf(user) - user.put_in_hands(mybag) - mybag = null - else - ..() - -/obj/vehicle/train/janitor/update_icon() - if(open) - //icon_state = "mulebot-hatch" - icon_state = initial(icon_state) - else - icon_state = initial(icon_state) - -/obj/vehicle/train/janitor/engine/Emag(mob/user as mob) - ..() - flick("mulebot-emagged", src) - -/obj/vehicle/train/janitor/trolley/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H) - return - -/obj/vehicle/train/janitor/engine/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H) - ..() - update_stats() - -/obj/vehicle/train/janitor/engine/remove_cell(var/mob/living/carbon/human/H) - ..() - update_stats() - -/obj/vehicle/train/janitor/engine/Bump(atom/Obstacle) - var/obj/machinery/door/D = Obstacle - var/mob/living/carbon/human/H = load - if(istype(D) && istype(H)) - D.Bumped(H) //a little hacky, but hey, it works, and repects access rights - - ..() - -/obj/vehicle/train/janitor/trolley/Bump(atom/Obstacle) - if(!lead) - return //so people can't knock others over by pushing a trolley around - ..() - -/obj/vehicle/train/janitor/engine/handle_rotation() - if(dir == SOUTH) - layer = FLY_LAYER - else - layer = OBJ_LAYER - -/obj/vehicle/train/janitor/engine/proc/update_mob() - if(load) - load.dir = dir - switch(dir) - if(SOUTH) - load.pixel_x = 0 - load.pixel_y = 7 - if(WEST) - load.pixel_x = 13 - load.pixel_y = 7 - if(NORTH) - load.pixel_x = 0 - load.pixel_y = 4 - if(EAST) - load.pixel_x = -13 - load.pixel_y = 7 - - -//------------------------------------------- -// Train procs -//------------------------------------------- -/obj/vehicle/train/janitor/engine/turn_on() - if(!key) - return - else - ..() - update_stats() - -/obj/vehicle/train/janitor/RunOver(var/mob/living/carbon/human/H) - var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm") - - H.apply_effects(5, 5) - for(var/i = 0, i < rand(1,3), i++) - H.apply_damage(rand(1,5), BRUTE, pick(parts)) - -/obj/vehicle/train/janitor/trolley/RunOver(var/mob/living/carbon/human/H) - ..() - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])") - -/obj/vehicle/train/janitor/engine/RunOver(var/mob/living/carbon/human/H) - ..() - - if(is_train_head() && istype(load, /mob/living/carbon/human)) - var/mob/living/carbon/human/D = load - D << "\red \b You ran over [H]!" - visible_message("\red \The [src] ran over [H]!") - attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") - msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") - else - attack_log += text("\[[time_stamp()]\] ran over [key_name(H)]") - - -//------------------------------------------- -// Interaction procs -//------------------------------------------- -/obj/vehicle/train/janitor/engine/relaymove(mob/user, direction) - if(user != load) - return 0 - - if(is_train_head()) - if(direction == reverse_direction(dir)) - return 0 - if(Move(get_step(src, direction))) - return 1 - return 0 - else - return ..() - - -/obj/vehicle/train/janitor/engine/examine(mob/user) - if(!..(user, 1)) - return - - user << "\icon[src] This [name] contains [reagents.total_volume] unit\s of [reagents]!" - if(mybag) - user << "\A [mybag] is hanging on the [name]." - - user << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." - -/obj/vehicle/train/janitor/engine/verb/check_power() - set name = "Check power level" - set category = "Object" - set src in view(1) - - if(!istype(usr, /mob/living/carbon/human)) - return - - if(!cell) - usr << "There is no power cell installed in [src]." - return - - usr << "The power meter reads [round(cell.percent(), 0.01)]%" - -/obj/vehicle/train/janitor/engine/verb/start_engine() - set name = "Start engine" - set category = "Object" - set src in view(1) - - if(!istype(usr, /mob/living/carbon/human)) - return - - if(on) - usr << "The engine is already running." - return - - turn_on() - if (on) - usr << "You start [src]'s engine." - else - if(cell.charge < charge_use) - usr << "[src] is out of power." - else - usr << "[src]'s engine won't start." - -/obj/vehicle/train/janitor/engine/verb/stop_engine() - set name = "Stop engine" - set category = "Object" - set src in view(1) - - if(!istype(usr, /mob/living/carbon/human)) - return - - if(!on) - usr << "The engine is already stopped." - return - - turn_off() - if (!on) - usr << "You stop [src]'s engine." - -/obj/vehicle/train/janitor/engine/verb/remove_key() - set name = "Remove key" - set category = "Object" - set src in view(1) - - if(!istype(usr, /mob/living/carbon/human)) - return - - if(!key || (load && load != usr)) - return - - if(on) - turn_off() - - key.loc = usr.loc - if(!usr.get_active_hand()) - usr.put_in_hands(key) - key = null - - verbs -= /obj/vehicle/train/janitor/engine/verb/remove_key - -//------------------------------------------- -// Loading/unloading procs -//------------------------------------------- -/obj/vehicle/train/janitor/trolley/load(var/atom/movable/C) - return 0 - -/obj/vehicle/train/janitor/engine/load(var/atom/movable/C) - if(!ismob(C)) - return 0 - - return ..() - - -//------------------------------------------------------- -// Stat update procs -// -// Update the trains stats for speed calculations. -// The longer the train, the slower it will go. car_limit -// sets the max number of cars one engine can pull at -// full speed. Adding more cars beyond this will slow the -// train proportionate to the length of the train. Adding -// more engines increases this limit by car_limit per -// engine. -//------------------------------------------------------- - -/obj/vehicle/train/janitor/engine/proc/update_move_delay() - if(!is_train_head() || !on) - move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind - else - move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains - move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines) - move_delay += config.run_speed //base reference speed - move_delay *= 1.05 diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 9d92dd02a811767ebb755f72fdf6e191376df648..63515f5b2e5e16b83c8bb898fc7dd11c277406a9 100644 GIT binary patch literal 50091 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 KvX# Date: Sat, 26 Sep 2015 08:45:43 -0700 Subject: [PATCH 05/69] Pixel-coords laserpointer --- code/game/objects/items/devices/laserpointer.dm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index ec5f18283a8..4167c36a61f 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -66,9 +66,9 @@ /obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params) if(flag) //we're placing the object on a table or in backpack return - laser_act(target, user) + laser_act(target, user, params) -/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user) +/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user, var/params) if( !(user in (viewers(7,target))) ) return if (!diode) @@ -173,12 +173,19 @@ //laser pointer image icon_state = "pointer_[pointer_icon_state]" var/list/showto = list() - for(var/mob/M in range(7,targloc)) + for(var/mob/M in viewers(7,targloc)) if(M.client) showto.Add(M.client) var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10) - I.pixel_x = target.pixel_x + rand(-5,5) - I.pixel_y = target.pixel_y + rand(-5,5) + var/list/click_params = params2list(params) + if(click_params) + if(click_params["icon-x"]) + I.pixel_x = (text2num(click_params["icon-x"]) - 16) + if(click_params["icon-y"]) + I.pixel_y = (text2num(click_params["icon-y"]) - 16) + else + I.pixel_x = target.pixel_x + rand(-5,5) + I.pixel_y = target.pixel_y + rand(-5,5) if(outmsg) user << outmsg From 495a5bfe317c641ea989482e25b9ef69fd668db3 Mon Sep 17 00:00:00 2001 From: Robertha89 Date: Sat, 26 Sep 2015 19:29:48 +0200 Subject: [PATCH 06/69] Death Alarm Implant Kit change Add's a sixth implant, and removes the implantpad, as it is not needed for deathimplants. --- code/game/objects/items/weapons/storage/boxes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index d22ca34cffa..24e030fbbc0 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -258,8 +258,8 @@ new /obj/item/weapon/implantcase/death_alarm(src) new /obj/item/weapon/implantcase/death_alarm(src) new /obj/item/weapon/implantcase/death_alarm(src) + new /obj/item/weapon/implantcase/death_alarm(src) new /obj/item/weapon/implanter(src) - new /obj/item/weapon/implantpad(src) /obj/item/weapon/storage/box/rxglasses From 77bf9cb73d95c9c21ff593c6917e56ee40384c53 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Sat, 26 Sep 2015 15:27:06 -0500 Subject: [PATCH 07/69] Gives a special *deathgasp text to IPC's. --- code/modules/mob/living/carbon/human/emote.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 95e60ade252..da652505eff 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -334,8 +334,12 @@ m_type = 2 if ("deathgasp") - message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." - m_type = 1 + if (species.name == "Machine") + message = "[src] gives one shrill beep before falling lifeless..." + m_type = 1 + else + message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." + m_type = 1 if ("giggle") if(miming) From 1ac203fb3dd809bdf5a4abb6102b91b140f6bde3 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Sat, 26 Sep 2015 16:06:17 -0500 Subject: [PATCH 08/69] Gives the IPC *deathgasp a bit more flavor. Delicious. --- code/modules/mob/living/carbon/human/emote.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index da652505eff..08c7c1732d2 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -335,7 +335,7 @@ if ("deathgasp") if (species.name == "Machine") - message = "[src] gives one shrill beep before falling lifeless..." + message = "[src] gives one shrill beep before falling limp, screen quickly flashing blue before shutting off entirely." m_type = 1 else message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." From 9e82cdc13f2cb7c3d034d574ae299c5e1af23d03 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 02:52:53 +0200 Subject: [PATCH 09/69] Grille floor fix --- _maps/map_files/cyberiad/cyberiad.dmm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 484eab2b868..19d3f4fd561 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6696,10 +6696,10 @@ "cyN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyO" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyP" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cyQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/virology) "cyR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/virology) +"cyT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) "cyU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/medical/surgery) "cyV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyW" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -6965,7 +6965,7 @@ "cDW" = (/obj/machinery/disease2/incubator{name = "Pathogenic incubator"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDX" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cDZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/medical/virology) "cEa" = (/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEc" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) From 6e19e36d9b5ca42167af235a79247392c79a6323 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 03:07:06 +0200 Subject: [PATCH 10/69] More admin logging --- code/modules/admin/verbs/diagnostics.dm | 42 +++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 177f5f49f34..aac1429dd62 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -1,6 +1,9 @@ /client/proc/air_status(turf/target as turf) set category = "Debug" set name = "Display Air Status" + + if(!check_rights(R_DEBUG)) + return if(!isturf(target)) return @@ -15,11 +18,22 @@ usr << "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" for(var/datum/gas/trace_gas in GM.trace_gases) usr << "[trace_gas.type]: [trace_gas.moles]" + + message_admins("[key_name_admin(usr)] has checked the air status of [turf]") + log_admin("[key_name(usr)] has checked the air status of [turf]") + feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/fix_next_move() set category = "Debug" set name = "Unfreeze Everyone" + + if(!check_rights(R_DEBUG)) + return + + message_admins("[key_name_admin(usr)] has unfrozen everyone") + log_admin("[key_name(usr)] has unfrozen everyone") + var/largest_move_time = 0 var/largest_click_time = 0 var/mob/largest_move_mob = null @@ -42,15 +56,20 @@ log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] next_click = [M.next_click] world.time = [world.time]") M.next_move = 1 M.next_click = 0 + message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!", 1) message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1) message_admins("world.time = [world.time]", 1) + feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/radio_report() set category = "Debug" set name = "Radio report" + + if(!check_rights(R_DEBUG)) + return var/filters = list( "1" = "RADIO_TO_AIRALARM", @@ -83,15 +102,22 @@ output += "    [device]
" usr << browse(output,"window=radioreport") + + message_admins("[key_name_admin(usr)] has generated a radio report") + log_admin("[key_name(usr)] has generated a radio report") + feedback_add_details("admin_verb","RR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/reload_admins() set name = "Reload Admins" set category = "Debug" - if(!check_rights(R_SERVER)) return + if(!check_rights(R_SERVER)) + return - message_admins("[usr] manually reloaded admins") + message_admins("[key_name_admin(usr)] has manually reloaded admins") + log_admin("[key_name(usr)] has manually reloaded admins") + load_admins() feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -100,15 +126,24 @@ set name = "Print Jobban Log" set desc = "This spams all the active jobban entries for the current round to standard output." set category = "Debug" + + if(!check_rights(R_DEBUG)) + return usr << "Jobbans active in this round." for(var/t in jobban_keylist) usr << "[t]" + + message_admins("[key_name_admin(usr)] has printed the jobban log") + log_admin("[key_name(usr)] has printed the jobban log") /client/proc/print_jobban_old_filter() set name = "Search Jobban Log" set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output." set category = "Debug" + + if(!check_rights(R_DEBUG)) + return var/filter = input("Contains what?","Filter") as text|null if(!filter) @@ -118,3 +153,6 @@ for(var/t in jobban_keylist) if(findtext(t, filter)) usr << "[t]" + + message_admins("[key_name_admin(usr)] has searched the jobban log for [filter]") + log_admin("[key_name(usr)] has searched the jobban log for [filter]") From 91eaf81a083a98323d2dc97c846814bd3c052b99 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 03:18:05 +0200 Subject: [PATCH 11/69] Fix --- code/modules/admin/verbs/diagnostics.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index aac1429dd62..6c5db7cd1e6 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -19,8 +19,8 @@ for(var/datum/gas/trace_gas in GM.trace_gases) usr << "[trace_gas.type]: [trace_gas.moles]" - message_admins("[key_name_admin(usr)] has checked the air status of [turf]") - log_admin("[key_name(usr)] has checked the air status of [turf]") + message_admins("[key_name_admin(usr)] has checked the air status of [T]") + log_admin("[key_name(usr)] has checked the air status of [T]") feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From ea438c62c7249f856c1133fb4f05af5010d4c35f Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 03:20:34 +0200 Subject: [PATCH 12/69] Let mentors de-admin again --- code/modules/admin/admin_verbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5184f4e7dd2..3a8509b80a1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -639,7 +639,7 @@ var/list/admin_verbs_proccall = list ( set name = "De-admin self" set category = "Admin" - if(!check_rights(R_ADMIN|R_MOD)) + if(!check_rights(R_ADMIN|R_MOD|R_MENTOR)) return log_admin("[key_name(usr)] deadmined themself.") From 69f71268b87c9675d0f01d48b1ed6d0fcb045a24 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 03:38:22 +0200 Subject: [PATCH 13/69] Stop AI's from going into transit tubes --- code/game/objects/structures/transit_tubes/station.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index e3ddc913bb1..5671316f975 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -15,6 +15,7 @@ var/const/OPEN_DURATION = 6 var/const/CLOSE_DURATION = 6 + var/list/disallowed_mobs = list(/mob/living/silicon/ai) /obj/structure/transit_tube/station/New() ..() @@ -32,13 +33,13 @@ return 1 /obj/structure/transit_tube/station/Bumped(mob/AM as mob|obj) - if(!pod_moving && icon_state == "open" && istype(AM, /mob)) + if(!pod_moving && icon_state == "open" && istype(AM, /mob/living) && !(AM.type in disallowed_mobs)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents.len) AM << "" return else if(!pod.moving && pod.dir in directions()) - AM.loc = pod + AM.forceMove(pod) return From ee130ccbbec7b12b95cdcac8b67d8a689be1c11b Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 04:15:57 +0200 Subject: [PATCH 14/69] Pipe fixes --- code/ATMOSPHERICS/atmospherics.dm | 9 ++-- .../binary_devices/binary_atmos_base.dm | 1 + .../components/omni_devices/omni_base.dm | 1 + .../trinary_devices/trinary_base.dm | 6 +-- .../components/unary_devices/unary_base.dm | 1 + code/ATMOSPHERICS/pipes/cap.dm | 1 + code/ATMOSPHERICS/pipes/manifold.dm | 1 + code/ATMOSPHERICS/pipes/manifold4w.dm | 1 + code/ATMOSPHERICS/pipes/simple/pipe_simple.dm | 1 + code/game/machinery/pipe/construction.dm | 51 +++++++------------ 10 files changed, 33 insertions(+), 40 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 4dfe8d70812..a7fe9ddd537 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -41,11 +41,14 @@ Pipelines + Other Objects -> Pipe network if(!pipe_color_check(pipe_color)) pipe_color = null + ..() + +/obj/machinery/atmospherics/initialize() + ..() + if(can_unwrench) stored = new(src, make_from = src) - ..() - /obj/machinery/atmospherics/Destroy() for(var/mob/living/M in src) //ventcrawling is serious business M.remove_ventcrawl() @@ -210,7 +213,7 @@ Pipelines + Other Objects -> Pipe network dir = D initialize_directions = P var/turf/T = loc - level = T.intact ? 2 : 1 + level = T.intact ? 2 : 1 initialize() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index b546268b4e0..343501dfd28 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -42,6 +42,7 @@ return ..() /obj/machinery/atmospherics/binary/initialize() + ..() var/node2_connect = dir var/node1_connect = turn(dir, 180) diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 55216a5a5c2..f1241079ad3 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -57,6 +57,7 @@ return ..() /obj/machinery/atmospherics/omni/initialize() + ..() for(var/datum/omni_port/P in ports) if(P.node || P.mode == 0) continue diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index a008b8886d5..9824715c1f4 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -67,7 +67,7 @@ return ..() /obj/machinery/atmospherics/trinary/initialize() - + ..() //Mixer: //1 and 2 is input //Node 3 is output @@ -78,10 +78,6 @@ //Node 2 is filtered output //Node 3 is rest output //If we flip the filter, 1 and 3 shall exchange positions - - if(can_unwrench) // Overridden here to avoid having to snowflake the flipped/icon_state on the construction - qdel(stored) - stored = new(src, make_from = src) var/node1_connect = turn(dir, -180) var/node2_connect = turn(dir, -90) diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index 76bd3ddc8c7..15b254093f9 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -23,6 +23,7 @@ return ..() /obj/machinery/atmospherics/unary/initialize() + ..() for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) var/c = check_connect_types(target,src) diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 6f70cf52465..35916a5b575 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -62,6 +62,7 @@ overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type) /obj/machinery/atmospherics/pipe/cap/initialize() + ..() for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) var/c = check_connect_types(target,src) diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 555ee66dbfd..6e6a8569ad9 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -33,6 +33,7 @@ icon = null /obj/machinery/atmospherics/pipe/manifold/initialize() + ..() for(var/D in cardinal) if(D == dir) continue diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 8f8b8460486..be0019a43a2 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -152,6 +152,7 @@ update_icon() /obj/machinery/atmospherics/pipe/manifold4w/initialize() + ..() for(var/D in cardinal) for(var/obj/machinery/atmospherics/target in get_step(src, D)) if(target.initialize_directions & get_dir(target,src)) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index 7908acc5321..c3d1762b993 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -44,6 +44,7 @@ initialize_directions = SOUTH|WEST /obj/machinery/atmospherics/pipe/simple/initialize() + ..() normalize_dir() var/N = 2 for(var/D in cardinal) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 667602686b5..47bbfa2715f 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -164,7 +164,7 @@ src.color = PIPE_COLOR_RED else if (pipe_type == PIPE_UNIVERSAL) connect_types = list(1,2,3) - //src.pipe_dir = get_pipe_dir() + update(make_from) src.pixel_x = rand(-5, 5) src.pixel_y = rand(-5, 5) @@ -275,14 +275,8 @@ src.dir = turn(src.dir, -90) - if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) - if(dir==2) - dir = 1 - else if(dir==8) - dir = 4 - else if (pipe_type in list (PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W)) - dir = 2 - //src.pipe_dir = get_pipe_dir() + fixdir() + return /obj/item/pipe/verb/flip() @@ -406,22 +400,6 @@ //Helper to clean up dir /obj/item/pipe/proc/fixdir() - if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) - if(dir==2) - dir = 1 - else if(dir==8) - dir = 4 - -/obj/item/pipe/attack_self(mob/user as mob) - return rotate() - -/obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) - ..() - //* - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!isturf(src.loc)) - return 1 if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) if(dir==2) dir = 1 @@ -429,13 +407,27 @@ dir = 4 else if (pipe_type in list(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER)) dir = 2 + +/obj/item/pipe/attack_self(mob/user as mob) + return rotate() + +/obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) + ..() + + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + + if (!isturf(src.loc)) + return 1 + + fixdir() + var/pipe_dir = get_pipe_dir() for(var/obj/machinery/atmospherics/M in src.loc) if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe - user << "\red There is already a pipe of the same type at this location." + user << "There is already a pipe of the same type at this location." return 1 - // no conflicts found var/obj/machinery/atmospherics/machineReference = null //If somebody wants to overhaul that switch statement below, be my guest. Easier to set a reference here and then transfer logs after the switch statement. @@ -603,11 +595,6 @@ qdel(src) // remove the pipe item return - //TODO: DEFERRED - -// ensure that setterm() is called for a newly connected pipeline - - /obj/item/pipe_meter name = "meter" From f5f27fa186f1bb20048cf7a260b821ac6397f847 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 04:48:42 +0200 Subject: [PATCH 15/69] Atmos analyzer update --- .../components/unary_devices/tank.dm | 7 ++ code/ATMOSPHERICS/pipes/pipe.dm | 10 +++ code/__HELPERS/unsorted.dm | 2 +- code/game/jobs/job_controller.dm | 1 - code/game/machinery/atmoalter/scrubber.dm | 5 +- code/game/objects/items/devices/PDA/PDA.dm | 80 +++---------------- 6 files changed, 32 insertions(+), 73 deletions(-) diff --git a/code/ATMOSPHERICS/components/unary_devices/tank.dm b/code/ATMOSPHERICS/components/unary_devices/tank.dm index 88f32eba44a..7c7298c511d 100644 --- a/code/ATMOSPHERICS/components/unary_devices/tank.dm +++ b/code/ATMOSPHERICS/components/unary_devices/tank.dm @@ -16,6 +16,13 @@ if(!istype(T)) return add_underlay(T, node, dir) + +/obj/machinery/atmospherics/unary/tank/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/device/analyzer)) + atmosanalyzer_scan(air_contents, user) + return + + return ..() /obj/machinery/atmospherics/unary/tank/air name = "Pressure Tank (Air)" diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm index 3f3a21e7789..7041d13993d 100644 --- a/code/ATMOSPHERICS/pipes/pipe.dm +++ b/code/ATMOSPHERICS/pipes/pipe.dm @@ -36,6 +36,16 @@ if(parent && isnull(parent.gcDestroyed)) qdel(parent) parent = null + +/obj/machinery/atmospherics/pipe/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/device/analyzer)) + atmosanalyzer_scan(parent.air, user) + return + + if(istype(W,/obj/item/device/pipe_painter)) + return + + return ..() /obj/machinery/atmospherics/proc/pipeline_expansion() return null diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 21de59e0216..0458944e956 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -334,7 +334,7 @@ Turf and target are seperate in case you want to teleport some distance from a t /obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src) var/obj/icon = target - user.visible_message("[user] has used the analyzer on \icon[icon] [target].", "You use the analyzer on \icon[icon] [target].") + user.visible_message("[user] has used the analyzer on [target].", "You use the analyzer on [target].") var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index e80d9dfe889..03f4f6998a9 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -541,7 +541,6 @@ var/global/datum/controller/occupations/job_master pda.ownjob = C.assignment pda.ownrank = C.rank pda.name = "PDA-[H.real_name] ([pda.ownjob])" - pda.JFLOG("Created") return 1 diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 5ab92bd3088..a62f87ee098 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -205,8 +205,9 @@ user << "You [anchored ? "wrench" : "unwrench"] \the [src]." return - ..() - + else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) + atmosanalyzer_scan(air_contents, user) + /obj/machinery/portable_atmospherics/scrubber/huge/stationary name = "Stationary Air Scrubber" stationary = 1 \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 74c1f2f51ff..7928450f083 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -284,7 +284,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if(usr.stat == 2) usr << "You can't do that because you are dead!" return - JFLOG("AI Showed Message Log") var/HTML = "AI PDA Message Log" for(var/index in tnote) if(index["sent"]) @@ -301,7 +300,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if(usr.stat == 2) usr << "You can't do that because you are dead!" return - JFLOG("AI Toggled Receiver") toff = !toff usr << "PDA sender/receiver toggled [(toff ? "Off" : "On")]!" @@ -314,7 +312,6 @@ var/global/list/obj/item/device/pda/PDAs = list() usr << "You can't do that because you are dead!" return silent=!silent - JFLOG("AI toggled the silent option") usr << "PDA ringer toggled [(silent ? "Off" : "On")]!" /obj/item/device/pda/ai/can_use() @@ -325,7 +322,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if ((honkamt > 0) && (prob(60)))//For clown virus. honkamt-- playsound(loc, 'sound/items/bikehorn.ogg', 30, 1) - JFLOG("[user] PDA honked") return @@ -528,15 +524,11 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/attack_self(mob/user as mob) user.set_machine(src) if(active_uplink_check(user)) - JFLOG("[user] activated a syndicate uplink in their PDA") return - JFLOG("[user] activated PDA") ui_interact(user) //NanoUI requires this proc return /obj/item/device/pda/Topic(href, href_list) - if (href_list["choice"]!="Return") // We really don't need to see ten thousand return actions. - JFLOG("UI Action >>> HREF|[href] >>> HREF_LIST|[list2json(href_list)]") if(href_list["cartmenu"] && !isnull(cartridge)) cartridge.Topic(href, href_list) return 1 @@ -964,7 +956,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if ( can_use(usr) ) if(id) - JFLOG("[usr] removed ID:[id]") remove_id() else usr << "This PDA does not have an ID in it." @@ -981,7 +972,6 @@ var/global/list/obj/item/device/pda/PDAs = list() return if ( can_use(usr) ) - JFLOG("[usr] removed pen") var/obj/item/weapon/pen/O = locate() in src if(O) if (istype(loc, /mob)) @@ -1021,7 +1011,6 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob, params) ..() if(istype(C, /obj/item/weapon/cartridge) && !cartridge) - JFLOG("[user] inserted Cartridge[cartridge]") cartridge = C user.drop_item() cartridge.loc = src @@ -1033,7 +1022,6 @@ var/global/list/obj/item/device/pda/PDAs = list() else if(istype(C, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/idcard = C if(!idcard.registered_name) - JFLOG("[user] tried to insert ID:[idcard] but it was rejected.") user << "\The [src] rejects the ID." return if(!owner) @@ -1042,14 +1030,12 @@ var/global/list/obj/item/device/pda/PDAs = list() ownrank = idcard.rank name = "PDA-[owner] ([ownjob])" user << "Card scanned." - JFLOG("[user] tried to insert ID:[idcard] and it was used to initialize this PDA.") else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) if( can_use(user) )//If they can still act. id_check(user, 2) user << "You put the ID into \the [src]'s slot." - JFLOG("[user] inserted ID:[idcard].") updateSelfDialog()//Update self dialog on success. return //Return in case of failed check or when successful. updateSelfDialog()//For the non-input related code. @@ -1058,7 +1044,6 @@ var/global/list/obj/item/device/pda/PDAs = list() C.loc = src pai = C user << "You slot \the [C] into [src]." - JFLOG("[user] inserted PAI:[pai]") nanomanager.update_uis(src) // update all UIs attached to src else if(istype(C, /obj/item/weapon/pen)) var/obj/item/weapon/pen/O = locate() in src @@ -1067,7 +1052,6 @@ var/global/list/obj/item/device/pda/PDAs = list() else user.drop_item() C.loc = src - JFLOG("[user] inserted PEN:[C]") user << "You slide \the [C] into \the [src]." return @@ -1075,7 +1059,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if (istype(C, /mob/living/carbon)) switch(scanmode) if(1) - JFLOG("[user] used the medical scanner on [C]") for (var/mob/O in viewers(C, null)) O.show_message("\red [user] has analyzed [C]'s vitals!", 1) @@ -1097,7 +1080,6 @@ var/global/list/obj/item/device/pda/PDAs = list() user.show_message("\blue \t Limbs are OK.",1) if(2) - JFLOG("[user] used the fingerprint scanner on [C]") if (!istype(C:dna, /datum/dna)) user << "\blue No fingerprints found on [C]" else @@ -1113,7 +1095,6 @@ var/global/list/obj/item/device/pda/PDAs = list() user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]" if(4) - JFLOG("[user] used the radiation scanner on [C]") for (var/mob/O in viewers(C, null)) O.show_message("\red [user] has analyzed [C]'s radiation levels!", 1) @@ -1128,22 +1109,18 @@ var/global/list/obj/item/device/pda/PDAs = list() switch(scanmode) if(3) - JFLOG("[user] used the reagent scanner on [A]") - if(!isobj(A)) - return if(!isnull(A.reagents)) if(A.reagents.reagent_list.len > 0) var/reagents_length = A.reagents.reagent_list.len - user << "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." + user << "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." for (var/re in A.reagents.reagent_list) - user << "\blue \t [re]" + user << "\t [re]" else - user << "\blue No active chemical agents found in [A]." + user << "No active chemical agents found in [A]." else - user << "\blue No significant chemical agents found in [A]." + user << "No significant chemical agents found in [A]." if(5) - JFLOG("[user] used the air analysis scanner on [A]") if (istype(A, /obj/item/weapon/tank)) var/obj/item/weapon/tank/T = A atmosanalyzer_scan(T.air_contents, user, T) @@ -1159,59 +1136,51 @@ var/global/list/obj/item/device/pda/PDAs = list() else if (istype(A, /obj/item/weapon/flamethrower)) var/obj/item/weapon/flamethrower/T = A if(T.ptank) atmosanalyzer_scan(T.ptank.air_contents, user, T) + else if (istype(A, /obj/machinery/portable_atmospherics/scrubber/huge)) + var/obj/machinery/portable_atmospherics/scrubber/huge/T = A + atmosanalyzer_scan(T.air_contents, user, T) + else if (istype(A, /obj/machinery/atmospherics/unary/tank)) + var/obj/machinery/atmospherics/unary/tank/T = A + atmosanalyzer_scan(T.air_contents, user, T) if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) - JFLOG("[user] used the document scanner on [A]") // JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents, // as this will clobber the HTML, but at least it lets you scan a document. You can restore the original // notes by editing the note again. (Was going to allow you to edit, but scanned documents are too long.) var/raw_scan = (A:info) var/formatted_scan = "" // Scrub out the tags (replacing a few formatting ones along the way) - // Find the beginning and end of the first tag. var/tag_start = findtext(raw_scan,"<") var/tag_stop = findtext(raw_scan,">") - // Until we run out of complete tags... while(tag_start&&tag_stop) var/pre = copytext(raw_scan,1,tag_start) // Get the stuff that comes before the tag var/tag = lowertext(copytext(raw_scan,tag_start+1,tag_stop)) // Get the tag so we can do intellegent replacement var/tagend = findtext(tag," ") // Find the first space in the tag if there is one. - // Anything that's before the tag can just be added as is. formatted_scan = formatted_scan+pre - // If we have a space after the tag (and presumably attributes) just crop that off. if (tagend) tag=copytext(tag,1,tagend) - if (tag=="p"||tag=="/p"||tag=="br") // Check if it's I vertical space tag. formatted_scan=formatted_scan+"
" // If so, add some padding in. - raw_scan = copytext(raw_scan,tag_stop+1) // continue on with the stuff after the tag - // Look for the next tag in what's left tag_start = findtext(raw_scan,"<") tag_stop = findtext(raw_scan,">") - // Anything that is left in the page. just tack it on to the end as is formatted_scan=formatted_scan+raw_scan - // If there is something in there already, pad it out. if (length(note)>0) note = note + "

" - // Store the scanned document to the notes note = "Scanned Document. Edit to restore previous notes/delete scan.
----------
" + formatted_scan + "
" // notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents" // feature to the PDA, which would better convey the availability of the feature, but this will work for now. - // Inform the user user << "\blue Paper scanned and OCRed to notekeeper." //concept of scanning paper copyright brainoblivion 2009 - - /obj/item/device/pda/proc/explode() //This needs tuning. if(!src.detonate) return var/turf/T = get_turf(src.loc) @@ -1224,12 +1193,10 @@ var/global/list/obj/item/device/pda/PDAs = list() T.hotspot_expose(700,125) explosion(T, -1, -1, 2, 3) - JFLOG("Exploded") qdel(src) return /obj/item/device/pda/Destroy() - JFLOG("Destroyed") PDAs -= src if (src.id) src.id.loc = get_turf(src.loc) @@ -1249,7 +1216,6 @@ var/global/list/obj/item/device/pda/PDAs = list() M.stop_pulling() M << "\blue You slipped on the PDA!" - JFLOG("Clown PDA Slipped [M]") playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) M.Stun(8) M.Weaken(5) @@ -1310,28 +1276,4 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/emp_act(severity) for(var/atom/A in src) A.emp_act(severity) - -/** -* -* JFLOG -* -* These functions as well as all the log statements are being used to gather user data for how -* people are using the PDA files with the intent of revising them based on this data. -* -* They are being added on 28/03/2015 and the intent is to remove them in two weeks. If you're -* reading this and it's substantially past that point, you should remove anything marked with -* 'JFLOG'. -* -* All changes should be contained to PDA.dm except the creation function which is contained in -* job_controller.dm. -* -* - Jack Fractal -**/ - - -/obj/item/device/pda/proc/JFLOG_DescribeSelf() - return "([src]|[cartridge ? cartridge.name : "None"])" - -/obj/item/device/pda/proc/JFLOG(message as text) - if (config) - log_pda("[JFLOG_DescribeSelf()] >>> [message]") + \ No newline at end of file From fe20808108d38df180d18caaf9c9d1c1dfce051a Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 05:03:05 +0200 Subject: [PATCH 16/69] Dead people can't emote --- code/modules/mob/living/carbon/alien/humanoid/emote.dm | 3 +++ code/modules/mob/living/carbon/alien/larva/emote.dm | 4 +++- code/modules/mob/living/carbon/brain/emote.dm | 3 +++ code/modules/mob/living/carbon/human/emote.dm | 3 +++ code/modules/mob/living/carbon/metroid/emote.dm | 3 ++- code/modules/mob/living/silicon/emote.dm | 3 +++ code/modules/mob/living/silicon/pai/emote.dm | 3 +++ code/modules/mob/living/silicon/robot/emote.dm | 3 +++ 8 files changed, 23 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index a80a0d5892c..69d1eb600dc 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -1,4 +1,7 @@ /mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null) + if(stat) + return + var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 12ad431f3c3..134350e2517 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -1,5 +1,7 @@ /mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null) - + if(stat) + return + var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 0441eb00ac4..054a9b6e71c 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -1,4 +1,7 @@ /mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null) + if(stat) + return + if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 95e60ade252..d759e143778 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,4 +1,7 @@ /mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null) + if(stat) + return + var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/metroid/emote.dm index 2cbc139f5a1..3c95bea1a43 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/metroid/emote.dm @@ -1,5 +1,6 @@ /mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) - + if(stat) + return if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index f7ead12e4cc..8c28d407ede 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -1,4 +1,7 @@ /mob/living/silicon/emote(var/act, var/m_type=1, var/message = null) + if(stat) + return + var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm index a8eeac8cbb7..2fce92f2883 100644 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ b/code/modules/mob/living/silicon/pai/emote.dm @@ -1,4 +1,7 @@ /mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null) + if(stat) + return + switch(act) if ("help") src << "ping, beep, buzz." diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 9c01f9ee5ec..45a086f0fe7 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,4 +1,7 @@ /mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null) + if(stat) + return + var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) From 24150330cf3e4ffaf26df8d5f08330841de6a01e Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 06:02:45 +0200 Subject: [PATCH 17/69] Removes the space cube, implements the round-randomized torus space map --- code/game/turfs/space/space.dm | 129 ++---------- .../space transition/space_transition.dm | 187 ++++++++++++++++++ paradise.dme | 1 + 3 files changed, 199 insertions(+), 118 deletions(-) create mode 100644 code/modules/space transition/space_transition.dm diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index ec573e348a2..dbd78b50188 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -9,7 +9,7 @@ thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 - var/transition //These is used in transistions as a way to tell where on the "cube" of space you're transitioning from/to + var/destination_z var/destination_x var/destination_y @@ -85,30 +85,18 @@ user << "\red The plating is going to need some support." return - -// Ported from unstable r355 - /turf/space/Entered(atom/movable/A as mob|obj) ..() - if ((!(A) || src != A.loc)) return + if ((!(A) || src != A.loc)) + return - if(transition) - - if(A.z > MAX_Z) return //for away missions - - if(destination_x) - A.x = destination_x - - if(destination_y) - A.y = destination_y - - var/obj/item/flag/nation/fukkenflag = A.GetTypeInAllContents(/obj/item/flag/nation) - if(fukkenflag) - fukkenflag.loc = fukkenflag.startloc - if(isliving(A)) - A << "The flag you were carrying was just returned to it's base. Nice try." - - A.z = text2num(transition) + if(destination_z) + if(A.z > MAX_Z) + return + + A.x = destination_x + A.y = destination_y + A.z = destination_z if(isliving(A)) var/mob/living/L = A @@ -229,100 +217,5 @@ A.loc.Entered(A) return - -/turf/space/proc/Assign_Destination() - - if(transition) - if(x <= TRANSITIONEDGE) //west - destination_x = world.maxx - TRANSITIONEDGE - 2 - else if (x >= (world.maxx - TRANSITIONEDGE - 1)) //east - destination_x = TRANSITIONEDGE + 1 - else if (y <= TRANSITIONEDGE) //south - destination_y = world.maxy - TRANSITIONEDGE - 2 - else if (y >= (world.maxy - TRANSITIONEDGE - 1)) //north - destination_y = TRANSITIONEDGE + 1 - -/* - Set the space turf transitions for the "space cube" - Connections: - ___ ___ - /_A_/| /_F_/| - | |C| | |E| - |_B_|/ |_D_|/ - Note that all maps except F are oriented with north towards A. A and F are oriented with north towards D. - The characters on the second cube should be upside down in this illustration, but aren't because of a lack of unicode support. -*/ -proc/setup_map_transitions() //listamania - - var/list/unplaced_z_levels = accessable_z_levels - var/list/free_zones = list("A", "B", "C", "D", "E", "F") - var/list/zone_connections = list("D ","C ","B ","E ","A ","C ","F ","E ","A ","D ","F ","B ","A ","E ","F ","C ","A ","B ","F ","D ","D ","C ","B ","E") //This describes the borders of a cube based on free zones, really! - var/text_zone_connections = list2text(zone_connections) - var/list/final_zone_connections = list() - var/list/turfs_needing_transition = list() - var/list/turfs_needing_destinations = list() - var/list/z_level_order = list() - var/z_level - var/placement - var/total_processed = 0 - - for(var/turf/space/S in world) //Define the transistions of the z levels - total_processed++ - if (S.x == TRANSITIONEDGE || S.x == (world.maxx - TRANSITIONEDGE - 1) || S.y == TRANSITIONEDGE || S.y == (world.maxy - TRANSITIONEDGE - 1)) - turfs_needing_transition += S - - //if we've processed lots of turfs, switch to background processing to prevent being mistaken for an infinite loop - if(total_processed > 450000) - set background = 1 - - while(free_zones.len != 0) //Assign the sides of the cube - if(!unplaced_z_levels || !unplaced_z_levels.len) //if we're somehow unable to fill the cube, pad with deep space - z_level = 6 - else - z_level = pick(unplaced_z_levels) - if(z_level > world.maxz) //A safety if one of the unplaced_z_levels doesn't actually exist - z_level = 6 - placement = pick(free_zones) - text_zone_connections = replacetext(text_zone_connections, placement, "[z_level]") - - for(var/turf/space/S in turfs_needing_transition) //pass the identity zone to the relevent turfs - if(S.transition && prob(50)) //In z = 6 (deep space) it's a bit of a crapshoot in terms of navigation - continue - if(S.z == z_level) - S.transition = num2text(z_level) - if(!(S in turfs_needing_destinations)) - turfs_needing_destinations += S - if(S.z != 6) //deep space turfs need to hang around in case they get reassigned a zone - turfs_needing_transition -= S - - z_level_order += num2text(z_level) - unplaced_z_levels -= z_level - free_zones -= placement - - zone_connections = text2list(replacetext(text_zone_connections, " ", "\n")) //Convert the string back into a list - - final_zone_connections.len = z_level_order.len - - var/list/temp = list() - - for(var/j=1, j<= 24, j++) - temp += zone_connections[j] - if(temp.len == 4) //Chunks of cardinal directions - final_zone_connections[z_level_order[j/4]] += temp - temp = list() - - for(var/turf/space/S in turfs_needing_destinations) //replace the identity zone with the destination z-level - var/list/directions = final_zone_connections[S.transition] - if(S.x <= TRANSITIONEDGE) - S.transition = directions[Z_WEST] - else if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) - S.transition = directions[Z_EAST] - else if(S.y <= TRANSITIONEDGE) - S.transition = directions[Z_SOUTH] - else - S.transition = directions[Z_NORTH] - - S.Assign_Destination() - /turf/space/singularity_act() - return \ No newline at end of file + return diff --git a/code/modules/space transition/space_transition.dm b/code/modules/space transition/space_transition.dm new file mode 100644 index 00000000000..81be4604193 --- /dev/null +++ b/code/modules/space transition/space_transition.dm @@ -0,0 +1,187 @@ +//This is realisation of the working torus-looping randomized-per-round space map, this kills the cube + +#define Z_LEVEL_NORTH "1" +#define Z_LEVEL_SOUTH "2" +#define Z_LEVEL_EAST "4" +#define Z_LEVEL_WEST "8" + + +var/list/z_levels_list = list() + +/datum/space_level + var/name = "Your config settings failed, you need to fix this for the datum space levels to work" + var/list/neigbours + var/z_value = 1 //actual z placement + var/linked = 1 + var/xi + var/yi //imaginary placements on the grid + +/datum/space_level/New() + neigbours = list() + var/list/L = list(Z_LEVEL_NORTH,Z_LEVEL_SOUTH,Z_LEVEL_EAST,Z_LEVEL_WEST) + for(var/A in L) + neigbours[A] = src + +/datum/space_level/proc/set_neigbours(list/L) + for(var/datum/point/P in L) + if(P.x == xi) + if(P.y == yi+1) + neigbours[Z_LEVEL_NORTH] = P.spl + P.spl.neigbours[Z_LEVEL_SOUTH] = src + else if(P.y == yi-1) + neigbours[Z_LEVEL_SOUTH] = P.spl + P.spl.neigbours[Z_LEVEL_NORTH] = src + else if(P.y == yi) + if(P.x == xi+1) + neigbours[Z_LEVEL_EAST] = P.spl + P.spl.neigbours[Z_LEVEL_WEST] = src + else if(P.x == xi-1) + neigbours[Z_LEVEL_WEST] = P.spl + P.spl.neigbours[Z_LEVEL_EAST] = src + +/datum/point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else + var/list/neigbours = list() + var/x + var/y + var/datum/space_level/spl + +/datum/point/New(nx, ny, list/point_grid) + if(!point_grid) + qdel(src) + return + var/list/L = point_grid[1] + if(nx > point_grid.len || ny > L.len) + qdel(src) + return + x = nx + y = ny + if(point_grid[x][y]) + return + point_grid[x][y] = src + +/datum/point/proc/set_neigbours(list/grid) + var/max_X = grid.len + var/list/max_Y = grid[1] + max_Y = max_Y.len + neigbours.Cut() + if(x+1 <= max_X) + neigbours |= grid[x+1][y] + if(x-1 >= 1) + neigbours |= grid[x-1][y] + if(y+1 <= max_Y) + neigbours |= grid[x][y+1] + if(y-1 >= 1) + neigbours |= grid[x][y-1] + + +//config/space_levels.txt is where you define your zlevel datum names, their connection to actual z levels and if you want them connected to one another or not +//Grammar: Name;z value;linked/unlinked +//Name is the name of the datum, just for the sake of it +//z value is to what actual map z level this datum is pointing +//linked/unlinked decide if you want the z level in the general map or not, for example centcomm is not reachable +//Each entry must be separated with a single empty line, no spaces outside the name +//No comments in the file allowed + +/proc/setup_map_transitions() //listamania + var/list/SLS = file2list("config/space_levels.txt", "\n\n") + var/datum/space_level/D + var/list/config_settings[SLS.len][] + for(var/A in SLS) + config_settings[SLS.Find(A)] = text2list(A, ";") + var/conf_set_len = SLS.len + SLS.Cut() + for(var/A in config_settings) + D = new() + D.name = A[1] + D.z_value = text2num(A[2]) + if(A[3] != "linked") + D.linked = 0 + z_levels_list["[D.z_value]"] = D + else + SLS.Add(D) + var/list/point_grid[conf_set_len*2+1][conf_set_len*2+1] + var/list/grid = list() + var/datum/point/P + for(var/i = 1, i<=conf_set_len*2+1, i++) + for(var/j = 1, j<=conf_set_len*2+1, j++) + P = new/datum/point(i,j, point_grid) + point_grid[i][j] = P + grid.Add(P) + for(var/datum/point/pnt in grid) + pnt.set_neigbours(point_grid) + P = point_grid[conf_set_len][conf_set_len] + var/list/possible_points = list() + var/list/used_points = list() + grid.Cut() + while(SLS.len) + D = pick(SLS) + SLS.Remove(D) + D.xi = P.x + D.yi = P.y + P.spl = D + possible_points |= P.neigbours + used_points |= P + possible_points.Remove(used_points) + D.set_neigbours(used_points) + P = pick(possible_points) + grid["[D.z_value]"] = D + + for(var/A in z_levels_list) + grid[A] = z_levels_list[A] + + for(var/turf/space/S in world) //Define the transistions of the z levels + if(S.x <= TRANSITIONEDGE) + D = grid["[S.z]"] + if(D.neigbours[Z_LEVEL_WEST] != D) + D = D.neigbours[Z_LEVEL_WEST] + S.destination_z = D.z_value + else + while(D.neigbours[Z_LEVEL_EAST] != D) + D = D.neigbours[Z_LEVEL_EAST] + S.destination_z = D.z_value + S.destination_x = world.maxx - TRANSITIONEDGE - 2 + S.destination_y = S.y + + if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) + D = grid["[S.z]"] + if(D.neigbours[Z_LEVEL_EAST] != D) + D = D.neigbours[Z_LEVEL_EAST] + S.destination_z = D.z_value + else + while(D.neigbours[Z_LEVEL_WEST] != D) + D = D.neigbours[Z_LEVEL_WEST] + S.destination_z = D.z_value + S.destination_x = TRANSITIONEDGE + 2 + S.destination_y = S.y + + if(S.y <= TRANSITIONEDGE) + D = grid["[S.z]"] + if(D.neigbours[Z_LEVEL_SOUTH] != D) + D = D.neigbours[Z_LEVEL_SOUTH] + S.destination_z = D.z_value + else + while(D.neigbours[Z_LEVEL_NORTH] != D) + D = D.neigbours[Z_LEVEL_NORTH] + S.destination_z = D.z_value + S.destination_x = S.x + S.destination_y = world.maxy - TRANSITIONEDGE - 2 + + if(S.y >= (world.maxy - TRANSITIONEDGE - 1)) + D = grid["[S.z]"] + if(D.neigbours[Z_LEVEL_NORTH] != D) + D = D.neigbours[Z_LEVEL_NORTH] + S.destination_z = D.z_value + else + while(D.neigbours[Z_LEVEL_SOUTH] != D) + D = D.neigbours[Z_LEVEL_SOUTH] + S.destination_z = D.z_value + S.destination_x = S.x + S.destination_y = TRANSITIONEDGE + 2 + + for(var/A in grid) + z_levels_list[A] = grid[A] + +#undef Z_LEVEL_NORTH +#undef Z_LEVEL_SOUTH +#undef Z_LEVEL_EAST +#undef Z_LEVEL_WEST diff --git a/paradise.dme b/paradise.dme index 76969b151fa..99373700176 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1822,6 +1822,7 @@ #include "code\modules\shuttles\shuttle_supply.dm" #include "code\modules\shuttles\shuttles_multi.dm" #include "code\modules\shuttles\whiteship.dm" +#include "code\modules\space transition\space_transition.dm" #include "code\modules\store\items.dm" #include "code\modules\store\store.dm" #include "code\modules\surgery\bones.dm" From 4bf3bb9c31526b6e9437afcfbd348794145f2fb4 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 06:32:17 +0200 Subject: [PATCH 18/69] Remove redundant check --- code/game/turfs/space/space.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index dbd78b50188..9cafaf48198 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -90,10 +90,7 @@ if ((!(A) || src != A.loc)) return - if(destination_z) - if(A.z > MAX_Z) - return - + if(destination_z) A.x = destination_x A.y = destination_y A.z = destination_z From 75c7cf165af9074926336740fa99eec63b5d5b2e Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 06:58:55 +0200 Subject: [PATCH 19/69] R&D fixes --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/modules/research/rdconsole.dm | 26 +++++++++++++------------- code/modules/research/server.dm | 19 +++++++++---------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 19d3f4fd561..6d6303de2a0 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5105,7 +5105,7 @@ "bUi" = (/obj/machinery/r_n_d/server/core,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) "bUj" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) "bUk" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom) -"bUl" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/server) +"bUl" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/turf/simulated/floor/plating,/area/toxins/server) "bUm" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) "bUn" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) "bUo" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 577397b70fc..9072217e4f7 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -184,7 +184,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(..()) return 1 - if(!allowed(usr)) + if(!allowed(usr) && !isobserver(usr)) return 1 add_fingerprint(usr) @@ -324,7 +324,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, use_power(250) updateUsrDialog() - else if(href_list["lock"]) //Lock the console from use by anyone without tox access. + else if(href_list["lock"]) //Lock the console from use by anyone without access. if(src.allowed(usr)) screen = text2num(href_list["lock"]) else @@ -606,7 +606,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/attack_hand(mob/user as mob) if(..()) return 1 - if(!allowed(user)) + if(!allowed(user) && !isobserver(user)) user << "Access denied." return 1 interact(user) @@ -1115,26 +1115,26 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "" return dat + +/obj/machinery/computer/rdconsole/core + name = "Core R&D Console" + desc = "A console used to interface with R&D tools." + id = 1 /obj/machinery/computer/rdconsole/robotics name = "Robotics R&D Console" desc = "A console used to interface with R&D tools." id = 2 req_access = list(access_robotics) + +/obj/machinery/computer/rdconsole/experiment + name = "E.X.P.E.R.I-MENTOR R&D Console" + desc = "A console used to interface with R&D tools." + id = 3 /obj/machinery/computer/rdconsole/mechanics name = "Mechanics R&D Console" desc = "A console used to interface with R&D tools." id = 4 req_access = list(access_mechanic) - -/obj/machinery/computer/rdconsole/core - name = "Core R&D Console" - desc = "A console used to interface with R&D tools." - id = 1 - -/obj/machinery/computer/rdconsole/experiment - name = "E.X.P.E.R.I-MENTOR R&D Console" - desc = "A console used to interface with R&D tools." - id = 3 \ No newline at end of file diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 67cf7cd9217..e55ff44e5ed 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -335,16 +335,15 @@ emagged = 1 user << "\blue You you disable the security protocols" src.updateUsrDialog() - -/obj/machinery/r_n_d/server/robotics - name = "Robotics R&D Server" - id_with_upload_string = "1;2" - id_with_download_string = "1;2" - server_id = 2 - - + /obj/machinery/r_n_d/server/core name = "Core R&D Server" - id_with_upload_string = "1" - id_with_download_string = "1" + id_with_upload_string = "1;3" + id_with_download_string = "1;3" server_id = 1 + +/obj/machinery/r_n_d/server/robotics + name = "Robotics and Mechanic R&D Server" + id_with_upload_string = "2;4" + id_with_download_string = "2;4" + server_id = 2 From 0b030a63bded9b68429015f9b0e4fdb96abf2e47 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 07:32:07 +0200 Subject: [PATCH 20/69] Remove spaces from module files --- .../detective_work.dm | 0 .../evidence.dm | 0 .../footprints_and_rag.dm | 0 .../scanner.dm | 0 .../__gc_info.dm | 0 .../garbage_collector.dm | 0 .../gc_testing.dm | 0 code/modules/genetics2/computer.dm | 0 code/modules/genetics2/genetree.dm | 63 --- code/modules/genetics2/sectors.dm | 110 ------ code/modules/icon generation/Bluespaced.dm | 243 ------------ .../icon generation/Icon_color_animation.dm | 96 ----- code/modules/icon generation/Uristrunes.dm | 268 ------------- .../mapGenerator.dm | 0 .../mapGeneratorModule.dm | 0 .../mapGeneratorModules/helpers.dm | 0 .../mapGeneratorModules/nature.dm | 0 .../mapGeneratorReadme.dm | 0 .../mapGenerators/asteroid.dm | 0 .../mapGenerators/nature.dm | 0 .../mapGenerators/syndicate.dm | 0 .../keycard authentication.dm | 370 +++++++++--------- .../security levels.dm | 366 ++++++++--------- .../space_transition.dm | 0 paradise.dme | 34 +- 25 files changed, 385 insertions(+), 1165 deletions(-) rename code/modules/{DetectiveWork => detective_work}/detective_work.dm (100%) rename code/modules/{DetectiveWork => detective_work}/evidence.dm (100%) rename code/modules/{DetectiveWork => detective_work}/footprints_and_rag.dm (100%) rename code/modules/{DetectiveWork => detective_work}/scanner.dm (100%) rename code/modules/{garbage collection => garbage_collection}/__gc_info.dm (100%) rename code/modules/{garbage collection => garbage_collection}/garbage_collector.dm (100%) rename code/modules/{garbage collection => garbage_collection}/gc_testing.dm (100%) delete mode 100644 code/modules/genetics2/computer.dm delete mode 100644 code/modules/genetics2/genetree.dm delete mode 100644 code/modules/genetics2/sectors.dm delete mode 100644 code/modules/icon generation/Bluespaced.dm delete mode 100644 code/modules/icon generation/Icon_color_animation.dm delete mode 100644 code/modules/icon generation/Uristrunes.dm rename code/modules/{procedural mapping => procedural_mapping}/mapGenerator.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGeneratorModule.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGeneratorModules/helpers.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGeneratorModules/nature.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGeneratorReadme.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGenerators/asteroid.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGenerators/nature.dm (100%) rename code/modules/{procedural mapping => procedural_mapping}/mapGenerators/syndicate.dm (100%) rename code/modules/{security levels => security_levels}/keycard authentication.dm (96%) rename code/modules/{security levels => security_levels}/security levels.dm (97%) rename code/modules/{space transition => space_transition}/space_transition.dm (100%) diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/detective_work/detective_work.dm similarity index 100% rename from code/modules/DetectiveWork/detective_work.dm rename to code/modules/detective_work/detective_work.dm diff --git a/code/modules/DetectiveWork/evidence.dm b/code/modules/detective_work/evidence.dm similarity index 100% rename from code/modules/DetectiveWork/evidence.dm rename to code/modules/detective_work/evidence.dm diff --git a/code/modules/DetectiveWork/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm similarity index 100% rename from code/modules/DetectiveWork/footprints_and_rag.dm rename to code/modules/detective_work/footprints_and_rag.dm diff --git a/code/modules/DetectiveWork/scanner.dm b/code/modules/detective_work/scanner.dm similarity index 100% rename from code/modules/DetectiveWork/scanner.dm rename to code/modules/detective_work/scanner.dm diff --git a/code/modules/garbage collection/__gc_info.dm b/code/modules/garbage_collection/__gc_info.dm similarity index 100% rename from code/modules/garbage collection/__gc_info.dm rename to code/modules/garbage_collection/__gc_info.dm diff --git a/code/modules/garbage collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm similarity index 100% rename from code/modules/garbage collection/garbage_collector.dm rename to code/modules/garbage_collection/garbage_collector.dm diff --git a/code/modules/garbage collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm similarity index 100% rename from code/modules/garbage collection/gc_testing.dm rename to code/modules/garbage_collection/gc_testing.dm diff --git a/code/modules/genetics2/computer.dm b/code/modules/genetics2/computer.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/genetics2/genetree.dm b/code/modules/genetics2/genetree.dm deleted file mode 100644 index aa8d1ba7571..00000000000 --- a/code/modules/genetics2/genetree.dm +++ /dev/null @@ -1,63 +0,0 @@ -// Management of available genes. - -/datum/genetree - var/list/sectors=list() - var/list/dependencies=list() - var/list/dependants=list() - var/obj/machinery/networked/biomass_controller/biomass = null - -/datum/genetree/New(var/obj/machinery/networked/biomass_controller/holder) - biomass = holder - // Build list of all sectors - for(var/typepath in subtypesof(/datum/genetic_sector)) - var/datum/genetic_sector/sector = new typepath - sectors[sector.id]=sector - - if(sector.prerequisites.len > 0) - sector.locked=1 - - // Make list of things that depend on this sector. - dependencies[sector.id]=sector.prerequisites - - // Generate reverse dependencies - for(var/dependee in sector.prerequisites) - if(!(dependee in dependants)) - dependants[dependee]=list(sector.id) - else - var/list/D = dependants[dependee] - D.Add(sector.name) - -/datum/genetree/proc/IsActive(var/sname) - var/datum/genetic_sector/sector = sectors[sname] - return sector.active - -/datum/genetree/proc/CanActivateSector(var/sname) - var/datum/genetic_sector/sector = sectors[sname] - for(var/dep in sector.prerequisites) - if(!IsActive(sector.id)) - return 0 - return biomass.available >= sector.required_biomass - -// Does NOT check for biomass -/datum/genetree/proc/ActivateSector(var/sname) - var/datum/genetic_sector/sector = sectors[sname] - sector.active = 1 - sector.OnActivate() - for(var/subsect in dependants[sname]) - var/datum/genetic_sector/subsector = sectors[subsect] - subsector.locked=0 - -/datum/genetree/proc/CheckSectors() - var/sectors_changed=0 - for(var/sname in sectors) - var/datum/genetic_sector/sector = sectors[sname] - var/pstate=sector.active - sector.active=1 - for(var/prereq in sector.prerequisites) - if(!IsActive(prereq)) - sector.active=0 - break - if(pstate != sector.active) - sectors_changed = 1 - if(sectors_changed) - CheckSectors() \ No newline at end of file diff --git a/code/modules/genetics2/sectors.dm b/code/modules/genetics2/sectors.dm deleted file mode 100644 index aec12619180..00000000000 --- a/code/modules/genetics2/sectors.dm +++ /dev/null @@ -1,110 +0,0 @@ -var/global/current_sector_id=0 -/datum/genetic_sector - var/name = "UNKNOWN SECTOR" - var/desc = "LOLIDK" - - var/id = "" - var/uniqid = "" // 3-char ID, shown when locked. - var/list/prerequisites = list() - var/list/blocks_txt = list() - var/list/blocks = list() // DO NOT FUCKING USE THIS - var/required_biomass = 0 // In hominids (/mob/living/carbon) - var/time_required = 300 // Decaseconds required to unlock - var/time_researched = 0 - var/active=0 // Accessible - var/locked=0 // Cannot be purchased (yet) - -/datum/genetic_sector/New() - uniqid = add_zero2("[current_sector_id++]",3) - - // Set blocks - for(var/blockname in blocks_txt) - var/block = assigned_blocks[blockname] - if(block) - blocks += block - -/////////////////////////////////////// -// SECTORS -/////////////////////////////////////// - -/datum/genetic_sector/metabolism - id = "metabolism" - name = "Metabolism" - desc = "Grants access to areas of DNA that affect how the body controls its temperature." - required_biomass = 1 - time_required = 30 SECONDS - blocks_txt=list( - "COLD", - "FIRE", - "IMMOLATE", - "SOBER", - "MELT", - "FAT" - ) - -/datum/genetic_sector/mind - id = "mind" - name = "Mental Aptitude" - desc = "Reveals parts of DNA that affect mental capabilities" - required_biomass = 2 - time_required = 30 SECONDS - blocks_txt=list( - "PSYRESIST", - "HALLUCINATION", - "TWITCH", - "EPILEPSY", - ) - -/datum/genetic_sector/teleability - id = "teleability" - name = "Teleability" - desc = "Activates unused portions of the brain that can affect people a great distance away." - prerequisites = list("mind") - required_biomass = 4 - time_required = 1 MINUTES - blocks_txt = list( - "REMOTEVIEW", - "REMOTETALK", - "CRYO", - "EMPATH" - ) - -/datum/genetic_sector/telekinesis - id = "telekinesis" - name = "Telekinesis" - desc = "Activates unused portions of the brain that can affect objects a great distance away." - prerequisites = list("teleability") - required_biomass = 5 - time_required = 2 MINUTES - blocks_txt = list( - "TELE", - "FAKE" - ) - -/datum/genetic_sector/senses - id = "senses" - name = "Senses" - desc = "Accesses genes that affect vision and hearing." - prerequisites = list("mind") - required_biomass = 4 - time_required = 30 SECONDS - blocks_txt = list( - "XRAY", - "BLIND", - "GLASSES", - "EMPATH", - "DEAF" - ) - -/datum/genetic_sector/respiration - id = "respiration" - name = "Respiration" - desc = "Mess around with genes that affect breathing and lungs." - prerequisites = list("metabolism") - time_required = 1 MINUTES - required_biomass = 4 - blocks_txt = list( - "NOBREATH", - "COUGH", - "INCREASERUN", - ) \ No newline at end of file diff --git a/code/modules/icon generation/Bluespaced.dm b/code/modules/icon generation/Bluespaced.dm deleted file mode 100644 index 697b9e97196..00000000000 --- a/code/modules/icon generation/Bluespaced.dm +++ /dev/null @@ -1,243 +0,0 @@ -/proc/bsi_cast_ray(icon/I, list/start, list/end) - - if(abs(start[1] - end[1]) > abs(start[2] - end[2])) - var/dist = abs(start[1] - end[1]) * 2 - - for(var/i = 1, i <= dist, i++) - var/x = round((start[1] * i / dist) + (end[1] * (1 - i / dist))) - var/y = round((start[2] * i / dist) + (end[2] * (1 - i / dist))) - - if(I.GetPixel(x, y) != null) - return list(x, y) - - else - var/dist = abs(start[2] - end[2]) * 2 - - for(var/i = 1, i <= dist, i++) - var/x = round((start[1] * i / dist) + (end[1] * (1 - i / dist))) - var/y = round((start[2] * i / dist) + (end[2] * (1 - i / dist))) - - if(I.GetPixel(x, y) != null) - return list(x, y) - - return null - -/proc/bsi_split_colors(color) - if(color == null) - return list(0, 0, 0, 0) - - var/list/colors = list(0, 0, 0, 0) - colors[1] = hex2num(copytext(color, 2, 4)) - colors[2] = hex2num(copytext(color, 4, 6)) - colors[3] = hex2num(copytext(color, 6, 8)) - colors[4] = (length(color) > 7)? hex2num(copytext(color, 8, 10)) : 255 - - return colors - -/proc/bsi_spread(icon/I, list/start_point) - var/list/queue = list() - queue[++queue.len] = start_point - - var/i = 0 - - while(i++ < length(queue)) - var/x = queue[i][1] - var/y = queue[i][2] - - var/list/pixel = bsi_split_colors(I.GetPixel(x, y)) - if(pixel[4] == 0) - continue - - var/list/n = (y < I.Height())? bsi_split_colors(I.GetPixel(x, y + 1)) : list(0, 0, 0, 0) - var/list/s = (y > 1)? bsi_split_colors(I.GetPixel(x, y - 1)) : list(0, 0, 0, 0) - var/list/e = (x < I.Width())? bsi_split_colors(I.GetPixel(x + 1, y)) : list(0, 0, 0, 0) - var/list/w = (x > 1)? bsi_split_colors(I.GetPixel(x - 1, y)) : list(0, 0, 0, 0) - - var/value = (i == 1)? 16 : max(n[1] - 1, e[1] - 1, s[1] - 1, w[1] - 1) - - if(prob(50)) - value = max(0, value - 1) - - if(prob(50)) - value = max(0, value - 1) - - if(prob(50)) - value = max(0, value - 1) - - if(value <= pixel[1]) - continue - - var/v2 = 256 - ((16 - value) * (16 - value)) - - I.DrawBox(rgb(value, v2, pixel[4] - v2, pixel[4]), x, y) - - if(n[4] != 0 && n[1] < value - 1) - queue[++queue.len] = list(x, y + 1) - - if(s[4] != 0 && s[1] < value - 1) - queue[++queue.len] = list(x, y - 1) - - if(e[4] != 0 && e[1] < value - 1) - queue[++queue.len] = list(x + 1, y) - - if(w[4] != 0 && w[1] < value - 1) - queue[++queue.len] = list(x - 1, y) - - - - - -/proc/bsi_generate_mask(icon/source, state) - var/icon/mask = icon(source, state) - - mask.MapColors( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 0, 0, 0) - - var/hits = 0 - - for(var/i = 1, i <= 10, i++) - var/point1 - var/point2 - - if(prob(50)) - if(prob(50)) - point1 = list(rand(1, mask.Width()), mask.Height()) - point2 = list(rand(1, mask.Width()), 1) - - else - point2 = list(rand(1, mask.Width()), mask.Height()) - point1 = list(rand(1, mask.Width()), 1) - - else - if(prob(50)) - point1 = list(mask.Width(), rand(1, mask.Height())) - point2 = list(1, rand(1, mask.Height())) - - else - point2 = list(mask.Width(), rand(1, mask.Height())) - point1 = list(1, rand(1, mask.Height())) - - var/hit = bsi_cast_ray(mask, point1, point2) - - if(hit == null) - continue - - hits++ - - bsi_spread(mask, hit) - - if(prob(20 + hits * 20)) - break - - if(hits == 0) - return null - - else - return mask - -/proc/generate_bluespace_icon(icon/source, state) - - var/icon/mask = bsi_generate_mask(source, state) - - if(mask == null) - return source - - var/icon/unaffected = icon(mask) - unaffected.MapColors( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - 255, 255, 255, 0) - - var/icon/temp = icon(source, state) //Mask already contains the original alpha values, avoid squaring them - temp.MapColors( - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 0, - 0, 0, 0, 255) - - unaffected.Blend(temp, ICON_MULTIPLY) - - var/icon/bluespaced = icon(mask) - bluespaced.MapColors( - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 0) - - bluespaced.Blend(icon(source, state), ICON_MULTIPLY) - - var/list/frames = list( - list(0.000,20), - list(0.020, 5), - list(0.050, 4), - list(0.080, 5), - list(0.100,10), - list(0.080, 5), - list(0.050, 4), - list(0.020, 5), - - list(0.000,20), - list(0.020, 5), - list(0.050, 4), - list(0.080, 5), - list(0.100,10), - list(0.080, 5), - list(0.050, 4), - list(0.020, 5), - - list(0.000,20), - list(0.020, 5), - list(0.050, 4), - list(0.080, 5), - list(0.100,10), - list(0.080, 5), - list(0.050, 4), - list(0.020, 5), - ) - - var/list/colors = list( - list( 75, 75, 75, 0), - list( 25, 25, 25, 0), - list( 75, 75, 75, 0), - list( 25, 25, 75, 0), - list( 75, 75, 300, 0), - list( 25, 25, 300, 0), - list(255, 255, 255, 0), - list( 0, 0, 0, 255), - list( 0, 0, 0, 0), - list( 0, 0, 0, 0), - ) - - for(var/i = 1, i <= rand(1, 5), i++) - var/f = rand(1, length(frames)) - - if(frames[f][2] > 1) - frames[f][2]-- - frames.Insert(f, 0) - - frames[f] = list(0.8, 1) - - var/icon/result = generate_color_animation(bluespaced, colors, frames) - result.Blend(unaffected, ICON_UNDERLAY) - - return result - - - -/atom/verb/test() - set src in view() - src.icon = generate_bluespace_icon(src.icon, src.icon_state) - -/mob/verb/bluespam() - for(var/turf/t in view(5)) - var/obj/s = new /obj/square(t) - s.icon = generate_bluespace_icon(s.icon, s.icon_state) - diff --git a/code/modules/icon generation/Icon_color_animation.dm b/code/modules/icon generation/Icon_color_animation.dm deleted file mode 100644 index 1be1bfa28a9..00000000000 --- a/code/modules/icon generation/Icon_color_animation.dm +++ /dev/null @@ -1,96 +0,0 @@ -//---------------------------------------- -// -// Return a copy of the provided icon, -// after calling MapColors on it. The -// color values are linearily interpolated -// between the pairs provided, based on -// the ratio argument. -// -//---------------------------------------- - -/proc/MapColors_interpolate(icon/input, ratio, - rr1, rg1, rb1, ra1, rr2, rg2, rb2, ra2, - gr1, gg1, gb1, ga1, gr2, gg2, gb2, ga2, - br1, bg1, bb1, ba1, br2, bg2, bb2, ba2, - ar1, ag1, ab1, aa1, ar2, ag2, ab2, aa2, - zr1, zg1, zb1, za1, zr2, zg2, zb2, za2) - var/r = ratio - var/i = 1 - ratio - var/icon/I = icon(input) - - I.MapColors( - (rr1 * r + rr2 * i) / 255.0, (rg1 * r + rg2 * i) / 255.0, (rb1 * r + rb2 * i) / 255.0, (ra1 * r + ra2 * i) / 255.0, - (gr1 * r + gr2 * i) / 255.0, (gg1 * r + gg2 * i) / 255.0, (gb1 * r + gb2 * i) / 255.0, (ga1 * r + ga2 * i) / 255.0, - (br1 * r + br2 * i) / 255.0, (bg1 * r + bg2 * i) / 255.0, (bb1 * r + bb2 * i) / 255.0, (ba1 * r + ba2 * i) / 255.0, - (ar1 * r + ar2 * i) / 255.0, (ag1 * r + ag2 * i) / 255.0, (ab1 * r + ab2 * i) / 255.0, (aa1 * r + aa2 * i) / 255.0, - (zr1 * r + zr2 * i) / 255.0, (zg1 * r + zg2 * i) / 255.0, (zb1 * r + zb2 * i) / 255.0, (za1 * r + za2 * i) / 255.0) - - return I - - - - -//---------------------------------------- -// -// Extension of the above that takes a -// list of lists of color values, rather -// than a large number of arguments. -// -//---------------------------------------- - -/proc/MapColors_interpolate_list(icon/I, ratio, list/colors) - var/list/c[10] - - //Provide default values for any missing colors (without altering the original list - for(var/i = 1, i <= 10, i++) - c[i] = list(0, 0, 0, (i == 7 || i == 8)? 255 : 0) - - if(istype(colors[i], /list)) - for(var/j = 1, j <= 4, j++) - if(j <= length(colors[i]) && isnum(colors[i][j])) - c[i][j] = colors[i][j] - - return MapColors_interpolate(I, ratio, - colors[ 1][1], colors[ 1][2], colors[ 1][3], colors[ 1][4], // Red 1 - colors[ 2][1], colors[ 2][2], colors[ 2][3], colors[ 2][4], // Red 2 - colors[ 3][1], colors[ 3][2], colors[ 3][3], colors[ 3][4], // Green 1 - colors[ 4][1], colors[ 4][2], colors[ 4][3], colors[ 4][4], // Green 2 - colors[ 5][1], colors[ 5][2], colors[ 5][3], colors[ 5][4], // Blue 1 - colors[ 6][1], colors[ 6][2], colors[ 6][3], colors[ 6][4], // Blue 2 - colors[ 7][1], colors[ 7][2], colors[ 7][3], colors[ 7][4], // Alpha 1 - colors[ 8][1], colors[ 8][2], colors[ 8][3], colors[ 8][4], // Alpha 2 - colors[ 9][1], colors[ 9][2], colors[ 9][3], colors[ 9][4], // Added 1 - colors[10][1], colors[10][2], colors[10][3], colors[10][4]) // Added 2 - - - - - -//---------------------------------------- -// -// Take the source image, and return an animated -// version, that transitions between the provided -// color mappings, according to the provided -// pattern. -// -// Colors should be in a format suitable for -// MapColors_interpolate_list, and frames should -// be a list of 'frames', where each frame is itself -// a list, element 1 being the ratio of the first -// color to the second, and element 2 being how -// long the frame lasts, in tenths of a second. -// -//---------------------------------------- - -/proc/generate_color_animation(icon/icon, list/colors, list/frames) - var/icon/out = icon('icons/effects/uristrunes.dmi', "") - var/frame_num = 1 - - for(var/frame in frames) - var/icon/I = MapColors_interpolate_list(icon, frame[1], colors) - out.Insert(I, "", 2, frame_num++, 0, frame[2]) - - return out - - - diff --git a/code/modules/icon generation/Uristrunes.dm b/code/modules/icon generation/Uristrunes.dm deleted file mode 100644 index d9c129df8ed..00000000000 --- a/code/modules/icon generation/Uristrunes.dm +++ /dev/null @@ -1,268 +0,0 @@ -//---------------------------------------- -// -// Take a source icon, convert into a mask, -// then create a border around it. -// -// The output then uses the colors and -// alpha values provided. -// -//---------------------------------------- - -/proc/create_border_image(icon/input, border_color = "#000000", fill_color = "#000000", border_alpha = 255, fill_alpha = 255) - var/icon/I = icon('icons/effects/uristrunes.dmi', "blank") - I.Blend(input, ICON_OVERLAY) - - //Discard the image - I.MapColors(0, 0, 0, 0, //-\ Ignore - 0, 0, 0, 0, //--> The - 0, 0, 0, 0, //-/ Colors - 0,255, 0, 1, //Keep alpha channel, any pixel with non-zero alpha gets max green channel - 0, 0, 0, 0) - - //Loop over the image, calculating the border value, and storing it in the red channel - //Store border's alpha in the blue channel - for(var/x = 1, x <= 32, x++) - for(var/y = 1, y <= 32, y++) - var/p = I.GetPixel(x, y) - - if(p == null) - var/n = I.GetPixel(x, y + 1) - var/s = I.GetPixel(x, y - 1) - var/e = I.GetPixel(x + 1, y) - var/w = I.GetPixel(x - 1, y) - var/ne = I.GetPixel(x + 1, y + 1) - var/se = I.GetPixel(x + 1, y - 1) - var/nw = I.GetPixel(x - 1, y + 1) - var/sw = I.GetPixel(x - 1, y - 1) - - var/sum_adj = ((n == "#00ff00"? 1 : 0) \ - + (s == "#00ff00"? 1 : 0) \ - + (e == "#00ff00"? 1 : 0) \ - + (w == "#00ff00"? 1 : 0)) - - var/sum_diag = ((ne == "#00ff00"? 1 : 0) \ - + (se == "#00ff00"? 1 : 0) \ - + (nw == "#00ff00"? 1 : 0) \ - + (sw == "#00ff00"? 1 : 0)) - - - if(sum_adj) - I.DrawBox(rgb(255, 0, 200, 0), x, y) - - else if(sum_diag) - I.DrawBox(rgb(255, 0, 100, 0), x, y) - - else - I.DrawBox(rgb(0, 0, 0, 0), x, y) - - else if(p != "#00ff00") - var/a = 255 - - if(length(p) == 9) // "#rrggbbaa", we want the aa - a = hex2num(copytext(p, 8)) - - I.DrawBox(rgb(255 - a, a, 255 - a, a), x, y) - - //Map the red and green channels to the desired output colors - I.MapColors(border_color, fill_color, rgb(0, 0, 0, border_alpha), rgb(0, 0, 0, fill_alpha), "#00000000") - - return I - - - - -//---------------------------------------- -// -// Take a source icon, convert into a mask, -// and border. Color them according to args, -// and animate. -// -//---------------------------------------- - -/proc/animate_rune_full(icon/input, rr1, rg1, rb1, ra1, rr2, rg2, rb2, ra2, br1, bg1, bb1, ba1, br2, bg2, bb2, ba2, ar1, ag1, ab1, aa1, ar2, ag2, ab2, aa2, or1, og1, ob1, oa1, or2, og2, ob2, oa2, frames) - - var/list/colors[10] - colors[ 1] = list(rr1, rg1, rb1, ra1) //Rune color 1 - colors[ 2] = list(rr2, rg2, rb2, ra2) //Rune color 2 - colors[ 3] = list(br1, bg1, bb1, ba1) //Border color 1 - colors[ 4] = list(br2, bg2, bb2, ba2) //Border color 2 - colors[ 5] = list( 0, 0, 0, 0) //Unused - colors[ 6] = list( 0, 0, 0, 0) //Unused - colors[ 7] = list(ar1, ag1, ab1, aa1) //Alpha color 1 - colors[ 8] = list(ar2, ag2, ab2, aa2) //Alpha color 2 - colors[ 9] = list(or1, og1, ob1, oa1) //Added color 1 - colors[10] = list(or2, og2, ob2, oa2) //Added color 2 - - var/icon/base = create_border_image(input, "#00ff0000", "#ff000000") - - return generate_color_animation(base, colors, frames) - - - - -//---------------------------------------- -// -// Calls the above, but accepts colors in -// the form of "#RRGGBBAA", and provides -// default values. -// -// Main limit is that it doesn't accept -// negative values, which you probably -// don't need anyway. Also missing a few -// color inputs, which would also be rarely -// used. -// -//---------------------------------------- - - -/proc/animate_rune(icon/input, rune_color = "#00000000", border_color = "#c8000000", rune_color2 = "#00000000", border_color2 = "#d8380000", alpha = 255, alpha2 = 255, frames = rune_animation) - var/rr1 = hex2num(copytext(rune_color, 2, 4)) - var/rg1 = hex2num(copytext(rune_color, 4, 6)) - var/rb1 = hex2num(copytext(rune_color, 6, 8)) - var/ra1 = hex2num(copytext(rune_color, 8, 10)) - var/rr2 = hex2num(copytext(rune_color2, 2, 4)) - var/rg2 = hex2num(copytext(rune_color2, 4, 6)) - var/rb2 = hex2num(copytext(rune_color2, 6, 8)) - var/ra2 = hex2num(copytext(rune_color2, 8, 10)) - var/br1 = hex2num(copytext(border_color, 2, 4)) - var/bg1 = hex2num(copytext(border_color, 4, 6)) - var/bb1 = hex2num(copytext(border_color, 6, 8)) - var/ba1 = hex2num(copytext(border_color, 8, 10)) - var/br2 = hex2num(copytext(border_color2, 2, 4)) - var/bg2 = hex2num(copytext(border_color2, 4, 6)) - var/bb2 = hex2num(copytext(border_color2, 6, 8)) - var/ba2 = hex2num(copytext(border_color2, 8, 10)) - - return animate_rune_full(input, rr1, rg1, rb1, ra1, rr2, rg2, rb2, ra2, br1, bg1, bb1, ba1, br2, bg2, bb2, ba2, 0, 0, 0, alpha, 0, 0, 0, alpha2, 0, 0, 0, 0, 0, 0, 0, 0, frames) - - -/proc/inanimate_rune(icon/input, rune_color = "#00000000", border_color = "#c8000000") - var/icon/base = create_border_image(input, "#00ff0000", "#ff000000") - - base.MapColors(rune_color, border_color, "#00000000", "#000000ff", "#00000000") - - return base - -var/list/rune_animation = list( - list(0.000, 5), - list(0.020, 1), - list(0.050, 1), - list(0.090, 1), - list(0.140, 1), - list(0.200, 1), - list(0.270, 1), - list(0.340, 1), - list(0.420, 1), - list(0.500, 1), - list(0.590, 1), - list(0.675, 1), - list(0.750, 1), - list(0.900, 1), - list(1.000, 6), - list(0.875, 1), - list(0.750, 1), - list(0.625, 1), - list(0.500, 1), - list(0.375, 1), - list(0.250, 1), - list(0.125, 1), - ) - -/var/list/rune_cache = list() - -/proc/get_rune(rune_bits, animated = 0) - var/lookup = "[rune_bits]-[animated]" - - if(lookup in rune_cache) - return rune_cache[lookup] - - var/icon/base = icon('icons/effects/uristrunes.dmi', "") - - for(var/i = 0, i < 10, i++) - if(rune_bits & (1 << i)) - base.Blend(icon('icons/effects/uristrunes.dmi', "rune-[1 << i]"), ICON_OVERLAY) - - var/icon/result - - if(animated == 1) - result = animate_rune(base) - - else - result = inanimate_rune(base) - - rune_cache[lookup] = result - return result - - - - - -// Testing procs and Fun procs - - - - -/mob/verb/create_rune() - var/obj/o = new(locate(x, y, z)) - o.icon = get_rune(rand(1, 1023), 1) - -/mob/verb/runes_15x15() - for(var/turf/t in range(7)) - var/obj/o = new /obj(t) - o.icon = get_rune(rand(1, 1023), 1) - - -/* -/mob/verb/create_rune_custom(rune as num, color1 as color, border1 as color, color2 as color, border2 as color, alpha1 as num, alpha2 as num) - var/icon/I = icon('icons/effects/uristrunes.dmi', "blank") - - for(var/i = 0, i < 10, i++) - if(rune & (1 << i)) - I.Blend(icon('icons/effects/uristrunes.dmi', "rune-[1 << i]"), ICON_OVERLAY) - - var/obj/o = new(locate(x, y, z)) - o.icon = animate_rune(I, color1, border1, color2, border2, alpha1, alpha2) - -/mob/verb/spam() - for(var/turf/t in range(4)) - var/icon/I = icon('icons/effects/uristrunes.dmi', "blank") - - var/rune = rand(1, 1023) - for(var/i = 0, i < 10, i++) - if(rune & (1 << i)) - I.Blend(icon('icons/effects/uristrunes.dmi', "rune-[1 << i]"), ICON_OVERLAY) - - var/obj/o = new(t) - o.icon = animate_rune_full(I, rand(0, 255), rand(0, 255), rand(0, 255), rand(-255, 255), - rand(0, 255), rand(0, 255), rand(0, 255), rand(-255, 255), - rand(0, 255), rand(0, 255), rand(0, 255), rand(-255, 255), - rand(0, 255), rand(0, 255), rand(0, 255), rand(-255, 255), - 0, 0, 0, rand(0, 255), - 0, 0, 0, rand(0, 255), - 0, 0, 0, 0, - 0, 0, 0, 0, - list( - list(0.000, 5), - list(0.020, 1), - list(0.050, 1), - list(0.090, 1), - list(0.140, 1), - list(0.200, 1), - list(0.270, 1), - list(0.340, 1), - list(0.420, 1), - list(0.500, 1), - list(0.590, 1), - list(0.675, 1), - list(0.750, 1), - list(0.900, 1), - list(1.000, 6), - list(0.875, 1), - list(0.750, 1), - list(0.625, 1), - list(0.500, 1), - list(0.375, 1), - list(0.250, 1), - list(0.125, 1), - )) -*/ \ No newline at end of file diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerator.dm rename to code/modules/procedural_mapping/mapGenerator.dm diff --git a/code/modules/procedural mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorModule.dm rename to code/modules/procedural_mapping/mapGeneratorModule.dm diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorModules/helpers.dm rename to code/modules/procedural_mapping/mapGeneratorModules/helpers.dm diff --git a/code/modules/procedural mapping/mapGeneratorModules/nature.dm b/code/modules/procedural_mapping/mapGeneratorModules/nature.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorModules/nature.dm rename to code/modules/procedural_mapping/mapGeneratorModules/nature.dm diff --git a/code/modules/procedural mapping/mapGeneratorReadme.dm b/code/modules/procedural_mapping/mapGeneratorReadme.dm similarity index 100% rename from code/modules/procedural mapping/mapGeneratorReadme.dm rename to code/modules/procedural_mapping/mapGeneratorReadme.dm diff --git a/code/modules/procedural mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/asteroid.dm rename to code/modules/procedural_mapping/mapGenerators/asteroid.dm diff --git a/code/modules/procedural mapping/mapGenerators/nature.dm b/code/modules/procedural_mapping/mapGenerators/nature.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/nature.dm rename to code/modules/procedural_mapping/mapGenerators/nature.dm diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm similarity index 100% rename from code/modules/procedural mapping/mapGenerators/syndicate.dm rename to code/modules/procedural_mapping/mapGenerators/syndicate.dm diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm similarity index 96% rename from code/modules/security levels/keycard authentication.dm rename to code/modules/security_levels/keycard authentication.dm index 7a9fd05da3e..0fbff9cd68a 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -1,186 +1,186 @@ -/obj/machinery/keycard_auth - name = "Keycard Authentication Device" - desc = "This device is used to trigger station functions, which require more than one ID card to authenticate." - icon = 'icons/obj/monitors.dmi' - icon_state = "auth_off" - var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made. - var/event = "" - var/screen = 1 - var/list/ert_chosen = list() - var/confirmed = 0 //This variable is set by the device that confirms the request. - var/confirm_delay = 20 //(2 seconds) - var/busy = 0 //Busy when waiting for authentication or an event request has been sent from this device. - var/obj/machinery/keycard_auth/event_source - var/mob/event_triggered_by - var/mob/event_confirmed_by - var/ert_reason = "Reason for ERT" - //1 = select event - //2 = authenticate - anchored = 1.0 - use_power = 1 - idle_power_usage = 2 - active_power_usage = 6 - power_channel = ENVIRON - -/obj/machinery/keycard_auth/attack_ai(mob/user as mob) - user << "The station AI is not to interact with these devices." - return - -/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(stat & (NOPOWER|BROKEN)) - user << "This device is not powered." - return - if(istype(W,/obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/ID = W - if(access_keycard_auth in ID.access) - if(active == 1) - //This is not the device that made the initial request. It is the device confirming the request. - if(event_source) - event_source.confirmed = 1 - event_source.event_confirmed_by = usr - else if(screen == 2) - if(event == "Emergency Response Team" && ert_reason == "Reason for ERT") - user << "Supply a reason for calling the ERT first!" - return - event_triggered_by = usr - broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices - -/obj/machinery/keycard_auth/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - icon_state = "auth_off" - else - stat |= NOPOWER - -/obj/machinery/keycard_auth/attack_hand(mob/user as mob) - if(!user.IsAdvancedToolUser()) - return 0 - ui_interact(user) - -/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(user.stat || stat & (NOPOWER|BROKEN)) - user << "This device is not powered." - return - if(busy) - user << "This device is busy." - return - - user.set_machine(src) - - var/data[0] - data["screen"] = screen - data["event"] = event - data["ertreason"] = ert_reason - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/keycard_auth/Topic(href, href_list) - if(..()) - return - if(busy) - usr << "This device is busy." - return - if(usr.stat || stat & (BROKEN|NOPOWER)) - usr << "This device is without power." - return - if(href_list["triggerevent"]) - event = href_list["triggerevent"] - screen = 2 - if(href_list["reset"]) - reset() - if(href_list["ert"]) - ert_reason = input(usr, "Reason for ERT Call:", "", "") - - nanomanager.update_uis(src) - add_fingerprint(usr) - return - -/obj/machinery/keycard_auth/proc/reset() - active = 0 - event = "" - screen = 1 - confirmed = 0 - event_source = null - icon_state = "auth_off" - event_triggered_by = null - event_confirmed_by = null - -/obj/machinery/keycard_auth/proc/broadcast_request() - icon_state = "auth_on" - for(var/obj/machinery/keycard_auth/KA in world) - if(KA == src) continue - KA.reset() - spawn() - KA.receive_request(src) - - sleep(confirm_delay) - if(confirmed) - confirmed = 0 - trigger_event(event) - log_game("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]") - message_admins("[key_name_admin(event_triggered_by)] triggered and [key_name_admin(event_confirmed_by)] confirmed event [event]", 1) - reset() - -/obj/machinery/keycard_auth/proc/receive_request(var/obj/machinery/keycard_auth/source) - if(stat & (BROKEN|NOPOWER)) - return - event_source = source - busy = 1 - active = 1 - icon_state = "auth_on" - - sleep(confirm_delay) - - event_source = null - icon_state = "auth_off" - active = 0 - busy = 0 - -/obj/machinery/keycard_auth/proc/trigger_event() - switch(event) - if("Red Alert") - set_security_level(SEC_LEVEL_RED) - feedback_inc("alert_keycard_auth_red",1) - if("Grant Emergency Maintenance Access") - make_maint_all_access() - feedback_inc("alert_keycard_auth_maintGrant",1) - if("Revoke Emergency Maintenance Access") - revoke_maint_all_access() - feedback_inc("alert_keycard_auth_maintRevoke",1) - if("Emergency Response Team") - if(is_ert_blocked()) - usr << "\red All Emergency Response Teams are dispatched and can not be called at this time." - return - - usr << "ERT request transmitted." - if(admins.len) - ERT_Announce(ert_reason , event_triggered_by) - ert_reason = "Reason for ERT" - feedback_inc("alert_keycard_auth_ert",1) - else - trigger_armed_response_team(new /datum/response_team/amber) // No admins? No problem. Automatically send a code amber ERT. - -/obj/machinery/keycard_auth/proc/is_ert_blocked() - return ticker.mode && ticker.mode.ert_disabled - -var/global/maint_all_access = 0 - -/proc/make_maint_all_access() - for(var/area/maintenance/A in world) - for(var/obj/machinery/door/airlock/D in A) - D.emergency = 1 - D.update_icon(0) - minor_announcement.Announce("The maintenance access requirement has been revoked on all airlocks.") - maint_all_access = 1 - -/proc/revoke_maint_all_access() - for(var/area/maintenance/A in world) - for(var/obj/machinery/door/airlock/D in A) - D.emergency = 0 - D.update_icon(0) - minor_announcement.Announce("The maintenance access requirement has been readded on all maintenance airlocks.") +/obj/machinery/keycard_auth + name = "Keycard Authentication Device" + desc = "This device is used to trigger station functions, which require more than one ID card to authenticate." + icon = 'icons/obj/monitors.dmi' + icon_state = "auth_off" + var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made. + var/event = "" + var/screen = 1 + var/list/ert_chosen = list() + var/confirmed = 0 //This variable is set by the device that confirms the request. + var/confirm_delay = 20 //(2 seconds) + var/busy = 0 //Busy when waiting for authentication or an event request has been sent from this device. + var/obj/machinery/keycard_auth/event_source + var/mob/event_triggered_by + var/mob/event_confirmed_by + var/ert_reason = "Reason for ERT" + //1 = select event + //2 = authenticate + anchored = 1.0 + use_power = 1 + idle_power_usage = 2 + active_power_usage = 6 + power_channel = ENVIRON + +/obj/machinery/keycard_auth/attack_ai(mob/user as mob) + user << "The station AI is not to interact with these devices." + return + +/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(stat & (NOPOWER|BROKEN)) + user << "This device is not powered." + return + if(istype(W,/obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/ID = W + if(access_keycard_auth in ID.access) + if(active == 1) + //This is not the device that made the initial request. It is the device confirming the request. + if(event_source) + event_source.confirmed = 1 + event_source.event_confirmed_by = usr + else if(screen == 2) + if(event == "Emergency Response Team" && ert_reason == "Reason for ERT") + user << "Supply a reason for calling the ERT first!" + return + event_triggered_by = usr + broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices + +/obj/machinery/keycard_auth/power_change() + if(powered(ENVIRON)) + stat &= ~NOPOWER + icon_state = "auth_off" + else + stat |= NOPOWER + +/obj/machinery/keycard_auth/attack_hand(mob/user as mob) + if(!user.IsAdvancedToolUser()) + return 0 + ui_interact(user) + +/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(user.stat || stat & (NOPOWER|BROKEN)) + user << "This device is not powered." + return + if(busy) + user << "This device is busy." + return + + user.set_machine(src) + + var/data[0] + data["screen"] = screen + data["event"] = event + data["ertreason"] = ert_reason + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/keycard_auth/Topic(href, href_list) + if(..()) + return + if(busy) + usr << "This device is busy." + return + if(usr.stat || stat & (BROKEN|NOPOWER)) + usr << "This device is without power." + return + if(href_list["triggerevent"]) + event = href_list["triggerevent"] + screen = 2 + if(href_list["reset"]) + reset() + if(href_list["ert"]) + ert_reason = input(usr, "Reason for ERT Call:", "", "") + + nanomanager.update_uis(src) + add_fingerprint(usr) + return + +/obj/machinery/keycard_auth/proc/reset() + active = 0 + event = "" + screen = 1 + confirmed = 0 + event_source = null + icon_state = "auth_off" + event_triggered_by = null + event_confirmed_by = null + +/obj/machinery/keycard_auth/proc/broadcast_request() + icon_state = "auth_on" + for(var/obj/machinery/keycard_auth/KA in world) + if(KA == src) continue + KA.reset() + spawn() + KA.receive_request(src) + + sleep(confirm_delay) + if(confirmed) + confirmed = 0 + trigger_event(event) + log_game("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]") + message_admins("[key_name_admin(event_triggered_by)] triggered and [key_name_admin(event_confirmed_by)] confirmed event [event]", 1) + reset() + +/obj/machinery/keycard_auth/proc/receive_request(var/obj/machinery/keycard_auth/source) + if(stat & (BROKEN|NOPOWER)) + return + event_source = source + busy = 1 + active = 1 + icon_state = "auth_on" + + sleep(confirm_delay) + + event_source = null + icon_state = "auth_off" + active = 0 + busy = 0 + +/obj/machinery/keycard_auth/proc/trigger_event() + switch(event) + if("Red Alert") + set_security_level(SEC_LEVEL_RED) + feedback_inc("alert_keycard_auth_red",1) + if("Grant Emergency Maintenance Access") + make_maint_all_access() + feedback_inc("alert_keycard_auth_maintGrant",1) + if("Revoke Emergency Maintenance Access") + revoke_maint_all_access() + feedback_inc("alert_keycard_auth_maintRevoke",1) + if("Emergency Response Team") + if(is_ert_blocked()) + usr << "\red All Emergency Response Teams are dispatched and can not be called at this time." + return + + usr << "ERT request transmitted." + if(admins.len) + ERT_Announce(ert_reason , event_triggered_by) + ert_reason = "Reason for ERT" + feedback_inc("alert_keycard_auth_ert",1) + else + trigger_armed_response_team(new /datum/response_team/amber) // No admins? No problem. Automatically send a code amber ERT. + +/obj/machinery/keycard_auth/proc/is_ert_blocked() + return ticker.mode && ticker.mode.ert_disabled + +var/global/maint_all_access = 0 + +/proc/make_maint_all_access() + for(var/area/maintenance/A in world) + for(var/obj/machinery/door/airlock/D in A) + D.emergency = 1 + D.update_icon(0) + minor_announcement.Announce("The maintenance access requirement has been revoked on all airlocks.") + maint_all_access = 1 + +/proc/revoke_maint_all_access() + for(var/area/maintenance/A in world) + for(var/obj/machinery/door/airlock/D in A) + D.emergency = 0 + D.update_icon(0) + minor_announcement.Announce("The maintenance access requirement has been readded on all maintenance airlocks.") maint_all_access = 0 \ No newline at end of file diff --git a/code/modules/security levels/security levels.dm b/code/modules/security_levels/security levels.dm similarity index 97% rename from code/modules/security levels/security levels.dm rename to code/modules/security_levels/security levels.dm index 5ac35d1188e..051d7b502cf 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security_levels/security levels.dm @@ -1,184 +1,184 @@ -/var/security_level = 0 -//0 = code green -//1 = code blue -//2 = code red -//3 = gamma -//4 = epsilon -//5 = code delta - -//config.alert_desc_blue_downto -/var/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) -/var/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1) - -/proc/set_security_level(var/level) - switch(level) - if("green") - level = SEC_LEVEL_GREEN - if("blue") - level = SEC_LEVEL_BLUE - if("red") - level = SEC_LEVEL_RED - if("gamma") - level = SEC_LEVEL_GAMMA - if("epsilon") - level = SEC_LEVEL_EPSILON - if("delta") - level = SEC_LEVEL_DELTA - - //Will not be announced if you try to set to the same level as it already is - if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level) - switch(level) - if(SEC_LEVEL_GREEN) - security_announcement_down.Announce("All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.","Attention! Security level lowered to green.") - security_level = SEC_LEVEL_GREEN - - for(var/obj/machinery/firealarm/FA in world) - if((FA.z in config.contact_levels)) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") - - if(SEC_LEVEL_BLUE) - if(security_level < SEC_LEVEL_BLUE) - security_announcement_up.Announce("The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible and random searches are permitted.","Attention! Security level elevated to blue.") - else - security_announcement_down.Announce("The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed.","Attention! Security level lowered to blue.") - security_level = SEC_LEVEL_BLUE - - for(var/obj/machinery/firealarm/FA in world) - if((FA.z in config.contact_levels)) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") - - if(SEC_LEVEL_RED) - if(security_level < SEC_LEVEL_RED) - security_announcement_up.Announce("There is an immediate and serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised.","Attention! Code Red!") - else - security_announcement_down.Announce("The station's self-destruct mechanism has been deactivated, but there is still an immediate and serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised.","Attention! Code Red!") - security_level = SEC_LEVEL_RED - - var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world - if(R && (R.z in config.station_levels)) - R.locked = 0 - R.update_icon() - - var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) - if(CC) - CC.post_status("alert", "redalert") - - for(var/obj/machinery/firealarm/FA in world) - if((FA.z in config.contact_levels)) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") - - if(SEC_LEVEL_GAMMA) - security_announcement_up.Announce("Central Command has ordered the Gamma security level on the station. Security is to have weapons equipped at all times, and all civilians are to immediately seek their nearest head for transportation to a secure location. The station's Gamma armory has been unlocked and is ready for use.","Attention! Gamma security level activated!") - security_level = SEC_LEVEL_GAMMA - - move_gamma_ship() - - if(security_level < SEC_LEVEL_RED) - for(var/obj/machinery/door/airlock/highsecurity/red/R in world) - if((R.z in config.station_levels)) - R.locked = 0 - R.update_icon() - - for(var/obj/machinery/door/airlock/hatch/gamma/H in world) - if((H.z in config.station_levels)) - H.locked = 0 - H.update_icon() - - var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) - if(CC) - CC.post_status("alert", "redalert") - - for(var/obj/machinery/firealarm/FA in world) - if((FA.z in config.contact_levels)) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma") - FA.update_icon() - - if(SEC_LEVEL_EPSILON) - security_announcement_up.Announce("Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated.","Attention! Epsilon security level activated!") - security_level = SEC_LEVEL_EPSILON - - var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) - if(CC) - CC.post_status("alert", "redalert") - - for(var/obj/machinery/firealarm/FA in world) - if((FA.z in config.contact_levels)) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon") - - if(SEC_LEVEL_DELTA) - security_announcement_up.Announce("The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.","Attention! Delta security level reached!") - security_level = SEC_LEVEL_DELTA - - var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) - if(CC) - CC.post_status("alert", "redalert") - - for(var/obj/machinery/firealarm/FA in world) - if((FA.z in config.contact_levels)) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta") - - else - return - -/proc/get_security_level() - switch(security_level) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_GAMMA) - return "gamma" - if(SEC_LEVEL_EPSILON) - return "epsilon" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/num2seclevel(var/num) - switch(num) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_GAMMA) - return "gamma" - if(SEC_LEVEL_EPSILON) - return "epsilon" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/seclevel2num(var/seclevel) - switch( lowertext(seclevel) ) - if("green") - return SEC_LEVEL_GREEN - if("blue") - return SEC_LEVEL_BLUE - if("red") - return SEC_LEVEL_RED - if("gamma") - return SEC_LEVEL_GAMMA - if("epsilon") - return SEC_LEVEL_EPSILON - if("delta") - return SEC_LEVEL_DELTA - - -/*DEBUG -/mob/verb/set_thing0() - set_security_level(0) -/mob/verb/set_thing1() - set_security_level(1) -/mob/verb/set_thing2() - set_security_level(2) -/mob/verb/set_thing3() - set_security_level(3) +/var/security_level = 0 +//0 = code green +//1 = code blue +//2 = code red +//3 = gamma +//4 = epsilon +//5 = code delta + +//config.alert_desc_blue_downto +/var/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) +/var/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1) + +/proc/set_security_level(var/level) + switch(level) + if("green") + level = SEC_LEVEL_GREEN + if("blue") + level = SEC_LEVEL_BLUE + if("red") + level = SEC_LEVEL_RED + if("gamma") + level = SEC_LEVEL_GAMMA + if("epsilon") + level = SEC_LEVEL_EPSILON + if("delta") + level = SEC_LEVEL_DELTA + + //Will not be announced if you try to set to the same level as it already is + if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level) + switch(level) + if(SEC_LEVEL_GREEN) + security_announcement_down.Announce("All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.","Attention! Security level lowered to green.") + security_level = SEC_LEVEL_GREEN + + for(var/obj/machinery/firealarm/FA in world) + if((FA.z in config.contact_levels)) + FA.overlays = list() + FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") + + if(SEC_LEVEL_BLUE) + if(security_level < SEC_LEVEL_BLUE) + security_announcement_up.Announce("The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible and random searches are permitted.","Attention! Security level elevated to blue.") + else + security_announcement_down.Announce("The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed.","Attention! Security level lowered to blue.") + security_level = SEC_LEVEL_BLUE + + for(var/obj/machinery/firealarm/FA in world) + if((FA.z in config.contact_levels)) + FA.overlays = list() + FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") + + if(SEC_LEVEL_RED) + if(security_level < SEC_LEVEL_RED) + security_announcement_up.Announce("There is an immediate and serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised.","Attention! Code Red!") + else + security_announcement_down.Announce("The station's self-destruct mechanism has been deactivated, but there is still an immediate and serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised.","Attention! Code Red!") + security_level = SEC_LEVEL_RED + + var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world + if(R && (R.z in config.station_levels)) + R.locked = 0 + R.update_icon() + + var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) + if(CC) + CC.post_status("alert", "redalert") + + for(var/obj/machinery/firealarm/FA in world) + if((FA.z in config.contact_levels)) + FA.overlays = list() + FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") + + if(SEC_LEVEL_GAMMA) + security_announcement_up.Announce("Central Command has ordered the Gamma security level on the station. Security is to have weapons equipped at all times, and all civilians are to immediately seek their nearest head for transportation to a secure location. The station's Gamma armory has been unlocked and is ready for use.","Attention! Gamma security level activated!") + security_level = SEC_LEVEL_GAMMA + + move_gamma_ship() + + if(security_level < SEC_LEVEL_RED) + for(var/obj/machinery/door/airlock/highsecurity/red/R in world) + if((R.z in config.station_levels)) + R.locked = 0 + R.update_icon() + + for(var/obj/machinery/door/airlock/hatch/gamma/H in world) + if((H.z in config.station_levels)) + H.locked = 0 + H.update_icon() + + var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) + if(CC) + CC.post_status("alert", "redalert") + + for(var/obj/machinery/firealarm/FA in world) + if((FA.z in config.contact_levels)) + FA.overlays = list() + FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma") + FA.update_icon() + + if(SEC_LEVEL_EPSILON) + security_announcement_up.Announce("Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated.","Attention! Epsilon security level activated!") + security_level = SEC_LEVEL_EPSILON + + var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) + if(CC) + CC.post_status("alert", "redalert") + + for(var/obj/machinery/firealarm/FA in world) + if((FA.z in config.contact_levels)) + FA.overlays = list() + FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon") + + if(SEC_LEVEL_DELTA) + security_announcement_up.Announce("The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.","Attention! Delta security level reached!") + security_level = SEC_LEVEL_DELTA + + var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) + if(CC) + CC.post_status("alert", "redalert") + + for(var/obj/machinery/firealarm/FA in world) + if((FA.z in config.contact_levels)) + FA.overlays = list() + FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta") + + else + return + +/proc/get_security_level() + switch(security_level) + if(SEC_LEVEL_GREEN) + return "green" + if(SEC_LEVEL_BLUE) + return "blue" + if(SEC_LEVEL_RED) + return "red" + if(SEC_LEVEL_GAMMA) + return "gamma" + if(SEC_LEVEL_EPSILON) + return "epsilon" + if(SEC_LEVEL_DELTA) + return "delta" + +/proc/num2seclevel(var/num) + switch(num) + if(SEC_LEVEL_GREEN) + return "green" + if(SEC_LEVEL_BLUE) + return "blue" + if(SEC_LEVEL_RED) + return "red" + if(SEC_LEVEL_GAMMA) + return "gamma" + if(SEC_LEVEL_EPSILON) + return "epsilon" + if(SEC_LEVEL_DELTA) + return "delta" + +/proc/seclevel2num(var/seclevel) + switch( lowertext(seclevel) ) + if("green") + return SEC_LEVEL_GREEN + if("blue") + return SEC_LEVEL_BLUE + if("red") + return SEC_LEVEL_RED + if("gamma") + return SEC_LEVEL_GAMMA + if("epsilon") + return SEC_LEVEL_EPSILON + if("delta") + return SEC_LEVEL_DELTA + + +/*DEBUG +/mob/verb/set_thing0() + set_security_level(0) +/mob/verb/set_thing1() + set_security_level(1) +/mob/verb/set_thing2() + set_security_level(2) +/mob/verb/set_thing3() + set_security_level(3) */ \ No newline at end of file diff --git a/code/modules/space transition/space_transition.dm b/code/modules/space_transition/space_transition.dm similarity index 100% rename from code/modules/space transition/space_transition.dm rename to code/modules/space_transition/space_transition.dm diff --git a/paradise.dme b/paradise.dme index 99373700176..39b3787f9f4 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1091,10 +1091,10 @@ #include "code\modules\crafting\table.dm" #include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" -#include "code\modules\DetectiveWork\detective_work.dm" -#include "code\modules\DetectiveWork\evidence.dm" -#include "code\modules\DetectiveWork\footprints_and_rag.dm" -#include "code\modules\DetectiveWork\scanner.dm" +#include "code\modules\detective_work\detective_work.dm" +#include "code\modules\detective_work\evidence.dm" +#include "code\modules\detective_work\footprints_and_rag.dm" +#include "code\modules\detective_work\scanner.dm" #include "code\modules\economy\Accounts.dm" #include "code\modules\economy\Accounts_DB.dm" #include "code\modules\economy\ATM.dm" @@ -1180,8 +1180,8 @@ #include "code\modules\food\recipes_microwave.dm" #include "code\modules\food\recipes_oven.dm" #include "code\modules\food\recipes_table.dm" -#include "code\modules\garbage collection\garbage_collector.dm" -#include "code\modules\garbage collection\gc_testing.dm" +#include "code\modules\garbage_collection\garbage_collector.dm" +#include "code\modules\garbage_collection\gc_testing.dm" #include "code\modules\holiday\christmas.dm" #include "code\modules\holiday\holiday.dm" #include "code\modules\hydroponics\grown.dm" @@ -1585,14 +1585,14 @@ #include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" #include "code\modules\power\singularity\particle_accelerator\particle_power.dm" #include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\procedural mapping\mapGenerator.dm" -#include "code\modules\procedural mapping\mapGeneratorModule.dm" -#include "code\modules\procedural mapping\mapGeneratorReadme.dm" -#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm" -#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm" -#include "code\modules\procedural mapping\mapGenerators\asteroid.dm" -#include "code\modules\procedural mapping\mapGenerators\nature.dm" -#include "code\modules\procedural mapping\mapGenerators\syndicate.dm" +#include "code\modules\procedural_mapping\mapGenerator.dm" +#include "code\modules\procedural_mapping\mapGeneratorModule.dm" +#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" +#include "code\modules\procedural_mapping\mapGenerators\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" #include "code\modules\projectiles\ammunition.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" @@ -1804,8 +1804,8 @@ #include "code\modules\scripting\Parser\Parser.dm" #include "code\modules\scripting\Scanner\Scanner.dm" #include "code\modules\scripting\Scanner\Tokens.dm" -#include "code\modules\security levels\keycard authentication.dm" -#include "code\modules\security levels\security levels.dm" +#include "code\modules\security_levels\keycard authentication.dm" +#include "code\modules\security_levels\security levels.dm" #include "code\modules\shieldgen\circuits_and_designs.dm" #include "code\modules\shieldgen\energy_field.dm" #include "code\modules\shieldgen\shield_capacitor.dm" @@ -1822,7 +1822,7 @@ #include "code\modules\shuttles\shuttle_supply.dm" #include "code\modules\shuttles\shuttles_multi.dm" #include "code\modules\shuttles\whiteship.dm" -#include "code\modules\space transition\space_transition.dm" +#include "code\modules\space_transition\space_transition.dm" #include "code\modules\store\items.dm" #include "code\modules\store\store.dm" #include "code\modules\surgery\bones.dm" From c1952dc97672a11d06453f7339e617d18cb2b17a Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 07:46:52 +0200 Subject: [PATCH 21/69] Fix unpowered outlet injectors --- .../RandomZLevels/undergroundoutpost45.dmm | 2 +- _maps/map_files/cyberiad/cyberiad.dmm | 19 +++++++++++-------- _maps/map_files/cyberiad/z5.dmm | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 2ecba55d33a..c86a593a1ca 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -856,7 +856,7 @@ "qx" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "qy" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "qz" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"qA" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) +"qA" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "qB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "qC" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "qD" = (/obj/machinery/vending/cola,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 6d6303de2a0..e22a8133fd1 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5046,7 +5046,7 @@ "bTb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bTc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) "bTd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/photocopier,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor) -"bTe" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/space) +"bTe" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/toxins/mixing) "bTf" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/mining/station) "bTg" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining/station) "bTh" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/mining/station) @@ -6767,7 +6767,7 @@ "cAg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber) "cAh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cAi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/toxins/xenobiology) -"cAj" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/space) +"cAj" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) "cAk" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port) "cAl" = (/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "cAm" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) @@ -7210,7 +7210,7 @@ "cIH" = (/obj/machinery/alarm{pixel_y = 25; target_temperature = 283.15},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cII" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cIJ" = (/obj/structure/flora/kirbyplants,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cIK" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/space) +"cIK" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/toxins/test_chamber) "cIL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor,/area/atmos/distribution) "cIM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos/distribution) "cIN" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -8004,7 +8004,7 @@ "cXV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/aisat/maintenance) "cXW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/aisat/maintenance) "cXX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/aisat/maintenance) -"cXY" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plating,/area/space) +"cXY" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/toxins/xenobiology) "cXZ" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space) "cYa" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{dir = 10; icon_state = "yellow"},/area/aisat/maintenance) "cYb" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/turf/simulated/floor{dir = 2; icon_state = "yellow"},/area/aisat/maintenance) @@ -8217,6 +8217,7 @@ "dca" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyc"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/patient_c) "dcb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/medical/patients_rooms) "dcc" = (/obj/machinery/light,/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 10; icon_state = "blue"},/area/medical/patients_rooms) +"dcd" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/turbine) "dce" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/patients_rooms) "dcf" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) "dcg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/medical/patients_rooms) @@ -8232,6 +8233,8 @@ "dcq" = (/obj/effect/decal/warning_stripes/south,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/patients_rooms) "dcr" = (/obj/structure/closet/l3closet,/obj/machinery/light{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) "dcs" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) +"dct" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/asmaint) +"dcu" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plating,/area/aisat/maintenance) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8389,7 +8392,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbF aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcfPcfQcfRbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecgfcgfcggcghcgicgjcgkcglcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzcgAcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFcgHcgJcgJcgKcgLcgMcgNcgOcgPcbPcgQcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbEXchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejchochpchqbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchuchvchwchxchychychzchAcglbGybGychBchCchDbGybGybGychEchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcfdcfdcfdcfdcfdcfdcgIbSqchOchPchQchRchSchTchUchVcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwcixciycizaacaacaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejbUTcfScejaaaaaaaaaaaaciEciFciGciHciIciJciKciLciMciNciOciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcfdcfdcjlcjpcjpcjpcjpckNclSckUcjqcjqcjrcjscjtcbAcjucjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTeaaaaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMaaacjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZckackbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjaaaaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMaaacjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZckackbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclbclbclbclccldcleclfclgclhclicjLcljcelcjMaaaclkcllclmclnclocjSclpclqclrclsciLcltcgdcbkciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOclPcfhcfhcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMaaaclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcmPcmQcmQcmRcmSchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbcnccndcnecnfcngcnhcklcnicfdcnjcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMaaaclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcoacobcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopcolcoqcorcoscfdcotcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoBcoCcoDcoAcoAaaaaaaaaaaaackPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8406,7 +8409,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaacGaaaczocAkczqaaaczocAkczqaaaczocAkczqaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabczscwWcwXcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAvcAwcAxcAycxsczBcAzcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAaaaaaaaaaaaadcidcodcqdcpdbycgmcFdbVicFmcFlcFlcFnbGycoAaaaaaackPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPaaaaaacwGcwGcBbcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaahaaaaaaaaaafxaabczocAkczqaaaczocAkczqaabczocAkczqaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaaczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcHscBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAaaaaaackPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPaaaaabaabcwGcwGcCscwGcwGaaabwobxXcvzcyJcHycHxbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaabaaaczocAkczqaabczocAkczqaaaczocAkczqaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctackycjocjnckuckycCScGucupcHwcCScoAcusbGycoAaaaaaackPcxOcxOcxOcAQcCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabaaaaaaaaacIKaaaaaaaaabwobxXcvzcyJbxXbxXbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGacGafxaabaaaczocAkczqaabczocAkczqaaaczocAkczqaabaaaaaaaaaaaaaaaaaaaaaaaaaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmcDncDocDncDncDpcDpcDncDqcDrcDscDtcDtcDucDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcuqczVcuqczVcuqcoAcusbGycoAcoAaaackPcwAcwAcwAcwAcEkcqUcCbcElcEmcCecqUcEncEocEocEpcEqcAjaabaaaaaaaaaaaaaaaaaaaaabwobxXcGybxXbxXcIPbwoaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGacGafxaabaaaczocAkczqaabczocAkczqaaaczocAkczqaabaaaaaaaaaaaaaaaaaaaaaaaaaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmcDncDocDncDncDpcDpcDncDqcDrcDscDtcDtcDucDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcuqczVcuqczVcuqcoAcusbGycoAcoAaaackPcwAcwAcwAcwAcEkcqUcCbcElcEmcCecqUcEncEocEocEpcEqcXYaabaaaaaaaaaaaaaaaaaaaaabwobxXcGybxXbxXcIPbwoaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGaaaaabaaaaabaabcEraabaabaabcEraabaaaaabcEraabaaaaaaaaaaaaaaaaaaaaaaaacDccDccDccEscEtcEucEvcEwcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIclQdcsclUcIQcIRczVcuqcyWclUcusbGycITcoAaaackPcwtcwucwvcFjcARczbcFkcJJcJIcJKcJKcFocFpcFqcJLckPaabaabaabaaaaaaaaaaaaaaaaaabwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcFMcFNcFOcFPcFQcFRcFScFTcFUcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAaaackPcxOcxPcxOcGAcxRcqUcGBcJPcGCcqUcqUcGDcwAcwAcwAckPaaaaaaaabaabaaaaaaaaaaaaaaabwocyKcvzbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGaaaaabaaaaabaabcGFaabaaaaabcGFaabaaaaabcGFaabaaaaaaaaaaaaaaaaaaaaaaaacDccDccDccGGcGHcGIcDdcGJcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXczNcJQczPczOcJhczQcyLczVczVczSclUcusbGycJRcoAaaackPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMaaaaaaaaaaabaabaaaaaaaaaaaabwobwocvzbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8434,7 +8437,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcECcTncTocSEaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacSEcTlcTmcECcTpcECcECcECcECcECaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaGcYhdaidaHdaicYhcoAdaIcFicFidaJdaLdaKcoAcoAcoAaaaaaaaaaaaaaaaaabaaacxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabaaaaaaaaaaabaaacuzcvEcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaacQScQScQScQSaaaaaacQScQScQScQScQScQScQSaaaaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaabcECcTdcSEcTPaaaaaacTQaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacSEcSEcTdcECcMHcTRcTScTTcTUcTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaGcYhdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAaaaaabaaaaaaaaaaaaaaaaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabaaaaaaaaaaabaaacuzcwMcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcECcTXcTYcSEaabaabaabcSQaaaaaacSQaaaaaaaaaaaacSQaabcTZaabcSEcUacUbcECcMHcUccUdcGOcUecTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaadaGcYhcYhdaVcYhcYhaaaaabaaaaaadaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabwodaFdaXbwocGxaabbwobwocxHcxHczMbwoaaaaabaaaaaaaaaaabaaaaaacxZaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUfcUgcUhaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacUicUgcUjcECcMHcECcUkcUlcUmcReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIKazycYhdaYcYhdaZaabaabaaaaaacIKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaahaaaaaabwodbbdbabwodbcaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaacznaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUfcUgcUhaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacUicUgcUjcECcMHcECcUkcUlcUmcReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcdazycYhdaYcYhdaZaabaabaaaaaadctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaahaaaaaabwodbbdbabwodbcaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaacznaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNycECcKDcSkcUhaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacUicSjcKDcECcECcMHcECcECcECcUncECaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabazydbddbedbdazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaacxHdbfcxHcxHaabczraaaaabaaaaaaaabaaaagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacECcECcSkcRScRScRScRScRScRScRScRScRScRScRScRScRScSjcECcECcECcECcTpcECaaaaabcUocUpaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaabazyaaaaaaaaaazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaacxHdbgcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaaaaaaabaaaaabaaaaaacHNaaaaaaaabaaaaabaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECaaacECcECcUqcECaabaabcUrcUscUtcUucUvcUucUtcUucUvcUucUtcUucUvcUucUtcUucUvcUwcUxaaaaabazyazyazyazyazyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaacxHdbhcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaacIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8470,7 +8473,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucWdcVFaaaaabaaacXvcXwcXxcXycXzcXAcXvaaaaaaaaacVucWlcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucWdcXBcVIcXCcXCcXvcXDcXEcXFcXGcXHcXvcVIcVIcVIcXdcWlcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucXIcVRcVRcVRcVRcXJcXKcXLcXMcXNcXOcXPcXQcWacWacWacXRcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaaacWfcWfcWfcWfcWfcXvcXScXTcXUcXVcXWcXXcXYcWfcWfcXZcXZaaaacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaaacWfcWfcWfcWfcWfcXvcXScXTcXUcXVcXWcXXdcucWfcWfcXZcXZaaaacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGacGacGacGacGacGacGcXvcYacYbcYccYdcYecXvacGacGacGacGacGacGacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcXvcXvcYfcYfcYfcXvcXvaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 958a023b33d..49e39b9f89d 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -246,7 +246,7 @@ "eL" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/research_outpost/power) "eM" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "eN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/mineral,/area/mine/explored) -"eO" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating,/area/mine/explored) +"eO" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/atmos) "eP" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/mine/abandoned) "eQ" = (/obj/item/stack/rods,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "eR" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned) From 24c503d73860c7a41d7d18e1e344cac757ec6c9c Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 07:52:02 +0200 Subject: [PATCH 22/69] Remove unnecessary logging from law procs --- code/modules/mob/living/silicon/laws.dm | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 8fccd74ff39..9cb442e3d37 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -12,7 +12,8 @@ /mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg) laws_sanity_check() laws.set_zeroth_law(law, law_borg) - log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]") + if(!isnull(usr) && law) + log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]") /mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg) ..() @@ -22,39 +23,43 @@ /mob/living/silicon/proc/add_ion_law(var/law) laws_sanity_check() laws.add_ion_law(law) - log_and_message_admins("has given [src] the ion law: [law]") + if(!isnull(usr) && law) + log_and_message_admins("has given [src] the ion law: [law]") /mob/living/silicon/proc/add_inherent_law(var/law) laws_sanity_check() laws.add_inherent_law(law) - log_and_message_admins("has given [src] the inherent law: [law]") + if(!isnull(usr) && law) + log_and_message_admins("has given [src] the inherent law: [law]") /mob/living/silicon/proc/add_supplied_law(var/number, var/law) laws_sanity_check() laws.add_supplied_law(number, law) - log_and_message_admins("has given [src] the supplied law: [law]") + if(!isnull(usr) && law) + log_and_message_admins("has given [src] the supplied law: [law]") /mob/living/silicon/proc/delete_law(var/datum/ai_law/law) laws_sanity_check() laws.delete_law(law) - log_and_message_admins("has deleted a law belonging to [src]: [law.law]") + if(!isnull(usr) && law) + log_and_message_admins("has deleted a law belonging to [src]: [law.law]") /mob/living/silicon/proc/clear_inherent_laws(var/silent = 0) laws_sanity_check() laws.clear_inherent_laws() - if(!silent) + if(!silent && !isnull(usr)) log_and_message_admins("cleared the inherent laws of [src]") /mob/living/silicon/proc/clear_ion_laws(var/silent = 0) laws_sanity_check() laws.clear_ion_laws() - if(!silent) + if(!silent && !isnull(usr)) log_and_message_admins("cleared the ion laws of [src]") /mob/living/silicon/proc/clear_supplied_laws(var/silent = 0) laws_sanity_check() laws.clear_supplied_laws() - if(!silent) + if(!silent && !isnull(usr)) log_and_message_admins("cleared the supplied laws of [src]") /mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws) From f63abafd2b8862eb435c75740bf00d4fa80f17a2 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 08:21:07 +0200 Subject: [PATCH 23/69] Make robot components start powered --- .../mob/living/silicon/robot/component.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d0469bc42dc..0b4bf74bb32 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -1,14 +1,15 @@ // TODO: remove the robot.mmi and robot.cell variables and completely rely on the robot component system -/datum/robot_component/var/name -/datum/robot_component/var/installed = 0 -/datum/robot_component/var/powered = 0 -/datum/robot_component/var/toggled = 1 -/datum/robot_component/var/brute_damage = 0 -/datum/robot_component/var/electronics_damage = 0 -/datum/robot_component/var/energy_consumption = 0 -/datum/robot_component/var/max_damage = 30 -/datum/robot_component/var/mob/living/silicon/robot/owner +/datum/robot_component + var/name = "Component" + var/installed = 0 + var/powered = 1 + var/toggled = 1 + var/brute_damage = 0 + var/electronics_damage = 0 + var/energy_consumption = 0 + var/max_damage = 30 + var/mob/living/silicon/robot/owner // The actual device object that has to be installed for this. /datum/robot_component/var/external_type = null From a9af8b1532dac79af42bdf066e5824131d6c424e Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 26 Sep 2015 23:24:52 -0700 Subject: [PATCH 24/69] Frankenstein This commit does the following - Organs are no longer reliant on the species and DNA of their attached owner. Whoever made the organs (ex a spawned mob) transfers their species and DNA to the organ, and it uses that for calculations. - You may now attach organs cross-species; Yes, this means sticking skrell heads onto humans to make tentacle monsters. Or something. - IPC's may now choose their frame color. - I did say elsewhere this was not feasible; However, after taking a few hours to learn the systems behind all of it, I managed to hack something together. It's snowflakey, but fuck it, it doesn't need to be not-snowflakey. --- .../mob/living/carbon/human/appearance.dm | 5 +-- code/modules/mob/living/carbon/human/human.dm | 12 ++++-- .../mob/living/carbon/human/human_organs.dm | 7 +++- .../living/carbon/human/species/station.dm | 23 ++++++----- .../mob/living/carbon/human/update_icons.dm | 15 ++++--- code/modules/organs/organ.dm | 19 +++++++-- code/modules/organs/organ_icon.dm | 41 +++++++++++++------ 7 files changed, 82 insertions(+), 40 deletions(-) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index ff2b98d430f..bc0226f4597 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -110,7 +110,7 @@ return 1 /mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue) - if(red == r_skin && green == g_skin && blue == b_skin || !(species.flags & HAS_SKIN_COLOR)) + if(red == r_skin && green == g_skin && blue == b_skin || !(species.bodyflags & HAS_SKIN_COLOR)) return r_skin = red @@ -122,7 +122,7 @@ return 1 /mob/living/carbon/human/proc/change_skin_tone(var/tone) - if(s_tone == tone || !(species.flags & HAS_SKIN_TONE)) + if(s_tone == tone || !(species.bodyflags & HAS_SKIN_TONE)) return s_tone = tone @@ -182,4 +182,3 @@ valid_facial_hairstyles += facialhairstyle return valid_facial_hairstyles - \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0e943d8c257..1b1964a000f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -10,6 +10,11 @@ var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. /mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0) + + if(!dna) + dna = new /datum/dna(null) + // Species name is handled by set_species() + if(!species) if(new_species) set_species(new_species,1) @@ -36,9 +41,6 @@ ..() - if(dna) - dna.real_name = real_name - prev_gender = gender // Debug for plural genders make_blood() @@ -46,8 +48,10 @@ faction |= "\ref[M]" // Set up DNA. - if(!delay_ready_dna) + if(!delay_ready_dna && dna) dna.ready_dna(src) + dna.real_name = real_name + sync_organ_dna() //this shouldn't be necessaaaarrrryyyyyyyy UpdateAppearance() /mob/living/carbon/human/Destroy() diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 8889e5370da..7654b0d2e3b 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -144,4 +144,9 @@ //New are added for reagents to random organs. for(var/datum/reagent/A in reagents.reagent_list) var/obj/item/organ/O = pick(organs) - O.trace_chemicals[A.name] = 100 \ No newline at end of file + O.trace_chemicals[A.name] = 100 + +/mob/living/carbon/human/proc/sync_organ_dna() + var/list/all_bits = internal_organs|organs + for(var/obj/item/organ/O in all_bits) + O.set_dna(dna) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index b525919b5bc..f3d61c038c7 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -59,7 +59,7 @@ /datum/species/unathi/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) - + /datum/species/unathi/equip(var/mob/living/carbon/human/H) if(H.mind.assigned_role != "Clown") H.unEquip(H.shoes) @@ -105,7 +105,7 @@ /datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) - + /datum/species/tajaran/equip(var/mob/living/carbon/human/H) if(H.mind.assigned_role != "Clown") H.unEquip(H.shoes) @@ -219,7 +219,7 @@ i++ newname += pick(vox_name_syllables) return capitalize(newname) - + /datum/species/vox/equip(var/mob/living/carbon/human/H) if(H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime") H.unEquip(H.wear_mask) @@ -235,7 +235,7 @@ H.internal = H.l_hand if (H.internals) H.internals.icon_state = "internal1" - + /* /datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) H.verbs += /mob/living/carbon/human/proc/leap @@ -469,20 +469,20 @@ /datum/species/machine name = "Machine" name_plural = "Machines" - + blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \ robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \ to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \ generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \ - inhuman in outlook and perspective." - + inhuman in outlook and perspective." + icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' path = /mob/living/carbon/human/machine default_language = "Galactic Common" language = "Trinary" unarmed_type = /datum/unarmed_attack/punch - + 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. @@ -500,20 +500,21 @@ flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD clothing_flags = HAS_SOCKS + bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet blood_color = "#1F181F" flesh_color = "#AAAAAA" virus_immune = 1 can_revive_by_healing = 1 reagent_tag = PROCESS_SYN - + has_organ = list( "brain" = /obj/item/organ/mmi_holder/posibrain, "cell" = /obj/item/organ/cell, "optics" = /obj/item/organ/optical_sensor ) - vision_organ = "optics" + vision_organ = "optics" has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest/ipc), "groin" = list("path" = /obj/item/organ/external/groin/ipc), @@ -532,7 +533,7 @@ H.h_style = "" spawn(100) if(H) H.update_hair() - + /datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H) ..() H.verbs += /mob/living/carbon/human/proc/change_monitor \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 4c99dd12895..86c2d79eb7b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -238,15 +238,13 @@ var/global/list/damage_icon_parts = list() var/hulk = (HULK in src.mutations) var/skeleton = (SKELETON in src.mutations) - var/g = (gender == FEMALE ? "f" : "m") - //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. //Create a new, blank icon for our mob to use. if(stand_icon) qdel(stand_icon) stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank") - var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin]" + var/icon_key = "" var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"] if(eyes) @@ -265,6 +263,13 @@ var/global/list/damage_icon_parts = list() else icon_key += "1" + if(part) + icon_key += "[part.species.race_key]" + icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" + icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" + if(part.s_col) + icon_key += "[rgb(part.s_col[1], part.s_col[2], part.s_col[3])]" + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon @@ -868,8 +873,8 @@ var/global/list/damage_icon_parts = list() var/image/I = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]") I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) - overlays_standing[R_HAND_LAYER] = I - + overlays_standing[R_HAND_LAYER] = I + if (handcuffed) drop_r_hand() else overlays_standing[R_HAND_LAYER] = null diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 1a5808ec7d3..a93d2a278a8 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -21,7 +21,8 @@ var/list/organ_cache = list() var/list/trace_chemicals = list() // traces of chemicals in the organ, // links chemical IDs to number of ticks for which they'll stay in the blood germ_level = 0 - + var/datum/dna/dna + var/datum/species/species /obj/item/organ/Destroy() if(!owner) @@ -59,6 +60,12 @@ var/list/organ_cache = list() max_damage = min_broken_damage * 2 if(istype(holder)) src.owner = holder + species = all_species["Human"] + if(holder.dna) + dna = holder.dna.Clone() + species = all_species[dna.species] + else + log_to_dd("[src] at [loc] spawned without a proper DNA.") var/mob/living/carbon/human/H = holder if(istype(H)) if(internal) @@ -67,13 +74,19 @@ var/list/organ_cache = list() if(E.internal_organs == null) E.internal_organs = list() E.internal_organs |= src - if(H.dna) + if(dna) if(!blood_DNA) blood_DNA = list() - blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + blood_DNA[dna.unique_enzymes] = dna.b_type if(internal) holder.internal_organs |= src +/obj/item/organ/proc/set_dna(var/datum/dna/new_dna) + if(new_dna) + dna = new_dna.Clone() + blood_DNA.Cut() + blood_DNA[dna.unique_enzymes] = dna.b_type + /obj/item/organ/proc/die() if(status & ORGAN_ROBOT) return diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 26ca1f5079a..e3e95e78df3 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -12,13 +12,25 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) s_tone = null s_col = null - if(status & ORGAN_ROBOT) + if(status & ORGAN_ROBOT && !(species && species.name == "Machine")) //machine people get skin color + return + if(species && human.species && species.name != human.species.name) return if(!isnull(human.s_tone) && (human.species.bodyflags & HAS_SKIN_TONE)) s_tone = human.s_tone if(human.species.bodyflags & HAS_SKIN_COLOR) s_col = list(human.r_skin, human.g_skin, human.b_skin) +/obj/item/organ/external/proc/sync_colour_to_dna() + s_tone = null + s_col = null + if(status & ORGAN_ROBOT) + return + if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.flags & HAS_SKIN_TONE)) + s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) + if(species.flags & HAS_SKIN_COLOR) + s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) + /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) ..() var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] @@ -34,11 +46,11 @@ var/global/list/limb_icon_cache = list() overlays.Cut() if(!owner) return - - if(owner.species.has_organ["eyes"]) + + if(species.has_organ["eyes"]) var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] - if(owner.species.eyes) - var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes) + if(species.eyes) + var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes) if(eyes) eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) else @@ -46,14 +58,14 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(eyes_icon, ICON_OVERLAY) overlays |= eyes_icon - if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS))) + if(owner.lip_style && (species && (species.flags & HAS_LIPS))) var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") overlays |= lip_icon mob_icon.Blend(lip_icon, ICON_OVERLAY) if(owner.f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] - if(facial_hair_style && facial_hair_style.species_allowed && (owner.species.name in facial_hair_style.species_allowed)) + if(facial_hair_style && facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) @@ -61,7 +73,7 @@ var/global/list/limb_icon_cache = list() if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] - if(hair_style && (owner.species.name in hair_style.species_allowed)) + if(hair_style && (species.name in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(hair_style.do_colouration) hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD) @@ -74,26 +86,29 @@ var/global/list/limb_icon_cache = list() var/gender if(force_icon) mob_icon = new /icon(force_icon, "[icon_name]") + if(species && species.name == "Machine") //snowflake for IPC's, sorry. + if(s_col && s_col.len >= 3) + mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD) else - if(!owner) + if(!dna) mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]") else if(gendered_icon) - if(owner.gender == FEMALE) + if(dna.GetUIState(DNA_UI_GENDER)) gender = "f" else gender = "m" if(skeletal) mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else if (status & ORGAN_ROBOT) + else if(status & ORGAN_ROBOT) mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") else if (status & ORGAN_MUTATED) - mob_icon = new /icon(owner.species.deform, "[icon_name][gender ? "_[gender]" : ""]") + mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]") else - mob_icon = new /icon(owner.species.icobase, "[icon_name][gender ? "_[gender]" : ""]") + mob_icon = new /icon(species.icobase, "[icon_name][gender ? "_[gender]" : ""]") if(status & ORGAN_DEAD) mob_icon.ColorTone(rgb(10,50,0)) From efbf5f50f062d91db01ba36806b61ff35cdce171 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 08:38:21 +0200 Subject: [PATCH 25/69] Make sure sprites update on login --- code/game/jobs/job_controller.dm | 2 +- code/modules/customitems/item_spawning.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 03f4f6998a9..2ff04e63f6a 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -493,7 +493,7 @@ var/global/datum/controller/occupations/job_master if(istype(G) && !G.prescription) G.prescription = 1 G.name = "prescription [G.name]" -// H.update_icons() + H.regenerate_icons() H.hud_updateflag |= (1 << ID_HUD) H.hud_updateflag |= (1 << IMPLOYAL_HUD) diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index e7e1e299f27..93c9733eae0 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -62,6 +62,7 @@ Item.loc = get_turf(M.loc) HackProperties(Item,propadjust) + M.regenerate_icons() // This is hacky, but since it's difficult as fuck to make a proper parser in BYOND without killing the server, here it is. - N3X /proc/HackProperties(var/mob/living/carbon/human/M,var/obj/item/I,var/script) From bcc3f2483a1a64b722c0f13c49eb97dfbbff627e Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 08:43:08 +0200 Subject: [PATCH 26/69] Prevent shadowlings from hatching in lockers --- code/game/gamemodes/shadowling/special_shadowling_abilities.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index bb4fc80c7d6..05ae972cec0 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -13,6 +13,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N /obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets) if(usr.stat || !ishuman(usr) || !usr) return + if(!isturf(usr.loc)) + usr << "You can't hatch here!" for(var/mob/living/carbon/human/H in targets) var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") switch(hatch_or_no) From a47b86e3c520865c47fce8a9c6a895af2264a760 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 08:48:43 +0200 Subject: [PATCH 27/69] Whoops, add return --- code/game/gamemodes/shadowling/special_shadowling_abilities.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 05ae972cec0..f77f83a9077 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -15,6 +15,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N return if(!isturf(usr.loc)) usr << "You can't hatch here!" + return for(var/mob/living/carbon/human/H in targets) var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") switch(hatch_or_no) From 1b1481788997a4ca12749e577add081adece6dfc Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 09:02:58 +0200 Subject: [PATCH 28/69] Add in-game stickyban interface --- code/modules/admin/IsBanned.dm | 66 ++++++--- code/modules/admin/admin_memo.dm | 4 +- code/modules/admin/admin_verbs.dm | 3 +- code/modules/admin/stickyban.dm | 207 ++++++++++++++++++++++++++++ code/modules/admin/topic.dm | 3 + code/modules/client/client procs.dm | 11 +- code/modules/client/message.dm | 9 ++ paradise.dme | 2 + 8 files changed, 282 insertions(+), 23 deletions(-) create mode 100644 code/modules/admin/stickyban.dm create mode 100644 code/modules/client/message.dm diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index e6d258b3386..0191d1c67bd 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -2,9 +2,11 @@ world/IsBanned(key,address,computer_id) if (!key || !address || !computer_id) log_access("Failed Login (invalid data): [key] [address]-[computer_id]") - return list("reason"="invalid login data", "desc"="Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]' If you continue to get this error, please restart byond or contact byond support.") - if(ckey(key) in admin_datums) - return ..() + return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]'. (If you continue to get this error, please restart byond or contact byond support.)") + var/admin = 0 + var/ckey = ckey(key) + if((ckey in admin_datums) || (ckey in deadmins)) + admin = 1 //Guest Checking if(!guests_allowed && IsGuestKey(key)) @@ -26,11 +28,13 @@ world/IsBanned(key,address,computer_id) //Ban Checking . = CheckBan( ckey(key), computer_id, address ) if(.) - log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") - message_admins("\blue Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]") - return . - - return ..() //default pager ban stuff + if (admin) + log_admin("The admin [key] has been allowed to bypass a matching ban on [.["key"]]") + message_admins("The admin [key] has been allowed to bypass a matching ban on [.["key"]]") + addclientmessage(ckey,"You have been allowed to bypass a matching ban on [.["key"]]") + else + log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") + return . else @@ -49,7 +53,7 @@ world/IsBanned(key,address,computer_id) if(computer_id) cidquery = " OR computerid = '[computer_id]' " - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM [format_table_name("ban")] WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM [format_table_name("ban")] WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR bantype = 'ADMIN_PERMABAN' OR ((bantype = 'TEMPBAN' OR bantype = 'ADMIN_TEMPBAN') AND expiration_time > Now())) AND isnull(unbanned)") query.Execute() @@ -63,18 +67,46 @@ world/IsBanned(key,address,computer_id) var/duration = query.item[7] var/bantime = query.item[8] var/bantype = query.item[9] - + if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN") + //admin bans MUST match on ckey to prevent cid-spoofing attacks + // as well as dynamic ip abuse + if (pckey != ckey) + continue + if (admin) + if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN") + log_admin("The admin [key] is admin banned, and has been disallowed access") + message_admins("The admin [key] is admin banned, and has been disallowed access") + else + log_admin("The admin [key] has been allowed to bypass a matching ban on [pckey]") + message_admins("The admin [key] has been allowed to bypass a matching ban on [pckey]") + addclientmessage(ckey,"You have been allowed to bypass a matching ban on [pckey]") + continue var/expires = "" if(text2num(duration) > 0) expires = "The ban is for [duration] minutes and expires on [expiration] (server time)." - if(istext(bantype) && (bantype == "PERMABAN")) - var/appealmsg = "" - if(config && config.banappeals) - appealmsg = " You may appeal it at
[config.banappeals]." - expires = "The ban is permanent.[appealmsg]" + else + expires = " The is a permanent ban." var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime]. [expires]" - return list("reason"="[bantype]", "desc"="[desc]") + . = list("reason"="[bantype]", "desc"="[desc]") - return ..() //default pager ban stuff + + log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") + return . + + + . = ..() //default pager ban stuff + if (.) + //byond will not trigger isbanned() for "global" host bans, + //ie, ones where the "apply to this game only" checkbox is not checked (defaults to not checked) + //So it's safe to let admins walk thru host/sticky bans here + if (admin) + log_admin("The admin [key] has been allowed to bypass a matching host/sticky ban") + message_admins("The admin [key] has been allowed to bypass a matching host/sticky ban") + addclientmessage(ckey,"You have been allowed to bypass a matching host/sticky ban") + return null + else + log_access("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]") + + return . diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 03fc3767b8e..355a82aa697 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -11,7 +11,7 @@ return admin_memo_output(memotask) -/client/proc/admin_memo_output(task, checkrights = 1) +/client/proc/admin_memo_output(task, checkrights = 1, silent = 0) if(checkrights && !check_rights(R_SERVER)) return if(!task) @@ -99,7 +99,7 @@ if(last_editor) output += "
Last edit by [last_editor] (Click here to see edit log)" output += "
[memotext]

" - if(!output) + if(!output && !silent) src << "No memos found in database." return src << output diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5184f4e7dd2..ba036010873 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -74,7 +74,8 @@ var/list/admin_verbs_admin = list( ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, - /client/proc/jobbans + /client/proc/jobbans, + /client/proc/stickybanpanel ) var/list/admin_verbs_sounds = list( /client/proc/play_local_sound, diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm new file mode 100644 index 00000000000..ce8a756b7af --- /dev/null +++ b/code/modules/admin/stickyban.dm @@ -0,0 +1,207 @@ +/datum/admins/proc/stickyban(action,data) + if(!check_rights(R_BAN)) + return + + switch (action) + if ("show") + stickyban_show() + if ("add") + var/list/ban = list() + var/ckey + ban["admin"] = usr.key + ban["type"] = list("sticky") + ban["reason"] = "(InGameBan)([usr.key])" //this will be displayed in dd only + + if (data["ckey"]) + ckey = ckey(data["ckey"]) + else + ckey = input(usr,"Ckey","Ckey","") as text|null + if (!ckey) + return + ckey = ckey(ckey) + if (get_stickyban_from_ckey(ckey)) + usr << "Error: Can not add a stickyban: User already has a current sticky ban" + + if (data["reason"]) + ban["message"] = data["reason"] + else + var/reason = input(usr,"Reason","Reason","Ban Evasion") as text|null + if (!reason) + return + ban["message"] = "[reason]" + + world.SetConfig("ban",ckey,list2stickyban(ban)) + + log_admin("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") + message_admins("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") + + if ("remove") + if (!data["ckey"]) + return + var/ckey = data["ckey"] + + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + usr << "Error: No sticky ban for [ckey] found!" + return + if (alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No") + return + if (!get_stickyban_from_ckey(ckey)) + usr << "Error: The ban disappeared." + return + world.SetConfig("ban",ckey, null) + + log_admin("[key_name(usr)] removed [ckey]'s stickyban") + message_admins("[key_name_admin(usr)] removed [ckey]'s stickyban") + + if ("remove_alt") + if (!data["ckey"]) + return + var/ckey = data["ckey"] + if (!data["alt"]) + return + var/alt = ckey(data["alt"]) + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + usr << "Error: No sticky ban for [ckey] found!" + return + + var/found = 0 + //we have to do it this way because byond keeps the case in its sticky ban matches WHY!!! + for (var/key in ban["keys"]) + if (ckey(key) == alt) + found = 1 + break + + if (!found) + usr << "Error: [alt] is not linked to [ckey]'s sticky ban!" + return + + if (alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No") + return + + //we have to do this again incase something changes + ban = get_stickyban_from_ckey(ckey) + if (!ban) + usr << "Error: The ban disappeared." + return + + found = 0 + for (var/key in ban["keys"]) + if (ckey(key) == alt) + ban["keys"] -= key + found = 1 + break + + if (!found) + usr << "Error: [alt] link to [ckey]'s sticky ban disappeared." + return + + world.SetConfig("ban",ckey,list2stickyban(ban)) + + log_admin("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban") + message_admins("[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban") + + if ("edit") + if (!data["ckey"]) + return + var/ckey = data["ckey"] + var/ban = get_stickyban_from_ckey(ckey) + if (!ban) + usr << "Error: No sticky ban for [ckey] found!" + return + var/oldreason = ban["message"] + var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null + if (!reason || reason == oldreason) + return + //we have to do this again incase something changed while we waited for input + ban = get_stickyban_from_ckey(ckey) + if (!ban) + usr << "Error: The ban disappeared." + return + ban["message"] = "[reason]" + + world.SetConfig("ban",ckey,list2stickyban(ban)) + + log_admin("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") + message_admins("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") + +/datum/admins/proc/stickyban_gethtml(ckey, ban) + . = "\[-\][ckey]
" + . += "[ban["message"]] \[Edit\]
" + if (ban["admin"]) + . += "[ban["admin"]]
" + else + . += "LEGACY
" + . += "Caught keys
\n
    " + for (var/key in ban["keys"]) + if (ckey(key) == ckey) + continue + . += "
  1. \[-\][key]
  2. " + . += "
\n" + +/datum/admins/proc/stickyban_show() + if(!check_rights(R_BAN)) + return + + var/list/bans = world.GetConfig("ban") + var/banhtml = "" + for(var/key in bans) + var/ckey = ckey(key) + var/ban = stickyban2list(world.GetConfig("ban",key)) + banhtml += "

\n" + banhtml += stickyban_gethtml(ckey,ban) + + var/html = {" + + Sticky Bans + + +

All Sticky Bans:

\[+\]
+ [banhtml] + + "} + usr << browse(html,"window=stickybans;size=700x400") + +/proc/get_stickyban_from_ckey(var/ckey) + if (!ckey) + return null + ckey = ckey(ckey) + . = null + for (var/key in world.GetConfig("ban")) + if (ckey(key) == ckey) + . = stickyban2list(world.GetConfig("ban",key)) + break + +/proc/stickyban2list(var/ban) + if (!ban) + return null + . = params2list(ban) + .["keys"] = text2list(.["keys"], ",") + .["type"] = text2list(.["type"], ",") + .["IP"] = text2list(.["IP"], ",") + .["computer_id"] = text2list(.["computer_id"], ",") + +/proc/list2stickyban(var/list/ban) + if (!ban || !islist(ban)) + return null + . = ban.Copy() + if (.["keys"]) + .["keys"] = list2text(.["keys"], ",") + if (.["type"]) + .["type"] = list2text(.["type"], ",") + if (.["IP"]) + .["IP"] = list2text(.["IP"], ",") + if (.["computer_id"]) + .["computer_id"] = list2text(.["computer_id"], ",") + . = list2params(.) + +/client/proc/stickybanpanel() + set name = "Sticky Ban Panel" + set category = "Admin" + + if(!check_rights(R_BAN)) + return + + holder.stickyban_show() + \ No newline at end of file diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cff4e611d65..cc34e5a3437 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -25,6 +25,9 @@ message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help") log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help") + + if(href_list["stickyban"]) + stickyban(href_list["stickyban"],href_list) if(href_list["makeAntag"]) switch(href_list["makeAntag"]) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 5212d6e84e8..48148244e20 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -282,15 +282,20 @@ winset(src, null, "command=\".configure graphics-hwmode on\"") log_client_to_db() + + if (ckey in clientmessages) + for (var/message in clientmessages[ckey]) + src << message + clientmessages.Remove(ckey) if (config && config.autoconvert_notes) convert_notes_sql(ckey) send_resources() - ////////////// - //DISCONNECT// - ////////////// +////////////// +//DISCONNECT// +////////////// /client/Del() if(holder) holder.owner = null diff --git a/code/modules/client/message.dm b/code/modules/client/message.dm new file mode 100644 index 00000000000..6406a7d051a --- /dev/null +++ b/code/modules/client/message.dm @@ -0,0 +1,9 @@ +var/list/clientmessages = list() + +proc/addclientmessage(var/ckey, var/message) + ckey = ckey(ckey) + if (!ckey || !message) + return + if (!(ckey in clientmessages)) + clientmessages[ckey] = list() + clientmessages[ckey] += message diff --git a/paradise.dme b/paradise.dme index 76969b151fa..0c103fbc6e7 100644 --- a/paradise.dme +++ b/paradise.dme @@ -907,6 +907,7 @@ #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" #include "code\modules\admin\sql_notes.dm" +#include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\ToRban.dm" #include "code\modules\admin\watchlist.dm" @@ -998,6 +999,7 @@ #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\global_cache.dm" +#include "code\modules\client\message.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_mysql.dm" #include "code\modules\client\preferences_spawnpoints.dm" From 84f1c2ab8f78f0b365559d0efafac115a3626568 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 09:08:10 +0200 Subject: [PATCH 29/69] Re-add ban appeal message, memo check --- code/modules/admin/IsBanned.dm | 5 ++++- code/modules/client/client procs.dm | 2 +- config/example/config.txt | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 0191d1c67bd..158f7ed1916 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -85,7 +85,10 @@ world/IsBanned(key,address,computer_id) if(text2num(duration) > 0) expires = "The ban is for [duration] minutes and expires on [expiration] (server time)." else - expires = " The is a permanent ban." + var/appealmessage = "" + if(config && config.banappeals) + appealmessage = " You may appeal it at [config.banappeals]." + expires = " The is a permanent ban.[appealmessage]" var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime]. [expires]" diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 48148244e20..cc3b54b6bde 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -272,7 +272,7 @@ if(holder) add_admin_verbs() - admin_memo_output("Show", 0) + admin_memo_output("Show", 0, 1) // Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays. // (but turn them off first, since sometimes BYOND doesn't turn them on properly otherwise) diff --git a/config/example/config.txt b/config/example/config.txt index a3260d4a04d..f370103cbbb 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -165,7 +165,7 @@ GUEST_BAN ## Wiki address # WIKIURL http://example.org -## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. Will show up on permanent bans. # BANAPPEALS http://example.org ## Media base URL - determines where to pull the jukebox playlist from. @@ -175,10 +175,10 @@ GUEST_BAN ## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard # FEATURE_OBJECT_SPELL_SYSTEM -##Toggle for having jobs load up from the .txt +## Toggle for having jobs load up from the .txt LOAD_JOBS_FROM_TXT -##Remove the # mark infront of this to forbid admins from posssessing the singularity. +## Remove the # mark infront of this to forbid admins from posssessing the singularity. #FORBID_SINGULO_POSSESSION ## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. From d743fb1d1ae5d72b2a074d33df455894fce3bcab Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Sep 2015 04:48:04 -0400 Subject: [PATCH 30/69] pda janitor cart fixup --- code/game/objects/items/devices/PDA/cart.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index ba3316b3ce0..a710738c757 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -500,7 +500,7 @@ if(!CbotData.len) CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CartData[0] - for(var/obj/structure/stool/bed/chair/janicart/B in world) + for(var/obj/structure/janitorialcart/B in world) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) From 569758f4cb25507052b02677a845e3735979f241 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Sep 2015 06:46:50 -0400 Subject: [PATCH 31/69] bluespace trashbag --- .../objects/items/weapons/storage/bags.dm | 19 ++++++++++++------ .../research/designs/janitorial_designs.dm | 10 +++++++++ icons/obj/janitor.dmi | Bin 10071 -> 12500 bytes icons/obj/trash.dmi | Bin 10123 -> 4670 bytes 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index e88e37afd6c..5b700bf7181 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -29,8 +29,8 @@ /obj/item/weapon/storage/bag/trash name = "trash bag" desc = "It's the heavy-duty black polymer kind. Time to take out the trash!" - icon = 'icons/obj/trash.dmi' - icon_state = "trashbag0" + icon = 'icons/obj/janitor.dmi' + icon_state = "trashbag" item_state = "trashbag" w_class = 4 @@ -46,12 +46,12 @@ /obj/item/weapon/storage/bag/trash/update_icon() if(contents.len == 0) - icon_state = "trashbag0" + icon_state = "[initial(icon_state)]" else if(contents.len < 12) - icon_state = "trashbag1" + icon_state = "[initial(icon_state)]1" else if(contents.len < 21) - icon_state = "trashbag2" - else icon_state = "trashbag3" + icon_state = "[initial(icon_state)]2" + else icon_state = "[initial(icon_state)]3" /obj/item/weapon/storage/bag/trash/cyborg @@ -63,6 +63,13 @@ /obj/item/weapon/storage/bag/trash/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) return +/obj/item/weapon/storage/bag/trash/bluespace + name = "trash bag of holding" + desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." + icon_state = "bluetrashbag" + max_combined_w_class = 60 + storage_slots = 60 + // ----------------------------- // Plastic Bag diff --git a/code/modules/research/designs/janitorial_designs.dm b/code/modules/research/designs/janitorial_designs.dm index 06fce1ca135..8c575425ebe 100644 --- a/code/modules/research/designs/janitorial_designs.dm +++ b/code/modules/research/designs/janitorial_designs.dm @@ -11,6 +11,16 @@ build_path = /obj/item/weapon/mop/advanced category = list("Janitorial") +/datum/design/blutrash + name = "Trashbag of Holding" + desc = "An advanced trashabg with bluespace properties; capable of holding a plethora of garbage." + id = "blutrash" + req_tech = list("materials" = 5, "bluespace" = 3) + build_type = PROTOLATHE + materials = list(MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PLASMA = 1500) + build_path = /obj/item/weapon/storage/bag/trash/bluespace + category = list("Janitorial") + /datum/design/buffer name = "Floor Buffer Upgrade" desc = "A floor buffer that can be attached to vehicular janicarts." diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 38b93652f0ea40613a59034cf3f0aab194e74b64..119f3df0e375479849934e59c5951c1ef9ce4145 100644 GIT binary patch literal 12500 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 diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 1d0d126006bcf46ff45ec41c2f5d8d2c6d7aed02..600ecc9f8a53e11aa16a238430b8f28042d5d537 100644 GIT binary patch literal 4670 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 literal 10123 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 F{{q8sUz7j< From 6f2a753d89f2f2fcc77f6c08a6aafd77b3e8f0a3 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 21:38:08 +0200 Subject: [PATCH 32/69] Send questions to admins and mods --- code/modules/admin/verbs/adminhelp.dm | 20 ++++++++------------ code/modules/mob/new_player/new_player.dm | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 69999e89940..198e5c8a042 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -92,7 +92,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," //send this msg to all admins var/admin_number_afk = 0 var/list/modholders = list() - var/list/banholders = list() var/list/adminholders = list() for(var/client/X in admins) if(check_rights(R_MOD|R_MENTOR, 0, X.mob)) @@ -103,8 +102,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(X.is_afk()) admin_number_afk++ adminholders += X - if(check_rights(R_BAN, 0, X.mob)) - banholders += X switch(selected_type) if("Question") @@ -113,15 +110,14 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' X << msg - else - if(adminholders.len) - for(var/client/X in adminholders) - if(X.prefs.sound & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg - else if("Player Complaint") - if(banholders.len) - for(var/client/X in banholders) + if(adminholders.len) + for(var/client/X in adminholders) + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' + X << msg + if("Player Complaint") + if(adminholders.len) + for(var/client/X in adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' X << msg diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 3830c9b2705..6f3bea0cef8 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -509,7 +509,7 @@ proc/has_admin_rights() - return client.holder.rights & R_ADMIN + return check_rights(R_ADMIN, 0, src) proc/is_species_whitelisted(datum/species/S) if(!S) return 1 From b914544a877358e1bed77a709c8e095855a46531 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 22:50:09 +0200 Subject: [PATCH 33/69] Fixes --- .../shadowling/shadowling_abilities.dm | 16 ++- code/game/machinery/pipe/construction.dm | 6 +- code/game/machinery/pipe/pipe_dispenser.dm | 3 +- .../structures/transit_tubes/station.dm | 2 +- code/modules/client/preferences_mysql.dm | 10 +- code/modules/clothing/spacesuits/plasmamen.dm | 56 +++------- code/modules/clothing/spacesuits/rig.dm | 102 ++++++------------ code/modules/mob/mob.dm | 5 - 8 files changed, 69 insertions(+), 131 deletions(-) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index fbc3b08e60a..5493ca96f53 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -85,10 +85,20 @@ else if(istype(I, /obj/item/clothing/head/helmet/space/rig)) var/obj/item/clothing/head/helmet/space/rig/R = I if(R.on) - R.on = 0 - R.icon_state = "rig[R.on]-[R._color]" + R.toggle_light() R.visible_message("[R]'s light fades and turns off.") - R.set_light(0) + else if(istype(I, /obj/item/clothing/head/helmet/space/eva/plasmaman)) + var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = I + if(P.on) + P.toggle_light() + P.visible_message("[P]'s light fades and turns off.") + else if(istype(I, /obj/item/weapon/gun)) + var/obj/item/weapon/gun/G = I + if(G.F) + var/obj/item/device/flashlight/F = G.F + if(F.on) + G.toggle_gunlight() + G.visible_message("[G]'s light fades and turns off.") return I.light_range /obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(var/mob/living/H) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 47bbfa2715f..adc87a948bf 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -35,8 +35,7 @@ #define PIPE_INJECTOR 34 #define PIPE_DVALVE 35 #define PIPE_DP_VENT 36 -#define PIPE_PASV_VENT 37 -#define PIPE_DTVALVE 38 +#define PIPE_DTVALVE 37 /obj/item/pipe name = "pipe" @@ -345,7 +344,7 @@ return dir|flip if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT) return dir //dir|acw - if(PIPE_CONNECTOR, PIPE_UVENT, PIPE_PASV_VENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_INJECTOR) + if(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_INJECTOR) return dir if(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER) return dir|flip|cw|acw @@ -671,5 +670,4 @@ #undef PIPE_INJECTOR #undef PIPE_DVALVE #undef PIPE_DP_VENT -#undef PIPE_PASV_VENT #undef PIPE_DTVALVE diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 0165aaa1d37..df9e1bd291a 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -20,7 +20,7 @@ Pipe Cap
4-Way Manifold
Manual T-Valve
-Digital T-Valve
+Digital T-Valve
Supply pipes:
Pipe
Bent Pipe
@@ -47,7 +47,6 @@ Gas Mixer
Air Injector
Dual-Port Vent Pump
-Passive Vent
Heat exchange:
Pipe
Bent Pipe
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 5671316f975..48cc9feccf7 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -33,7 +33,7 @@ return 1 /obj/structure/transit_tube/station/Bumped(mob/AM as mob|obj) - if(!pod_moving && icon_state == "open" && istype(AM, /mob/living) && !(AM.type in disallowed_mobs)) + if(!pod_moving && icon_state == "open" && istype(AM, /mob/living) && !is_type_in_list(AM, disallowed_mobs)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents.len) AM << "" diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 38006797487..98c26df8ec8 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -264,10 +264,10 @@ job_karma_high='[job_karma_high]', job_karma_med='[job_karma_med]', job_karma_low='[job_karma_low]', - flavor_text='[sql_sanitize_text(flavor_text)]', - med_record='[sql_sanitize_text(med_record)]', - sec_record='[sql_sanitize_text(sec_record)]', - gen_record='[sql_sanitize_text(gen_record)]', + flavor_text='[sql_sanitize_text(html_decode(flavor_text))]', + med_record='[sql_sanitize_text(html_decode(med_record))]', + sec_record='[sql_sanitize_text(html_decode(sec_record))]', + gen_record='[sql_sanitize_text(html_decode(gen_record))]', player_alt_titles='[playertitlelist]', be_special='[be_special]', disabilities='[disabilities]', @@ -321,7 +321,7 @@ '[job_medsci_high]', '[job_medsci_med]', '[job_medsci_low]', '[job_engsec_high]', '[job_engsec_med]', '[job_engsec_low]', '[job_karma_high]', '[job_karma_med]', '[job_karma_low]', - '[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]', + '[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]', '[playertitlelist]', '[be_special]', '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', '[socks]', '[body_accessory]') diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 32b99189599..7bfa16b8ba8 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -5,7 +5,7 @@ desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies." allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) slowdown = 0 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0 ,energy = 0, bomb = 0, bio = 100, rad = 20) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -16,9 +16,9 @@ icon_state = "plasmaman_suit" item_state = "plasmaman_suit" - var/next_extinguish=0 - var/extinguish_cooldown=10 SECONDS - var/extinguishes_left=10 // Yeah yeah, reagents, blah blah blah. This should be simple. + var/next_extinguish = 0 + var/extinguish_cooldown = 10 SECONDS + var/extinguishes_left = 10 // Yeah yeah, reagents, blah blah blah. This should be simple. /obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user) ..(user) @@ -46,35 +46,26 @@ var/base_state = "plasmaman_helmet" var/brightness_on = 4 //luminosity when on var/on = 0 - var/no_light=0 // Disable the light on the atmos suit action_button_name = "Toggle Helmet Light" /obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities. - return - if(no_light) + user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities. return + toggle_light(user) + +/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user) on = !on icon_state = "[base_state][on]" - if(on) user.set_light(user.luminosity + brightness_on) - else user.set_light(user.luminosity - brightness_on) - user.update_inv_head() - -/obj/item/clothing/head/helmet/space/eva/plasmaman/pickup(mob/user) - if(on) - user.set_light(user.luminosity + brightness_on) -// user.UpdateLuminosity() + if(on) + set_light(brightness_on) + else set_light(0) -/obj/item/clothing/head/helmet/space/eva/plasmaman/dropped(mob/user) - if(on) - user.set_light(user.luminosity - brightness_on) -// user.UpdateLuminosity() - set_light(brightness_on) - - + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_head() // ENGINEERING /obj/item/clothing/suit/space/eva/plasmaman/assistant @@ -305,7 +296,7 @@ /obj/item/clothing/suit/space/eva/plasmaman/nuclear name = "blood red plasmaman suit" icon_state = "plasmaman_Nukeops" - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs) siemens_coefficient = 0.6 @@ -313,20 +304,5 @@ name = "blood red plasmaman helmet" icon_state = "plasmaman_Nukeops_helmet0" base_state = "plasmaman_Nukeops_helmet" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) siemens_coefficient = 0.6 - var/obj/machinery/camera/camera - -/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/attack_self(mob/user) - if(camera) - ..(user) - else - camera = new /obj/machinery/camera(src) - camera.network = list("NUKE") - cameranet.removeCamera(camera) - camera.c_tag = user.name - user << "User scanned as [camera.c_tag]. Camera activated." - -/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/examine(mob/user) - if(..(user, 1)) - user << "This helmet has a built-in camera. It's [camera ? "" : "in"]active." \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index b3c5d19b6d7..8f1703a3325 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -27,20 +27,24 @@ "Vox" = 'icons/obj/clothing/species/vox/hats.dmi', ) - attack_self(mob/user) - if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities. - return - on = !on - icon_state = "rig[on]-[_color]" -// item_state = "rig[on]-[color]" +/obj/item/clothing/head/helmet/space/rig/attack_self(mob/user) + if(!isturf(user.loc)) + user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities. + return + toggle_light(user) - if(on) set_light(brightness_on) - else set_light(0) +/obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user) + on = !on + icon_state = "rig[on]-[_color]" - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_head() + if(on) + set_light(brightness_on) + else + set_light(0) + + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_head() /obj/item/clothing/suit/space/rig name = "hardsuit" @@ -98,7 +102,7 @@ else M << "Your suit's helmet deploys with a hiss." //TODO: Species check, skull damage for forcing an unfitting helmet on? - helmet.loc = H + helmet.forceMove(H) H.equip_to_slot(helmet, slot_head) helmet.flags |= NODROP @@ -107,7 +111,7 @@ M << "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way." else M << "Your suit's boots deploy with a hiss." - boots.loc = H + boots.forceMove(H) H.equip_to_slot(boots, slot_shoes) boots.flags |= NODROP @@ -122,7 +126,7 @@ if(helmet && H.head == helmet) helmet.flags &= ~NODROP H.unEquip(helmet) - helmet.loc = src + helmet.forceMove(src) if(boots) H = boots.loc @@ -130,58 +134,15 @@ if(boots && H.shoes == boots) boots.flags &= ~NODROP H.unEquip(boots) - boots.loc = src - -/* -/obj/item/clothing/suit/space/rig/verb/get_mounted_device() - - set name = "Deploy Mounted Device" - set category = "Object" - set src in usr - - if(!can_mount) - verbs -= /obj/item/clothing/suit/space/rig/verb/get_mounted_device - verbs -= /obj/item/clothing/suit/space/rig/verb/stow_mounted_device - return - - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - if(active_device) - usr << "You already have \the [active_device] deployed." - return - - if(!mounted_devices.len) - usr << "You do not have any devices mounted on \the [src]." - return - -/obj/item/clothing/suit/space/rig/verb/stow_mounted_device() - - set name = "Stow Mounted Device" - set category = "Object" - set src in usr - - if(!can_mount) - verbs -= /obj/item/clothing/suit/space/rig/verb/get_mounted_device - verbs -= /obj/item/clothing/suit/space/rig/verb/stow_mounted_device - return - - if(!istype(usr, /mob/living)) return - - if(usr.stat) return - - if(!active_device) - usr << "You have no device currently deployed." - return -*/ - + boots.forceMove(src) + /obj/item/clothing/suit/space/rig/verb/toggle_helmet() - set name = "Toggle Helmet" set category = "Object" set src in usr - if(!istype(src.loc,/mob/living)) return + if(!isliving(usr)) + return if(!helmet) usr << "There is no helmet installed." @@ -197,23 +158,22 @@ helmet.flags &= ~NODROP H.unEquip(helmet) helmet.loc = src - H << "\blue You retract your hardsuit helmet." + H << "You retract your hardsuit helmet." else if(H.head) - H << "\red You cannot deploy your helmet while wearing another helmet." + H << "You cannot deploy your helmet while wearing another helmet." return //TODO: Species check, skull damage for forcing an unfitting helmet on? helmet.loc = H helmet.pickup(H) H.equip_to_slot(helmet, slot_head) helmet.flags |= NODROP - H << "\blue You deploy your hardsuit helmet, sealing you off from the world." + H << "You deploy your hardsuit helmet, sealing you off from the world." H.update_inv_head() /obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params) - - if(!istype(user,/mob/living)) return - + if(!isliving(user)) + return if(istype(src.loc,/mob/living)) user << "How do you propose to modify a hardsuit while it is being worn?" @@ -230,7 +190,7 @@ if(!boots) user << "\The [src] does not have any boots installed." else - user << "You detatch \the [boots] from \the [src]'s boot mounts." + user << "You detach \the [boots] from \the [src]'s boot mounts." boots.loc = get_turf(src) boots = null return @@ -338,8 +298,9 @@ /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot toggle your helmet while in this [user.loc]" //To prevent some lighting anomalities. + user << "You cannot toggle your helmet while in this [user.loc]." //To prevent some lighting anomalities. return + on = !on if(on) user << "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor." @@ -484,7 +445,6 @@ heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT - /obj/item/clothing/suit/space/rig/atmos desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding." icon_state = "rig-atmos" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 221b8962ca8..a644ec9d7d3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -639,11 +639,6 @@ var/list/slot_equipment_priority = list( \ flavor_text = msg -/mob/proc/warn_flavor_changed() - if(flavor_text && flavor_text != "") // don't spam people that don't use it! - src << "

OOC Warning:

" - src << "Your flavor text is likely out of date! Change" - /mob/proc/print_flavor_text(var/shrink = 1) if (flavor_text && flavor_text != "") var/msg = replacetext(flavor_text, "\n", " ") From 44763a869ab1e4fc7c6ef56c58053b212a439dcc Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 27 Sep 2015 23:58:10 +0200 Subject: [PATCH 34/69] Stickyban clean-up, add admin bans --- code/__DEFINES/admin.dm | 2 + code/modules/admin/DB ban/functions.dm | 61 +++++++++++++++++++++ code/modules/admin/IsBanned.dm | 31 +++++------ code/modules/admin/stickyban.dm | 7 ++- code/modules/admin/topic.dm | 11 ++++ code/modules/admin/verbs/modifyvariables.dm | 6 +- 6 files changed, 99 insertions(+), 19 deletions(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 5d63e777087..49ef7a72855 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -19,6 +19,8 @@ #define BANTYPE_JOB_TEMP 4 #define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban. #define BANTYPE_APPEARANCE 6 +#define BANTYPE_ADMIN_PERMA 7 +#define BANTYPE_ADMIN_TEMP 8 //Please don't edit these values without speaking to Errorage first ~Carn //Admin Permissions diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 8cd511a3c9a..72cee4a7b4c 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -1,3 +1,4 @@ +#define MAX_ADMIN_BANS_PER_ADMIN 1 datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/banip = null, var/bancid = null) @@ -10,14 +11,22 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = var/serverip = "[world.internet_address]:[world.port]" var/bantype_pass = 0 var/bantype_str + var/maxadminbancheck //Used to limit the number of active bans of a certein type that each admin can give. Used to protect against abuse or mutiny. + var/announceinirc //When set, it announces the ban in irc. Intended to be a way to raise an alarm, so to speak. + var/blockselfban //Used to prevent the banning of yourself. + var/kickbannedckey //Defines whether this proc should kick the banned person, if they are connected (if banned_mob is defined). + //some ban types kick players after this proc passes (tempban, permaban), but some are specific to db_ban, so + //they should kick within this proc. switch(bantype) if(BANTYPE_PERMA) bantype_str = "PERMABAN" duration = -1 bantype_pass = 1 + blockselfban = 1 if(BANTYPE_TEMP) bantype_str = "TEMPBAN" bantype_pass = 1 + blockselfban = 1 if(BANTYPE_JOB_PERMA) bantype_str = "JOB_PERMABAN" duration = -1 @@ -29,6 +38,21 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = bantype_str = "APPEARANCE_BAN" duration = -1 bantype_pass = 1 + if(BANTYPE_ADMIN_PERMA) + bantype_str = "ADMIN_PERMABAN" + duration = -1 + bantype_pass = 1 + maxadminbancheck = 1 + announceinirc = 1 + blockselfban = 1 + kickbannedckey = 1 + if(BANTYPE_ADMIN_TEMP) + bantype_str = "ADMIN_TEMPBAN" + bantype_pass = 1 + maxadminbancheck = 1 + announceinirc = 1 + blockselfban = 1 + kickbannedckey = 1 if( !bantype_pass ) return if( !istext(reason) ) return @@ -66,6 +90,11 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = a_ckey = src.owner:ckey a_computerid = src.owner:computer_id a_ip = src.owner:address + + if(blockselfban) + if(a_ckey == ckey) + usr << "You cannot apply this ban type on yourself." + return var/who for(var/client/C in clients) @@ -82,6 +111,15 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = adminwho += ", [C]" reason = sql_sanitize_text(reason) + + if(maxadminbancheck) + var/DBQuery/adm_query = dbcon.NewQuery("SELECT count(id) AS num FROM [format_table_name("ban")] WHERE (a_ckey = '[a_ckey]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") + adm_query.Execute() + if(adm_query.NextRow()) + var/adm_bans = text2num(adm_query.item[1]) + if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN) + usr << "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!" + return var/sql = "INSERT INTO [format_table_name("ban")] (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) @@ -89,7 +127,12 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = usr << "\blue Ban saved to database." message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1) + if(announceinirc) + send2irc("BAN ALERT","[a_ckey] applied a [bantype_str] on [ckey]") + if(kickbannedckey) + if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey) + del(banned_mob.client) datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") @@ -114,6 +157,12 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") if(BANTYPE_APPEARANCE) bantype_str = "APPEARANCE_BAN" bantype_pass = 1 + if(BANTYPE_ADMIN_PERMA) + bantype_str = "ADMIN_PERMABAN" + bantype_pass = 1 + if(BANTYPE_ADMIN_TEMP) + bantype_str = "ADMIN_TEMPBAN" + bantype_pass = 1 if(BANTYPE_ANY_FULLBAN) bantype_str = "ANY" bantype_pass = 1 @@ -300,6 +349,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) output += "" output += "" output += "" + output += "" + output += "" output += "" output += "Ckey: " output += "IP: " @@ -339,6 +390,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) output += "" output += "" output += "" + output += "" + output += "" output += "" output += "

" output += " Match(min. 3 characters to search by key or ip, and 7 to search by cid)
" @@ -406,6 +459,10 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) bantypesearch += "'JOB_TEMPBAN' " if(BANTYPE_APPEARANCE) bantypesearch += "'APPEARANCE_BAN' " + if(BANTYPE_ADMIN_PERMA) + bantypesearch = "'ADMIN_PERMABAN' " + if(BANTYPE_ADMIN_TEMP) + bantypesearch = "'ADMIN_TEMPBAN' " else bantypesearch += "'PERMABAN' " @@ -448,6 +505,10 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) typedesc = "TEMP JOBBAN
([job])
([duration] minutes
Expires [expiration]" if("APPEARANCE_BAN") typedesc = "APPEARANCE/NAME BAN" + if("ADMIN_PERMABAN") + typedesc = "ADMIN PERMABAN" + if("ADMIN_TEMPBAN") + typedesc = "ADMIN TEMPBAN
([duration] minutes [(unbanned) ? "" : "(Edit))"]
Expires [expiration]
" output += "" output += "[typedesc]" diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 158f7ed1916..44027257bee 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -2,7 +2,7 @@ world/IsBanned(key,address,computer_id) if (!key || !address || !computer_id) log_access("Failed Login (invalid data): [key] [address]-[computer_id]") - return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]'. (If you continue to get this error, please restart byond or contact byond support.)") + return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.") var/admin = 0 var/ckey = ckey(key) if((ckey in admin_datums) || (ckey in deadmins)) @@ -10,23 +10,25 @@ world/IsBanned(key,address,computer_id) //Guest Checking if(!guests_allowed && IsGuestKey(key)) - log_access("Failed Login: [key] - Guests not allowed") + log_access("Failed Login: [key] [computer_id] [address] - Guests not allowed") // message_admins("\blue Failed Login: [key] - Guests not allowed") - return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") + return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a BYOND account.") - //check if the IP address is a known TOR node - if(config && config.ToRban && ToRban_isbanned(address)) - log_access("Failed Login: [src] - Banned: ToR") - message_admins("\blue Failed Login: [src] - Banned: ToR") + //check if the IP address is a known Tor node + if(config.ToRban && ToRban_isbanned(address)) + log_access("Failed Login: [key] [computer_id] [address] - Banned: Tor") + message_admins("Failed Login: [key] - Banned: Tor") //ban their computer_id and ckey for posterity - AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0) - return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [config.banappeals]") + AddBan(ckey(key), computer_id, "Use of Tor", "Automated Ban", 0, 0) + var/mistakemessage = "" + if(config.banappeals) + mistakemessage = "\nIf you believe this is a mistake, please request help at [config.banappeals]." + return list("reason"="using Tor", "desc"="\nReason: The network you are using to connect has been banned.[mistakemessage]") if(config.ban_legacy_system) - //Ban Checking - . = CheckBan( ckey(key), computer_id, address ) + . = CheckBan(ckey(key), computer_id, address) if(.) if (admin) log_admin("The admin [key] has been allowed to bypass a matching ban on [.["key"]]") @@ -35,9 +37,7 @@ world/IsBanned(key,address,computer_id) else log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") return . - else - var/ckeytext = ckey(key) if(!establish_db_connection()) @@ -86,7 +86,7 @@ world/IsBanned(key,address,computer_id) expires = "The ban is for [duration] minutes and expires on [expiration] (server time)." else var/appealmessage = "" - if(config && config.banappeals) + if(config.banappeals) appealmessage = " You may appeal it at [config.banappeals]." expires = " The is a permanent ban.[appealmessage]" @@ -94,7 +94,6 @@ world/IsBanned(key,address,computer_id) . = list("reason"="[bantype]", "desc"="[desc]") - log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") return . @@ -107,7 +106,7 @@ world/IsBanned(key,address,computer_id) if (admin) log_admin("The admin [key] has been allowed to bypass a matching host/sticky ban") message_admins("The admin [key] has been allowed to bypass a matching host/sticky ban") - addclientmessage(ckey,"You have been allowed to bypass a matching host/sticky ban") + addclientmessage(ckey,"You have been allowed to bypass a matching host/sticky ban") return null else log_access("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]") diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index ce8a756b7af..072cad1acf7 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -5,6 +5,7 @@ switch (action) if ("show") stickyban_show() + return if ("add") var/list/ban = list() var/ckey @@ -30,7 +31,7 @@ return ban["message"] = "[reason]" - world.SetConfig("ban",ckey,list2stickyban(ban)) + world.SetConfig("ban", ckey, list2stickyban(ban)) log_admin("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") message_admins("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") @@ -49,7 +50,7 @@ if (!get_stickyban_from_ckey(ckey)) usr << "Error: The ban disappeared." return - world.SetConfig("ban",ckey, null) + world.SetConfig("ban", ckey, null) log_admin("[key_name(usr)] removed [ckey]'s stickyban") message_admins("[key_name_admin(usr)] removed [ckey]'s stickyban") @@ -125,6 +126,8 @@ log_admin("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") message_admins("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") + + stickyban_show() /datum/admins/proc/stickyban_gethtml(ckey, ban) . = "\[-\][ckey]
" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cc34e5a3437..b922b4979c8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -126,6 +126,17 @@ return banduration = null banjob = null + if(BANTYPE_ADMIN_PERMA) + if(!banckey || !banreason) + usr << "Not enough parameters (Requires ckey and reason)" + return + banduration = null + banjob = null + if(BANTYPE_ADMIN_TEMP) + if(!banckey || !banreason || !banduration) + usr << "Not enough parameters (Requires ckey, reason and duration)" + return + banjob = null var/mob/playermob diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index f0532fbd254..134cc9ff3f5 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -323,8 +323,12 @@ var/list/forbidden_varedit_object_types = list( for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) - usr << "\red It is forbidden to edit this object's variables." + usr << "It is forbidden to edit this object's variables." return + + if(istype(O, /client) && (param_var_name == "ckey" || param_var_name == "key")) + usr << "You cannot edit ckeys on client objects." + return var/class var/variable From bd65300965afd0777998687d881c01371a11f76d Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 00:22:35 +0200 Subject: [PATCH 35/69] Formatting update, make sure that reload admins remove proccall verbs --- code/modules/admin/IsBanned.dm | 9 ++++----- code/modules/admin/admin_verbs.dm | 1 + code/modules/admin/stickyban.dm | 5 +++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 44027257bee..c738be58089 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -2,7 +2,7 @@ world/IsBanned(key,address,computer_id) if (!key || !address || !computer_id) log_access("Failed Login (invalid data): [key] [address]-[computer_id]") - return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.") + return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.") var/admin = 0 var/ckey = ckey(key) if((ckey in admin_datums) || (ckey in deadmins)) @@ -33,7 +33,7 @@ world/IsBanned(key,address,computer_id) if (admin) log_admin("The admin [key] has been allowed to bypass a matching ban on [.["key"]]") message_admins("The admin [key] has been allowed to bypass a matching ban on [.["key"]]") - addclientmessage(ckey,"You have been allowed to bypass a matching ban on [.["key"]]") + addclientmessage(ckey,"You have been allowed to bypass a matching ban on [.["key"]].") else log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") return . @@ -79,7 +79,7 @@ world/IsBanned(key,address,computer_id) else log_admin("The admin [key] has been allowed to bypass a matching ban on [pckey]") message_admins("The admin [key] has been allowed to bypass a matching ban on [pckey]") - addclientmessage(ckey,"You have been allowed to bypass a matching ban on [pckey]") + addclientmessage(ckey,"You have been allowed to bypass a matching ban on [pckey].") continue var/expires = "" if(text2num(duration) > 0) @@ -97,7 +97,6 @@ world/IsBanned(key,address,computer_id) log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") return . - . = ..() //default pager ban stuff if (.) //byond will not trigger isbanned() for "global" host bans, @@ -106,7 +105,7 @@ world/IsBanned(key,address,computer_id) if (admin) log_admin("The admin [key] has been allowed to bypass a matching host/sticky ban") message_admins("The admin [key] has been allowed to bypass a matching host/sticky ban") - addclientmessage(ckey,"You have been allowed to bypass a matching host/sticky ban") + addclientmessage(ckey,"You have been allowed to bypass a matching host/sticky ban.") return null else log_access("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ba036010873..1bc24ab72b2 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -226,6 +226,7 @@ var/list/admin_verbs_proccall = list ( admin_verbs_spawn, admin_verbs_mod, admin_verbs_mentor, + admin_verbs_proccall, admin_verbs_show_debug_verbs, /client/proc/readmin, ) diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index 072cad1acf7..ef625d001f2 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -126,8 +126,9 @@ log_admin("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") message_admins("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") - - stickyban_show() + + spawn(10) + stickyban_show() /datum/admins/proc/stickyban_gethtml(ckey, ban) . = "\[-\][ckey]
" From 1952d15699a01f835ecfcd372ebb1c2b1059ba5b Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 00:44:07 +0200 Subject: [PATCH 36/69] Space fix --- code/modules/admin/IsBanned.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index c738be58089..37c6a60bcdd 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -83,14 +83,14 @@ world/IsBanned(key,address,computer_id) continue var/expires = "" if(text2num(duration) > 0) - expires = "The ban is for [duration] minutes and expires on [expiration] (server time)." + expires = " The ban is for [duration] minutes and expires on [expiration] (server time)." else var/appealmessage = "" if(config.banappeals) appealmessage = " You may appeal it at [config.banappeals]." expires = " The is a permanent ban.[appealmessage]" - var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime]. [expires]" + var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime].[expires]" . = list("reason"="[bantype]", "desc"="[desc]") From 273bcb07e5c697b9492f699bae56235d447cfafe Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 01:18:04 +0200 Subject: [PATCH 37/69] Add vial box to virology, in view() update --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/modules/admin/admin_report.dm | 2 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index e22a8133fd1..7ee88a4383d 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6970,7 +6970,7 @@ "cEb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEc" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEd" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cEe" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cEe" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/storage/fancy/vials,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEf" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/vials,/obj/item/weapon/hand_labeler{pixel_x = -3; pixel_y = -3},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEg" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint) diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index b0f43741d02..89b267cd348 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -118,7 +118,7 @@ client/proc/display_admin_reports() usr << browse(output, "window=news;size=600x400") -client/proc/Report(mob/M as mob in world) +client/proc/Report(mob/M as mob in view()) set category = "Admin" if(!src.holder) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3a8509b80a1..a7e9cf0fd3e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -570,7 +570,7 @@ var/list/admin_verbs_proccall = list ( log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") message_admins("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") -/client/proc/make_sound(var/obj/O in world) // -- TLE +/client/proc/make_sound(var/obj/O in view()) // -- TLE set category = "Event" set name = "Make Sound" set desc = "Display a message to everyone who can hear the target" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a49cd02c06b..e047a9c6497 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -567,7 +567,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) set category = "Admin" set name = "Delete" @@ -596,7 +596,7 @@ Traitors and the like can also be revived with the previous role mostly intact. src << "[job.title]: [job.total_positions]" feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in view()) set category = "Event" set name = "Explosion" @@ -627,7 +627,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else return -/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in view()) set category = "Special Verbs" set name = "EM Pulse" From 155afc61317b85321021e4cba18047409eda0984 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Sep 2015 19:24:35 -0400 Subject: [PATCH 38/69] lists --- code/_globalvars/lists/objects.dm | 1 + code/game/objects/items/devices/PDA/cart.dm | 2 +- code/game/objects/structures/janicart.dm | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index c832bcc03d4..709892ee141 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -11,6 +11,7 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI var/global/list/flag_list = list() //list of flags during Nations gamemode var/global/list/airlocks = list() //list of all airlocks var/global/list/singularities = list() //list of all singularities +var/global/list/janitorialcarts = list() //list of all singularities var/global/list/aibots = list() // AI controlled bots var/global/list/table_recipes = list() //list of all table craft recipes diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index a710738c757..0262d1f99a6 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -500,7 +500,7 @@ if(!CbotData.len) CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CartData[0] - for(var/obj/structure/janitorialcart/B in world) + for(var/obj/structure/janitorialcart/B in janitorialcarts) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index d22db9cc1d7..6972d1eb908 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -232,8 +232,13 @@ /obj/structure/janitorialcart/New() create_reagents(100) + janitorialcarts += src +/obj/structure/janitorialcart/Destroy() + janitorialcarts -= src + return ..() + /obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user) if(reagents.total_volume < 1) user << "[src] is out of water!
" From 219640c02a93f99d5c96b693fac1a8c398a51088 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 01:24:50 +0200 Subject: [PATCH 39/69] Loose pipe --- _maps/map_files/cyberiad/cyberiad.dmm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 7ee88a4383d..e2f805d6c55 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -4839,7 +4839,6 @@ "bPc" = (/turf/simulated/wall,/area/hallway/primary/central/sw) "bPd" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/crew_quarters/heads) "bPe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/server) -"bPf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/server) "bPg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/gravitygenerator) "bPh" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/gravitygenerator) "bPi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central/sw) @@ -8378,7 +8377,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbF aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbFnbBRbBRbKnbAebFqbAebAebAebAebAebyvbAfbICbKobngbKpbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbKwbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbKObvvbKPbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbbLbbLbbLcbLbbLdbLdbLebLfbLgbLhbLhbLibLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLAbLBbJVbLCbEXbLDbLDbLDbLEbEXbLFaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbIzbIAbIzbFobLGbLHbAebAebAebLGbAebyvbAfbICbLIbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPbLQbLRbLSbKzbLTbLUbLVbLWbLXbLYbLZbMaaaaaaaaaabHybMbbMcbMdbMdbMebMfbMgbHybMhbMibFXbMjbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbLgbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbMVbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbEXbIxbIxbEXbNcbNdbNebNfbNgbNhbNibLDaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbNjbNkbNjbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbNrbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbNKbNLbFNbNMbMaaaaaaaaaabHybNNbNObNPbNQbMebMfbMgbHybNRbNSbNTbNUbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHbOIbOJbOKbOLbNabOMbONaaaaaaaaabEXbOObOPbOQbORbOSbOTbOUbEXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebPfbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybPibvvbPjbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMbONaaaaaaaaabEXbQebQfbEXbKjbEXbEXbKjbEXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybPibvvbPjbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMbONaaaaaaaaabEXbQebQfbEXbKjbEXbEXbKjbEXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQgaabaaaaaaaaaaaabOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQNbubbQObvvbQPbQQbQRbvvbQSbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRpbLgbRqbMHbMHbMHbRrbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbRFbRGbRHbRIbRJbRKbNabRLbwoaaaaaaaaabEXbEXbEXbEXaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQNbubbSgbShbSibSjbSkbSlbvvbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSFbSGbLgbSHbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUbSVbSWbSXbSYbSZbTabTbbTcbTdbNabOMbwobTeaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaabTfbTgbThbTgbTiaaaaaaaaabOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTIbTJbTKbTsbTLbTMbTNbTObTPbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybUzbNabOMbUAbUBbUAbUCbUDbUCbUCbUCaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From d7f23f4271fa27ce7879cfe8bf36f03b373105fc Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Sep 2015 19:39:09 -0400 Subject: [PATCH 40/69] Oh, that kind of list --- code/_globalvars/lists/objects.dm | 2 +- code/game/objects/items/devices/PDA/cart.dm | 8 ++++---- code/game/objects/items/weapons/mop.dm | 4 ++++ code/game/objects/structures/janicart.dm | 4 ++-- code/game/objects/structures/mop_bucket.dm | 5 +++++ 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 709892ee141..a001c55082f 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -11,7 +11,7 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI var/global/list/flag_list = list() //list of flags during Nations gamemode var/global/list/airlocks = list() //list of all airlocks var/global/list/singularities = list() //list of all singularities -var/global/list/janitorialcarts = list() //list of all singularities +var/global/list/janitorial_equipment = list() //list of janitorial equipment var/global/list/aibots = list() // AI controlled bots var/global/list/table_recipes = list() //list of all table craft recipes diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 0262d1f99a6..670d02af975 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -463,7 +463,7 @@ else JaniData["user_loc"] = list("x" = 0, "y" = 0) var/MopData[0] - for(var/obj/item/weapon/mop/M in world) + for(var/obj/item/weapon/mop/M in janitorial_equipment) var/turf/ml = get_turf(M) if(ml) if(ml.z != cl.z) @@ -476,7 +476,7 @@ var/BucketData[0] - for(var/obj/structure/mopbucket/B in world) + for(var/obj/structure/mopbucket/B in janitorial_equipment) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) @@ -488,7 +488,7 @@ BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CbotData[0] - for(var/obj/machinery/bot/cleanbot/B in world) + for(var/obj/machinery/bot/cleanbot/B in aibots) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) @@ -500,7 +500,7 @@ if(!CbotData.len) CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CartData[0] - for(var/obj/structure/janitorialcart/B in janitorialcarts) + for(var/obj/structure/janitorialcart/B in janitorial_equipment) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 0bceaa54fcf..205ffc6733f 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -19,7 +19,11 @@ /obj/item/weapon/mop/New() create_reagents(mopcap) + janitorial_equipment += src +/obj/item/weapon/mop/Destroy() + janitorial_equipment -= src + return..() /obj/item/weapon/mop/proc/clean(turf/simulated/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1)) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 6972d1eb908..9d8ed7ee3dc 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -232,11 +232,11 @@ /obj/structure/janitorialcart/New() create_reagents(100) - janitorialcarts += src + janitorial_equipment += src /obj/structure/janitorialcart/Destroy() - janitorialcarts -= src + janitorial_equipment -= src return ..() /obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index f14e9ec246d..4988e7d465e 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -11,11 +11,16 @@ var/datum/reagents/R = new/datum/reagents(100) reagents = R R.my_atom = src + janitorial_equipment += src /obj/structure/mopbucket/full/New() ..() reagents.add_reagent("water", 100) +/obj/structure/mopbucket/Destroy() + janitorial_equipment -= src + return ..() + /obj/structure/mopbucket/examine(mob/user) if(..(user, 1)) usr << text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume) From 6b7d8914d989d8d72b4ee3928a4abb0a411c2b0b Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 01:44:18 +0200 Subject: [PATCH 41/69] Admin messaging for proc calls --- code/modules/admin/verbs/debug.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 542a02ee231..8fc24a175cd 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -83,11 +83,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!target) usr << "Error: callproc(): owner of proc no longer exists." return + message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc else //this currently has no hascall protection. wasn't able to get it working. - log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name_admin(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") + log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc usr << "[procname] returned: [returnval ? returnval : "null"]" @@ -115,7 +117,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!A || !IsValidSrc(A)) usr << "Error: callproc_datum(): owner of proc no longer exists." return - log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") + log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") spawn() var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc From f69beaeb00a36291a942d55c93a34ca78c4dd06b Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 03:34:33 +0200 Subject: [PATCH 42/69] Drone fix, runtime fixes --- code/modules/mining/equipment_locker.dm | 8 ++++---- code/modules/mob/living/carbon/human/login.dm | 3 ++- code/modules/reagents/Chemistry-Machinery.dm | 2 ++ code/modules/reagents/reagent_containers.dm | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index e355194ddfc..2fecda8394c 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -656,7 +656,7 @@ return ..() -/mob/living/simple_animal/hostile/mining_drone/death() +/mob/living/simple_animal/hostile/mining_drone/Die() ..() visible_message("[src] is destroyed!") new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) @@ -707,11 +707,11 @@ /mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() var/obj/item/weapon/ore/O for(O in src.loc) - O.loc = src + O.forceMove(src) for(var/dir in alldirs) var/turf/T = get_step(src,dir) for(O in T) - O.loc = src + O.forceMove(src) return /mob/living/simple_animal/hostile/mining_drone/proc/DropOre() @@ -719,7 +719,7 @@ return for(var/obj/item/weapon/ore/O in contents) contents -= O - O.loc = src.loc + O.forceMove(loc) return /mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss() diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index 14372e6c976..28862cf6cfc 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -5,5 +5,6 @@ src << "You can ventcrawl! Use alt+click on vents to quickly travel about the station." update_pipe_vision() update_hud() - ticker.mode.update_all_synd_icons() //This proc only sounds CPU-expensive on paper. It is O(n^2), but the outer for-loop only iterates through syndicates, which are only prsenet in nuke rounds and even when they exist, there's usually 6 of them. + if(ticker && ticker.mode) + ticker.mode.update_all_synd_icons() //This proc only sounds CPU-expensive on paper. It is O(n^2), but the outer for-loop only iterates through syndicates, which are only prsenet in nuke rounds and even when they exist, there's usually 6 of them. return diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 46bb04ee636..78e5ee25fe3 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -591,6 +591,8 @@ if(!condi) var/count = 1 if (href_list["createpatch_multiple"]) count = isgoodnumber(input("Select the number of patches to make.", 10, patchamount) as num) + if(!count || count <= 0) + return if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? var/amount_per_patch = reagents.total_volume/count if (amount_per_patch > 40) amount_per_patch = 40 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index aeda3fcbec3..7f9c3ee3c98 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -63,7 +63,7 @@ /obj/item/weapon/reagent_containers/proc/reagentlist(var/obj/item/weapon/reagent_containers/snack) //Attack logs for regents in pills var/data - if(snack.reagents.reagent_list && snack.reagents.reagent_list.len) //find a reagent list if there is and check if it has entries + if(snack && snack.reagents && snack.reagents.reagent_list && snack.reagents.reagent_list.len) //find a reagent list if there is and check if it has entries for (var/datum/reagent/R in snack.reagents.reagent_list) //no reagents will be left behind data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. return data From dbbdf9067082d95df1a337b2d9d156a7750916fa Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 05:03:19 +0200 Subject: [PATCH 43/69] Add missing c200 cash sprite --- code/game/objects/items/weapons/cash.dm | 2 +- icons/obj/money.dmi | Bin 3920 -> 2230 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm index 4269ddb283d..8aadcc91e92 100644 --- a/code/game/objects/items/weapons/cash.dm +++ b/code/game/objects/items/weapons/cash.dm @@ -77,7 +77,7 @@ var/global/list/moneytypes=list( stack_color = "#663200" /obj/item/weapon/spacecash/c200 - icon_state = "cash100" + icon_state = "cash200" worth = 200 stack_color = "#663200" diff --git a/icons/obj/money.dmi b/icons/obj/money.dmi index c052cb8ea9304ff8519fda89e1e6b84894ce2616..7b8a5e0949508eb4e8d654a9820dc1316f117801 100644 GIT binary patch delta 2205 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 From 444c616d5a16890e55f9d298742e91250efe9faf Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 27 Sep 2015 23:43:41 -0400 Subject: [PATCH 44/69] Ports NT Station's Belt of Holding Sprite --- .../objects/items/weapons/storage/belt.dm | 4 ++-- icons/mob/belt.dmi | Bin 9934 -> 10800 bytes icons/obj/clothing/belts.dmi | Bin 7134 -> 3911 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 5d92705d1ed..f409324844b 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -359,8 +359,8 @@ /obj/item/weapon/storage/belt/bluespace name = "Belt of Holding" desc = "The greatest in pants-supporting technology." - icon_state = "medicalbelt" - item_state = "medical" + icon_state = "holdingbelt" + item_state = "holdingbelt" storage_slots = 14 w_class = 4 max_w_class = 2 diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 75f2ccef8668a1a828a427f34a3d3239aa1f54da..24e7f335be8ea6a54b6da3f3035a445d64caad54 100644 GIT binary patch literal 10800 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 From c004e68ceb872722bfc8cdcc0348698ef89d6d26 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 05:53:51 +0200 Subject: [PATCH 45/69] Re-introduce passive vents, mixer sprite fix --- .../components/unary_devices/passive_vent.dm | 36 ++++++++++++++++++ code/game/machinery/pipe/construction.dm | 19 +++++---- code/game/machinery/pipe/pipe_dispenser.dm | 3 +- icons/obj/pipe-item.dmi | Bin 32351 -> 32653 bytes paradise.dme | 1 + 5 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 code/ATMOSPHERICS/components/unary_devices/passive_vent.dm diff --git a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm new file mode 100644 index 00000000000..632b75c0dc8 --- /dev/null +++ b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm @@ -0,0 +1,36 @@ +/obj/machinery/atmospherics/unary/passive_vent + icon = 'icons/atmos/vent_pump.dmi' + icon_state = "map_vent" + + name = "passive vent" + desc = "A large air vent" + + can_unwrench = 1 + + var/volume = 250 + +/obj/machinery/atmospherics/unary/passive_vent/high_volume + name = "large passive vent" + volume = 1000 + +/obj/machinery/atmospherics/unary/passive_vent/New() + ..() + air_contents.volume = volume + +/obj/machinery/atmospherics/unary/passive_vent/process() + ..() + + if(!node) + return + + var/datum/gas_mixture/removed = air_contents.remove(volume) + loc.assume_air(removed) + air_update_turf() + +/obj/machinery/atmospherics/unary/passive_vent/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node, dir) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index adc87a948bf..9815035311e 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -35,7 +35,8 @@ #define PIPE_INJECTOR 34 #define PIPE_DVALVE 35 #define PIPE_DP_VENT 36 -#define PIPE_DTVALVE 37 +#define PIPE_PASV_VENT 37 +#define PIPE_DTVALVE 38 /obj/item/pipe name = "pipe" @@ -142,6 +143,8 @@ src.pipe_type = PIPE_INJECTOR else if(istype(make_from, /obj/machinery/atmospherics/binary/dp_vent_pump)) src.pipe_type = PIPE_DP_VENT + else if(istype(make_from, /obj/machinery/atmospherics/unary/passive_vent)) + src.pipe_type = PIPE_PASV_VENT else if(istype(make_from, /obj/machinery/atmospherics/omni/mixer)) src.pipe_type = PIPE_OMNI_MIXER @@ -344,7 +347,7 @@ return dir|flip if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT) return dir //dir|acw - if(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_INJECTOR) + if(PIPE_CONNECTOR, PIPE_UVENT, PIPE_PASV_VENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_INJECTOR) return dir if(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER) return dir|flip|cw|acw @@ -428,8 +431,6 @@ user << "There is already a pipe of the same type at this location." return 1 - var/obj/machinery/atmospherics/machineReference = null //If somebody wants to overhaul that switch statement below, be my guest. Easier to set a reference here and then transfer logs after the switch statement. - switch(pipe_type) //What kind of heartless person thought of doing this? if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc ) @@ -574,6 +575,12 @@ if (pipename) P.name = pipename P.construction(dir, pipe_dir, color) + + if(PIPE_PASV_VENT) + var/obj/machinery/atmospherics/unary/passive_vent/P = new(src.loc) + if (pipename) + P.name = pipename + P.construction(dir, pipe_dir, color) if(PIPE_OMNI_MIXER) var/obj/machinery/atmospherics/omni/mixer/P = new(loc) @@ -588,9 +595,6 @@ "[user] fastens the [src].", \ "\blue You have fastened the [src].", \ "You hear ratchet.") - if(machineReference) - transfer_fingerprints_to(machineReference) - machineReference.add_fingerprint(user) qdel(src) // remove the pipe item return @@ -670,4 +674,5 @@ #undef PIPE_INJECTOR #undef PIPE_DVALVE #undef PIPE_DP_VENT +#undef PIPE_PASV_VENT #undef PIPE_DTVALVE diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index df9e1bd291a..0165aaa1d37 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -20,7 +20,7 @@ Pipe Cap
4-Way Manifold
Manual T-Valve
-Digital T-Valve
+Digital T-Valve
Supply pipes:
Pipe
Bent Pipe
@@ -47,6 +47,7 @@ Gas Mixer
Air Injector
Dual-Port Vent Pump
+Passive Vent
Heat exchange:
Pipe
Bent Pipe
diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 1ef48fbad130338fd911a84fafef85898b2d2066..662b67986a3f655f6150afaeaf5b951293d46932 100644 GIT binary patch literal 32653 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 AdqV5AB@$!{)MG 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

%y9K2SNPe%ZjIQ)a)CAIYM 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 G*#83x^gL+* literal 32351 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

e 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

-M4?pJMSljgU6qjzpy-0ijZBBCzuZ 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 aWDoOY3|xctmtf;~L|s`&sa(M<@P7b48yKws diff --git a/paradise.dme b/paradise.dme index bd5f98f365e..9d6f8aaeaf5 100644 --- a/paradise.dme +++ b/paradise.dme @@ -121,6 +121,7 @@ #include "code\ATMOSPHERICS\components\unary_devices\heat_source.dm" #include "code\ATMOSPHERICS\components\unary_devices\outlet_injector.dm" #include "code\ATMOSPHERICS\components\unary_devices\oxygen_generator.dm" +#include "code\ATMOSPHERICS\components\unary_devices\passive_vent.dm" #include "code\ATMOSPHERICS\components\unary_devices\portables_connector.dm" #include "code\ATMOSPHERICS\components\unary_devices\tank.dm" #include "code\ATMOSPHERICS\components\unary_devices\thermal_plate.dm" From 4bcb5d0eb2da4e509d9b472f0bb5a9acebc739a5 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 05:58:00 +0200 Subject: [PATCH 46/69] Add sorting to stickyban list --- code/modules/admin/stickyban.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index ef625d001f2..474b7c76265 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -148,7 +148,7 @@ if(!check_rights(R_BAN)) return - var/list/bans = world.GetConfig("ban") + var/list/bans = sortList(world.GetConfig("ban")) var/banhtml = "" for(var/key in bans) var/ckey = ckey(key) From dc0399802042a28c2c9236cd09ebe1c3456d48ef Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 06:27:51 +0200 Subject: [PATCH 47/69] Fix stacking/unloading machines --- _maps/map_files/cyberiad/cyberiad.dmm | 6 ++--- _maps/map_files/cyberiad/z5.dmm | 36 +++++++++++++-------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 373047bd21f..fe596449bdc 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -699,7 +699,7 @@ "anw" = (/obj/structure/grille,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/shuttle/window,/turf/simulated/floor/plating,/area/shuttle/siberia/station) "anx" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station) "any" = (/obj/machinery/flasher_button{id = "gulagshuttleflasher"; name = "Flash Control"; pixel_x = 0; pixel_y = -26; req_access_txt = "1"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station) -"anz" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30; pixel_y = 30},/obj/machinery/mineral/output,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station) +"anz" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30; pixel_y = 30},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station) "anA" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "labor_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = null; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia/station) "anB" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "labor_dock_north_outer"; locked = 1; name = "Labor Camp Airlock"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/security/prisonershuttle) "anC" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "labor_dock_north_pump"},/turf/simulated/floor/plating,/area/security/prisonershuttle) @@ -754,7 +754,7 @@ "aoz" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/station) "aoA" = (/obj/machinery/door/airlock/external{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia/station) "aoB" = (/turf/simulated/shuttle/wall,/area/shuttle/siberia/station) -"aoC" = (/obj/machinery/mineral/stacking_machine/laborstacker,/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia/station) +"aoC" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia/station) "aoD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle) "aoE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle) "aoF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prisonershuttle) @@ -798,7 +798,7 @@ "apr" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "security_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "13"},/turf/simulated/floor/plating,/area/space) "aps" = (/turf/space,/area/shuttle/syndicate_elite/station) "apt" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia/station) -"apu" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/obj/machinery/mineral/input,/turf/simulated/shuttle/floor,/area/shuttle/siberia/station) +"apu" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia/station) "apv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall/r_wall,/area/security/prisonershuttle) "apw" = (/turf/simulated/wall/r_wall,/area/security/prisonershuttle) "apx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonershuttle) diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 49e39b9f89d..c00a7f8fe50 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -411,9 +411,9 @@ "hU" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/med) "hV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/fire,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/med) "hW" = (/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage) -"hX" = (/obj/machinery/mineral/input,/obj/machinery/camera{c_tag = "Research Outpost Temporary Storage"; dir = 2; network = list("Research Outpost")},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage) +"hX" = (/obj/machinery/camera{c_tag = "Research Outpost Temporary Storage"; dir = 2; network = list("Research Outpost")},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage) "hY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/research_outpost/tempstorage) -"hZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/mineral/output,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage) +"hZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage) "ia" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage) "ib" = (/obj/machinery/camera{c_tag = "Research Outpost Hallway Central"; dir = 4; network = list("Research Outpost")},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) "ic" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) @@ -668,7 +668,7 @@ "mR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor,/area/research_outpost/gearstore) "mS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Expedition Area APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/camera{c_tag = "Research Outpost Expedition Preparation"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor,/area/research_outpost/gearstore) "mT" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/research_outpost/tempstorage) -"mU" = (/obj/machinery/mineral/input,/obj/machinery/conveyor_switch/oneway{id = "anominerals"; pixel_y = 16},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "loadingarea"},/area/research_outpost/tempstorage) +"mU" = (/obj/machinery/conveyor_switch/oneway{id = "anominerals"; pixel_y = 16},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "loadingarea"},/area/research_outpost/tempstorage) "mV" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/research_outpost/maint) "mW" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/plating,/area/research_outpost/maint) "mX" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the isolation room cameras."; layer = 4; name = "Isolation Room Telescreen"; network = list("Anomaly Isolation"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/maint) @@ -703,7 +703,7 @@ "nA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Equipment storage"; req_access_txt = "47"},/turf/simulated/floor,/area/research_outpost/gearstore) "nB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/research_outpost/gearstore) "nC" = (/turf/simulated/floor,/area/research_outpost/gearstore) -"nD" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) +"nD" = (/obj/machinery/mineral/unloading_machine{input_dir = 1; output_dir = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) "nE" = (/obj/machinery/conveyor_switch{id = "anotempload"},/turf/simulated/floor/airless{tag = "icon-asteroidwarning (NORTH)"; icon_state = "asteroidwarning"; dir = 1},/area/research_outpost/maint) "nF" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/airless{tag = "icon-asteroidwarning (NORTH)"; icon_state = "asteroidwarning"; dir = 1},/area/research_outpost/maint) "nG" = (/obj/machinery/conveyor_switch{id = "anosample"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless{tag = "icon-asteroidwarning (NORTH)"; icon_state = "asteroidwarning"; dir = 1},/area/research_outpost/maint) @@ -738,7 +738,7 @@ "oj" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/research_outpost/gearstore) "ok" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/research_outpost/gearstore) "ol" = (/obj/structure/table,/obj/item/weapon/pickaxe,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/weapon/storage/box/excavation,/obj/item/device/ano_scanner,/obj/item/weapon/storage/bag/fossils,/turf/simulated/floor,/area/research_outpost/gearstore) -"om" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) +"om" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) "on" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/explored) "oo" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plating,/area/research_outpost/maint) "op" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/research_outpost/iso1) @@ -945,9 +945,9 @@ "si" = (/obj/machinery/conveyor{dir = 2; id = "gulag"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "sj" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "sk" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) -"sl" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/obj/machinery/mineral/output,/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) -"sm" = (/obj/machinery/mineral/unloading_machine{dir = 1},/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) -"sn" = (/obj/structure/ore_box,/obj/machinery/mineral/input,/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) +"sl" = (/obj/structure/ore_box,/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) +"sm" = (/obj/machinery/mineral/unloading_machine{dir = 1; input_dir = 4; output_dir = 8},/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) +"sn" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 2; id = "gulag"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "so" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/turf/simulated/floor{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/mine/explored) "sp" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "labor_camp_north_outer"; locked = 1; name = "Labor Camp Airlock"; opacity = 1; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "sq" = (/obj/machinery/light/small{dir = 1},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "labor_camp_north_sensor"; pixel_x = -8; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "labor_camp_north_pump"},/obj/machinery/door_control{id = "Labor"; name = "Labor Camp Lockdown"; pixel_x = 0; pixel_y = -28; req_access_txt = "2"},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{id_tag = "labor_camp_north_airlock"; master_tag = "labor_camp_dock"; pixel_y = 30; req_access_txt = "2"; req_one_access_txt = "0"; tag_airpump = "labor_camp_north_pump"; tag_chamber_sensor = "labor_camp_north_sensor"; tag_exterior_door = "labor_camp_north_outer"; tag_interior_door = "labor_camp_north_inner"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) @@ -955,7 +955,7 @@ "ss" = (/obj/machinery/door/poddoor/preopen{id_tag = "Labor"; name = "labor camp blast door"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "labor_camp_north_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/obj/machinery/door/airlock/glass_security{name = "Labor Camp Shuttle Cockpit"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "st" = (/turf/simulated/floor,/area/mine/laborcamp) "su" = (/obj/machinery/mineral/processing_unit_console{machinedir = 6},/turf/simulated/wall,/area/mine/laborcamp) -"sv" = (/obj/structure/plasticflaps,/obj/machinery/conveyor{dir = 2; id = "gulag"},/obj/machinery/mineral/input,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) +"sv" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "sw" = (/obj/machinery/camera{c_tag = "Labor Camp External"; dir = 4; network = list("Labor")},/turf/simulated/floor{dir = 1; icon_state = "asteroidwarning"; tag = "icon-asteroidwarning (NORTH)"},/area/mine/laborcamp) "sx" = (/turf/simulated/floor{dir = 1; icon_state = "asteroidwarning"; tag = "icon-asteroidwarning (NORTH)"},/area/mine/laborcamp) "sy" = (/obj/machinery/conveyor_switch/oneway{id = "gulag"},/turf/simulated/floor{dir = 1; icon_state = "asteroidwarning"; tag = "icon-asteroidwarning (NORTH)"},/area/mine/laborcamp) @@ -970,10 +970,10 @@ "sH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp) "sI" = (/obj/machinery/computer/shuttle_control/labor_camp/one_way,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "sJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=6-Vending"; location = "5-Central"},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) -"sK" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) +"sK" = (/obj/machinery/conveyor{dir = 10; icon_state = "conveyor0"; id = "gulag"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "sL" = (/obj/machinery/mineral/stacking_machine{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) -"sM" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/obj/machinery/mineral/input,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) -"sN" = (/obj/machinery/conveyor{dir = 10; icon_state = "conveyor0"; id = "gulag"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) +"sM" = (/obj/machinery/mineral/unloading_machine{input_dir = 4; output_dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/west_outpost) +"sN" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/mine/west_outpost) "sO" = (/obj/structure/closet/crate,/turf/simulated/floor{icon_state = "asteroidfloor"},/area/mine/laborcamp) "sP" = (/obj/item/stack/sheet/metal{amount = 5},/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "asteroidfloor"},/area/mine/laborcamp) "sQ" = (/turf/simulated/wall/r_wall,/area/mine/laborcamp/security) @@ -1257,6 +1257,7 @@ "yi" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/item/device/gps/mining{gpstag = "MINE2"},/obj/item/device/gps/mining{gpstag = "MINE1"},/obj/item/device/gps/mining,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -3},/turf/simulated/floor,/area/mine/eva) "yj" = (/turf/simulated/floor,/area/mine/eva) "yk" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/eva) +"yl" = (/obj/machinery/conveyor{dir = 4; id = "mining_west"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/west_outpost) "ym" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/eva) "yn" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/mine/eva) "yo" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/eva) @@ -1268,9 +1269,6 @@ "yu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/mine/west_outpost) "yv" = (/obj/machinery/light_switch{pixel_x = 6; pixel_y = -23},/turf/simulated/floor,/area/mine/west_outpost) "yw" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/mine/west_outpost) -"yx" = (/obj/machinery/mineral/input,/turf/simulated/floor{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/mine/west_outpost) -"yy" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/west_outpost) -"yz" = (/obj/machinery/conveyor{dir = 4; id = "mining_west"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/west_outpost) "yA" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/west_outpost) "yB" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/west_outpost) "yC" = (/obj/structure/toilet{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "showroomfloor"},/area/mine/living_quarters) @@ -1600,10 +1598,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaqUrBrCrdrDrfrerErFrfrGrdrHrIrIrqrJrqrtrtqQqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaabkbkbkaaaaaaafafafpepepepepeafafaeaeaeaeqKaerKntafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaarLrLagagagagagqUrMrNrOrPrQrRrfrDrfrfrSrIrIrqrqrqrqrTrtqQqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaaaaaaafafafpepepepepeafafafaeaeaeqKaeaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbkacaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUqUrVrWrXrYrQrZrfrDsarfrdsbscscrqrqrrrrrtrtqQqQqQbkqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacaaaaaaaaaaaaaaaaaaaaafafpepepepepeafafafaeaesdqBqCaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbkacaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUseqUrdrdrdsfrfsgrQshrusisjskslsmsnrqrrrrsortqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaaaaaaafafpepepepepeafafafaeaeqxqGqzaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUspsqsrssstrfrDrfrfsusvrdswsxsyrqrqrrrrrrrtszqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaaaaaaaaaaaaaaafafafpepepepepeafafaeaeaeqKaeaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbkacaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUseqUrdrdrdsfrfsgrQshrusisjsksksmslrqrrrrsortqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaaaaaaafafpepepepepeafafafaeaeqxqGqzaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUspsqsrssstrfrDrfrfsusnrdswsxsyrqrqrrrrrrrtszqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaaaaaaaaaaaaaaafafafpepepepepeafafaeaeaeqKaeaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbkacaaaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUqUqUqUsAsBrfrDrusCrdsDrdrIsErIrrrrrrrrsFrdqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaaaaaactaaaaafafafpepepepepeafafaeaeaeqKaeaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacctacacaaaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUsGsHsHsIrfrfsJsKsLsMsNrdsOsPrrrrrrrrrTrtrtqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaaaabkctctaaaaafafpepepepepeafafaeaeaeqKaeaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacctacacaaaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUsGsHsHsIrfrfsJsvsLsvsKrdsOsPrrrrrrrrrTrtrtqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaaaabkctctaaaaafafpepepepepeafafaeaeaeqKaeaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUsQsQsQsRsSsTsUsVsVsVrdsVsVsWrrrrrrrrrTrtqQqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaabkbkctaaaaaaafafafafafpeafafafaeaeqKaeafafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagrUrUrUrUrUsXsYsZtatbtctdtetftgthtitjtkrIrrrrrrrtrtqQqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacaaaaaaaaaaaaaaaaaaaaafafafpeafafafaeaeqKaeafafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaagrUrUrUrUtlsQsVsVsUtmsUsVsVtntotpsVsVtqrIrrrrrtrtqQqQqQqQqQqQqQbkbkbkbkbkbkbkbkbkbkbkbkbkbkctbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacaaaaaaaaaaaaaaaaaaaaaaafafpeafafafaeaeqKaeaeafafpepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepepeafafafafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1689,7 +1687,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaewtxbxcxdwHxcxexcxcxfxgxhwPxixjaeaeaeaeaeafafafacacacacacacacbkbkbkbkbkbkbkbkbkbkbkbkacacafafntaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacvNxkwRxlxmxnxovNvNvNvNvTvNwVxpxpxpxqweaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaewYxrxsxsxtwZaexuaeaeaeofntafafafpepepepepepepepepepeafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaewtxvxcxcxwxcxexxxcxcwHxyxzwHqzaeaeaeaeaeaeaeafafafafacacacacacacbkbkbkbkbkbkbkbkbkacacafafaewfaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacvNxAxBxCwRxDxExFxqxGxHxIvNxJxpxKxLxMweaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaexNxNxOxOwYxPxQxRxSwZwZwZwZaeaeaeaeafafafafpepepepepepepepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaewtxTxcxUwNxVxWxXxcwtwtwtwtwtwvsdqCaeaeaeaeaeaeaeaeafafafacacacacacbkbkbkbkbkbkbkacacacafaeaeaeaeaeaeaeaeaeaeaesdqCaeaeaeaeaeaeaeaeaeafafacacxYvNvNvNxZvNvNyaybycyaybvNvNvNvNvNydvNvNweweaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexOxOyeyfygyhyiyjyjykyoymynyoqCaeaeaenuafafafpepepepepepepeafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtypyqyrwHysytyuyvywyxyyyzyAyBujukrArArArArAqTaeaeaeaeafafafacacacacacbkbkbkacacacacafafaeaeuhrArArArArArArArAujukrArArArAqTaeaeaeaeaeafacacacacacxZyCyDyExpxMyFxqxMxFyGyHyIxqxMxpyJyKweweweyLyMyMyMyMyMyMyMyNyNyNyNyNyNyNxOxOxOyOyfyPyQyRySyjyjyTyUyVyWyXyYaeaeaenuafafafpepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtypyqyrwHysytyuyvywsNsMylyAyBujukrArArArArAqTaeaeaeaeafafafacacacacacbkbkbkacacacacafafaeaeuhrArArArArArArArAujukrArArArAqTaeaeaeaeaeafacacacacacxZyCyDyExpxMyFxqxMxFyGyHyIxqxMxpyJyKweweweyLyMyMyMyMyMyMyMyNyNyNyNyNyNyNxOxOxOyOyfyPyQyRySyjyjyTyUyVyWyXyYaeaeaenuafafafpepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtwtwtwtwtyZzazbwtwtzcwtwtwtwtqxqzaeaeaeaeaeqKaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqKaeaeaeaeaeaeaeaeqxqzaeaeaeaeqKaeaeaeaeaeafafntafafacvNvNvNvNxpxMzdzezfxHzgzhzhzizizjzhzkzlzhzlzmzmzmzmzmzmzmzmznznznznznznznzozpzozqzpzrzsztzuzvzwzxyozyzzyoqzaeaeaeaeafafafafpepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIzMzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNAjyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From ef6aeeb7d42e86bceecc23d609b25d46802f7aed Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 06:47:54 +0200 Subject: [PATCH 48/69] Fix mixer underlay --- code/ATMOSPHERICS/components/trinary_devices/mixer.dm | 5 +---- code/ATMOSPHERICS/components/trinary_devices/tvalve.dm | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index cd219cd6f4e..5d33e3cb605 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -37,10 +37,7 @@ if(!istype(T)) return - if(flipped) - add_underlay(T, node1, turn(dir, -90)) - else - add_underlay(T, node1, turn(dir, -180)) + add_underlay(T, node1, turn(dir, -180)) if(flipped) add_underlay(T, node2, turn(dir, 90)) diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index 7e91c931f16..f95396086b7 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -40,6 +40,7 @@ var/turf/T = get_turf(src) if(!istype(T)) return + add_underlay(T, node1, turn(dir, -180)) if(flipped) From 3397ddf7c1dd671d33e0f886cd8536c7e2fb6578 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 07:41:24 +0200 Subject: [PATCH 49/69] Fix inflatable walls --- code/game/objects/structures/inflatable.dm | 404 ++++++++++----------- 1 file changed, 200 insertions(+), 204 deletions(-) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 14b51d03498..17978724c34 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -5,13 +5,13 @@ icon_state = "folded_wall" w_class = 3.0 - attack_self(mob/user) - playsound(loc, 'sound/items/zip.ogg', 75, 1) - user << "\blue You inflate [src]." - var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) - src.transfer_fingerprints_to(R) - R.add_fingerprint(user) - qdel(src) +/obj/item/inflatable/attack_self(mob/user) + playsound(loc, 'sound/items/zip.ogg', 75, 1) + user << "\blue You inflate [src]." + var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) + src.transfer_fingerprints_to(R) + R.add_fingerprint(user) + qdel(src) /obj/structure/inflatable name = "inflatable wall" @@ -25,131 +25,130 @@ var/health = 50.0 +/obj/structure/inflatable/New(location) + ..() + air_update_turf(1) - New(location) - ..() - air_update_turf() +/obj/structure/inflatable/Destroy() + air_update_turf(1) + return ..() - Destroy() - air_update_turf() - return ..() +/obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + return 0 + +/obj/structure/inflatable/CanAtmosPass(turf/T) + return !density - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return 0 +/obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + if(health <= 0) + deflate(1) + return - bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - if(health <= 0) +/obj/structure/inflatable/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) deflate(1) - return - - - ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) + return + if(3.0) + if(prob(50)) deflate(1) return - if(3.0) - if(prob(50)) - deflate(1) - return +/obj/structure/inflatable/blob_act() + deflate(1) - blob_act() +/obj/structure/inflatable/attack_hand(mob/user as mob) + add_fingerprint(user) + return + +/obj/structure/inflatable/proc/attack_generic(mob/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime + health -= damage + if(health <= 0) + user.visible_message("[user] tears open [src]!") + deflate(1) + else //for nicer text~ + user.visible_message("[user] tears at [src]!") + +/obj/structure/inflatable/attack_alien(mob/user as mob) + if(islarva(user)) + return + attack_generic(user, 15) + +/obj/structure/inflatable/attack_animal(mob/user as mob) + if(!isanimal(user)) + return + var/mob/living/simple_animal/M = user + if(M.melee_damage_upper <= 0) + return + attack_generic(M, M.melee_damage_upper) + +/obj/structure/inflatable/attack_slime(mob/user as mob) + var/mob/living/carbon/slime/S = user + if (!S.is_adult) + return + attack_generic(user, rand(10, 15)) + +/obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(!istype(W)) + return + if (can_puncture(W)) + visible_message("\red [user] pierces [src] with [W]!") + deflate(1) + if(W.damtype == BRUTE || W.damtype == BURN) + hit(W.force) + ..() + return + +/obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = 1) + health = max(0, health - damage) + if(sound_effect) + playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + if(health <= 0) deflate(1) - attack_hand(mob/user as mob) - add_fingerprint(user) - return - - - proc/attack_generic(mob/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime - health -= damage - if(health <= 0) - user.visible_message("[user] tears open [src]!") - deflate(1) - else //for nicer text~ - user.visible_message("[user] tears at [src]!") - - attack_alien(mob/user as mob) - if(islarva(user)) return - attack_generic(user, 15) - - attack_animal(mob/user as mob) - if(!isanimal(user)) return - var/mob/living/simple_animal/M = user - if(M.melee_damage_upper <= 0) return - attack_generic(M, M.melee_damage_upper) - - - attack_slime(mob/user as mob) - var/mob/living/carbon/slime/S = user - if (!S.is_adult) - return - attack_generic(user, rand(10, 15)) - - - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(!istype(W)) return - - if (can_puncture(W)) - visible_message("\red [user] pierces [src] with [W]!") - deflate(1) - if(W.damtype == BRUTE || W.damtype == BURN) - hit(W.force) - ..() - return - - proc/hit(var/damage, var/sound_effect = 1) - health = max(0, health - damage) - if(sound_effect) - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) - if(health <= 0) - deflate(1) - - - proc/deflate(var/violent=0) - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) - if(violent) - visible_message("[src] rapidly deflates!") - var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) +/obj/structure/inflatable/proc/deflate(var/violent=0) + playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + if(violent) + visible_message("[src] rapidly deflates!") + var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) + src.transfer_fingerprints_to(R) + qdel(src) + else + //user << "\blue You slowly deflate the inflatable wall." + visible_message("[src] slowly deflates.") + spawn(50) + var/obj/item/inflatable/R = new /obj/item/inflatable(loc) src.transfer_fingerprints_to(R) qdel(src) - else - //user << "\blue You slowly deflate the inflatable wall." - visible_message("[src] slowly deflates.") - spawn(50) - var/obj/item/inflatable/R = new /obj/item/inflatable(loc) - src.transfer_fingerprints_to(R) - qdel(src) - verb/hand_deflate() - set name = "Deflate" - set category = "Object" - set src in oview(1) +/obj/structure/inflatable/verb/hand_deflate() + set name = "Deflate" + set category = "Object" + set src in oview(1) - if(isobserver(usr)) //to stop ghosts from deflating - return + if(usr.stat || usr.restrained()) + return - deflate() + deflate() -/obj/item/inflatable/door/ +/obj/item/inflatable/door name = "inflatable door" desc = "A folded membrane which rapidly expands into a simple door on activation." icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door" - attack_self(mob/user) - playsound(loc, 'sound/items/zip.ogg', 75, 1) - user << "\blue You inflate [src]." - var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) - src.transfer_fingerprints_to(R) - R.add_fingerprint(user) - qdel(src) +/obj/item/inflatable/door/attack_self(mob/user) + playsound(loc, 'sound/items/zip.ogg', 75, 1) + user << "\blue You inflate [src]." + var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) + src.transfer_fingerprints_to(R) + R.add_fingerprint(user) + qdel(src) /obj/structure/inflatable/door //Based on mineral door code name = "inflatable door" @@ -163,94 +162,91 @@ var/state = 0 //closed, 1 == open var/isSwitchingStates = 0 - //Bumped(atom/user) - // ..() - // if(!state) - // return TryToSwitchState(user) - // return +/obj/structure/inflatable/door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral + if(isAI(user)) //so the AI can't open it + return + else if(isrobot(user)) //but cyborgs can + if(get_dist(user,src) <= 1) //not remotely though + return TryToSwitchState(user) - attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral - if(isAI(user)) //so the AI can't open it - return - else if(isrobot(user)) //but cyborgs can - if(get_dist(user,src) <= 1) //not remotely though - return TryToSwitchState(user) +/obj/structure/inflatable/door/attack_hand(mob/user as mob) + return TryToSwitchState(user) - attack_hand(mob/user as mob) - return TryToSwitchState(user) +/obj/structure/inflatable/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) + return state + if(istype(mover, /obj/effect/beam)) + return !opacity + return !density + +/obj/structure/inflatable/door/CanAtmosPass(turf/T) + return !density - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) - return state - if(istype(mover, /obj/effect/beam)) - return !opacity - return !density - - proc/TryToSwitchState(atom/user) - if(isSwitchingStates) return - if(ismob(user)) - var/mob/M = user - if(world.time - user.last_bumped <= 60) return //NOTE do we really need that? - if(M.client) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!C.handcuffed) - SwitchState() - else +/obj/structure/inflatable/door/proc/TryToSwitchState(atom/user) + if(isSwitchingStates) + return + if(ismob(user)) + var/mob/M = user + if(world.time - user.last_bumped <= 60) + return //NOTE do we really need that? + if(M.client) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!C.handcuffed) SwitchState() - else if(istype(user, /obj/mecha)) - SwitchState() + else + SwitchState() + else if(istype(user, /obj/mecha)) + SwitchState() - proc/SwitchState() - if(state) - Close() - else - Open() - air_update_turf() - - proc/Open() - isSwitchingStates = 1 - //playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1) - flick("door_opening",src) - sleep(10) - density = 0 - opacity = 0 - state = 1 - update_icon() - isSwitchingStates = 0 - - proc/Close() - isSwitchingStates = 1 - //playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1) - flick("door_closing",src) - sleep(10) - density = 1 - opacity = 0 - state = 0 - update_icon() - isSwitchingStates = 0 +/obj/structure/inflatable/door/proc/SwitchState() + if(state) + Close() + else + Open() + air_update_turf(1) +/obj/structure/inflatable/door/proc/Open() + isSwitchingStates = 1 + //playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1) + flick("door_opening",src) + sleep(10) + density = 0 + opacity = 0 + state = 1 update_icon() - if(state) - icon_state = "door_open" - else - icon_state = "door_closed" + isSwitchingStates = 0 - deflate(var/violent=0) - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) - if(violent) - visible_message("[src] rapidly deflates!") - var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) - src.transfer_fingerprints_to(R) - qdel(src) - else - //user << "\blue You slowly deflate the inflatable wall." - visible_message("[src] slowly deflates.") - spawn(50) - var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) - src.transfer_fingerprints_to(R) - qdel(src) +/obj/structure/inflatable/door/proc/Close() + isSwitchingStates = 1 + //playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1) + flick("door_closing",src) + sleep(10) + density = 1 + opacity = 0 + state = 0 + update_icon() + isSwitchingStates = 0 +/obj/structure/inflatable/door/update_icon() + if(state) + icon_state = "door_open" + else + icon_state = "door_closed" + +/obj/structure/inflatable/door/deflate(var/violent=0) + playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + if(violent) + visible_message("[src] rapidly deflates!") + var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) + else + visible_message("[src] slowly deflates.") + spawn(50) + var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) + + src.transfer_fingerprints_to(R) + air_update_turf(1) + qdel(src) /obj/item/inflatable/torn name = "torn inflatable wall" @@ -258,9 +254,9 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall_torn" - attack_self(mob/user) - user << "\blue The inflatable wall is too torn to be inflated!" - add_fingerprint(user) +/obj/item/inflatable/torn/attack_self(mob/user) + user << "The inflatable wall is too torn to be inflated!" + add_fingerprint(user) /obj/item/inflatable/door/torn name = "torn inflatable door" @@ -268,9 +264,9 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door_torn" - attack_self(mob/user) - user << "\blue The inflatable door is too torn to be inflated!" - add_fingerprint(user) +/obj/item/inflatable/door/torn/attack_self(mob/user) + user << "The inflatable door is too torn to be inflated!" + add_fingerprint(user) /obj/item/weapon/storage/briefcase/inflatable name = "inflatable barrier box" @@ -280,12 +276,12 @@ max_combined_w_class = 21 w_class = 3 - New() - ..() - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) \ No newline at end of file +/obj/item/weapon/storage/briefcase/inflatable/New() + ..() + new /obj/item/inflatable/door(src) + new /obj/item/inflatable/door(src) + new /obj/item/inflatable/door(src) + new /obj/item/inflatable(src) + new /obj/item/inflatable(src) + new /obj/item/inflatable(src) + new /obj/item/inflatable(src) From 699bbd0972cdbc265fc628b4246a429511489d7c Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 07:46:30 +0200 Subject: [PATCH 50/69] Compile --- code/game/objects/structures/inflatable.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 17978724c34..a23ba5ac92e 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -239,12 +239,13 @@ if(violent) visible_message("[src] rapidly deflates!") var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) + src.transfer_fingerprints_to(R) else visible_message("[src] slowly deflates.") spawn(50) var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) - - src.transfer_fingerprints_to(R) + src.transfer_fingerprints_to(R) + air_update_turf(1) qdel(src) From c5e5b3d9ab5b506a7231638b6e3a140fc476f3f8 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 08:49:12 +0200 Subject: [PATCH 51/69] Fix passive vent icon sprite, hopefully fix tvalves --- .../components/trinary_devices/tvalve.dm | 2 +- code/ATMOSPHERICS/datum_pipeline.dm | 15 ++------------- icons/obj/pipe-item.dmi | Bin 32653 -> 32639 bytes 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index f95396086b7..16df97b6ea6 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -66,7 +66,7 @@ parent1.update = 0 parent2.update = 0 parent3.update = 0 - parent3.reconcile_air() + parent1.reconcile_air() investigate_log("was set to side by [usr ? key_name(usr) : "a remote signal"]", "atmos") return 1 diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 0a95353fff3..30908f68900 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -30,17 +30,6 @@ var/global/list/datum/pipeline/pipe_networks = list() update = 0 reconcile_air() return - /* - //Check to see if pressure is within acceptable limits - var/pressure = air.return_pressure() - if(pressure > alert_pressure) - for(var/obj/machinery/atmospherics/pipe/member in members) - if(!member.check_pressure(pressure)) - break //Only delete 1 pipe per process - //Allow for reactions - //air.react() //Should be handled by pipe_network now - */ - var/pipenetwarnings = 10 @@ -231,10 +220,10 @@ var/pipenetwarnings = 10 PL |= V.parent2 for(var/obj/machinery/atmospherics/trinary/tvalve/T in P.other_atmosmch) if(!T.state) - PL |= T.parent3 PL |= T.parent1 - else PL |= T.parent3 + else + PL |= T.parent1 PL |= T.parent2 for(var/obj/machinery/atmospherics/unary/portables_connector/C in P.other_atmosmch) if(C.connected_device) diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 662b67986a3f655f6150afaeaf5b951293d46932..34fedaa560f84461ed7e005ea1e560472cc98208 100644 GIT binary patch delta 31084 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 A>;M1& delta 31072 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%0DVt7BwFiZ^O&`|2B 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 From 2c7d6f1a1b6ba2af08f7345d8d59ce6a58de44c6 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 18:25:50 +0200 Subject: [PATCH 52/69] Law manager now only requires the host to be conscious --- code/modules/mob/living/silicon/subsystems.dm | 2 +- code/modules/nano/interaction/conscious.dm | 7 +++++++ paradise.dme | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 code/modules/nano/interaction/conscious.dm diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index 9a1c713ab72..fa3dcfd2cfa 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -81,7 +81,7 @@ set name = "Law Manager" set category = "Subsystems" - law_manager.ui_interact(usr, state = self_state) + law_manager.ui_interact(usr, state = conscious_state) /******************** * Power Monitor * diff --git a/code/modules/nano/interaction/conscious.dm b/code/modules/nano/interaction/conscious.dm new file mode 100644 index 00000000000..143bc24956f --- /dev/null +++ b/code/modules/nano/interaction/conscious.dm @@ -0,0 +1,7 @@ +/* + This state only checks if user is conscious. +*/ +/var/global/datum/topic_state/conscious_state/conscious_state = new() + +/datum/topic_state/conscious_state/can_use_topic(var/src_object, var/mob/user) + return user.stat == CONSCIOUS ? STATUS_INTERACTIVE : STATUS_CLOSE diff --git a/paradise.dme b/paradise.dme index 9d6f8aaeaf5..ba808273341 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1497,6 +1497,7 @@ #include "code\modules\nano\nanoui.dm" #include "code\modules\nano\interaction\admin.dm" #include "code\modules\nano\interaction\base.dm" +#include "code\modules\nano\interaction\conscious.dm" #include "code\modules\nano\interaction\contained.dm" #include "code\modules\nano\interaction\default.dm" #include "code\modules\nano\interaction\inventory.dm" From 52b700f8c8595c0fc8b83e9e0e2832d51053ffae Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 18:45:57 +0200 Subject: [PATCH 53/69] Proper sprite/sounds for electric arm --- code/game/objects/items/robot/robot_items.dm | 64 ++++++++----------- icons/obj/items.dmi | Bin 98776 -> 99909 bytes 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 3d496ca3b86..894f51fee69 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -1,35 +1,30 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /********************************************************************** Cyborg Spec Items ***********************************************************************/ //Might want to move this into several files later but for now it works here /obj/item/borg/stun - name = "Electrified Arm" - icon = 'icons/obj/decals.dmi' - icon_state = "shock" + name = "electrified arm" + icon = 'icons/obj/items.dmi' + icon_state = "elecarm" + +/obj/item/borg/stun/attack(mob/M, mob/living/silicon/robot/user) + user.cell.charge -= 30 - attack(mob/M as mob, mob/living/silicon/robot/user as mob) - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [key_name(user)]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [key_name(M)]") - if(M.ckey) - msg_admin_attack("[key_name_admin(user)] used the [src.name] to attack [key_name_admin(M)]") + M.Weaken(5) + if (M.stuttering < 5) + M.stuttering = 5 + M.Stun(5) - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user + M.visible_message("[user] has prodded [M] with [src]!", \ + "[user] has prodded you with [src].") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + if(!iscarbon(user)) + M.LAssailant = null + else + M.LAssailant = user - user.cell.charge -= 30 - - M.Weaken(5) - if (M.stuttering < 5) - M.stuttering = 5 - M.Stun(5) - - for(var/mob/O in viewers(M, null)) - if (O.client) - O.show_message("\red [user] has prodded [M] with an electrically-charged arm!", 1, "\red You hear someone fall", 2) + add_logs(M, user, "stunned", src, "(INTENT: [uppertext(user.a_intent)])") /obj/item/borg/overdrive name = "Overdrive" @@ -44,19 +39,16 @@ icon_state = "securearea" var/sight_mode = null - /obj/item/borg/sight/xray name = "X-ray Vision" sight_mode = BORGXRAY - /obj/item/borg/sight/thermal name = "Thermal Vision" sight_mode = BORGTHERM icon_state = "thermal" icon = 'icons/obj/clothing/glasses.dmi' - /obj/item/borg/sight/meson name = "Meson Vision" sight_mode = BORGMESON @@ -67,24 +59,22 @@ name = "Hud" var/obj/item/clothing/glasses/hud/hud = null - /obj/item/borg/sight/hud/med name = "medical hud" icon_state = "healthhud" icon = 'icons/obj/clothing/glasses.dmi' - New() - ..() - hud = new /obj/item/clothing/glasses/hud/health(src) - return - +/obj/item/borg/sight/hud/med/New() + ..() + hud = new /obj/item/clothing/glasses/hud/health(src) + return /obj/item/borg/sight/hud/sec name = "security hud" icon_state = "securityhud" icon = 'icons/obj/clothing/glasses.dmi' - New() - ..() - hud = new /obj/item/clothing/glasses/hud/security(src) - return +/obj/item/borg/sight/hud/sec/New() + ..() + hud = new /obj/item/clothing/glasses/hud/security(src) + return diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 826c5ea1f4f360e388f43a2763ea3aecacac3896..dd6cf13fc1e91a4ed78b5e6fd8fb1579df555770 100644 GIT binary patch delta 22210 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 Date: Mon, 28 Sep 2015 18:47:29 +0200 Subject: [PATCH 54/69] Attack animation --- code/game/objects/items/robot/robot_items.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 894f51fee69..b0345b217a2 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -10,6 +10,7 @@ /obj/item/borg/stun/attack(mob/M, mob/living/silicon/robot/user) user.cell.charge -= 30 + user.do_attack_animation(M) M.Weaken(5) if (M.stuttering < 5) M.stuttering = 5 From 2f148fd429c7e3ac1b8ac93cc1a308736db9a838 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 19:04:22 +0200 Subject: [PATCH 55/69] Cell update --- code/game/objects/items/robot/robot_items.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index b0345b217a2..0342dec3840 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -6,9 +6,14 @@ name = "electrified arm" icon = 'icons/obj/items.dmi' icon_state = "elecarm" + var/charge_cost = 30 /obj/item/borg/stun/attack(mob/M, mob/living/silicon/robot/user) - user.cell.charge -= 30 + var/mob/living/silicon/robot/R = user + if(R && R.cell && R.cell.charge > 0) + R.cell.use(charge_cost) + else + return user.do_attack_animation(M) M.Weaken(5) From 7c6475895c9631ccff51b64475dbf216045c51ac Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Mon, 28 Sep 2015 11:26:02 -0700 Subject: [PATCH 56/69] Beakers now follow a drop check before being put in the sleeper Cyborgs no longer will be able to do weird things with their nodrop beakers in the sleeper. This might need some sort of replacement for this functionality, but this seems hardly functional as it is. --- code/game/machinery/Sleeper.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index eafbb40fa19..adc4542cfd4 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -300,11 +300,11 @@ if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(!beaker) beaker = G - user.drop_item() - G.loc = src - user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") - src.updateUsrDialog() - return + if (user.drop_item()) + G.loc = src + user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") + src.updateUsrDialog() + return else user << "\red The sleeper has a beaker already." return @@ -611,4 +611,4 @@ qdel(O) src.add_fingerprint(usr) return - return \ No newline at end of file + return From 8e37513502488cf91b606be7f7d3456c1a50e3fb Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 20:39:30 +0200 Subject: [PATCH 57/69] Make sure all departments can still sync with R&D --- code/modules/research/server.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index e55ff44e5ed..a520fe6ec92 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -344,6 +344,6 @@ /obj/machinery/r_n_d/server/robotics name = "Robotics and Mechanic R&D Server" - id_with_upload_string = "2;4" - id_with_download_string = "2;4" + id_with_upload_string = "1;2;4" + id_with_download_string = "1;2;4" server_id = 2 From ffa7e01ba2b7bec35c006eb0082b10477ba66c61 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 28 Sep 2015 21:02:42 +0200 Subject: [PATCH 58/69] Space levels config --- config/example/space_levels.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 config/example/space_levels.txt diff --git a/config/example/space_levels.txt b/config/example/space_levels.txt new file mode 100644 index 00000000000..e724264daac --- /dev/null +++ b/config/example/space_levels.txt @@ -0,0 +1,15 @@ +Main Station;1;linked + +Central Command;2;unlinked + +Telecommunications Satellite;3;linked + +Engineering Outpost;4;linked + +Mining Asteroid;5;linked + +Derelicted Station;6;linked + +Empty Area;7;linked + +Syndicate Station;8;unlinked \ No newline at end of file From ec2b31e4358a6c750f0b93c79781887dd2286d36 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 28 Sep 2015 12:59:44 -0700 Subject: [PATCH 59/69] Nuke wheelchair snowflake shit, fix the delay --- code/game/machinery/doors/door.dm | 8 - .../effects/decals/Cleanable/humans.dm | 3 - .../stool_bed_chair_nest/wheelchair.dm | 183 ++++-------------- .../mob/living/carbon/human/human_movement.dm | 12 +- 4 files changed, 37 insertions(+), 169 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 680f9317bfd..a9559ea01f6 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -83,14 +83,6 @@ else flick("door_deny", src) return - if(istype(AM, /obj/structure/stool/bed/chair/wheelchair)) - var/obj/structure/stool/bed/chair/wheelchair/wheel = AM - if(density) - if(wheel.pulling && (src.allowed(wheel.pulling))) - open() - else - flick("door_deny", src) - return return diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 859834960ff..076e85c6de0 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -74,9 +74,6 @@ var/global/list/image/splatter_cache=list() if(!perp.feet_blood_DNA) perp.feet_blood_DNA = list() perp.feet_blood_DNA |= blood_DNA.Copy() - else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair)) - var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled - W.bloodiness = 4 perp.update_inv_shoes(1) amount-- diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 03d74cee94e..51424aeb26e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -5,10 +5,7 @@ anchored = 0 movable = 1 - var/driving = 0 - var/mob/living/pulling = null - var/bloodiness - + var/move_delay = null /obj/structure/stool/bed/chair/wheelchair/handle_rotation() overlays = null @@ -18,139 +15,57 @@ buckled_mob.dir = dir /obj/structure/stool/bed/chair/wheelchair/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained()) - if(user==pulling) - pulling = null - user.pulledby = null - user << "\red You lost your grip!" - return - if(user.pulling && (user == pulling)) - pulling = null - user.pulledby = null - return if(propelled) - return - if(pulling && (get_dist(src, pulling) > 1)) - pulling = null - user.pulledby = null - if(user==pulling) - return - if(pulling && (get_dir(src.loc, pulling.loc) == direction)) - user << "\red You cannot go there." - return - if(pulling && buckled_mob && (buckled_mob == user)) - user << "\red You cannot drive while being pushed." + return 0 + + if(!Process_Spacemove(direction) || !has_gravity(src.loc) || !isturf(loc)) + return 0 + + if(world.time < move_delay) return - if(istype(user.loc, /turf/space)) - return + move_delay = world.time + move_delay += 2 //wheelchairs are not infact sport bikes - if(ishuman(user)) - var/mob/living/carbon/human/driver = user - var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") - var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") - if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) - return // No hands to drive your chair? Tough luck! - - // Let's roll - driving = 1 - var/turf/T = null - //--1---Move occupant---1--// if(buckled_mob) - buckled_mob.buckled = null - step(buckled_mob, direction) - buckled_mob.buckled = src - //--2----Move driver----2--// - if(pulling) - T = pulling.loc - if(get_dist(src, pulling) >= 1) - step(pulling, get_dir(pulling.loc, src.loc)) - //--3--Move wheelchair--3--// - step(src, direction) - if(buckled_mob) // Make sure it stays beneath the occupant - Move(buckled_mob.loc) - dir = direction - handle_rotation() - if(pulling) // Driver - if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert! - pulling.forceMove(T) - else - spawn(0) - if(get_dist(src, pulling) > 1) // We are too far away? Losing control. - pulling = null - user.pulledby = null - pulling.dir = get_dir(pulling, src) // When everything is right, face the wheelchair - if(bloodiness) - create_track() - driving = 0 + if(buckled_mob.incapacitated()) + return 0 -/obj/structure/stool/bed/chair/wheelchair/Move() - ..() - if(buckled_mob) - var/mob/living/occupant = buckled_mob - if(!driving) - occupant.buckled = null - occupant.Move(src.loc) - occupant.buckled = src - if (occupant && (src.loc != occupant.loc)) - if (propelled) - for (var/mob/O in src.loc) - if (O != occupant) - Bump(O) - else - unbuckle_mob() - if (pulling && (get_dist(src, pulling) > 1)) - pulling.pulledby = null - pulling << "\red You lost your grip!" - pulling = null - else - if (occupant && (src.loc != occupant.loc)) - forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving - handle_rotation() + if(ishuman(buckled_mob)) + var/mob/living/carbon/human/driver = user + var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") + var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") + if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) + return 0 // No hands to drive your chair? Tough luck! -/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob) - if (pulling) - MouseDrop(usr) - else - user_unbuckle_mob(user, user) - return + for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm")) + var/obj/item/organ/external/E = driver.get_organ(organ_name) + if(!E || (E.status & ORGAN_DESTROYED)) + move_delay += 4 + else if(E.status & ORGAN_SPLINTED) + move_delay += 0.5 + else if(E.status & ORGAN_BROKEN) + move_delay += 1.5 + + if(!buckled_mob.Move(get_step(buckled_mob, direction), direction)) + loc = buckled_mob.loc //we gotta go back + last_move = buckled_mob.last_move + inertia_dir = last_move + buckled_mob.inertia_dir = last_move + . = 0 -/obj/structure/stool/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) - ..() - if(over_object == usr && in_range(src, usr)) - if(!ishuman(usr)) return - if(usr == buckled_mob) - usr << "\red You realize you are unable to push the wheelchair you sit in." - return - if(!pulling) - pulling = usr - usr.pulledby = src - if(usr.pulling) - usr.stop_pulling() - usr.dir = get_dir(usr, src) - usr << "You grip \the [name]'s handles." else - if(usr != pulling) - for(var/mob/O in viewers(pulling, null)) - O.show_message("\red [usr] breaks [pulling]'s grip on the wheelchair.", 1) - else - usr << "You let go of \the [name]'s handles." - pulling.pulledby = null - pulling = null - return + . = 1 /obj/structure/stool/bed/chair/wheelchair/Bump(atom/A) ..() if(!buckled_mob) return - if(propelled || (pulling && (pulling.a_intent == I_HARM))) + if(propelled) var/mob/living/occupant = buckled_mob unbuckle_mob() - if (pulling && (pulling.a_intent == "hurt")) - occupant.throw_at(A, 3, 3, pulling) - else if (propelled) - occupant.throw_at(A, 3, propelled) + occupant.throw_at(A, 3, propelled) occupant.apply_effect(6, STUN, 0) occupant.apply_effect(6, WEAKEN, 0) @@ -162,31 +77,5 @@ victim.apply_effect(6, WEAKEN, 0) victim.apply_effect(6, STUTTER, 0) victim.take_organ_damage(10) - if(pulling) - occupant.visible_message("[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!") - pulling.attack_log += "\[[time_stamp()]\] Crashed [key_name(occupant)] [name] into \a [A]" - occupant.attack_log += "\[[time_stamp()]\] Thrusted into \a [A] by [key_name(pulling)] with \the [name]" - msg_admin_attack("[key_name_admin(pulling)] has thrusted [key_name_admin(occupant)] [name] into \a [A]") - else - occupant.visible_message("[occupant] crashed into \the [A]!") - -/obj/structure/stool/bed/chair/wheelchair/proc/create_track() - var/obj/effect/decal/cleanable/blood/tracks/B = new(loc) - var/newdir = get_dir(get_step(loc, dir), loc) - if(newdir == dir) - B.dir = newdir - else - newdir = newdir | dir - if(newdir == 3) - newdir = 1 - else if(newdir == 12) - newdir = 4 - B.dir = newdir - bloodiness-- - -/obj/structure/stool/bed/chair/wheelchair/buckle_mob(mob/M as mob, mob/user as mob) - if(M == pulling) - pulling = null - usr.pulledby = null - ..() \ No newline at end of file + occupant.visible_message("[occupant] crashed into \the [A]!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f61318e09c6..b54c7f5ee36 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -24,20 +24,10 @@ if(wear_suit) tally += wear_suit.slowdown - if(!buckled || (buckled && !istype(buckled, /obj/structure/stool/bed/chair/wheelchair))) + if(!buckled) if(shoes) tally += shoes.slowdown - if(buckled && istype(buckled, /obj/structure/stool/bed/chair/wheelchair)) - for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm")) - var/obj/item/organ/external/E = get_organ(organ_name) - if(!E || (E.status & ORGAN_DESTROYED)) - tally += 4 - else if(E.status & ORGAN_SPLINTED) - tally += 0.5 - else if(E.status & ORGAN_BROKEN) - tally += 1.5 - if(shock_stage >= 10) tally += 3 if(back) From a1636b3b245e90181157aa8633e0b10d17e8f3bc Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Mon, 28 Sep 2015 14:48:06 -0700 Subject: [PATCH 60/69] NODROP is now more respected A few machines, especially in medical, didn't respect NODROP. Hopefully with these changes, medical cyborgs should no longer get their beaker stuck in some sort of bizarre multipositional limbo. --- code/game/dna/dna_modifier.dm | 11 +++++++---- code/game/machinery/Sleeper.dm | 2 ++ code/game/machinery/constructable_frame.dm | 2 +- code/game/machinery/cryo.dm | 8 +++++--- code/game/machinery/iv_drip.dm | 16 +++++++++------- code/modules/reagents/Chemistry-Machinery.dm | 20 +++++++++++--------- 6 files changed, 35 insertions(+), 24 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index d74b2672360..9bdfa73d484 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -217,10 +217,13 @@ return beaker = item - user.drop_item() - item.loc = src - user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!") - return + if(user.drop_item()) + item.loc = src + user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!") + return + else + user << "\The [item] is stuck to you!" + return else if (!istype(item, /obj/item/weapon/grab)) return var/obj/item/weapon/grab/G = item diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index adc4542cfd4..a84ad07458a 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -305,6 +305,8 @@ user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") src.updateUsrDialog() return + else + user << "\The [G] is stuck to you!" else user << "\red The sleeper has a beaker already." return diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index bb7a54daf4b..38cbb0fb4c6 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -153,7 +153,7 @@ if(istype(P, /obj/item)) var/success for(var/I in req_components) - if(istype(P, I) && (req_components[I] > 0)) + if(istype(P, I) && (req_components[I] > 0) && !(P.flags & NODROP)) success=1 playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(istype(P, /obj/item/stack/cable_coil)) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index c35eaacf9f8..a12f01caf6f 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -279,9 +279,11 @@ return beaker = G - user.drop_item() - G.loc = src - user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") + if(user.drop_item()) + G.loc = src + user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") + else + user << "The [G] is stuck to you!" if (istype(G, /obj/item/weapon/screwdriver)) if(occupant || on) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 870018c54b3..3f1658f5fe0 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -63,12 +63,14 @@ user << "There is already a reagent container loaded!" return - user.drop_item() - W.loc = src - src.beaker = W - user << "You attach \the [W] to \the [src]." - src.update_icon() - return + if(user.drop_item()) + W.loc = src + src.beaker = W + user << "You attach \the [W] to \the [src]." + src.update_icon() + return + else + user << "\The [W] is stuck to you!" else return ..() @@ -167,4 +169,4 @@ else user << "\blue No chemicals are attached." - user << "\blue [attached ? attached : "No one"] is attached." \ No newline at end of file + user << "\blue [attached ? attached : "No one"] is attached." diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 46bb04ee636..26cd1f75ae0 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -218,15 +218,17 @@ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) src.beaker = B - user.drop_item() - B.loc = src - user << "You set [B] on the machine." - nanomanager.update_uis(src) // update all UIs attached to src - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - overlays += icon_beaker - return + if(user.drop_item()) + B.loc = src + user << "You set [B] on the machine." + nanomanager.update_uis(src) // update all UIs attached to src + if(!icon_beaker) + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10,5) + overlays += icon_beaker + return + else + user << "\The [B] is stuck to you!" /obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob, params) ..() From be672419cac4823acbccba0c1ca31d636a62423a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 28 Sep 2015 18:15:39 -0400 Subject: [PATCH 61/69] Fixes a few Destroys --- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/cloning.dm | 28 ++++++++--------- code/game/machinery/requests_console.dm | 12 ++++---- code/game/mecha/equipment/tools/tools.dm | 2 +- code/game/mecha/mech_bay.dm | 30 +++++++++---------- code/game/objects/items/weapons/mop.dm | 2 +- .../projectiles/guns/energy/temperature.dm | 2 +- 7 files changed, 39 insertions(+), 39 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2df598a5001..891be23fdf2 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -66,7 +66,7 @@ /obj/machinery/clonepod/Destroy() if(connected) connected.pods -= src - ..() + return ..() /obj/machinery/clonepod/RefreshParts() speed_coeff = 0 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index cc192ec8c53..31fa24feb6f 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -22,10 +22,10 @@ /obj/machinery/computer/cloning/initialize() ..() updatemodules() - + /obj/machinery/computer/cloning/Destroy() releasecloner() - ..() + return ..() /obj/machinery/computer/cloning/process() if(!scanner || !pods.len || !autoprocess) @@ -39,8 +39,8 @@ for(var/datum/dna2/record/R in src.records) if(!(pod.occupant || pod.mess)) if(pod.growclone(R)) - records.Remove(R) - + records.Remove(R) + /obj/machinery/computer/cloning/proc/updatemodules() src.scanner = findscanner() releasecloner() @@ -119,23 +119,23 @@ return var/data[0] data["menu"] = src.menu - data["scanner"] = src.scanner - + data["scanner"] = src.scanner + var/canpodautoprocess = 0 if(pods.len) data["numberofpods"] = src.pods.len - + var/list/tempods[0] for (var/obj/machinery/clonepod/pod in pods) if(pod.efficiency > 5) canpodautoprocess = 1 - + tempods.Add(list(list("pod" = "\ref[pod]", "name" = capitalize(pod.name), "biomass" = pod.biomass))) data["pods"] = tempods - + data["loading"] = loading data["autoprocess"] = autoprocess - + if(scanner && pods.len && ((scanner.scan_level > 2) || canpodautoprocess)) data["autoallowed"] = 1 else @@ -257,11 +257,11 @@ src.active_record = src.diskette.buf src.temp = "Load successful." - + if("eject") if (!isnull(src.diskette)) src.diskette.loc = src.loc - src.diskette = null + src.diskette = null else if (href_list["save_disk"]) //Save to disk! if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record))) @@ -284,7 +284,7 @@ else if (href_list["refresh"]) nanomanager.update_uis(src) - + else if (href_list["selectpod"]) var/obj/machinery/clonepod/selected = locate(href_list["selectpod"]) if(istype(selected) && (selected in pods)) @@ -297,7 +297,7 @@ //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. if(!pods.len) temp = "Error: No cloning pod detected." - else + else var/obj/machinery/clonepod/pod = selected_pod if (!selected_pod) temp = "Error: No cloning pod selected." diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 133ce3814df..8a52c2653e3 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -79,7 +79,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_supplies |= department if (departmentType & RC_INFO) req_console_information |= department - + set_light(1) /obj/machinery/requests_console/Destroy() @@ -96,14 +96,14 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_supplies -= department if (departmentType & RC_INFO) req_console_information -= department - ..() + return ..() /obj/machinery/requests_console/attack_ghost(user as mob) if(stat & NOPOWER) return - - ui_interact(user) - + + ui_interact(user) + /obj/machinery/requests_console/attack_hand(user as mob) if(..(user)) return @@ -138,7 +138,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() ui.set_auto_update(1) /obj/machinery/requests_console/Topic(href, href_list) - if(..()) + if(..()) return 1 usr.set_machine(src) add_fingerprint(usr) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index f80fe007d26..bed4da6fe2f 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -287,7 +287,7 @@ Destroy() rcd_list -= src - ..() + return ..() action(atom/target) if(istype(target, /turf/space/transit))//>implying these are ever made -Sieve diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index a3ec474fb08..8588baa80df 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -5,13 +5,13 @@ var/obj/machinery/mech_bay_recharge_port/recharge_port var/obj/machinery/computer/mech_bay_power_console/recharge_console var/obj/mecha/recharging_mecha = null - + /turf/simulated/floor/mech_bay_recharge_floor/airless icon_state = "recharge_floor_asteroid" oxygen = 0.01 nitrogen = 0.01 temperature = TCMB - + /turf/simulated/floor/mech_bay_recharge_floor/Destroy() if(recharge_console && recharge_console.recharge_floor == src) recharge_console.recharge_floor = null @@ -36,7 +36,7 @@ else if(!recharge_port) mecha.occupant_message("Power port not found. Terminating.") return - + /turf/simulated/floor/mech_bay_recharge_floor/Exited(atom) . = ..() if(atom == recharging_mecha) @@ -91,7 +91,7 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() - + pr_recharger = new /datum/global_iterator/mech_bay_recharger(null,0) /obj/machinery/mech_bay_recharge_port/upgraded/New() @@ -114,12 +114,12 @@ pr_recharger.max_charge = MC * 10 if(recharge_console) recharge_console.voltage = MC * 10 - + /obj/machinery/mech_bay_recharge_port/Destroy() recharge_console.recharge_port = null recharge_floor.recharge_port = null - ..() - + return ..() + /obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I)) return @@ -131,7 +131,7 @@ return default_deconstruction_crowbar(I) - + /obj/machinery/mech_bay_recharge_port/proc/start_charge(var/obj/mecha/recharging_mecha) if(stat&(NOPOWER|BROKEN)) recharging_mecha.occupant_message("Power port not responding. Terminating.") @@ -149,13 +149,13 @@ update_icon() pr_recharger.stop() return - + /obj/machinery/mech_bay_recharge_port/proc/active() if(pr_recharger.active()) return 1 else return 0 - + /obj/machinery/mech_bay_recharge_port/power_change() if(powered()) @@ -165,7 +165,7 @@ stat |= NOPOWER pr_recharger.stop() return - + /obj/machinery/mech_bay_recharge_port/proc/set_voltage(new_voltage) if(new_voltage && isnum(new_voltage)) pr_recharger.max_charge = new_voltage @@ -177,7 +177,7 @@ delay = 20 var/max_charge = 50 check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process() - + /datum/global_iterator/mech_bay_recharger/process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha) if(!port) return 0 @@ -208,11 +208,11 @@ var/voltage = 50 var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor var/obj/machinery/mech_bay_recharge_port/recharge_port - + /obj/machinery/computer/mech_bay_power_console/Destroy() recharge_port.recharge_console = null recharge_floor.recharge_console = null - ..() + return ..() /obj/machinery/computer/mech_bay_power_console/proc/mecha_in(var/obj/mecha/mecha) if(stat&(NOPOWER|BROKEN)) @@ -251,7 +251,7 @@ ..() if(recharge_port) recharge_port.stop_charge() - + /obj/machinery/computer/mech_bay_power_console/update_icon() if(!recharge_floor || !recharge_floor.recharging_mecha || !recharge_floor.recharging_mecha.cell || !(recharge_floor.recharging_mecha.cell.charge < recharge_floor.recharging_mecha.cell.maxcharge)) icon_screen = "recharge_comp" diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 205ffc6733f..05a367fc075 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -23,7 +23,7 @@ /obj/item/weapon/mop/Destroy() janitorial_equipment -= src - return..() + return ..() /obj/item/weapon/mop/proc/clean(turf/simulated/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1)) diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 1f6f374aef0..8d33a9e2508 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -29,7 +29,7 @@ /obj/item/weapon/gun/energy/temperature/Destroy() processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user as mob) From 6825c33cb98f43372973be2fa9300aea9e338dcb Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 29 Sep 2015 00:51:17 +0200 Subject: [PATCH 62/69] Fix flamethrower logs --- code/game/objects/items/weapons/flamethrower.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index e148d6bc7ff..40ac8e93bdd 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -66,7 +66,7 @@ var/turf/target_turf = get_turf(target) if(target_turf) var/turflist = getline(user, target_turf) - add_logs(user, target, "flamethrowered", addition="at [target.x],[target.y],[target.z]") + add_logs(target, user, "flamethrowered", addition="at [target.x],[target.y],[target.z]") flame_turf(turflist) /obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params) From 22faa3c40d9d7aca2bc2f12ed4f36202e43d07ad Mon Sep 17 00:00:00 2001 From: DZD Date: Mon, 28 Sep 2015 19:28:48 -0400 Subject: [PATCH 63/69] Fixes a few description oversights --- code/game/gamemodes/shadowling/shadowling_abilities.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index b1e6b7290d7..0a626d2ec78 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -182,9 +182,9 @@ /obj/effect/proc_holder/spell/targeted/shadow_vision - name = "Darksight" - desc = "Gives you night vision." - panel = "Thrall Abilities" + name = "Shadowling Darksight" + desc = "Gives you night and thermal vision." + panel = "Shadowling Abilities" charge_max = 0 range = -1 include_user = 1 @@ -204,6 +204,9 @@ H.vision_type = null /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall + desc = "Thrall Darksight" + desc = "Gives you night vision." + panel = "Thrall Abilities" vision_path = /datum/vision_override/nightvision /obj/effect/proc_holder/spell/aoe_turf/flashfreeze From 62fb3c29813e2894de6aa13c5653900aa51e3f72 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 29 Sep 2015 11:31:57 -0400 Subject: [PATCH 64/69] Safe Cleanup and Fix --- code/game/objects/structures/safe.dm | 37 ++++++++++++++-------------- code/stylesheet.dm | 2 ++ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 10b8d73a92b..c95f3aa2b09 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -23,11 +23,11 @@ FLOOR SAFES /obj/structure/safe/New() - tumbler_1_pos = rand(0, 72) - tumbler_1_open = rand(0, 72) + tumbler_1_pos = rand(0, 71) + tumbler_1_open = rand(0, 71) - tumbler_2_pos = rand(0, 72) - tumbler_2_open = rand(0, 72) + tumbler_2_pos = rand(0, 71) + tumbler_2_open = rand(0, 71) /obj/structure/safe/initialize() @@ -39,14 +39,14 @@ FLOOR SAFES I.loc = src -/obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear) +/obj/structure/safe/proc/check_unlocked(mob/user, canhear) if(user && canhear) if(tumbler_1_pos == tumbler_1_open) - user << "You hear a [pick("tonk", "krunk", "plunk")] from [src]." + user << "You hear a [pick("tonk", "krunk", "plunk")] from [src]." if(tumbler_2_pos == tumbler_2_open) - user << "You hear a [pick("tink", "krink", "plink")] from [src]." + user << "You hear a [pick("tink", "krink", "plink")] from [src]." if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open) - if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") + if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") return 1 return 0 @@ -72,7 +72,7 @@ FLOOR SAFES icon_state = initial(icon_state) -/obj/structure/safe/attack_hand(mob/user as mob) +/obj/structure/safe/attack_hand(mob/user) user.set_machine(src) var/dat = "

" dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" @@ -101,7 +101,7 @@ FLOOR SAFES updateUsrDialog() return else - user << "You can't [open ? "close" : "open"] [src], the lock is engaged!" + user << "You can't [open ? "close" : "open"] [src], the lock is engaged!" return if(href_list["decrement"]) @@ -109,11 +109,11 @@ FLOOR SAFES if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) tumbler_1_pos = decrement(tumbler_1_pos) if(canhear) - user << "You hear a [pick("clack", "scrape", "clank")] from [src]." + user << "You hear a [pick("clack", "scrape", "clank")] from [src]." if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35) tumbler_2_pos = decrement(tumbler_2_pos) if(canhear) - user << "You hear a [pick("click", "chink", "clink")] from [src]." + user << "You hear a [pick("click", "chink", "clink")] from [src]." check_unlocked(user, canhear) updateUsrDialog() return @@ -123,11 +123,11 @@ FLOOR SAFES if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71) tumbler_1_pos = increment(tumbler_1_pos) if(canhear) - user << "You hear a [pick("clack", "scrape", "clank")] from [src]." + user << "You hear a [pick("clack", "scrape", "clank")] from [src]." if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35) tumbler_2_pos = increment(tumbler_2_pos) if(canhear) - user << "You hear a [pick("click", "chink", "clink")] from [src]." + user << "You hear a [pick("click", "chink", "clink")] from [src]." check_unlocked(user, canhear) updateUsrDialog() return @@ -142,11 +142,13 @@ FLOOR SAFES updateUsrDialog() -/obj/structure/safe/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/structure/safe/attackby(obj/item/I, mob/user, params) if(open) if(I.w_class + space <= maxspace) space += I.w_class - user.drop_item() + if(!user.drop_item()) + user << "\The [I] is stuck to your hand, you cannot put it in the safe!" + return I.loc = src user << "You put [I] in [src]." updateUsrDialog() @@ -156,14 +158,13 @@ FLOOR SAFES return else if(istype(I, /obj/item/clothing/accessory/stethoscope)) - user << "Hold [I] in one of your hands while you manipulate the dial." + user << "Hold [I] in one of your hands while you manipulate the dial!" return obj/structure/safe/blob_act() return - obj/structure/safe/ex_act(severity) return diff --git a/code/stylesheet.dm b/code/stylesheet.dm index ffd829c70b4..c0e951046fa 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -11,6 +11,8 @@ em {font-style: normal; font-weight: bold;} .motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} +.italics { font-style: italic;} + .prefix { font-weight: bold;} .ooc { font-weight: bold;} From 3c80bd7eb1f25f63b54954314592e383621fbbba Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 29 Sep 2015 08:52:20 -0700 Subject: [PATCH 65/69] Fix exploit, refactor access to body color, let IPC's actually change color as non-admins --- code/modules/client/preferences.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 06ac7184749..210b1ddea65 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -367,7 +367,7 @@ datum/preferences dat += "
Eyes
" dat += "Change Color
__

" - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins dat += "
Body Color
" dat += "Change Color
__
" @@ -1028,7 +1028,7 @@ datum/preferences if(species == "Human") s_tone = random_skin_tone() if("s_color") - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Wryn" || species == "Vulpkanin") + if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wyrn", "Vulpkanin", "Machine")) r_skin = rand(0,255) g_skin = rand(0,255) b_skin = rand(0,255) @@ -1115,6 +1115,8 @@ datum/preferences b_hair = 0//hex2num(copytext(new_hair, 6, 8)) s_tone = 0 + + body_accessory = null //no vulpatail on humans damnit if("speciesprefs")//oldvox code speciesprefs = !speciesprefs @@ -1268,7 +1270,7 @@ datum/preferences s_tone = 35 - max(min( round(new_s_tone), 220),1) if("skin") - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 1, user)) + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null if(new_skin) r_skin = hex2num(copytext(new_skin, 2, 4)) From 9678fe09ecc6e57d4bc478509f25a4f2c81932f2 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Tue, 29 Sep 2015 11:05:34 -0700 Subject: [PATCH 66/69] Replaced location setting with forceMove() I'm restricting this only to the machine's I'm affecting with this fix. Refactoring the rest of the code to use it would be for a different thing. --- code/game/dna/dna_modifier.dm | 2 +- code/game/machinery/Sleeper.dm | 4 ++-- code/game/machinery/cryo.dm | 2 +- code/game/machinery/iv_drip.dm | 2 +- code/modules/reagents/Chemistry-Machinery.dm | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 9bdfa73d484..cbd7772f535 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -218,7 +218,7 @@ beaker = item if(user.drop_item()) - item.loc = src + item.forceMove(src) user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!") return else diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a84ad07458a..582a8466e22 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -299,9 +299,9 @@ /obj/machinery/sleeper/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params) if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(!beaker) - beaker = G if (user.drop_item()) - G.loc = src + beaker = G + G.forceMove(src) user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") src.updateUsrDialog() return diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index a12f01caf6f..53f903121ad 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -280,7 +280,7 @@ beaker = G if(user.drop_item()) - G.loc = src + G.forceMove(src) user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") else user << "The [G] is stuck to you!" diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 3f1658f5fe0..e3bb3d32eaa 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -64,7 +64,7 @@ return if(user.drop_item()) - W.loc = src + W.forceMove(src) src.beaker = W user << "You attach \the [W] to \the [src]." src.update_icon() diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 26cd1f75ae0..d9a16e89e76 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -219,7 +219,7 @@ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) src.beaker = B if(user.drop_item()) - B.loc = src + B.forceMove(src) user << "You set [B] on the machine." nanomanager.update_uis(src) // update all UIs attached to src if(!icon_beaker) From 734e0842e2b3621f688391fefb73c55f64ab255d Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Tue, 29 Sep 2015 11:56:51 -0700 Subject: [PATCH 67/69] Fixed a few more reversed add_logs Did a search, and found 3 of these to patch up. Perhaps there's something left, perhaps not. --- code/game/objects/items/devices/laserpointer.dm | 4 ++-- code/modules/mining/equipment_locker.dm | 2 +- code/modules/mob/living/carbon/alien/alien_defenses.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 866c5735bab..ed55d931d8c 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -96,7 +96,7 @@ //20% chance to actually hit the eyes if(prob(effectchance * diode.rating)) - add_logs(user, C, "shone in the eyes", object="laser pointer") + add_logs(C, user, "shone in the eyes", object="laser pointer") //eye target check @@ -213,4 +213,4 @@ energy = max_energy recharging = 0 recharge_locked = 0 - ..() + ..() \ No newline at end of file diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 2fecda8394c..e81ade4287a 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -571,7 +571,7 @@ playsound(src,'sound/weapons/resonator_blast.ogg',50,1) if(creator) for(var/mob/living/L in src.loc) - add_logs(creator, L, "used a resonator field on", object="resonator") + add_logs(L, creator, "used a resonator field on", object="resonator") L << "The [src.name] ruptured with you in it!" L.adjustBruteLoss(resonance_damage) else diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index 8d0c36bc05d..ed98e221993 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -35,7 +35,7 @@ In all, this is a lot like the monkey code. /N visible_message("[M.name] bites [src]!", \ "[M.name] bites [src]!") adjustBruteLoss(damage) - add_logs(M, src, "attacked", admin=0) + add_logs(src, M, "attacked", admin=0) updatehealth() else M << "[name] is too injured for that." @@ -67,4 +67,4 @@ In all, this is a lot like the monkey code. /N if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) - updatehealth() + updatehealth() \ No newline at end of file From 8b2e62fc10ea8675bbf857d201034638a77e80be Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 29 Sep 2015 22:03:04 +0200 Subject: [PATCH 68/69] Strange reagent fix, tod --> timeofdeath --- code/game/gamemodes/changeling/powers/fakedeath.dm | 2 +- code/game/gamemodes/changeling/powers/revive.dm | 4 +--- code/game/objects/items/devices/PDA/PDA.dm | 4 ++-- code/game/objects/items/devices/scanners.dm | 4 ++-- code/modules/awaymissions/mission_code/wildwest.dm | 2 +- code/modules/mob/living/carbon/alien/death.dm | 4 ++-- code/modules/mob/living/carbon/alien/larva/death.dm | 4 ++-- code/modules/mob/living/carbon/brain/death.dm | 4 ++-- code/modules/mob/living/carbon/human/death.dm | 4 ++-- code/modules/mob/living/carbon/human/human_damage.dm | 9 --------- code/modules/mob/living/living.dm | 12 +++++++++--- code/modules/mob/living/living_defines.dm | 2 -- code/modules/mob/living/silicon/ai/death.dm | 4 ++-- code/modules/mob/living/silicon/robot/component.dm | 4 ++-- code/modules/mob/living/silicon/robot/death.dm | 4 ++-- code/modules/reagents/newchem/medicine.dm | 6 +++--- 16 files changed, 33 insertions(+), 40 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index 9a4b144cc71..3a0fb785f19 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -18,7 +18,7 @@ if(user.stat != DEAD) user.emote("deathgasp") - user.tod = worldtime2text() + user.timeofdeath = worldtime2text() spawn(800) if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 8e4313b92b0..e5cc89aeaed 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -5,12 +5,10 @@ //Revive from regenerative stasis /obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user) - if(user.stat == DEAD) dead_mob_list -= user - living_mob_list += user + living_mob_list |= user user.stat = CONSCIOUS - user.tod = null user.setToxLoss(0) user.setOxyLoss(0) user.setCloneLoss(0) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 74c1f2f51ff..f6976502e47 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1084,8 +1084,8 @@ var/global/list/obj/item/device/pda/PDAs = list() user.show_message("\blue \t Damage Specifics: [C.getOxyLoss() > 50 ? "\red" : "\blue"][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "\red" : "\blue"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "\red" : "\blue"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "\red" : "\blue"][C.getBruteLoss()]", 1) user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) - if(C.tod && (C.stat == DEAD || (C.status_flags & FAKEDEATH))) - user.show_message("\blue \t Time of Death: [C.tod]") + if(C.timeofdeath && (C.stat == DEAD || (C.status_flags & FAKEDEATH))) + user.show_message("\blue \t Time of Death: [C.timeofdeath]") if(istype(C, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C var/list/damaged = H.get_damaged_organs(1,1) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 19812645eea..976fed562c0 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -161,8 +161,8 @@ REAGENT SCANNER user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\t Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - user.show_message("\blue Time of Death: [M.tod]") + if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) + user.show_message("\blue Time of Death: [M.timeofdeath]") if(istype(M, /mob/living/carbon/human) && mode == 1) var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 3e2910fa556..ce914b6c407 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -207,7 +207,7 @@ dead_mob_list -= C living_mob_list += C C.stat = CONSCIOUS - C.tod = null + C.timeofdeath = 0 C.setToxLoss(0) C.setOxyLoss(0) C.setCloneLoss(0) diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 40303b03543..693763e4960 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -53,7 +53,7 @@ if(client) blind.layer = 0 update_icons() - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) + timeofdeath = worldtime2text() + if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) return ..(gibbed) diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index 67edcfd04ca..574b617ca58 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -9,8 +9,8 @@ update_canmove() if(client) blind.layer = 0 - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) + timeofdeath = worldtime2text() + if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) living_mob_list -= src return ..(gibbed) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 17bf26de838..efcfac98624 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -11,8 +11,8 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) //mind. ? + timeofdeath = worldtime2text() + if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) //mind. ? return ..(gibbed) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index a9cf1ea1094..4307c6cbd0b 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -133,8 +133,8 @@ update_canmove() if(client) blind.layer = 0 - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) + timeofdeath = worldtime2text() + if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) if(ticker && ticker.mode) // log_to_dd("k") sql_report_death(src) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 4f404d1f314..c0587ddee86 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -22,15 +22,6 @@ update_revive() return -/mob/living/carbon/human/proc/update_revive() // handles revival through other means than cloning or adminbus (defib, IPC repair) - stat = CONSCIOUS - dead_mob_list -= src - living_mob_list |= src - mob_list |= src - ear_deaf = 0 - tod = 0 - timeofdeath = 0 - /mob/living/carbon/human/adjustBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6ead72a36f5..808f8b3e772 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -317,9 +317,16 @@ C.reagents.addiction_list.Cut() hud_updateflag |= 1 << HEALTH_HUD hud_updateflag |= 1 << STATUS_HUD + +/mob/living/proc/update_revive() // handles revival through other means than cloning or adminbus (defib, IPC repair) + stat = CONSCIOUS + dead_mob_list -= src + living_mob_list |= src + mob_list |= src + ear_deaf = 0 + timeofdeath = 0 /mob/living/proc/rejuvenate() - // shut down various types of badness setToxLoss(0) setOxyLoss(0) @@ -367,10 +374,9 @@ human_mob.decaylevel = 0 restore_all_organs() - if(stat == 2) + if(stat == DEAD) dead_mob_list -= src living_mob_list += src - tod = null timeofdeath = 0 stat = CONSCIOUS diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index cf6204e710c..08a99c0dba2 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -34,8 +34,6 @@ var/atom/movable/cameraFollow = null - var/tod = null // Time of death - var/on_fire = 0 //The "Are we on fire?" var var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20 diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index dfa05ddc5d0..fe96da3c35e 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -53,7 +53,7 @@ if (istype(loc, /obj/item/device/aicard)) loc.icon_state = "aicard-404" - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) + timeofdeath = worldtime2text() + if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) return ..(gibbed) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d0469bc42dc..3c81531030d 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -206,8 +206,8 @@ user << "Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]" user << "\t Key: Electronics/Brute" user << "\t Damage Specifics: [BU] - [BR]" - if(M.tod && M.stat == DEAD) - user << "Time of Disable: [M.tod]" + if(M.timeofdeath && M.stat == DEAD) + user << "Time of Disable: [M.timeofdeath]" var/mob/living/silicon/robot/H = M var/list/damaged = H.get_damaged_components(1,1,1) user << "Localized Damage:" diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index cf9427242d8..cafb53d8621 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -62,8 +62,8 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO update_icons() - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) + timeofdeath = worldtime2text() + if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) sql_report_cyborg_death(src) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index a54072e9bbb..e79667be06e 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -633,6 +633,7 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T if(method == TOUCH) if(M.stat == DEAD) M.health = M.maxHealth + M.update_revive() M.visible_message("[M] seems to rise from the dead!") if(istype(M, /mob/living/carbon)) if(method == INGEST) @@ -648,13 +649,12 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T M.visible_message("[M] doesn't appear to respond, perhaps try again later?") if(!M.suiciding && !ghost && !(NOCLONE in M.mutations)) M.visible_message("[M] seems to rise from the dead!") - M.stat = 1 M.setOxyLoss(0) M.adjustBruteLoss(rand(0,15)) M.adjustToxLoss(rand(0,15)) M.adjustFireLoss(rand(0,15)) - dead_mob_list -= M - living_mob_list |= list(M) + M.update_revive() + M.stat = UNCONSCIOUS add_logs(M, M, "revived", object="strange reagent") ..() return From 2712c4dba88350fedccdf849067a251eda281eb7 Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 29 Sep 2015 23:18:05 +0200 Subject: [PATCH 69/69] Add spaceport security to blacklist --- code/_globalvars/lists/mobs.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index ac66623c72a..27da3c1fd4b 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -50,7 +50,8 @@ var/global/list/blocked_mobs = list(/mob/living/simple_animal/hostile, /mob/living/simple_animal/hostile/spaceWorm/wormHead, /mob/living/simple_animal/ascendant_shadowling, /mob/living/simple_animal/slaughter, - /mob/living/simple_animal/hostile/retaliate/araneus + /mob/living/simple_animal/hostile/retaliate/araneus, + /mob/living/simple_animal/hostile/syndicate/ranged/orion ) var/global/list/med_hud_users = list()