From c5aaa07949f94f2f191bca0d921c9add757e17f5 Mon Sep 17 00:00:00 2001 From: Sligneris Date: Wed, 19 Apr 2017 00:32:35 +0200 Subject: [PATCH 01/97] Changes all instances of "RD Console" to "R&D Console" --- code/game/machinery/computer/buildandrepair.dm | 6 +++--- code/modules/research/rdconsole.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 0f18a68bf89..21fe22ee58a 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -304,17 +304,17 @@ build_path = /obj/machinery/computer/gulag_teleporter_computer /obj/item/weapon/circuitboard/computer/rdconsole - name = "RD Console (Computer Board)" + name = "R&D Console (Computer Board)" build_path = /obj/machinery/computer/rdconsole/core /obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/weapon/screwdriver)) if(build_path == /obj/machinery/computer/rdconsole/core) - name = "RD Console - Robotics (Computer Board)" + name = "R&D Console - Robotics (Computer Board)" build_path = /obj/machinery/computer/rdconsole/robotics to_chat(user, "Access protocols successfully updated.") else - name = "RD Console (Computer Board)" + name = "R&D Console (Computer Board)" build_path = /obj/machinery/computer/rdconsole/core to_chat(user, "Defaulting access protocols.") else diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index f2bdd738c46..beea0afecb3 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -1068,7 +1068,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/robotics/New() ..() if(circuit) - circuit.name = "RD Console - Robotics (Computer Board)" + circuit.name = "R&D Console - Robotics (Computer Board)" circuit.build_path = /obj/machinery/computer/rdconsole/robotics /obj/machinery/computer/rdconsole/core From 73cc6834cf19706c1de3dedbc07cd48ec7f07b0e Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Wed, 19 Apr 2017 17:10:59 +0100 Subject: [PATCH 02/97] Examining a window gives tips for construction/deconstruction :cl: coiax add: Examining a window now gives hints to the appropriate tool for the next stage of construction/deconstruction. /:cl: --- code/game/objects/structures/window.dm | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c6c2ef358bc..2d5eb8ef6dd 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -27,7 +27,23 @@ /obj/structure/window/examine(mob/user) ..() - to_chat(user, "Alt-click to rotate it clockwise.") + if(reinf) + if(anchored && state == WINDOW_SCREWED_TO_FRAME) + to_chat(user, "The window is screwed to the frame.") + else if(anchored && state == WINDOW_IN_FRAME) + to_chat(user, "The window is unscrewed but pried into the frame.") + else if(anchored && state == WINDOW_OUT_OF_FRAME) + to_chat(user, "The window is out of the frame, but could be pried in. It is screwed to the floor.") + else if(!anchored) + to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + else + if(anchored) + to_chat(user, "The window is screwed to the floor.") + else + to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + + if(!anchored) + to_chat(user, "Alt-click to rotate it clockwise.") /obj/structure/window/Initialize(mapload, direct) ..() From 8f44405cc7c5613aa9af24d393674630d2b0da77 Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Wed, 19 Apr 2017 17:15:38 +0100 Subject: [PATCH 03/97] Also reinforced desc --- code/game/objects/structures/window.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2d5eb8ef6dd..ac1748c6945 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -405,6 +405,7 @@ /obj/structure/window/reinforced name = "reinforced window" + desc = "A window that is reinforced with metal rods." icon_state = "rwindow" reinf = 1 heat_resistance = 1600 From 9fc228d824f19852b44bbcb93c90e6d7b7a96673 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Wed, 19 Apr 2017 18:10:15 -0400 Subject: [PATCH 04/97] Adds support for CLONER_FRESH_CLONE flag, ghostizes new clones immediately rather than waiting --- code/game/machinery/cloning.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 794f1ccda32..49f689c01bd 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -199,11 +199,12 @@ clonemind.transfer_to(H) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + if(grab_ghost_when == CLONER_FRESH_CLONE) + to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") if(grab_ghost_when == CLONER_MATURE_CLONE) - addtimer(CALLBACK(src, .proc/occupant_dreams), 100) + H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost + to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") if(H) H.faction |= factions @@ -214,11 +215,6 @@ attempting = FALSE return TRUE -/obj/machinery/clonepod/proc/occupant_dreams() - if(occupant) - to_chat(occupant, "While your body grows, you have the strangest dream, like you can see yourself from the outside.") - occupant.ghostize(TRUE) - //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() From 439e22740746f4e747ee278c8bdc9997ee7239c1 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Wed, 19 Apr 2017 18:14:38 -0400 Subject: [PATCH 05/97] whoops --- code/game/machinery/cloning.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 49f689c01bd..e44c07ed614 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -200,6 +200,7 @@ clonemind.transfer_to(H) if(grab_ghost_when == CLONER_FRESH_CLONE) + H.grab_ghost() to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") if(grab_ghost_when == CLONER_MATURE_CLONE) From db9d86a39ef141266e4f7e878242e00505303c1a Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Wed, 19 Apr 2017 18:22:26 -0400 Subject: [PATCH 06/97] New() goes in the trash, we've gotta Initialize() --- .../miniantags/abduction/machinery/pad.dm | 6 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 6 +- code/game/gamemodes/wizard/artefact.dm | 4 +- code/game/objects/effects/overlays.dm | 74 ++++++++++--------- code/game/objects/items/devices/flashlight.dm | 4 +- code/modules/VR/vr_sleeper.dm | 4 +- .../simple_animal/guardian/types/support.dm | 2 +- .../hostile/bosses/paperwizard.dm | 4 +- .../hostile/megafauna/colossus.dm | 2 +- .../simple_animal/hostile/megafauna/dragon.dm | 8 +- .../hostile/megafauna/hierophant.dm | 25 +++---- .../modules/projectiles/projectile/special.dm | 25 ++++--- .../chemistry/machinery/chem_dispenser.dm | 8 +- .../chemistry/machinery/chem_heater.dm | 4 +- .../chemistry/machinery/chem_master.dm | 4 +- .../reagents/chemistry/machinery/pandemic.dm | 4 +- .../chemistry/machinery/reagentgrinder.dm | 5 +- code/modules/reagents/reagent_containers.dm | 6 +- .../reagents/reagent_containers/blood_pack.dm | 8 +- .../reagents/reagent_containers/borghydro.dm | 4 +- .../reagents/reagent_containers/bottle.dm | 8 +- .../reagents/reagent_containers/glass.dm | 8 +- .../reagents/reagent_containers/pill.dm | 4 +- .../reagents/reagent_containers/syringes.dm | 6 +- code/modules/reagents/reagent_dispenser.dm | 8 +- code/modules/recycling/conveyor2.dm | 12 +-- code/modules/recycling/disposal-structures.dm | 39 ++++------ code/modules/recycling/disposal-unit.dm | 9 +-- code/modules/research/circuitprinter.dm | 4 +- code/modules/research/designs.dm | 8 +- code/modules/research/destructive_analyzer.dm | 4 +- code/modules/research/experimentor.dm | 8 +- code/modules/research/message_server.dm | 5 +- code/modules/research/protolathe.dm | 4 +- code/modules/research/rdconsole.dm | 8 +- code/modules/research/rdmachines.dm | 4 +- code/modules/research/research.dm | 12 +-- code/modules/research/server.dm | 4 +- code/modules/research/stock_parts.dm | 8 +- .../research/xenobiology/xenobiology.dm | 10 +-- code/modules/ruins/lavaland_ruin_code.dm | 4 +- .../ruins/objects_and_mobs/sin_ruins.dm | 2 +- .../security_levels/keycard_authentication.dm | 2 +- code/modules/shuttle/computer.dm | 4 +- code/modules/shuttle/emergency.dm | 11 ++- code/modules/shuttle/manipulator.dm | 2 +- code/modules/shuttle/shuttle.dm | 14 ++-- code/modules/shuttle/special.dm | 2 +- code/modules/shuttle/syndicate.dm | 4 +- code/modules/shuttle/transit.dm | 2 +- code/modules/spells/spell.dm | 4 +- code/modules/spells/spell_types/forcewall.dm | 4 +- code/modules/spells/spell_types/godhand.dm | 6 +- code/modules/spells/spell_types/trigger.dm | 4 +- code/modules/station_goals/bsa.dm | 4 +- code/modules/station_goals/dna_vault.dm | 4 +- code/modules/station_goals/shield.dm | 4 +- code/modules/surgery/organs/augments_arms.dm | 12 +-- .../surgery/organs/augments_internal.dm | 3 +- code/modules/surgery/organs/organ_internal.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 4 +- code/modules/telesci/telepad.dm | 4 +- code/modules/telesci/telesci_computer.dm | 4 +- code/modules/uplink/uplink.dm | 20 ++--- code/modules/vehicles/atv.dm | 6 +- code/modules/vehicles/bicycle.dm | 4 +- code/modules/vehicles/speedbike.dm | 13 +--- code/modules/zombie/organs.dm | 2 +- 68 files changed, 256 insertions(+), 275 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm index 5f8ad3de9d6..083e610587a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -47,8 +47,8 @@ icon_state = "teleport" duration = 80 -/obj/effect/overlay/temp/teleport_abductor/New() +/obj/effect/overlay/temp/teleport_abductor/Initialize() + . = ..() var/datum/effect_system/spark_spread/S = new S.set_up(10,0,loc) - S.start() - ..() \ No newline at end of file + S.start() \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 6ce04bed141..c6248b03cc2 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -527,9 +527,9 @@ icon_state = "disintegrate" duration = 10 -/obj/effect/overlay/temp/swarmer/disintegration/New() - playsound(src.loc, "sparks", 100, 1) - ..() +/obj/effect/overlay/temp/swarmer/disintegration/Initialize() + . = ..() + playsound(loc, "sparks", 100, 1) /obj/effect/overlay/temp/swarmer/dismantle icon_state = "dismantle" diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index ada94fb26f5..dde67fb664e 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -630,6 +630,6 @@ duration = 40 pixel_x = 500 -/obj/effect/overlay/temp/tornado/New(loc) - ..() +/obj/effect/overlay/temp/tornado/Initialize() + . = ..() animate(src, pixel_x = -500, time = 40) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 3d62e850e84..2231ed43a40 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -31,8 +31,8 @@ . = ..() deltimer(timerid) -/obj/effect/overlay/temp/New() - ..() +/obj/effect/overlay/temp/Initialize() + . = ..() if(randomdir) setDir(pick(GLOB.cardinal)) flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation. @@ -45,10 +45,10 @@ /obj/effect/overlay/temp/dir_setting randomdir = FALSE -/obj/effect/overlay/temp/dir_setting/New(loc, set_dir) +/obj/effect/overlay/temp/dir_setting/Initialize(mapload, set_dir) if(set_dir) setDir(set_dir) - ..() + . = ..() /obj/effect/overlay/temp/dir_setting/bloodsplatter icon = 'icons/effects/blood.dmi' @@ -57,12 +57,12 @@ layer = BELOW_MOB_LAYER var/splatter_type = "splatter" -/obj/effect/overlay/temp/dir_setting/bloodsplatter/New(loc, set_dir) +/obj/effect/overlay/temp/dir_setting/bloodsplatter/Initialize(mapload, set_dir) if(set_dir in GLOB.diagonals) icon_state = "[splatter_type][pick(1, 2, 6)]" else icon_state = "[splatter_type][pick(3, 4, 5)]" - ..() + . = ..() var/target_pixel_x = 0 var/target_pixel_y = 0 switch(set_dir) @@ -94,6 +94,13 @@ /obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter splatter_type = "xsplatter" +/obj/effect/overlay/temp/dir_setting/speedbike_trail + name = "speedbike trails" + icon_state = "ion_fade" + layer = BELOW_MOB_LAYER + duration = 10 + randomdir = 0 + /obj/effect/overlay/temp/dir_setting/firing_effect icon = 'icons/effects/effects.dmi' icon_state = "firing_effect" @@ -190,8 +197,8 @@ desc = "It's a decoy!" duration = 15 -/obj/effect/overlay/temp/decoy/New(loc, atom/mimiced_atom) - ..() +/obj/effect/overlay/temp/decoy/Initialize(mapload, atom/mimiced_atom) + . = ..() alpha = initial(alpha) if(mimiced_atom) name = mimiced_atom.name @@ -199,8 +206,8 @@ setDir(mimiced_atom.dir) mouse_opacity = 0 -/obj/effect/overlay/temp/decoy/fading/New(loc, atom/mimiced_atom) - ..() +/obj/effect/overlay/temp/decoy/fading/Initialize(mapload, atom/mimiced_atom) + . = ..() animate(src, alpha = 0, time = duration) /obj/effect/overlay/temp/decoy/fading/fivesecond @@ -214,7 +221,7 @@ icon = 'icons/effects/fire.dmi' icon_state = "3" duration = 20 - + /obj/effect/overlay/temp/cult randomdir = 0 duration = 10 @@ -325,15 +332,15 @@ var/mob/user var/damage = 20 -/obj/effect/overlay/temp/ratvar/volt_hit/New(loc, caster, multiplier) +/obj/effect/overlay/temp/ratvar/volt_hit/Initialize(mapload, caster, multiplier) if(multiplier) damage *= multiplier duration = max(round(damage * 0.2), 1) - ..() + . = ..() set_light(1.5, 2, LIGHT_COLOR_ORANGE) -/obj/effect/overlay/temp/ratvar/volt_hit/true/New(loc, caster, multiplier) - ..() +/obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier) + . = ..() user = caster if(user) var/matrix/M = new @@ -377,8 +384,8 @@ icon_state = "warden_gaze" duration = 3 -/obj/effect/overlay/temp/ratvar/ocular_warden/New() - ..() +/obj/effect/overlay/temp/ratvar/ocular_warden/Initialize() + . = ..() pixel_x = rand(-8, 8) pixel_y = rand(-10, 10) animate(src, alpha = 0, time = 3, easing = EASE_OUT) @@ -402,8 +409,8 @@ layer = ABOVE_MOB_LAYER duration = 10 -/obj/effect/overlay/temp/ratvar/component/New() - ..() +/obj/effect/overlay/temp/ratvar/component/Initialize() + . = ..() transform = matrix()*0.75 pixel_x = rand(-10, 10) pixel_y = rand(-10, -2) @@ -433,9 +440,8 @@ light_power = 2 light_color = "#FAE48C" -/obj/effect/overlay/temp/ratvar/sigil/transgression/New() - ..() - update_light() +/obj/effect/overlay/temp/ratvar/sigil/transgression/Initialize() + . = ..() var/oldtransform = transform animate(src, transform = matrix()*2, time = 5) animate(transform = oldtransform, alpha = 0, time = 65) @@ -448,10 +454,6 @@ light_power = 0.5 light_color = "#1E8CE1" -/obj/effect/overlay/temp/ratvar/sigil/vitality/New() - ..() - update_light() - /obj/effect/overlay/temp/ratvar/sigil/accession color = "#AF0AAF" layer = ABOVE_MOB_LAYER @@ -494,9 +496,9 @@ icon = 'icons/mob/mob.dmi' duration = 15 -/obj/effect/overlay/temp/gib_animation/New(loc, gib_icon) +/obj/effect/overlay/temp/gib_animation/Initialize(mapload, gib_icon) icon_state = gib_icon // Needs to be before ..() so icon is correct - ..() + . = ..() /obj/effect/overlay/temp/gib_animation/ex_act(severity) return //so the overlay isn't deleted by the explosion that gibbed the mob. @@ -508,9 +510,9 @@ icon = 'icons/mob/mob.dmi' duration = 15 -/obj/effect/overlay/temp/dust_animation/New(loc, dust_icon) +/obj/effect/overlay/temp/dust_animation/Initialize(mapload, dust_icon) icon_state = dust_icon // Before ..() so the correct icon is flick()'d - ..() + . = ..() /obj/effect/overlay/temp/mummy_animation icon = 'icons/mob/mob.dmi' @@ -522,12 +524,12 @@ icon_state = "heal" duration = 15 -/obj/effect/overlay/temp/heal/New(loc, colour) - ..() - pixel_x = rand(-12, 12) - pixel_y = rand(-9, 0) +/obj/effect/overlay/temp/heal/Initialize(mapload, colour) if(colour) color = colour + . = ..() + pixel_x = rand(-12, 12) + pixel_y = rand(-9, 0) /obj/effect/overlay/temp/kinetic_blast name = "kinetic explosion" @@ -559,14 +561,14 @@ icon_state = "impact_bullet" duration = 5 -/obj/effect/overlay/temp/impact_effect/New(loc, atom/target, obj/item/projectile/P) +/obj/effect/overlay/temp/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P) if(target == P.original) //the projectile hit the target originally clicked pixel_x = P.p_x + target.pixel_x - 16 + rand(-4,4) pixel_y = P.p_y + target.pixel_y - 16 + rand(-4,4) else pixel_x = target.pixel_x + rand(-4,4) pixel_y = target.pixel_y + rand(-4,4) - ..() + . = ..() /obj/effect/overlay/temp/impact_effect/red_laser icon_state = "impact_laser" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 62e0667f149..8537387dc45 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -100,8 +100,8 @@ icon_state = "medi_holo" duration = 30 -/obj/effect/overlay/temp/medical_holosign/New(loc, creator) - ..() +/obj/effect/overlay/temp/medical_holosign/Initialize(mapload, creator) + . = ..() playsound(loc, 'sound/machines/ping.ogg', 50, 0) //make some noise! if(creator) visible_message("[creator] created a medical hologram!") diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 41f3bbc0019..9411917c39a 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -17,8 +17,8 @@ var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games var/outfit = /datum/outfit/vr_basic -/obj/machinery/vr_sleeper/New() - ..() +/obj/machinery/vr_sleeper/Initialize() + . = ..() sparks = new /datum/effect_system/spark_spread() sparks.set_up(2,0) sparks.attach(src) diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 95d561abeb3..159e6df5f4c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -16,7 +16,7 @@ var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/healer/Initialize() - ..() + . = ..() var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index 2829bf574e1..951589daaf1 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -149,8 +149,8 @@ duration = 18 randomdir = FALSE -/obj/effect/overlay/temp/paperwiz_dying/New() - ..() +/obj/effect/overlay/temp/paperwiz_dying/Initialize() + . = ..() visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!") playsound(get_turf(src),'sound/magic/MandSwap.ogg', 50, 1, 1) playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, 1, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index a0e7c3694f3..c817687217c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -106,7 +106,7 @@ Difficulty: Very Hard var/target /obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target) - ..() + . = ..() target = new_target INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 9bc32993fa9..f2dbb01496a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -96,8 +96,8 @@ Difficulty: Medium duration = 12 pixel_z = 500 -/obj/effect/overlay/temp/fireball/Initialize(loc) - ..() +/obj/effect/overlay/temp/fireball/Initialize() + . = ..() animate(src, pixel_z = 0, time = 12) /obj/effect/overlay/temp/target @@ -121,8 +121,8 @@ Difficulty: Medium /obj/effect/overlay/temp/target/ex_act() return -/obj/effect/overlay/temp/target/Initialize(loc) - ..() +/obj/effect/overlay/temp/target/Initialize() + . = ..() INVOKE_ASYNC(src, .proc/fall) /obj/effect/overlay/temp/target/proc/fall() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index d9f099e2f11..b25e0dbdfab 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -426,8 +426,8 @@ Difficulty: Hard layer = BELOW_MOB_LAYER var/mob/living/caster //who made this, anyway -/obj/effect/overlay/temp/hierophant/New(loc, new_caster) - ..() +/obj/effect/overlay/temp/hierophant/Initialize(mapload, new_caster) + . = ..() if(new_caster) caster = new_caster @@ -437,13 +437,13 @@ Difficulty: Hard light_range = 1 randomdir = FALSE -/obj/effect/overlay/temp/hierophant/squares/New(loc, new_caster) - ..() +/obj/effect/overlay/temp/hierophant/squares/Initialize(mapload, new_caster) + . = ..() if(ismineralturf(loc)) var/turf/closed/mineral/M = loc M.gets_drilled(caster) -/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling are not friends. TODO: figure this out +/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling were not friends, but pooling is dead. name = "vortex wall" icon = 'icons/turf/walls/hierophant_wall_temp.dmi' icon_state = "wall" @@ -451,15 +451,14 @@ Difficulty: Hard duration = 100 smooth = SMOOTH_TRUE -/obj/effect/overlay/temp/hierophant/wall/New(loc, new_caster) - ..() +/obj/effect/overlay/temp/hierophant/wall/Initialize(mapload, new_caster) + . = ..() queue_smooth_neighbors(src) queue_smooth(src) /obj/effect/overlay/temp/hierophant/wall/Destroy() queue_smooth_neighbors(src) - ..() - return QDEL_HINT_QUEUE + return ..() /obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0) if(mover == caster) @@ -480,8 +479,8 @@ Difficulty: Hard var/currently_seeking = FALSE var/friendly_fire_check = FALSE //if blasts produced apply friendly fire -/obj/effect/overlay/temp/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire) - ..() +/obj/effect/overlay/temp/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire) + . = ..() target = new_target friendly_fire_check = is_friendly_fire if(new_speed) @@ -558,8 +557,8 @@ Difficulty: Hard var/friendly_fire_check = FALSE var/bursting = FALSE //if we're bursting and need to hit anyone crossing us -/obj/effect/overlay/temp/hierophant/blast/New(loc, new_caster, friendly_fire) - ..() +/obj/effect/overlay/temp/hierophant/blast/Initialize(mapload, new_caster, friendly_fire) + . = ..() friendly_fire_check = friendly_fire if(new_caster) hit_things += new_caster diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index b5c2a93996b..f5df46cb7b5 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -204,7 +204,8 @@ dismemberment = 20 impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser -/obj/item/projectile/plasma/New() +/obj/item/projectile/plasma/Initialize() + . = ..() var/turf/proj_turf = get_turf(src) if(!isturf(proj_turf)) return @@ -215,7 +216,6 @@ name = "full strength [name]" damage *= 4 range *= 2 - ..() /obj/item/projectile/plasma/on_hit(atom/target) . = ..() @@ -254,9 +254,10 @@ var/power = 4 var/list/thrown_items = list() -/obj/item/projectile/gravityrepulse/New(var/obj/item/ammo_casing/energy/gravityrepulse/C) - ..() - if(C) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items +/obj/item/projectile/gravityrepulse/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityrepulse/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun.power, 15) /obj/item/projectile/gravityrepulse/on_hit() @@ -284,9 +285,10 @@ var/power = 4 var/list/thrown_items = list() -/obj/item/projectile/gravityattract/New(var/obj/item/ammo_casing/energy/gravityattract/C) - ..() - if(C) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items +/obj/item/projectile/gravityattract/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityattract/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun.power, 15) /obj/item/projectile/gravityattract/on_hit() @@ -313,9 +315,10 @@ var/power = 4 var/list/thrown_items = list() -/obj/item/projectile/gravitychaos/New(var/obj/item/ammo_casing/energy/gravitychaos/C) - ..() - if(C) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items +/obj/item/projectile/gravitychaos/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravitychaos/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun.power, 15) /obj/item/projectile/gravitychaos/on_hit() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b4166d8070e..2ea99af8823 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -52,8 +52,8 @@ "toxin" ) -/obj/machinery/chem_dispenser/New() - ..() +/obj/machinery/chem_dispenser/Initialize() + . = ..() recharge() dispensable_reagents = sortList(dispensable_reagents) @@ -245,8 +245,8 @@ ) ) -/obj/machinery/chem_dispenser/constructable/New() - ..() +/obj/machinery/chem_dispenser/constructable/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_dispenser(null) B.apply_default_parts(src) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 2c6f7712e4d..da728fea892 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -12,8 +12,8 @@ var/heater_coefficient = 0.10 var/on = FALSE -/obj/machinery/chem_heater/New() - ..() +/obj/machinery/chem_heater/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_heater(null) B.apply_default_parts(src) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index a94a1c01fff..93628a9cc15 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -17,12 +17,12 @@ var/useramount = 30 // Last used amount layer = BELOW_OBJ_LAYER -/obj/machinery/chem_master/New() +/obj/machinery/chem_master/Initialize() create_reagents(100) add_overlay("waitlight") var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_master(null) B.apply_default_parts(src) - ..() + . = ..() /obj/item/weapon/circuitboard/machine/chem_master name = "ChemMaster 3000 (Machine Board)" diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index cfc8198b382..5a73c5dcf4c 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -13,8 +13,8 @@ var/wait = null var/obj/item/weapon/reagent_containers/beaker = null -/obj/machinery/computer/pandemic/New() - ..() +/obj/machinery/computer/pandemic/Initialize() + . = ..() update_icon() /obj/machinery/computer/pandemic/proc/GetVirusByIndex(index) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 5c8d6950071..9f5073075fa 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -89,10 +89,9 @@ var/list/holdingitems = list() -/obj/machinery/reagentgrinder/New() - ..() +/obj/machinery/reagentgrinder/Initialize() + . = ..() beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - return /obj/machinery/reagentgrinder/Destroy() if(beaker) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 2f8a1799466..ac3152ddfd1 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -12,9 +12,9 @@ var/disease_amount = 20 var/spillable = 0 -/obj/item/weapon/reagent_containers/New(location, vol = 0) - ..() - if (isnum(vol) && vol > 0) +/obj/item/weapon/reagent_containers/Initialize(mapload, vol) + . = ..() + if(isnum(vol) && vol > 0) volume = vol create_reagents(volume) if(spawned_disease) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 1ed89a74db8..ab467308733 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -7,8 +7,8 @@ var/blood_type = null var/labelled = 0 -/obj/item/weapon/reagent_containers/blood/New() - ..() +/obj/item/weapon/reagent_containers/blood/Initialize() + . = ..() if(blood_type != null) reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() @@ -43,9 +43,9 @@ if(51 to INFINITY) icon_state = "full" -/obj/item/weapon/reagent_containers/blood/random/New() +/obj/item/weapon/reagent_containers/blood/random/Initialize() blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L") - ..() + . = ..() /obj/item/weapon/reagent_containers/blood/APlus blood_type = "A+" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 46e41ecfeb8..8cbbfc8fb98 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -30,8 +30,8 @@ Borg Hypospray //Used as list for input() in shakers. -/obj/item/weapon/reagent_containers/borghypo/New() - ..() +/obj/item/weapon/reagent_containers/borghypo/Initialize() + . = ..() for(var/R in reagent_ids) add_reagent(R) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 01f39db4d35..1de2ec5ba78 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -9,8 +9,8 @@ volume = 30 -/obj/item/weapon/reagent_containers/glass/bottle/New() - ..() +/obj/item/weapon/reagent_containers/glass/bottle/Initialize() + . = ..() if(!icon_state) icon_state = "bottle" update_icon() @@ -139,8 +139,8 @@ icon_state = "bottle16" var/extra_reagent = null -/obj/item/weapon/reagent_containers/glass/bottle/traitor/New() - ..() +/obj/item/weapon/reagent_containers/glass/bottle/traitor/Initialize() + . = ..() extra_reagent = pick("polonium", "histamine", "formaldehyde", "venom", "neurotoxin2", "cyanide") reagents.add_reagent("[extra_reagent]", 3) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 9a4ccada9b2..bbd85d8f6d8 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -122,8 +122,8 @@ item_state = "beaker" materials = list(MAT_GLASS=500) -/obj/item/weapon/reagent_containers/glass/beaker/New() - ..() +/obj/item/weapon/reagent_containers/glass/beaker/Initialize() + . = ..() update_icon() /obj/item/weapon/reagent_containers/glass/beaker/on_reagent_change() @@ -176,8 +176,8 @@ origin_tech = "materials=2;engineering=3;plasmatech=3" flags = OPENCONTAINER -/obj/item/weapon/reagent_containers/glass/beaker/noreact/New() - ..() +/obj/item/weapon/reagent_containers/glass/beaker/noreact/Initialize() + . = ..() reagents.set_reacting(FALSE) /obj/item/weapon/reagent_containers/glass/beaker/bluespace diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index d8cebf9d0d3..f7399fc4b74 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -11,8 +11,8 @@ var/roundstart = 0 var/self_delay = 0 //pills are instant, this is because patches inheret their aplication from pills -/obj/item/weapon/reagent_containers/pill/New() - ..() +/obj/item/weapon/reagent_containers/pill/Initialize() + . = ..() if(!icon_state) icon_state = "pill[rand(1,20)]" if(reagents.total_volume && roundstart) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 0cb848974af..600a54cd5b5 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -16,8 +16,8 @@ materials = list(MAT_METAL=10, MAT_GLASS=20) container_type = TRANSPARENT -/obj/item/weapon/reagent_containers/syringe/New() - ..() +/obj/item/weapon/reagent_containers/syringe/Initialize() + . = ..() if(list_reagents) //syringe starts in inject mode if its already got something inside mode = SYRINGE_INJECT update_icon() @@ -243,7 +243,7 @@ volume = 20 origin_tech = "materials=3;engineering=3" -/obj/item/weapon/reagent_containers/syringe/noreact/New() +/obj/item/weapon/reagent_containers/syringe/noreact/NInitialize() . = ..() reagents.set_reacting(FALSE) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index a30e7b0b761..5ad154e12b9 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -23,10 +23,10 @@ else return ..() -/obj/structure/reagent_dispensers/New() +/obj/structure/reagent_dispensers/Initialize() create_reagents(tank_volume) reagents.add_reagent(reagent_id, tank_volume) - ..() + . = ..() /obj/structure/reagent_dispensers/examine(mob/user) ..() @@ -129,8 +129,8 @@ density = 0 reagent_id = "condensedcapsaicin" -/obj/structure/reagent_dispensers/peppertank/New() - ..() +/obj/structure/reagent_dispensers/peppertank/Initialize() + . = ..() if(prob(1)) desc = "IT'S PEPPER TIME, BITCH!" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 71b73de0e14..bba5ea2d6d3 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -24,8 +24,8 @@ // Auto conveyour is always on unless unpowered -/obj/machinery/conveyor/auto/New(loc, newdir) - ..(loc, newdir) +/obj/machinery/conveyor/auto/Initialize(mapload, newdir) + . = ..() operating = 1 update_move_direction() @@ -43,8 +43,8 @@ icon_state = "conveyor[operating * verted]" // create a conveyor -/obj/machinery/conveyor/New(loc, newdir) - ..(loc) +/obj/machinery/conveyor/Initialize(mapload, newdir) + . = ..() if(newdir) setDir(newdir) update_move_direction() @@ -328,8 +328,8 @@ w_class = WEIGHT_CLASS_BULKY var/id = "" //inherited by the switch -/obj/item/conveyor_switch_construct/New() - ..() +/obj/item/conveyor_switch_construct/Initialize() + . = ..() id = rand() //this couldn't possibly go wrong /obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity) diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index a823b4a62e1..a4b751574b2 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -147,8 +147,8 @@ var/obj/structure/disposalconstruct/stored // new pipe, set the icon_state as on map -/obj/structure/disposalpipe/New(loc,var/obj/structure/disposalconstruct/make_from) - ..() +/obj/structure/disposalpipe/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() if(make_from && !QDELETED(make_from)) base_icon_state = make_from.base_state @@ -176,7 +176,6 @@ stored.ptype = DISP_SORTJUNCTION if("pipe-j2s") stored.ptype = DISP_SORTJUNCTION_FLIP - return // pipe is deleted @@ -349,15 +348,14 @@ /obj/structure/disposalpipe/segment icon_state = "pipe-s" -/obj/structure/disposalpipe/segment/New() - ..() +/obj/structure/disposalpipe/segment/Initialize() + . = ..() if(stored.ptype == DISP_PIPE_STRAIGHT) dpdir = dir | turn(dir, 180) else dpdir = dir | turn(dir, -90) update() - return @@ -366,8 +364,8 @@ /obj/structure/disposalpipe/junction icon_state = "pipe-j1" -/obj/structure/disposalpipe/junction/New() - ..() +/obj/structure/disposalpipe/junction/Initialize() + . = ..() switch(stored.ptype) if(DISP_JUNCTION) dpdir = dir | turn(dir, -90) | turn(dir,180) @@ -376,7 +374,6 @@ if(DISP_YJUNCTION) dpdir = dir | turn(dir,90) | turn(dir, -90) update() - return // next direction to move @@ -442,8 +439,8 @@ dpdir = sortdir | posdir | negdir -/obj/structure/disposalpipe/sortjunction/New() - ..() +/obj/structure/disposalpipe/sortjunction/Initialize() + . = ..() // Generate a list of soring tags. if(sortType) @@ -458,7 +455,6 @@ updatedir() update() - return /obj/structure/disposalpipe/sortjunction/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/destTagger)) @@ -506,8 +502,8 @@ var/negdir = 0 var/sortdir = 0 -/obj/structure/disposalpipe/wrapsortjunction/New() - ..() +/obj/structure/disposalpipe/wrapsortjunction/Initialize() + . = ..() posdir = dir if(stored.ptype == DISP_SORTJUNCTION) sortdir = turn(posdir, -90) @@ -519,7 +515,6 @@ dpdir = sortdir | posdir | negdir update() - return // next direction to move // if coming in from negdir, then next is primary dir or sortdir @@ -547,14 +542,13 @@ icon_state = "pipe-t" var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet -/obj/structure/disposalpipe/trunk/New() - ..() +/obj/structure/disposalpipe/trunk/Initialize() + . = ..() dpdir = dir spawn(1) getlinked() update() - return /obj/structure/disposalpipe/trunk/Destroy() if(linked) @@ -621,8 +615,8 @@ // i.e. will be treated as an empty turf desc = "A broken piece of disposal pipe." -/obj/structure/disposalpipe/broken/New() - ..() +/obj/structure/disposalpipe/broken/Initialize() + . = ..() update() // the disposal outlet machine @@ -645,9 +639,8 @@ var/start_eject = 0 var/eject_range = 2 -/obj/structure/disposaloutlet/New(loc, var/obj/structure/disposalconstruct/make_from) - ..() - +/obj/structure/disposaloutlet/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() if(make_from) setDir(make_from.dir) make_from.loc = src diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 7cc890c1f64..2d3ecc88d4c 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -26,9 +26,8 @@ // create a new disposal // find the attached trunk (if present) and init gas resvr. -/obj/machinery/disposal/New(loc, var/obj/structure/disposalconstruct/make_from) - ..() - +/obj/machinery/disposal/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() if(make_from) setDir(make_from.dir) make_from.loc = 0 @@ -445,8 +444,8 @@ icon_state = "intake" pressure_charging = FALSE // the chute doesn't need charging and always works -/obj/machinery/disposal/deliveryChute/New(loc,var/obj/structure/disposalconstruct/make_from) - ..() +/obj/machinery/disposal/deliveryChute/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() stored.ptype = DISP_END_CHUTE spawn(5) trunk = locate() in loc diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 1c28dc73b2e..3cb462c9c83 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -27,8 +27,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). "Computer Parts" ) -/obj/machinery/r_n_d/circuit_imprinter/New() - ..() +/obj/machinery/r_n_d/circuit_imprinter/Initialize() + . = ..() materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE)) create_reagents(0) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e23c71e5fca..41ba8197a17 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -54,10 +54,10 @@ other types of metals and chemistry for reagents). var/list/blueprints = list() var/max_blueprints = 1 -/obj/item/weapon/disk/design_disk/New() - ..() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) +/obj/item/weapon/disk/design_disk/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) for(var/i in 1 to max_blueprints) blueprints += null diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 6afeb6cb0d4..4f950f178f0 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -13,8 +13,8 @@ Note: Must be placed within 3 tiles of the R&D Console icon_state = "d_analyzer" var/decon_mod = 0 -/obj/machinery/r_n_d/destructive_analyzer/New() - ..() +/obj/machinery/r_n_d/destructive_analyzer/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/destructive_analyzer(null) B.apply_default_parts(src) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index c12a6d553fd..47d6b52b44c 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -79,8 +79,8 @@ critical_items += I -/obj/machinery/r_n_d/experimentor/New() - ..() +/obj/machinery/r_n_d/experimentor/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/experimentor(null) B.apply_default_parts(src) @@ -589,8 +589,8 @@ var/cooldownMax = 60 var/cooldown -/obj/item/weapon/relic/New() - ..() +/obj/item/weapon/relic/Initialize() + . = ..() icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank") realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index ec99299f06d..24fe6a1c745 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -78,12 +78,11 @@ GLOBAL_LIST_INIT(message_servers, list()) var/active = 1 var/decryptkey = "password" -/obj/machinery/message_server/New() +/obj/machinery/message_server/Initialize() GLOB.message_servers += src decryptkey = GenerateKey() send_pda_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.") - ..() - return + . = ..() /obj/machinery/message_server/Destroy() GLOB.message_servers -= src diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 05889bf097f..0abe4e952c1 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -31,8 +31,8 @@ Note: Must be placed west/left of and R&D console to function. ) -/obj/machinery/r_n_d/protolathe/New() - ..() +/obj/machinery/r_n_d/protolathe/Initialize() + . = ..() create_reagents(0) materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index f2bdd738c46..aed1ae02e8c 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -100,8 +100,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, C.files.RefreshResearch() -/obj/machinery/computer/rdconsole/New() - ..() +/obj/machinery/computer/rdconsole/Initialize() + . = ..() files = new /datum/research(src) //Setup the research data holder. matching_designs = list() if(!id) @@ -1065,8 +1065,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, req_access = null req_access_txt = "29" -/obj/machinery/computer/rdconsole/robotics/New() - ..() +/obj/machinery/computer/rdconsole/robotics/Initialize() + . = ..() if(circuit) circuit.name = "RD Console - Robotics (Computer Board)" circuit.build_path = /obj/machinery/computer/rdconsole/robotics diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 2ff9387a719..f029b65b382 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -16,8 +16,8 @@ var/obj/machinery/computer/rdconsole/linked_console var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer) -/obj/machinery/r_n_d/New() - ..() +/obj/machinery/r_n_d/Initialize() + . = ..() wires = new /datum/wires/r_n_d(src) /obj/machinery/r_n_d/Destroy() diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index e98e3771b65..a321c03b473 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -313,10 +313,10 @@ research holder datum. var/list/tech_stored = list() var/max_tech_stored = 1 -/obj/item/weapon/disk/tech_disk/New() - ..() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) +/obj/item/weapon/disk/tech_disk/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) for(var/i in 1 to max_tech_stored) tech_stored += null @@ -339,8 +339,8 @@ research holder datum. materials = list() max_tech_stored = 0 -/obj/item/weapon/disk/tech_disk/debug/New() - ..() +/obj/item/weapon/disk/tech_disk/debug/Initialize() + . = ..() var/list/techs = subtypesof(/datum/tech) max_tech_stored = techs.len for(var/V in techs) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 4b8242c1f86..3f3453fd0e8 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -14,8 +14,8 @@ var/delay = 10 req_access = list(GLOB.access_rd) //Only the R&D can change server settings. -/obj/machinery/r_n_d/server/New() - ..() +/obj/machinery/r_n_d/server/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/rdserver(null) B.apply_default_parts(src) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 74b5bc01213..0c32efbb64d 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -72,10 +72,10 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi w_class = WEIGHT_CLASS_SMALL var/rating = 1 -/obj/item/weapon/stock_parts/New() - ..() - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) +/obj/item/weapon/stock_parts/Initialize() + . = ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) //Rating 1 diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 38d742c5be0..c6685956996 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -25,9 +25,9 @@ qdel(O) ..() -/obj/item/slime_extract/New() - ..() - create_reagents(100) +/obj/item/slime_extract/Initialize() + . = ..() + create_reagents(100) /obj/item/slime_extract/grey name = "grey slime extract" @@ -559,8 +559,8 @@ var/duration = 140 alpha = 125 -/obj/effect/timestop/New() - ..() +/obj/effect/timestop/Initialize() + . = ..() for(var/mob/living/M in GLOB.player_list) for(var/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop immune |= M diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 376c8aa9f26..32fb4a46e5c 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -24,8 +24,8 @@ icon_state = "datadisk1" max_blueprints = 1 -/obj/item/weapon/disk/design_disk/golem_shell/New() - ..() +/obj/item/weapon/disk/design_disk/golem_shell/Initialize() + . = ..() var/datum/design/golem_shell/G = new blueprints[1] = G diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index c5aacadecbc..349d716d2d9 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -45,7 +45,7 @@ anchored = FALSE density = TRUE -/obj/structure/cursed_money/New() +/obj/structure/cursed_money/Initialize() . = ..() addtimer(CALLBACK(src, .proc/collapse), 600) diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index e7c115e1004..17f0f4ffc78 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -18,7 +18,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) var/mob/triggerer = null var/waiting = 0 -/obj/machinery/keycard_auth/New() +/obj/machinery/keycard_auth/Initialize() . = ..() ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, .proc/triggerEvent)) diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 0033f380d17..4f5b85ced78 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -10,8 +10,8 @@ var/admin_controlled var/no_destination_swap = 0 -/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/computer/shuttle/C) - ..() +/obj/machinery/computer/shuttle/Initialize(mapload, obj/item/weapon/circuitboard/computer/shuttle/C) + . = ..() if(istype(C)) possible_destinations = C.possible_destinations shuttleId = C.shuttleId diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 07c135d7955..6432114c9e6 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -412,8 +412,8 @@ to_chat(usr, "Escape pods will only launch during \"Code Red\" security alert.") return 1 -/obj/docking_port/mobile/pod/New() - ..() +/obj/docking_port/mobile/pod/Initialize() + . = ..() if(id == "pod") WARNING("[type] id has not been changed from the default. Use the id convention \"pod1\" \"pod2\" etc.") @@ -492,8 +492,7 @@ icon_state = "safe" var/unlocked = FALSE -/obj/item/weapon/storage/pod/New() - ..() +/obj/item/weapon/storage/pod/PopulateContents() new /obj/item/clothing/head/helmet/space/orange(src) new /obj/item/clothing/head/helmet/space/orange(src) new /obj/item/clothing/suit/space/orange(src) @@ -533,13 +532,13 @@ dir = EAST roundstart_move = "backup_away" -/obj/docking_port/mobile/emergency/backup/New() +/obj/docking_port/mobile/emergency/backup/Initialize() // We want to be a valid emergency shuttle // but not be the main one, keep whatever's set // valid. // backup shuttle ignores `timid` because THERE SHOULD BE NO TOUCHING IT var/current_emergency = SSshuttle.emergency - ..() + . = ..() SSshuttle.emergency = current_emergency SSshuttle.backup_shuttle = src diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index bb2f401cdba..0d836818546 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -20,7 +20,7 @@ var/obj/docking_port/mobile/preview_shuttle var/datum/map_template/shuttle/preview_template -/obj/machinery/shuttle_manipulator/New() +/obj/machinery/shuttle_manipulator/Initialize() . = ..() update_icon() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index a271ddfe417..f6cff76c003 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -145,8 +145,8 @@ var/area_type = /area/space var/last_dock_time -/obj/docking_port/stationary/New() - ..() +/obj/docking_port/stationary/Initialize() + . = ..() SSshuttle.stationary += src if(!id) id = "[SSshuttle.stationary.len]" @@ -168,8 +168,8 @@ var/area/shuttle/transit/assigned_area var/obj/docking_port/mobile/owner -/obj/docking_port/stationary/transit/New() - ..() +/obj/docking_port/stationary/transit/Initialize() + . = ..() SSshuttle.transit += src /obj/docking_port/stationary/transit/proc/dezone() @@ -223,8 +223,8 @@ var/list/ripples = list() -/obj/docking_port/mobile/New() - ..() +/obj/docking_port/mobile/Initialize() + . = ..() if(!timid) register() @@ -316,7 +316,7 @@ if(!check_dock(S)) testing("check_dock failed on request for [src]") return - + if(mode == SHUTTLE_IGNITING && destination == S) return diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 9e1cde78577..cc4cc163f3e 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -14,7 +14,7 @@ var/tables_required = 2 active = FALSE -/obj/machinery/power/emitter/energycannon/magical/New() +/obj/machinery/power/emitter/energycannon/magical/Initialize() . = ..() if(prob(50)) desc = "Oh no, not again." diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 8151b864442..57a8ffd7efa 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -31,9 +31,9 @@ var/challenge = FALSE var/moved = FALSE -/obj/item/weapon/circuitboard/computer/syndicate_shuttle/New() +/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Initialize() + . = ..() GLOB.syndicate_shuttle_boards += src - ..() /obj/item/weapon/circuitboard/computer/syndicate_shuttle/Destroy() GLOB.syndicate_shuttle_boards -= src diff --git a/code/modules/shuttle/transit.dm b/code/modules/shuttle/transit.dm index c03d4a26450..7bf217d1ff7 100644 --- a/code/modules/shuttle/transit.dm +++ b/code/modules/shuttle/transit.dm @@ -5,7 +5,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "at_shield1" -/obj/effect/landmark/transit/New() +/obj/effect/landmark/transit/Initialize() . = ..() GLOB.transit_markers += src diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index bdab8b6c226..cc3f2c1ab90 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -223,8 +223,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/playMagSound() playsound(get_turf(usr), sound,50,1) -/obj/effect/proc_holder/spell/New() - ..() +/obj/effect/proc_holder/spell/Initialize() + . = ..() action = new(src) still_recharging_msg = "[name] is still recharging." diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index 6579171738a..8b2a40fe591 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -26,8 +26,8 @@ /obj/effect/forcefield/wizard var/mob/wizard -/obj/effect/forcefield/wizard/New(atom/loc, mob/summoner) - ..() +/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner) + . = ..() wizard = summoner QDEL_IN(src, 300) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 20d223354b7..26c543537e6 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -14,9 +14,9 @@ throw_range = 0 throw_speed = 0 -/obj/item/weapon/melee/touch_attack/New(var/spell) - attached_spell = spell - ..() +/obj/item/weapon/melee/touch_attack/Initialize() + attached_spell = loc + . = ..() /obj/item/weapon/melee/touch_attack/attack(mob/target, mob/living/carbon/user) if(!iscarbon(user)) //Look ma, no hands diff --git a/code/modules/spells/spell_types/trigger.dm b/code/modules/spells/spell_types/trigger.dm index 9c6dc7490f3..7dfda257309 100644 --- a/code/modules/spells/spell_types/trigger.dm +++ b/code/modules/spells/spell_types/trigger.dm @@ -5,8 +5,8 @@ var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks -/obj/effect/proc_holder/spell/targeted/trigger/New() - ..() +/obj/effect/proc_holder/spell/targeted/trigger/Initialize() + . = ..() for(var/spell in starting_spells) var/spell_to_add = text2path(spell) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 0d4200d49eb..1a6a2cc53cf 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -161,8 +161,8 @@ return locate(world.maxx,y,z) return get_turf(src) -/obj/machinery/bsa/full/New(loc,cannon_direction = WEST) - ..() +/obj/machinery/bsa/full/Initialize(mapload,cannon_direction = WEST) + . = ..() switch(cannon_direction) if(WEST) dir = WEST diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index d7f9a72a9ef..343fc91267c 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -17,8 +17,8 @@ var/human_count var/plant_count -/datum/station_goal/dna_vault/New() - ..() +/datum/station_goal/dna_vault/Initialize() + . = ..() animal_count = rand(15,20) //might be too few given ~15 roundstart stationside ones human_count = rand(round(0.75 * SSticker.totalPlayersReady) , SSticker.totalPlayersReady) // 75%+ roundstart population. var/non_standard_plants = non_standard_plants_count() diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 863d7d4bde3..b89ed4bde05 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -99,8 +99,8 @@ var/static/gid = 0 var/id = 0 -/obj/machinery/satellite/New() - ..() +/obj/machinery/satellite/Initialize() + . = ..() id = gid++ /obj/machinery/satellite/interact(mob/user) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 153de8d823a..acac8b4fa93 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -14,8 +14,8 @@ var/obj/item/holder = null // You can use this var for item path, it would be converted into an item on New() -/obj/item/organ/cyberimp/arm/New() - ..() +/obj/item/organ/cyberimp/arm/Initialize() + . = ..() if(ispath(holder)) holder = new holder(src) @@ -207,8 +207,8 @@ contents = newlist(/obj/item/device/assembly/flash/armimplant) origin_tech = "materials=4;combat=3;biotech=4;magnets=4;powerstorage=3" -/obj/item/organ/cyberimp/arm/flash/New() - ..() +/obj/item/organ/cyberimp/arm/flash/Initialize() + . = ..() if(locate(/obj/item/device/assembly/flash/armimplant) in items_list) var/obj/item/device/assembly/flash/armimplant/F = locate(/obj/item/device/assembly/flash/armimplant) in items_list F.I = src @@ -225,8 +225,8 @@ contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/assembly/flash/armimplant) origin_tech = "materials=5;combat=7;biotech=5;powerstorage=5;syndicate=6;programming=5" -/obj/item/organ/cyberimp/arm/combat/New() - ..() +/obj/item/organ/cyberimp/arm/combat/Initialize() + . = ..() if(locate(/obj/item/device/assembly/flash/armimplant) in items_list) var/obj/item/device/assembly/flash/armimplant/F = locate(/obj/item/device/assembly/flash/armimplant) in items_list F.I = src diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 85a98b09e6f..0ba52a0cb96 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -155,8 +155,7 @@ /obj/item/device/autosurgeon/reviver) var/amount = 5 -/obj/item/weapon/storage/box/cyber_implants/bundle/New() - ..() +/obj/item/weapon/storage/box/cyber_implants/PopulateContents() var/implant while(contents.len <= amount) implant = pick(boxed) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index ac306ee7c4b..988f7f8b35a 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -655,7 +655,7 @@ var/phomeme_type = "sans" var/list/phomeme_types = list("sans", "papyrus") -/obj/item/organ/tongue/bone/New() +/obj/item/organ/tongue/bone/Initialize() . = ..() phomeme_type = pick(phomeme_types) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e844918eeba..67314bafcd7 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -36,8 +36,8 @@ name = "Voice of God" var/obj/item/organ/vocal_cords/colossus/cords = null -/datum/action/item_action/organ_action/colossus/New() - ..() +/datum/action/item_action/organ_action/colossus/Initialize() + . = ..() cords = target /datum/action/item_action/organ_action/colossus/IsAvailable() diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 027cab8c3e6..918ec309f2b 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -10,8 +10,8 @@ active_power_usage = 5000 var/efficiency -/obj/machinery/telepad/New() - ..() +/obj/machinery/telepad/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telesci_pad(null) B.apply_default_parts(src) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 60ac49a529c..aac9ca6cdea 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -30,9 +30,9 @@ var/list/crystals = list() var/obj/item/device/gps/inserted_gps -/obj/machinery/computer/telescience/New() +/obj/machinery/computer/telescience/Initialize() recalibrate() - ..() + . = ..() /obj/machinery/computer/telescience/Destroy() eject() diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm index 0538232fc06..6e70077063d 100644 --- a/code/modules/uplink/uplink.dm +++ b/code/modules/uplink/uplink.dm @@ -20,8 +20,8 @@ GLOBAL_LIST_EMPTY(uplinks) var/purchase_log = "" var/list/uplink_items -/obj/item/device/uplink/New() - ..() +/obj/item/device/uplink/Initialize() + . = ..() GLOB.uplinks += src uplink_items = get_uplink_items(gamemode) @@ -133,24 +133,24 @@ GLOBAL_LIST_EMPTY(uplinks) return hidden_uplink.attackby(I, user, params) // A collection of pre-set uplinks, for admin spawns. -/obj/item/device/radio/uplink/New() - ..() +/obj/item/device/radio/uplink/Initialize() + . = ..() icon_state = "radio" hidden_uplink = new(src) hidden_uplink.active = TRUE hidden_uplink.lockable = FALSE -/obj/item/device/radio/uplink/nuclear/New() - ..() +/obj/item/device/radio/uplink/nuclear/Initialize() + . = ..() hidden_uplink.set_gamemode(/datum/game_mode/nuclear) -/obj/item/device/multitool/uplink/New() - ..() +/obj/item/device/multitool/uplink/Initialize() + . = ..() hidden_uplink = new(src) hidden_uplink.active = TRUE hidden_uplink.lockable = FALSE -/obj/item/weapon/pen/uplink/New() - ..() +/obj/item/weapon/pen/uplink/Initialize() + . = ..() hidden_uplink = new(src) traitor_unlock_degrees = 360 diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 6afd401b75a..17989224457 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -9,8 +9,8 @@ . = ..() riding_datum = new/datum/riding/atv -/obj/vehicle/atv/New() - ..() +/obj/vehicle/atv/Initialize() + . = ..() if(!atvcover) atvcover = image("icons/obj/vehicles.dmi", "atvcover") atvcover.layer = ABOVE_MOB_LAYER @@ -36,7 +36,7 @@ density = 0 -/obj/vehicle/atv/turret/New() +/obj/vehicle/atv/turret/Initialize() . = ..() turret = new(loc) turret.base = src diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 184b03a6bfd..d51de5809c5 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -7,8 +7,8 @@ var/static/list/bike_music = list('sound/misc/bike1.mid', 'sound/misc/bike2.mid', 'sound/misc/bike3.mid') -/obj/vehicle/bicycle/New() - ..() +/obj/vehicle/bicycle/Initialize() + . = ..() riding_datum = new/datum/riding/bicycle /obj/vehicle/bicycle/buckle_mob(mob/living/M, force = 0, check_loc = 1) diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 3db99e736b6..d2a546b5625 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -16,20 +16,9 @@ overlay.layer = ABOVE_MOB_LAYER add_overlay(overlay) -/obj/effect/overlay/temp/speedbike_trail - name = "speedbike trails" - icon_state = "ion_fade" - layer = BELOW_MOB_LAYER - duration = 10 - randomdir = 0 - -/obj/effect/overlay/temp/speedbike_trail/New(loc,move_dir) - ..() - setDir(move_dir) - /obj/vehicle/space/speedbike/Move(newloc,move_dir) if(has_buckled_mobs()) - new /obj/effect/overlay/temp/speedbike_trail(loc,move_dir) + new /obj/effect/overlay/temp/dir_setting/speedbike_trail(loc,move_dir) . = ..() /obj/vehicle/space/speedbike/red diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 295d7745955..f254ef6337e 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -13,7 +13,7 @@ var/revive_time_max = 700 var/timer_id -/obj/item/organ/zombie_infection/New(loc) +/obj/item/organ/zombie_infection/Initialize() . = ..() if(iscarbon(loc)) Insert(loc) From 52cb6f9c063236f264456823b96d6b65002a48c5 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Wed, 19 Apr 2017 18:43:14 -0400 Subject: [PATCH 07/97] some failures are just overchanging stuff --- code/modules/reagents/reagent_containers/syringes.dm | 2 +- code/modules/station_goals/dna_vault.dm | 4 ++-- code/modules/surgery/organs/vocal_cords.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 600a54cd5b5..4ee6ba1ac84 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -243,7 +243,7 @@ volume = 20 origin_tech = "materials=3;engineering=3" -/obj/item/weapon/reagent_containers/syringe/noreact/NInitialize() +/obj/item/weapon/reagent_containers/syringe/noreact/Initialize() . = ..() reagents.set_reacting(FALSE) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 343fc91267c..d7f9a72a9ef 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -17,8 +17,8 @@ var/human_count var/plant_count -/datum/station_goal/dna_vault/Initialize() - . = ..() +/datum/station_goal/dna_vault/New() + ..() animal_count = rand(15,20) //might be too few given ~15 roundstart stationside ones human_count = rand(round(0.75 * SSticker.totalPlayersReady) , SSticker.totalPlayersReady) // 75%+ roundstart population. var/non_standard_plants = non_standard_plants_count() diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 67314bafcd7..e844918eeba 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -36,8 +36,8 @@ name = "Voice of God" var/obj/item/organ/vocal_cords/colossus/cords = null -/datum/action/item_action/organ_action/colossus/Initialize() - . = ..() +/datum/action/item_action/organ_action/colossus/New() + ..() cords = target /datum/action/item_action/organ_action/colossus/IsAvailable() From 086d14d2918ecd881e771ee24a59d654d9b2f821 Mon Sep 17 00:00:00 2001 From: WJohn Date: Sat, 22 Apr 2017 13:05:19 -0400 Subject: [PATCH 08/97] Skeleton hitboxes --- icons/mob/human.dmi | Bin 15696 -> 16148 bytes icons/mob/human_parts.dmi | Bin 13169 -> 31791 bytes icons/mob/human_parts_greyscale.dmi | Bin 29081 -> 29492 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index ab69241cdeae15b93937d982f2aa49db19359d13..5b526ab99d8603a9643f0e4a3a4516f9863de39e 100644 GIT binary patch literal 16148 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 U)SQyRe{+Z2(K6Jm(y$BvUs0hym;e9( literal 15696 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:>)r$sDQEPK_i>HA z+63OZ(8Z1d(82q{ll<=&IEXG>a^}o?H{oUXZQ+VVwG>Lo+7UOfR-aridx~8x+#$M1 z?e4_9JBOEX^!YghNHQtHiZkuPg2;0);JQEQ{*Zycmy{-G+7TtQw{wD>U!8ThXZU)S zPNQaz2}slBwcizkSXCy8U;PSE_0>N6C8f$jW}`c5Bmnxj!~C0lz?AQAc3PS-lso5; zneQwpm4)J=hiQdw7%Egfd|rOBi_%Nb^<6X_C>0HFvGb$=fClcc`6iMZ2KRY^0Wrwl z(qIic6b+`)zN49y=u|@HZJTP(WzElzu*H5h;)RPSK@3c7dYoAr%)b9XRxagQ1(41L zb>>{#Z2HTOtzp>+dDLiI_6lItmqBuXe*vYICAbL$-t zL(Q4Qjxt_DOAm;@xw*(=hko#7p2=O|{0*AR>uMLxD2pYaTS^3c%X)bKNE1b9i;EcV zP#vTeS=5fu)c&DWb+7%5ZiVxfrik+(%N){_qde%oF|{BLAAN(q3w!bgeSftKhHw9*c1xcN`DOy37~ScKNuR2LiV8L!^0-~kGe}PgC;MGGwFE7lte-YfHLdN!Cc<6OXF>Z@ z?}yzjXZ6JP-MB>@XTlDdIRHq?H*6Z*6mvFmB_o;Q4LPoNGBt92N~_?OwUnfQ`rd>L zxX9d}%lBs%9gH?GcYG4$jVca$meoLv7^Oht_oC6btSJoS>Q_ucCuPkMhK&q@^~ zqxHlVLQ^5aH_?F_9-SBEqgRZRb!}{9?wgo?4@|c(Sly8pyf1Pdn|$%y#D!H8io>;Y zWagEC@6?P^a0u{6*A^-PIa=xg1G(Bymt5hwRZC3n{*R1;@!f7jPjjA5jQ*ZRj_4a< z0K&j@8Gd(e?vs9C_{60l!Tq1!6yfzdN&5|R&SmrH@qDoNd`AmErF%c`&24p8LTjwT z{M}5=)*0CH*!MpB&0bFoHlkpq#v2oox!%?M1;@E(htD`YxiAfazjAGK;V5bMXHi#+ z%CF9|l3Khd>HEAX9h_jAsWiF!(Zy4IfjHF-pyM=^0(l zJ@&j8DQKYN!@!zN-c%Y6u%q$`LE@|$dOsji44?Ip<6Xuu@c>Jj&OXYDC$Avk`gWZP z#K*QN*YvLlN%hM}mX6{R6GFK;I8a^Dw5QG4%F|3C-G%c2x4H-XdEEjxg&86VKId#Q zO&!F+LgbO-JdLM%G8u6JSdz_Z!iQ#Ar{xA=tIrQHj?C}6sM^{|LK7FrPLe8p`@nd% z`Miq{LEnb_*Lr>3^h-!99G{*97v_g(yhRT09KTf4qcj(AAULUyT0*19RBzT{y8>qi zw+}^mz1@zKXPs`TlmKN*b@Xvy)p%A>IFHXS6YOMXxbhEffHUk++o5XRde-TPHGxM#vNO8cR z`pN0Zfv;peRD$)ntgM;|C6!!P^5wvuSDDGRPmYDv+s!DxZhVuMmtr+Epd#l3^p_fY z>g%H@(fFDLr(1N{^J>>g`hG~`;viERVrS3gVxoi~T@o#2U_y*e8MtNVHLm;5| z`OH%PRO|Q+i?smay}4HZ{i)sCL?+-r-JN$FfMZNK0_-|-!8!x^6Ax*}0pD<;4blnKanm|ql6Vem=#>V^uFXsbHJDX^y98q84_kIP(aS=ps z_B`Ty9xy4ofFR=I?pxo5IJCcJXUl9t-cU=j@RQ9-7=OE!Q*mCl+>ZMlYO)nI)=TAG z(8BPF>&@^S9(V-B_>*s|+NBhO{8o(MdLiFc(YDD0KK^(6r|+KBIb%iB3V+>_wxC_E z11)TA?)KCVCj0H1d7e$AP(=0AkZg__y+@4w?azfIsq8o|Ya9$b1L7Yw zF=4WQQ1cNR-anu@`r>8c1=d#?+Ov#R-&<7j>h! zOuKk3vlDq@&4*x&D*r6sXh26eEb8-E`_q9wggX_Pwdt zIEtn2+!?Hxi7#JFSYA--o!JidKF>hXy&+9`fos0-ogxSc`5HAXf=lpF@+lu&BhJS?-VdE`ExY59(%6c|~(jujH%QBh(#N z@!3i^z3puTSNVoO$2yUA%W~g$S*y@h1b%{{DO_G@AmWN)2=rf!jg4*b#*4Y_%c^3+ zX+6E~^|7Bmu`(3xgn<+>s07i`34R>r)p*^Z^*epiag6Ea53jXfw=M@)hUUNRK{R&Sd00-gZIFtetVI~h_56aMGGx20O?%C2?vv~{YF z7($evYfBUIq}aHe@bj!mPOMnzB1>B$r7=j;Fc%_{bXou}b=vJ1Jhm=i>5X!`)@$?N zDlg{2G)pZb(?oBUCtARntzLeoAIkGZah{ z6s$b&*!aay`|~PO12mh`6+1pQg`keBCY5zl1~OzCCMa02b1Zi>vSN>MCg=pqKlm@v#Up<8I#L&;!SK&Cn#m z=$Jmio~7&I!2xLJl{oKCc5k={)~zIqwE>BeDDF6f?q*z6egh~$9>(3RRcF59#f%h~ zUiFth0?Y^C!jdSTe17L5B;m$Qs`T3uDL2?Rc>hNBeU{Bl%wA?7#nywpT;$syni@${EAV2J%q6*N)h`;QDm%-+MsQF)d6w@U&kWxb+5g{xj zq;tWH1&?xar7>H$(zwL5bT2R?gI-Nt{qCi=j7-3=Cuy}v^SDDu;E8JJKLMZ+5!27H zG3GBSt4~YaU0rPpWp(N1Hv~J|FY-IvZh=}ypFmkEF?!f~nUJzE#9G>zn4@CzO06Dohfu8Mm4_xrxh@degJX2o&(Qdv>zr*6^9v6?)9h z`;Lf2?Z$GFFJSVD(W~zDoZ`MwSLd^W-X%v_enHJ-K5j0f1Id&m`$M>d6gL}Yxiouj zI|M}7+K2xTe8{on$vz~W60!!4DzX=ao>w|}cuXaxrP*OVEB9>iCm@BwcZOQ}bVa^l z%ihB}>oSA4eqxmbU4;C6GC*Gpmcm6!zK%m-QE}uFfUsTdGoh#P*(7)68OY(xq^^%67s{MIW~Y z!}$342+^I#6CPsp;A5*}O`1_UI71H|-g?uzF zTIe=jt7j(C!Q#6UVTl_u@KEvu#n-H2=^bfa>fcHA;X63;Ozra$eY=+LGG)Ny$<6Z- zQifU)WMOgfW~$zc?jVv!wJ0Byr)eW(*+oNUps$<9*`2sE*do+#|V&^rid>N=Xq(JIp z2cXO=A*;3in!;08{6_Baec`2BZu?$MlMf+5q7s%UQ4x`Dy3>M9CQ~J8nFgkG6*fTK zPKLx3A~f}sw^h`;9BYCNiwB7I4|YL`CC6D2P^(Q9a~=Rv;u)ZXucI(+w}nj`%Xf1X zI1~79j5~L5wo{c;rH`IwhE8}SFlH6lH()1e>OLmYUh|=E?TyUgb|}EZ)WAZ=k3(U zSHYd69G$+(y#>tnn}HJHuZ)~o=qg&Jm)0YQ-(0=N?bhyqdr-uyF%2p`U=n9dfRvOL z-31u`{YRg)lQBck`9+!Cu2G4xSlKY%bQCaapK(zF{r7qXkGj9_gac`M)LfHw8`N3r z9UQC*^yX9pXiF_spN9@60EROJ;QCl4o?KB$1sUO=AGfP> zuQ~~~9e75m{R&!)4dAGUODJOZf5tsWszjPy&JS&o2~z-1sx2n8932sZ!gFE#Eg|gs z8om@$>)g#e*>vwHk-%=~XteCF>{9F<_<5J(uGlqzwrEyEtXTJ7;2Bk0(v>DVZ(J^X zfSLRxlpE+beet4D=K8bgZe~AT;b+0)ZWreV?HT25(VT zqXeJF1EM0~j^R68$+}cG9F8P}!g8wt2>K)+Qhf!Z0<41lUyi@(T^>#7XoXh)P{AZ( zt;6HX%lXtk!=eq6xN!YVXyCN?u|V&GcYe~mLUD;4Qw@*niB1z?F;MXn+WAo2)3kR= zMye*3=7Rl@TUguBBjR02^J(uXTQq|XJ@cV^@xMPWDGr0MQxP0Ku)#{A7lgs;|API$ ziNpWbaLWH?`(*BgjY0f@xxBvZ?gjvQAwWMoKv&j_V+Nu1@W%Ibm(&dS)V3Q?8fJf3 z$>e2Za6plckA5@TZkYX$EE$hD*1m^Wo>9oQTLY*NVP*gL0d*V$$fiUfxQf%j755I5 z{OIZC0q$xUs)e!VdO+Nso#l^27Mt&Hp1fL zK#f$*%9<+O1M{(Vt^~s)ev_W)(CuQ+Uz1P}G3)p$@yS9nQ&x!ceK8jPv4&R2hd6Sh z0XD0x<3%Ds*vJY+nHJpRZJ4F^+0lg)DJE@?OtVs#=I1MXhh{M&Vj?*G;9hsW%sNh1 zqa(}UK09>Ll4@qJ)v>ZVf$k)K^TDRbPAsKMc7=`JsB{@FvSY;K;+aPxpqCE(7^8 z$V8&#;9vZ}nnHo(Y&oUXS>GJ^i#};{{i@?w)bm>ZD)O&jZh^94H!PBFHs;q(f!(6_ z%jyKB$CxNK$r%kPyM~jsV<;t4?&&^fWiF?CeB!ruQMGZogknVf|IYnD;es&q*FfG$>62o)JjmpPwhlNR6fC|eJhRyj*wLaGjiHm;mpeX?Zt&{(Zo XVFf2S0$$)CaL7wJ6+x(y#6Ut4qH=xFK2Mqg3>TQ)W}dU|^G`<4j;lmGw| z03iJS+JZn40Pq6OJiF>aYa+>x9r@ajO_gK%DRfG`rLw2Jw3hq=CpEf$ji&y+1csq z>#M1$X=!P#f^ZEC4CJ}dUqLt&pq4xkwz9JFn>TMBg7SEHct9W!oCfY8?2)fpfEgqa zAQ#YJ(%2mMy3zjybFzB#X9#n+gxQ!Vj`YN=jlX~Y-qh68$Hxb=Jc`-+joF>W?9XFX z#-^K!F@I+;+tcWUk%O`Ji|M|@pB?+7ZJ*uTuCK4#wY2s&HzVNix45{+sUqV5KqU^& zMVminDCMli9<%i0bh3LvLjwZ<g@rWL|-&?1TXEPoMO# zkl%NMqf}8$fl9o0vrrnqMzDcR;=@z653H1woJ>sO{QN2^DvDsRu9_Mg4%a6nlol4| zp`j5H5~{4M+}_^q?(R-bPQI^1QSV{O{mTM+=xXW#5F69?UkjM~PT$Z&(e{nCyQ8az zql@!>U(3w;H0T_{4}CIqNX{{1ko9$5zqE`e-5jCGPt}XC%~0B&`ox*)@srjIZ`>!& zD-JL6?eX<_`#ft#-0NG`n8z8CKC0OV`>R{}cA9VbwBpYU>+6~z=cj*nv#fQ|a zePv_anYm`*aBswy^Hloe`q*5xsOSVX@*=B}jS|%_JProI8`shsS}s~+b!~tMK`fa; z>}VOslCevPxImgO%B6*`UT#_RrA0jPN_6`vgRkuCUo^vb?Of*1*=-@*-y^vAaKvde zE3&moD5zKV6{J!?yFZ$lQHV~QaJZ>6vb&exA%r_YguTQzc*dE|$eT-9+`-11i7)Gc zUu9MvFYd=uDs2ZVi`W zOjuyZRi_}`r*>)TU-5&c_05D+?vov_25zTBRMy`Tn3Voa$8cB-yKRA^l!n1S)_tJ! zt0R@03jOxn?YnW_^Wx-d{gnK2+2QZ~fco{f@)jF#*3U@|^LCdKH^5JdOfuf?>~a7A z44|qgr|+G)mxZ>b?e|$cK$L}k!i%z3k1Q{XJjsIsAlQnXQ7ThUca-&knor}Fs zi`Qs)Uci!&lu*OTynS}sy#H5iZRisnC@Ti~p|`-(5K+s0RWw~!g-2ZNu(?ju!=)Qu|%#! z5&=H!=e}Ztl9H;FKvIfv+ zzlP{UbX^FWcJGFRz?=MLhyzDNOGu_50G{Rf)tF%U1D3NxJwr%z z?yRc7Z<*)5jxKtJu{aYUIHv%!Vj2iD?$3oEwFXgczu(vYsmGJcu8fh^vc!-O;?L%X z$r?sMecz3V>Pm6;&2-N6k(1m-)eZf0 zkI!sQD*WTEMgypq&OWz^X(+C^xHswCjcX9fza7$&zpAcUJ9DDsrs>16VkPx=p8~_JI-6g$Nn#O|s-+1l%U@@~~Sx zqKK2E7r~nKO_v1*8B?Z5X2}PebIO=rrx0lYl@KaHN^+_=J)5Fio+H%h(tyu;yT#(- zmxool32}G6p1HKi5Z&mYS$-T;+@S0u4b6Dq2%BnYRnLBbw%^eJGiEtK`SLS0v)oTC z*Xt3&C*-6dkLE)PLn^R?kD23Sj~TZ4*c13cLD%@?A1^pqC|y(=LR@ceE`cNgdq2$s z*9;i0&Xfa*!T1~;<68ST$>E<&=j6u>*zol2`Y)_IjyMRmelA{8`TCVGm@zDCy4~Rv z&`0Dh%XtIQ8!qT`>khO@$CZGebf6Fy$JzP^>Pv){$|b0eQ=syDdH-M+NCQ zczEtVv8#9jV%}Sd*%*t?<6#{=6_F;TTsy_d#RFf$26~nZ5%NKP3P)$anz0}(81WpC z6RYSCc1hl4C$KbdP||{)N(n-&{y$xAEp{?)4#co=^f2jmPy@+Dd%c;9r8W$G(Jrr} znDaSIsevsK%;AQY{LxKKkEqV_Luu_g8yT3x=RRlf8oF_q%bwLWtNI&ftvaj_^pg2W z@n~x3U}w;S*cye0N+44T+hUlcBVIBEXC7p`wJP<>fwCBOviurqEhYRQ;JE*qlkAf{ zr;G=}F@fnjDX*Nc+9d7spku{hjq0=R_cERcoqrSU|2kBI3a(=QSufR1=Usr8OQz(??}Kt@y(aL$`$5fz?dkKn0r@aZ&~c}1 zdRzN~Pu&EAw>l>xArCyDHm3a0u(ayStpwhtsW;ymb5RA?mMY1M z93M|Cj1;0#K%`QmvPi|D~ST1G~a5nlL^imGct(9HiRp@ZnhdxTHVtg;59w zTQ)qg5~+wTLC$`VM(A=1U2`ZE+m?wV{m_~qwLk6Sf^swKmQdkQobl&nhJZ=Fi&5np zwZDxlV_~)+&L}d%&gQNDk36 zV`dHpu1{Nhe5h_*7)&?5G{pCfq;Qu%73&oCdVBcTa9D1zH#!~6yQ04#x=DPMLy}4r9&aZvkny&mrQzsG|E{Z~^eug=&6Ha!oJ;jp|_+^5YJzC~0FXh;WF{ zA;$eGRO`U0$5cD&Nyrk7h7dxuA!GDq9YR}Fj-)Y-JUJ%L-3PtjF2v98-P3l6@{h)* zTx|{WvZ*f33ktaS^3Yk?ReO&Gwzt%9pdjS;rSdgVw;R0M+lXjYzs_aP;G3z&nz*tglhG!FOG1vw zuu755l;rV=_&58%=?m^ZCv0<`hc&zenXD+jS4gh|;-I2A8NmqM~x0#uenE zLCDiktsOK`W#In&Z}s+|Psvqd@@Fk7YxUvY_pGS^) z3JFWQ?@sHO!E%vG%0fJ-uFi*A(m}L633ovOv{-bH#E*L(W}Zc|4^#+IsUI8;B;|MC zs++Va$#pIS^uT73uV8%G(%OM#5RZ-Q)qLyx{#<|PtPm24Dv-HToukC!(Y7dY3#-$M zurQb<#+gP#!%xnG4k0DE=FKzW1B=77)bqWS@e3`U&SadiV7;d$oj-Z_dQLPt4mW%{ z(tykJy8+94TXOMiDrE6Ce9%Ieml*gtPGOJ5mW4M?Y6Di97a7edAzuSYaD$0fw8*J| zXV*)H=2yxf>Q$0BV=6shVZ>HY7ZrYo7}u9?l;X0|)P3Ul-RI(GJujs4G9`c5Cx*h&i8qo_|9uFepXMXw`i=boxt7w`iRnTKAXkuPsg`JL-hEB4n)xhV~5j8 z{jtaA4q#@=UJ-uUCpwa0g%S0m%xxm9zOZ&|90}_JAa9Src|u&=;rUQCL9TMnnt`R( zdz|;r5S(($qZYs(1iBB?>Fa2bQLKY=h=4wcyW7;^egAPU#Q}W7(lWpmAei2zkKkl{ z4NYfJ6px@Mtrfq>zqMl5jLo{0xgLH8`(`Hap`s?~_Mud7KKplQ+E--fDs)@)PXKP1 zaAb&Z*f*+T^8pZabbhbQ`C{PY56I^Sdlf z#=)j9R%uu!;^!!sN!~@v2S|=X_)x`tck#HF5I7oY%^;~79eoHExE7DZ@gU;h!+sUGO2=>2Eey68usY_oJVH<;djq!-o}X3zxYz zH_zC(Sex4<<*U#?co|gXk(R!R6^x9;%_nR>52vRWZrnRPh%g=vSe zjO>A&_}4bU*Q=)x@YyB1uRg+&AIi>e0cN-$$1>W9n}jP?{jiA2^I*?s*V@TyjO}$S zv^Qd0uuesjD23?As@I!#{DIf_*Xeqi^Kc${tI^KOr|zZ&=IOOgj#ik%wc%v(WAG~- ztnuO;cD7`@t)1kYbN?tUOM6*6H(K+>{_tPq@e=_-;1cAxJUt3TYq1Js0Y=`35DW(i zGVwepsvCbbX;Yk@QLn|Hu1l7`iHT!d zk-U#)DSYX@yd4_^6MshhI1|@{MZVzdE z&mL{T<-?vHg3^)Kx@5Yaf1bf*jjXNXXLF?W{5P}=eQ!!9`*IN~7ONuU+G-PQWgh;T zMPiaC`zXc+N&x3_s_HSb{&~@)8rZaTmq*R{j-T4aUp^U70IM$CvZ)~>MAr(^U$}A zMHBp{zyBFxCIok(iKi~*IZckkttGbb!XYB_gU?5jEZVBt8*v;#oge~oZQRnMS8*G) zm~J!COtTT59$Et#x_78wndq6FwZ>L3bxuVYQc#(A9_YX&?aZ)B9R^>8;@8ml*j=yK z^REV#ZI}TMf=065m%T#~>3;aqHq^+SZXS)b;=($1`}SSpg*Fr`0b(`r=!=x*ow7BG zsOxdt-o&nEmp3Ysg+8KQ=kt-Lp4|6j9iS~qy|;7Td2uvyvZy_C1@vJZJsUWqw7`&gA&vm&h(u%o@jP`|*C5uj zTs*bkz+SBSh$S4BUdYl?%QF~I!aJPWiOC2L3Q2udf`%HrDrN!x-0DJ`p8Uo)32P!; zV?ya!4EK2eeg{dSE|I?l9{x6XSdRJIw5bS0OT43E^rK!Lox%S*5jqSm6}|fNX0%3w zWgEE?M&0nNm-^2zqD~!cRl`E}AH93xm;&PnsfIVj!;U(pgzAyFW12IUsmm)#8+y1XQNvF0cAf3I=6~L zp^D^Bb?91=vRWIQZ{@P09tEC+lWTK&2($v!bcjuZj-kTbO~u$}*3i)Y4ksu!7e^S$ zJ%ecqU4`u0k^xBa)K!95C$-9+YJ_d(&>>;e^h->$8Z(z1V{M0dt6&<2r+%fDXy+`wra+L=msKuNDyiv{jiRG#8H{Rd73x--pHPu)VR3F5HcAN^i7p$9j|-s{6W7De+Mdgq9uKoS~a%g!($(; zPkL;kPM&e&`qt##1RTaI$w{O7S}$5e&xRu=AFq!I60o* zJ;KN6`$*uE_weckJ3Q!KaN-c5B`uG8kEfuc+rqKD{zA_(LsuGqAPKM5CL=NlK-k?O z@etd#F-|vDn$%ZJ4XSO)MW&5wjq-k_-a?p1#ZiNlj&Xl;m+F0G?>b+B$EB=8#2)W% z&D>xM)UY)`=&g${^D(1(hOu->1>t|ofJrfLN8!)d?vR-523%&__wi(qMf-j%zV#0vEu+31j4qZ8wq zr*2W)(uN-=zt1_cRWQupMO4hUYdK`ws6*v!-OUc_mLxmZ8{}G^#saE%);&P-bs=(8 zpZ{;1@{g`0(+bjkoBM0?`NXrZB`rHm#%-l%m#8>?J8gR=ZN~9;rH4ey%)_&H=pLuA zF9z8;{_S0}DZIskbYO>c^0AY%&79&6E?BQx8yUEyt8K;DXV<3|j!6Zp)aX`)3XpQ6 zuC3z|@ZRm#C=yU5lN8batbO4qbtWM#of5?#sJ~$W{I*MYqt_iN7|6lvmn&7 z(n#Z+qFe#iRzu28ZUamM#%)8J?1M?Lo&=JNWYM zuwM@;E!Djc#WBGxR0mZo=7Sw0eDNect|GR%Ls^twXoNAXIUd$4`nMbM1;a98y-3H< z-n99u@H^f936VA&^)RMP$!S$lG0COxv1+!>!FeoYe%G>2irlZ6Ja{b_RB9=UHgf~y zalZe>3Zwh5W@!TvHpubC|8f{Vv*X+pXoMG7S|s;q&mqcaZJkZck31-Kgof6y3hSMo zh zGT}*GRB+cdk14FeUzX#eERD7ZR9d1KEAEm@-7^ z=MhRUo_P~~6@0zqQ8EIhQ>RGtTICX2$||OUe!d|}!3h1$KbA+!u1#&LadCM4##=Hw ztQ;XESTOzD&@O3^b5@5j>VRCmZBFnx{jrCameFwV)?njymsDFT{crKz)dTIqB=cxT zW{#>D>zQrww>_U14d#oO+ES80HGTd2K|8<9uk-kDM9@iMXul)%3&svjO5L2&>a@7? z!}TbCA@}AxTfRstOxJVx*#V#Qga+`>r%9|r1WwVXd8|)S^}&m~p3a?XwXe%0-xCIN zzDxi6TpB^?A59gZifsgxa3a_w>{z(%L{yN|zbuh0FTWH|jq3xe8geZU~)Z97| zSNql?=`p~Gmgjwt?5u(D`x%CLtf5oW(h=G|Wrpm8VDG!E@auXg?)5#keAKY{U}M*W zit$%nU0`I~-LTPiF6gEXKev#>2X;^MKX*I1_*WBw6?e|APu)CDj~us?l1d;e#I}(8 zLae%h16{nuTKtnSLdSQ7N(i(S#;?Aro+!)slfB>vgk0~T32p^MoIX8FY5JP(dh@=e z&!V0*=n)R3e0blnG7?ChZt{6?S)1>FIBA{-jXebg#SfNhb)25n6w^0$%eymm|Iwxq zBSV<s&X&D8>I0^4$jo)g($pdBlyl$MP^-W1fUBGEhWwu;scsc#5o1PY zz7yeVb*{(*xwf2wVwSD3FFr)mn4H!ls(&B6I$ADIGFo%`2ZVTd64Pkf;-4H_EZvSB zW!_nQ`A%1Z5h4xb`KQS-Sk;8syZyup6CkB6z@b_PylSm``M7P#npSe>jef{=UD4;no`V=qX--B9$7p*mf-eXQ27;{7D-;_YYhLZ_8wT~krmos&@6YFFURH!4xcygtdU;aQc@kS_V) ztYPyGSDHICH!({SLJ?oZxUcf3GMA)-E*2;6SdPb7deMyH#}=nP)t`b~kS>)Z3|DtH z@*a3#|LL9W^@po%i~fT%ndiErB}gc4@pt`s0-cIfN_W#0Yp%ko;{S;KvE0Xx9}{OW zO4Y02WYap2{XY`Ioq1?!UW-_G6?n&R50g7 zH->{^XUNFg9n=9s_u8Ye7VbfpgAI2Mc4X5!T@vo0-{7$*FIC#AHWT`DMkq zYv70AMp!{fSL+{LIOi@N6!SH)7%QF-Zjapsev`kMbWI_GLLb+SKJM5l?8r8f+%!#= z04^U~OlHxN?Ij-4aOR>9z9|itZzkM!o_8f% zcH*;zOdZ*gI@qL@<7Zm)+8aW ztWA$cBhF5W3SSu4E7Ri+SrhnjJRuu1m(m9ceILfxaBz-rT9rc(Si{J*EAJtFB&ndE zI6i&>##N0WIAd&$>5(!{0Si+T@}4Ia-wJV|Oz-dZOI}GfR>Dbsbw6DmOPu{|Xx%55 zw8psKKI*>}YVP~ZH75JVQawh8DVv& zno5*RR#y){MJiIi4A;V{Nja%4uZSfrIVzh!pz-a{`{qU z=B-dfp;Nm__Jilo`JzCH{>Zk_4+n-uFM9XP+t--P=UOhFYNlQClp?*K^O`kB5Q-Bm zMYZ9djQS3n_TlhK5tLl5w;J*ttPTmKnX@xT2w{_r{iV#ukEGP@>7BaT;8Q<#P00O@ z)2q%9{P#JqhULLn17B;+J2#Qg2igO@lY}m=+%kA?OOS#ZWI+GTGeSzfC(}3+{AR6( z*Iv^bPw*zLq32rrV0n-Z8m0);iSBua65}K_8P#EFycc_IvT}+BBcEFqQ|^T;1s7pCbV$ldwbz};Q3n6k8-5=(_|)sh}Nf3 zbfmw%p|(wfQ;D5jCc2rdlaTOk(UY(#zUo&Td@{%lF|+O#MYRpbgSOg(_TPPdwmd?` zg=1nr*@0oVvLxI7h{{G*+1`5Vn{;!IXaA~P_Cn32RG47lAxH1q6z(X-VP(%y?u;$r5`5Ba99#!dU&03<}IUp+-nRZJ{%gF zJUg2dS^jo(#%(YIGPrxTg~<4IV{@BkizgaT4cz0N8uu$Nt!{r8V=y+f^JP-K940fQ zc4^jQ`?YguQe-gj+b1^N(LLr4kp$-xdha)@-$g9Un%V;t8taghjc*f8AGq~k}- z(a_}Ni^|#ES01;MU&@u>o+%j(Un|vI=225$Y0YlbB2E`RsyjnI9;}SWk>J=Y{AqN1 z9d;o%Raw>cC4lZWG$uy9Tw88ULG<#vs`9hhi;j2m&ZZsi28dU`we4P`!(SN~@S!90 z3{x{L_Kqd>0`UXfpdH>j%ab#ebx`|iaM9y-(@#}HeA0j=i`J&{$PEAKp3 zKj)w`(UGsX;Y~GB*k9fK&-%2U{}$(t!R%afZRY>xtD<(hbvWBe3H;JrI{D>&C-3LE z-M(w)bYPX)GV|NRop;j;_jZ)Q2L)bJgDj-qhfr%mnj!j-oUBT?E*Jp{%;A=sm3w}3`N$sls7zX}*&1G|e zSb>HWH;T9m+CZ#PA|KF0*M;+>FH_J2k=Pzp`oo+%iohUF9v^&WsH+1~i7JdgOk^pL z$i=x8Ekuij-hEw(E1*IV?9_dBHvDQA>Mjx$R9T63^^e&@!C;&?R{4g*s)B{s+8lU! z;ZLA_g+T>3(k=^23cJ;JIg3kBj>o?Uy97IQ)D2_&0aa;NqZOxDFk_WGE;dVz==dkk zM!M2{MX`aw8ldnP`Np5qOGDIk58KH4w3bmC{)XrN>^x_?3eecOt6$ zwJgyFy(X6O5iqtqtytlos%cv-w0?CS_ru3~3_YIG)1W(t;UwZ)?D`+3_rJU%#+E|4 zFSeaUU97^KoTL87r)PJvL7`8&O*q%E;Im1mZILu$a_^D~J3ZOwL&^`d6YQCom>f8@ zo$%TReu~ytB%dgCa&GfopErjE{rU4p{yc*PQWjEY?lUzVW~4jFSBu<&REO)qDB}5* zxtiEAyE=&!fbj{W7066dc-ZSwq-4hTjE>L;Y9%m>4)P}04_XP7$>$5Lps{VtI$z)w z;W^PSvdiBoCZ)WgVi@zhp;9k?CDGp|?ophDtfEzanpMHG&2M{Uv7ucH_bgOCoFoY$76Mh)O5>(3;Ufzo*Am*FBxwX(~&S<9$lZK{8)uft< z4Gm8@`Os(TnKkzBEq+b$Hhd0n`83bQ5X|y94LaW9c=`>0fCGOzpXPzdG}dcXFYehM zyG%0y>*}l6VspDv_;ZZwx+rF&bjOSt@SMReDx5~Zj`@v~l!GNGu@3dFCE1)QuzeH9?x=lb>G z0;Hd78*!b}$xZF7QB>vpc0>!`ysoow>d#!hQVp~PY9l6mHlwV_%2w$DauD_5N5mA` zp4O-}IS;u@M*(T=TA1-6B0w~G_w6r0J|}pN23%H$u9~VVV|eqHg>UzD+z;KjhP@7` zn7cwsKFp{(BholN{HKNJeYnEzXF(+`!ZWk3th)|UyKzlt`!yG?fBd6p*bF$mq0>xT z2iYo)A5YnW7O}|R-~aFIdW<^`Gp?zP%ogzvtod$^5-U%3X7!t$=*4mj0R9)woY%Is zWexmuB^bDWKleRoYsl*S|5LG+Ew(NC2x+rHF{y(|ubqQEKub`AGR}?@u#A?WYK=w} z<_uaPjJS8HDi!myK1c|kw%eP_!<$Wz8Te^az`VjY-~e|O z8Q(7jdDb??FT^swD&j%kJ~gAcAQYTPhkn1JKW1Ys67sqp(4E5 zSe@B+64a~J*y8=Qq(16s^Fl)Uogco$lszKV4<$;nh_W{f7eZ#7nosDTYvTrfHK*1Q zoZfK6N7gLP^wA`Qz3{~yUGp4yHvM&Pu{3s{LYukIvbegBs25zq$iEfzG?FNL@O5KI zTR5E(Vtzl!GtVD!{&Zishy#iR#Cz80TgUPt*RDcSpzbnDimvK`igm*Gs;;hYcmjt% zzE+RY&i@_B3lIzrzm?SuE`!c3ifR$LoWv2Udp@MaAGR!kvyKRXg{~%hX>*p)hF6nD z_aI^~6gPg<)uCkS2{1_dmlcTlUtZ5z9;Gz$a(Pct&+zy>#dF0Ltj+|>>N<|O-wTEg zvhWh4gu`-OUPs7z{42I<@2&eX$PV@zVC>$Aa~p)O=K2?ADGr)<0)_@Hr4Jj zzYwc>EiN)85SLKJzB;x)5zcn6It*fc8E0qJGA!bDQPtT0)0EGvqLVxVtR0=lvN1YK zT*R|EO1bC~?$9=IQ$rCdyU`4BOB&x>KSTe(|Dl`J9gEKNoeDOgJ4uHWVVT1ji%zS=helLmj!k0tdx^I$wt*ZZlK18fgVnVf82eQHDX+T!qXR(o MiKb$uyhZT;2V(@uiU0rr diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index e23288dedb93a0ed69d4cb900346c0b1eb85013b..caf9de716f572406e0faff3be05572e6fbecafdd 100644 GIT binary patch delta 8832 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 Xlc^hkul|t^2L2u?sUu4ijNbnb9`RNH delta 8439 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 From 4530579e13c8c7375ae6a9b123c2cd10b0fae136 Mon Sep 17 00:00:00 2001 From: Leo Date: Sat, 22 Apr 2017 23:23:04 -0300 Subject: [PATCH 09/97] Fixes chameleon guns projectile --- code/modules/clothing/chameleon.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index b15378c3b30..ce8cbcd04c9 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -455,8 +455,7 @@ if(v in blacklisted_vars) continue vars[v] = initial(vars[v]) - if(chambered.BB) - qdel(chambered.BB) + QDEL_NULL(chambered.BB) chambered.newshot() /obj/item/weapon/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE) From 77a238a6112c6acd588b46c9601022681caee710 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 23 Apr 2017 05:01:10 -0700 Subject: [PATCH 10/97] Update human.dm --- code/modules/mob/living/carbon/human/human.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e2aa7535d2d..b3375194db4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -923,15 +923,16 @@ riding_datum = new /datum/riding/human(src) if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS)) return - if(iscarbon(M)) - if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) - M.visible_message("[M] can't hang onto [src]!") - return - if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!! - M.visible_message("[M] can't climb onto [src]!") - return - . = ..(M, force, check_loc) - stop_pulling() + if(do_after(M, 15, target = src)) + if(iscarbon(M)) + if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) + M.visible_message("[M] can't hang onto [src]!") + return + if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!! + M.visible_message("[M] can't climb onto [src]!") + return + . = ..(M, force, check_loc) + stop_pulling() /mob/living/carbon/human/unbuckle_mob(mob/living/M, force=FALSE) if(iscarbon(M)) From 85ec546d4b081201e68db7a738b6f5e6831ca83e Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 23 Apr 2017 05:03:46 -0700 Subject: [PATCH 11/97] Update human.dm --- code/modules/mob/living/carbon/human/human.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b3375194db4..102e5abd410 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -923,6 +923,7 @@ riding_datum = new /datum/riding/human(src) if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS)) return + visible_message("[M] starts to climb onto [src]...") if(do_after(M, 15, target = src)) if(iscarbon(M)) if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) @@ -933,6 +934,8 @@ return . = ..(M, force, check_loc) stop_pulling() + else + visible_message("[M] fails to climb onto [src]!") /mob/living/carbon/human/unbuckle_mob(mob/living/M, force=FALSE) if(iscarbon(M)) From 5bd06b88c2054140efd7c04df1462a71eee0f8c2 Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Sun, 23 Apr 2017 16:28:41 +0100 Subject: [PATCH 12/97] Fixes turfs on Omegastation :cl: coiax fix: The vent in the Escape Coridoor on Omega Station has been fixed. /:cl: - Added some warning lines - Fixed some of the bad turfs from the decals refactor - Removed all roundstart active turfs on Omegastation. --- _maps/map_files/OmegaStation/OmegaStation.dmm | 415 ++++++++++++------ 1 file changed, 292 insertions(+), 123 deletions(-) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index cf8c406eb5e..1d6e417a5d1 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -2398,10 +2398,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aea" = ( /obj/machinery/conveyor{ @@ -2415,10 +2412,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aeb" = ( /obj/machinery/conveyor{ @@ -2429,10 +2423,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aec" = ( /obj/machinery/conveyor{ @@ -2448,10 +2439,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aed" = ( /obj/machinery/conveyor{ @@ -2461,10 +2449,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aee" = ( /obj/machinery/conveyor{ @@ -2483,10 +2468,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" - }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aef" = ( /obj/machinery/conveyor{ @@ -4519,9 +4501,10 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/end{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating{ tag = "icon-plating_warn_end (WEST)"; icon_state = "plating_warn_end" @@ -4537,10 +4520,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "ahp" = ( /obj/machinery/conveyor{ @@ -4551,10 +4534,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, -/turf/open/floor/plating{ - tag = "icon-plating_warn_side (EAST)"; - icon_state = "plating_warn_side" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/turf/open/floor/plasteel, /area/quartermaster/storage) "ahq" = ( /obj/machinery/conveyor{ @@ -4569,6 +4552,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating{ tag = "icon-plating_warn_side (EAST)"; icon_state = "plating_warn_side" @@ -4584,6 +4570,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating{ tag = "icon-plating_warn_side (EAST)"; icon_state = "plating_warn_side" @@ -4606,6 +4595,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating{ tag = "icon-plating_warn_side (EAST)"; icon_state = "plating_warn_side" @@ -5036,6 +5028,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/quartermaster/storage) "aif" = ( @@ -11429,9 +11424,7 @@ dir = 4 }, /turf/open/floor/plasteel/green/side{ - dir = 5; - initial_gas_mix = "n2=100;TEMP=80"; - tag = "SERVER" + dir = 5 }, /area/atmos) "arz" = ( @@ -12047,7 +12040,7 @@ layer = 2.9 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/mining) "asv" = ( /turf/open/floor/engine/n2, @@ -26169,7 +26162,7 @@ }, /obj/structure/shuttle/engine/heater, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/escape) "aPF" = ( /obj/structure/window/reinforced{ @@ -26178,7 +26171,7 @@ /obj/structure/shuttle/engine/heater, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/escape) "aPG" = ( /obj/structure/grille, @@ -26758,7 +26751,7 @@ "aQE" = ( /obj/structure/shuttle/engine/propulsion, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/escape) "aQF" = ( /obj/machinery/light{ @@ -27771,10 +27764,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (WEST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/medical/research{ name = "Research Division" }) @@ -27788,10 +27778,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (EAST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/medical/research{ name = "Research Division" }) @@ -29350,7 +29337,8 @@ }) "aVC" = ( /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/medical/research{ name = "Research Division" @@ -29802,7 +29790,8 @@ dir = 4 }, /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/medical/research{ name = "Research Division" @@ -37061,10 +37050,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (WEST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/toxins/xenobiology) "biD" = ( /obj/machinery/shower{ @@ -37080,10 +37066,7 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/turf/open/floor/plasteel/white{ - tag = "icon-white_warn_end (EAST)"; - icon_state = "white_warn_end" - }, +/turf/open/floor/plasteel, /area/toxins/xenobiology) "biE" = ( /obj/structure/sign/xenobio, @@ -37583,7 +37566,8 @@ "bjw" = ( /obj/machinery/atmospherics/pipe/manifold/general/hidden, /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/toxins/xenobiology) "bjx" = ( @@ -37593,7 +37577,8 @@ dir = 9 }, /turf/open/floor/plasteel/vault{ - dir = 8 + dir = 8; + initial_gas_mix = "n2=100;TEMP=80" }, /area/toxins/xenobiology) "bjy" = ( @@ -37757,7 +37742,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "bjO" = ( /turf/closed/wall/mineral/plastitanium, @@ -37914,7 +37899,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "bjX" = ( /obj/structure/grille, @@ -38933,14 +38918,7 @@ "bmh" = ( /obj/machinery/atmospherics/components/unary/vent_pump{ dir = 1; - external_pressure_bound = 0; - frequency = 1441; - id_tag = "o2_out"; - initialize_directions = 1; - internal_pressure_bound = 4000; - on = 1; - pressure_checks = 2; - pump_direction = 0 + on = 1 }, /turf/open/floor/plasteel, /area/hallway/secondary/exit{ @@ -41743,6 +41721,197 @@ "bvf" = ( /turf/closed/wall/r_wall, /area/engine/supermatter) +"bvg" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvi" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvm" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvn" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvo" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvp" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvq" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvr" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvs" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvt" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvu" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvv" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvw" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvx" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvy" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvA" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvB" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvC" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvD" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvF" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvG" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvH" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvI" = ( +/obj/item/weapon/pickaxe/emergency, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvJ" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvK" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvL" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvM" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) +"bvN" = ( +/turf/open/floor/plating/airless/astplate, +/area/ruin/unpowered{ + name = "Asteroid" + }) (1,1,1) = {" aaa @@ -71389,7 +71558,7 @@ aad aad aad aad -aac +abj aaW aad aad @@ -71646,7 +71815,7 @@ aad aad aad abi -aac +abj abi abi aad @@ -71683,9 +71852,9 @@ aJp aRF aSP aEt -abi +bvo aad -abi +bvr aad abi aad @@ -71903,8 +72072,8 @@ aad abi aik aaW -aac -aac +abj +abj abu abP aad @@ -72158,11 +72327,11 @@ aac aad aad aad -aac -aac +abj +abj abS -aac -aac +abj +abj acD aad abi @@ -72201,11 +72370,11 @@ aUR aVL aUR aUQ -abi +bvu ahu aad aac -acD +bvI aad aac aad @@ -72415,9 +72584,9 @@ aac aad aad aaW -aac +abj abu -ajP +aaV aad abS aad @@ -72445,11 +72614,11 @@ aHl aIi aJs aKz -buX +buW aMR buZ -bva -bvb +buZ +buW aQL aRI aSS @@ -72458,10 +72627,10 @@ aUS aUU aWz aVL -abi +bvv ahu -abP -abu +bvG +bvH aad aad aad @@ -72676,7 +72845,7 @@ abu abu aad aad -aac +abj abi anx anx @@ -72706,7 +72875,7 @@ aLP aMS aMS aOC -bvc +buW aQM aRJ aST @@ -72715,8 +72884,8 @@ aUR aUU aWz aUQ -abP -abi +bvw +bvD aad aad aad @@ -72930,9 +73099,9 @@ aad aad aad abu -aac +abj aad -ajP +aaV abP amG anx @@ -72972,8 +73141,8 @@ aUS aUU aWz aVL -abu -abP +bvx +bvE aad aad aad @@ -73229,8 +73398,8 @@ aUT aUU aUU aUQ -abu -abi +bvy +bvF aad aad aad @@ -73486,7 +73655,7 @@ aUS aUU aWz aVL -abP +bvz aad aad aad @@ -73734,7 +73903,7 @@ aLT aMW aMW aOD -bve +buW aQQ aRN aSX @@ -73743,7 +73912,7 @@ aUR aUU aWz aUQ -abi +bvA aad aad aad @@ -73987,11 +74156,11 @@ aHr aIo aJw aKE -buY +buW aMX aMX aMX -bvf +buW aQR aRO aSY @@ -74000,7 +74169,7 @@ aUS aUU aWz aVL -abi +bvB aOH aZo baj @@ -74767,11 +74936,11 @@ aQT aRR aTa aEt -abi -abu -abP -abi -abi +bvp +bvq +bvs +bvt +bvC aOH aZr bam @@ -88596,9 +88765,9 @@ aaa aad aad aad -abu -abP -abP +bvg +bvh +bvj adn aec aeS @@ -88665,7 +88834,7 @@ bhj bhT aRz aad -abu +bvN aac aad aad @@ -88854,7 +89023,7 @@ aaa aac aac aac -abu +bvi aad adn aed @@ -88921,7 +89090,7 @@ bgv bhk bhU aRy -abu +bvJ aac aaa aaa @@ -89178,7 +89347,7 @@ bgw bhl bhV aRy -abu +bvK aaa aaa aaa @@ -89387,9 +89556,9 @@ acv aph aqp abt -abP -abP -abu +bvk +bvl +bvn aac aac aae @@ -89645,7 +89814,7 @@ api amD amC amC -abu +bvm aac aae aae @@ -89692,7 +89861,7 @@ bgy bhk bhX aRy -abu +bvL aaa aaa aaa @@ -89949,7 +90118,7 @@ bgz bhk bgw aRy -abu +bvM aac aaa aaa From bee69ddcd95609fb9d42fc5c0e0ec224e5bbb0ed Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Sun, 23 Apr 2017 17:45:20 +0100 Subject: [PATCH 13/97] Removes active turfs from Pubby, Box and Crashed Ship ruin --- _maps/RandomRuins/SpaceRuins/crashedship.dmm | 3 +- _maps/map_files/PubbyStation/PubbyStation.dmm | 129 +++++++++++------- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 18 +-- 3 files changed, 88 insertions(+), 62 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 192657641fd..b4d65c7bd9b 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -2184,7 +2184,8 @@ /turf/open/floor/plating/airless, /area/awaymission/BMPship/Fore) "ge" = ( -/turf/closed/mineral/random, +/obj/machinery/door/airlock/silver, +/turf/open/floor/plating, /area/awaymission/BMPship/Midship) "gf" = ( /obj/machinery/light{ diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 631433a5a73..e0e721840d8 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -29590,9 +29590,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel/whiteblue/side{ - dir = 9; - initial_gas_mix = "n2=100;TEMP=80"; - tag = "icon-whiteblue (NORTHWEST)" + dir = 9 }, /area/medical/medbay3) "bhO" = ( @@ -29631,9 +29629,7 @@ pixel_x = -32 }, /turf/open/floor/plasteel/whiteblue/side{ - dir = 9; - initial_gas_mix = "n2=100;TEMP=80"; - tag = "icon-whiteblue (NORTHWEST)" + dir = 9 }, /area/medical/medbay) "bhS" = ( @@ -48652,17 +48648,23 @@ pixel_y = 24 }, /obj/structure/cable, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTt" = ( /obj/machinery/power/terminal{ icon_state = "term"; dir = 1 }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTu" = ( -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTv" = ( /obj/machinery/telecomms/bus/preset_three, @@ -48726,20 +48728,28 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/plasteel/darkred/side, +/turf/open/floor/plasteel/darkred/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTD" = ( -/turf/open/floor/plasteel/darkpurple/side, +/turf/open/floor/plasteel/darkpurple/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTE" = ( -/turf/open/floor/plasteel/darkgreen/side, +/turf/open/floor/plasteel/darkgreen/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTF" = ( /obj/machinery/light{ dir = 4; icon_state = "tube1" }, -/turf/open/floor/plasteel/darkgreen/side, +/turf/open/floor/plasteel/darkgreen/side{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bTG" = ( /turf/closed/indestructible{ @@ -48826,17 +48836,20 @@ dir = 8 }, /turf/open/floor/plasteel/darkblue/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTS" = ( /turf/open/floor/plasteel/darkblue/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTT" = ( /turf/open/floor/plasteel/darkyellow/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTU" = ( @@ -48845,7 +48858,8 @@ icon_state = "tube1" }, /turf/open/floor/plasteel/darkyellow/side{ - dir = 1 + dir = 1; + initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) "bTV" = ( @@ -48896,7 +48910,9 @@ /obj/item/weapon/stock_parts/subspace/amplifier, /obj/item/weapon/stock_parts/subspace/analyzer, /obj/item/weapon/stock_parts/subspace/analyzer, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUc" = ( /obj/structure/table, @@ -48904,7 +48920,9 @@ /obj/item/weapon/stock_parts/subspace/ansible, /obj/item/weapon/stock_parts/subspace/crystal, /obj/item/weapon/stock_parts/subspace/crystal, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUd" = ( /obj/structure/table, @@ -48912,7 +48930,9 @@ /obj/item/weapon/stock_parts/subspace/filter, /obj/item/weapon/stock_parts/subspace/transmitter, /obj/item/weapon/stock_parts/subspace/transmitter, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUe" = ( /obj/machinery/camera/motion{ @@ -48921,7 +48941,6 @@ network = list("SS13","Telecoms") }, /turf/open/floor/plasteel/black{ - name = "Mainframe Floor"; initial_gas_mix = "n2=100;TEMP=80" }, /area/tcommsat/server) @@ -48931,7 +48950,9 @@ /obj/item/weapon/stock_parts/subspace/treatment, /obj/item/weapon/stock_parts/manipulator, /obj/item/weapon/stock_parts/manipulator, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUg" = ( /obj/structure/table, @@ -48939,13 +48960,17 @@ /obj/item/weapon/stock_parts/console_screen, /obj/item/weapon/stock_parts/micro_laser, /obj/item/weapon/stock_parts/micro_laser, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUh" = ( /obj/structure/table, /obj/item/weapon/stock_parts/scanning_module, /obj/item/weapon/stock_parts/scanning_module, -/turf/open/floor/plasteel/black, +/turf/open/floor/plasteel/black{ + initial_gas_mix = "n2=100;TEMP=80" + }, /area/tcommsat/server) "bUi" = ( /obj/machinery/camera/motion{ @@ -83827,33 +83852,33 @@ bQl bQC bQN bQZ -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg -bRg -bRE -bRg -bRg -bRg +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ +aeZ +afy +aeZ +aeZ +aeZ bSp bSu bSC @@ -97895,7 +97920,7 @@ aaa aaa aGT aOx -cii +aPw aKE aPw aSs diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index c390a0cf06b..aa5e44a5210 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -13925,7 +13925,7 @@ dir = 4; icon_state = "burst_r" }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aEy" = ( /obj/structure/shuttle/engine/heater{ @@ -13935,7 +13935,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aEz" = ( /obj/machinery/power/apc{ @@ -14460,7 +14460,7 @@ dir = 4; icon_state = "propulsion" }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aFG" = ( /turf/open/floor/plasteel/arrival{ @@ -16630,7 +16630,7 @@ dir = 4; icon_state = "burst_l" }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "aKj" = ( /obj/machinery/door/firedoor, @@ -58780,7 +58780,7 @@ dir = 8; icon_state = "propulsion_l" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cxu" = ( /turf/closed/wall/mineral/titanium, @@ -58816,7 +58816,7 @@ dir = 8 }, /obj/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cxz" = ( /obj/machinery/computer/shuttle/ferry/request, @@ -58844,7 +58844,7 @@ dir = 4; pixel_x = 0 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cxE" = ( /obj/machinery/door/airlock/titanium, @@ -60967,7 +60967,7 @@ dir = 1; pixel_y = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/transport) "cCz" = ( /obj/machinery/door/airlock/external, @@ -63393,7 +63393,7 @@ name = "arrivals"; width = 7 }, -/turf/open/floor/plasteel/black, +/turf/open/floor/plating/airless, /area/shuttle/arrival) "cIh" = ( /obj/machinery/door/airlock/external{ From 7ddea10cd785ce2b8ebe830c5eee7cf0af2a8826 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Sun, 23 Apr 2017 21:16:10 -0400 Subject: [PATCH 14/97] Exploit whack-a-mole --- code/__HELPERS/type2type.dm | 2 +- code/_globalvars/lists/names.dm | 36 +++++++++---------- code/controllers/configuration.dm | 6 ++-- code/controllers/subsystem/ticker.dm | 6 ++-- code/datums/ai_laws.dm | 2 +- code/datums/helper_datums/getrev.dm | 2 +- code/game/objects/items/weapons/AI_modules.dm | 2 +- code/modules/admin/admin_ranks.dm | 4 +-- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/whitelist.dm | 2 +- code/modules/awaymissions/zlevel.dm | 2 +- code/modules/games/cas.dm | 2 +- code/world.dm | 4 +-- tools/Redirector/Configurations.dm | 4 +-- tools/Redirector/textprocs.dm | 2 +- 15 files changed, 39 insertions(+), 39 deletions(-) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 92636ee9dc1..3fb38839804 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -72,7 +72,7 @@ return . //Splits the text of a file at seperator and returns them in a list. -/proc/file2list(filename, seperator="\n") +/world/proc/file2list(filename, seperator="\n") return splittext(return_file_text(filename),seperator) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index 7b34552e35d..0853a10aeb7 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -1,23 +1,23 @@ -GLOBAL_LIST_INIT(ai_names, file2list("config/names/ai.txt")) -GLOBAL_LIST_INIT(wizard_first, file2list("config/names/wizardfirst.txt")) -GLOBAL_LIST_INIT(wizard_second, file2list("config/names/wizardsecond.txt")) -GLOBAL_LIST_INIT(ninja_titles, file2list("config/names/ninjatitle.txt")) -GLOBAL_LIST_INIT(ninja_names, file2list("config/names/ninjaname.txt")) -GLOBAL_LIST_INIT(commando_names, file2list("config/names/death_commando.txt")) -GLOBAL_LIST_INIT(first_names_male, file2list("config/names/first_male.txt")) -GLOBAL_LIST_INIT(first_names_female, file2list("config/names/first_female.txt")) -GLOBAL_LIST_INIT(last_names, file2list("config/names/last.txt")) -GLOBAL_LIST_INIT(lizard_names_male, file2list("config/names/lizard_male.txt")) -GLOBAL_LIST_INIT(lizard_names_female, file2list("config/names/lizard_female.txt")) -GLOBAL_LIST_INIT(clown_names, file2list("config/names/clown.txt")) -GLOBAL_LIST_INIT(mime_names, file2list("config/names/mime.txt")) -GLOBAL_LIST_INIT(carp_names, file2list("config/names/carp.txt")) -GLOBAL_LIST_INIT(golem_names, file2list("config/names/golem.txt")) -GLOBAL_LIST_INIT(plasmaman_names, file2list("config/names/plasmaman.txt")) +GLOBAL_LIST_INIT(ai_names, world.file2list("config/names/ai.txt")) +GLOBAL_LIST_INIT(wizard_first, world.file2list("config/names/wizardfirst.txt")) +GLOBAL_LIST_INIT(wizard_second, world.file2list("config/names/wizardsecond.txt")) +GLOBAL_LIST_INIT(ninja_titles, world.file2list("config/names/ninjatitle.txt")) +GLOBAL_LIST_INIT(ninja_names, world.file2list("config/names/ninjaname.txt")) +GLOBAL_LIST_INIT(commando_names, world.file2list("config/names/death_commando.txt")) +GLOBAL_LIST_INIT(first_names_male, world.file2list("config/names/first_male.txt")) +GLOBAL_LIST_INIT(first_names_female, world.file2list("config/names/first_female.txt")) +GLOBAL_LIST_INIT(last_names, world.file2list("config/names/last.txt")) +GLOBAL_LIST_INIT(lizard_names_male, world.file2list("config/names/lizard_male.txt")) +GLOBAL_LIST_INIT(lizard_names_female, world.file2list("config/names/lizard_female.txt")) +GLOBAL_LIST_INIT(clown_names, world.file2list("config/names/clown.txt")) +GLOBAL_LIST_INIT(mime_names, world.file2list("config/names/mime.txt")) +GLOBAL_LIST_INIT(carp_names, world.file2list("config/names/carp.txt")) +GLOBAL_LIST_INIT(golem_names, world.file2list("config/names/golem.txt")) +GLOBAL_LIST_INIT(plasmaman_names, world.file2list("config/names/plasmaman.txt")) GLOBAL_LIST_INIT(posibrain_names, list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD","COI")) -GLOBAL_LIST_INIT(verbs, file2list("config/names/verbs.txt")) -GLOBAL_LIST_INIT(adjectives, file2list("config/names/adjectives.txt")) +GLOBAL_LIST_INIT(verbs, world.file2list("config/names/verbs.txt")) +GLOBAL_LIST_INIT(adjectives, world.file2list("config/names/adjectives.txt")) //loaded on startup because of " //would include in rsc if ' was used diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 35f12e4dc51..f0f39e68255 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -293,7 +293,7 @@ GLOB.abandon_allowed = respawn /datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) for(var/t in Lines) if(!t) @@ -785,7 +785,7 @@ /datum/configuration/proc/loadmaplist(filename) - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) var/datum/map_config/currentmap = null for(var/t in Lines) @@ -835,7 +835,7 @@ /datum/configuration/proc/loadsql(filename) - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) for(var/t in Lines) if(!t) continue diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 5d572f8a07a..34dd9d6c41f 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(ticker) var/list/round_start_events /datum/controller/subsystem/ticker/Initialize(timeofday) - var/list/music = file2list(ROUND_START_MUSIC_LIST, "\n") + var/list/music = world.file2list(ROUND_START_MUSIC_LIST, "\n") login_music = pick(music) if(!GLOB.syndicate_code_phrase) @@ -604,8 +604,8 @@ SUBSYSTEM_DEF(ticker) if(selected_tip) m = selected_tip else - var/list/randomtips = file2list("config/tips.txt") - var/list/memetips = file2list("config/sillytips.txt") + var/list/randomtips = world.file2list("config/tips.txt") + var/list/memetips = world.file2list("config/sillytips.txt") if(randomtips.len && prob(95)) m = pick(randomtips) else if(memetips.len) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 576d1080bb7..30b839cef0e 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -190,7 +190,7 @@ /datum/ai_laws/custom/New() //This reads silicon_laws.txt and allows server hosts to set custom AI starting laws. ..() - for(var/line in file2list("config/silicon_laws.txt")) + for(var/line in world.file2list("config/silicon_laws.txt")) if(!line) continue if(findtextEx(line,"#",1,2)) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index f285effc0fb..31d6b384de5 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -8,7 +8,7 @@ /datum/getrev/New() var/head_file = return_file_text(".git/logs/HEAD") if(SERVERTOOLS && fexists("..\\prtestjob.lk")) - var/list/tmp = file2list("..\\prtestjob.lk") + var/list/tmp = world.file2list("..\\prtestjob.lk") for(var/I in tmp) if(I) testmerge |= I diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 9775481b30b..c75b4c7d743 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -409,7 +409,7 @@ AI MODULES /obj/item/weapon/aiModule/core/full/custom/New() ..() - for(var/line in file2list("config/silicon_laws.txt")) + for(var/line in world.file2list("config/silicon_laws.txt")) if(!line) continue if(findtextEx(line,"#",1,2)) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 6c1eecda767..bf7b9dcb1ae 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -105,7 +105,7 @@ GLOBAL_PROTECT(admin_ranks) if(config.admin_legacy_system) var/previous_rights = 0 //load text from file and process each line seperately - for(var/line in file2list("config/admin_ranks.txt")) + for(var/line in world.file2list("config/admin_ranks.txt")) if(!line) continue if(findtextEx(line,"#",1,2)) @@ -175,7 +175,7 @@ GLOBAL_PROTECT(admin_ranks) if(config.admin_legacy_system) //load text from file - var/list/lines = file2list("config/admins.txt") + var/list/lines = world.file2list("config/admins.txt") //process each line seperately for(var/line in lines) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 14abaf9dcb5..f29a04e376e 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -19,7 +19,7 @@ if (!msg) return - var/nicknames = file2list("config/admin_nicknames.txt") + var/nicknames = world.file2list("config/admin_nicknames.txt") var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" diff --git a/code/modules/admin/whitelist.dm b/code/modules/admin/whitelist.dm index b922518812c..095e3dceac0 100644 --- a/code/modules/admin/whitelist.dm +++ b/code/modules/admin/whitelist.dm @@ -5,7 +5,7 @@ GLOBAL_PROTECT(whitelist) /proc/load_whitelist() GLOB.whitelist = list() - for(var/line in file2list(WHITELISTFILE)) + for(var/line in world.file2list(WHITELISTFILE)) if(!line) continue if(findtextEx(line,"#",1,2)) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 382be07fbe6..bea67c994f7 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "config/away /proc/generateMapList(filename) var/list/potentialMaps = list() - var/list/Lines = file2list(filename) + var/list/Lines = world.file2list(filename) if(!Lines.len) return diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index c34325c9041..3858e633a2c 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -28,7 +28,7 @@ card_text_file = "strings/cas_black.txt" /obj/item/toy/cards/deck/cas/New() - var/static/list/cards_against_space = list("cas_white" = file2list("strings/cas_white.txt"),"cas_black" = file2list("strings/cas_black.txt")) + var/static/list/cards_against_space = list("cas_white" = world.file2list("strings/cas_white.txt"),"cas_black" = world.file2list("strings/cas_black.txt")) allcards = cards_against_space[card_face] var/list/possiblecards = allcards.Copy() if(possiblecards.len < decksize) // sanity check diff --git a/code/world.dm b/code/world.dm index 6207483c2dc..75470585e43 100644 --- a/code/world.dm +++ b/code/world.dm @@ -17,7 +17,7 @@ log_world("World loaded at [time_stamp()]") #if (PRELOAD_RSC == 0) - external_rsc_urls = file2list("config/external_rsc_urls.txt","\n") + external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") var/i=1 while(i<=external_rsc_urls.len) if(external_rsc_urls[i]) @@ -251,7 +251,7 @@ world << sound(round_end_sound) /world/proc/load_mode() - var/list/Lines = file2list("data/mode.txt") + var/list/Lines = world.file2list("data/mode.txt") if(Lines.len) if(Lines[1]) GLOB.master_mode = Lines[1] diff --git a/tools/Redirector/Configurations.dm b/tools/Redirector/Configurations.dm index 6b89ace90d5..2966bb8702c 100644 --- a/tools/Redirector/Configurations.dm +++ b/tools/Redirector/Configurations.dm @@ -11,7 +11,7 @@ var/list/adminkeys = list() proc/gen_configs() - config_stream = dd_file2list("config.txt") + config_stream = dd_world.file2list("config.txt") var/server_gen = 0 // if the stream is looking for servers var/admin_gen = 0 // if the stream is looking for admins @@ -43,7 +43,7 @@ proc/gen_configs() // Generate the list of admins now for(var/file in adminfiles) - var/admin_config_stream = dd_file2list(file) + var/admin_config_stream = dd_world.file2list(file) for(var/line in admin_config_stream) diff --git a/tools/Redirector/textprocs.dm b/tools/Redirector/textprocs.dm index b8d49ade72f..5f12d1dc89c 100644 --- a/tools/Redirector/textprocs.dm +++ b/tools/Redirector/textprocs.dm @@ -11,7 +11,7 @@ proc /////////////////// // Reading files // /////////////////// - dd_file2list(file_path, separator = "\n") + dd_world.file2list(file_path, separator = "\n") var/file if (isfile(file_path)) file = file_path From 877d7f962665f4f27d8b32f07c69832a75786a2f Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Sun, 23 Apr 2017 21:17:57 -0400 Subject: [PATCH 15/97] These --- tools/Redirector/Configurations.dm | 2 +- tools/Redirector/textprocs.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/Redirector/Configurations.dm b/tools/Redirector/Configurations.dm index 2966bb8702c..3d5087071ba 100644 --- a/tools/Redirector/Configurations.dm +++ b/tools/Redirector/Configurations.dm @@ -11,7 +11,7 @@ var/list/adminkeys = list() proc/gen_configs() - config_stream = dd_world.file2list("config.txt") + config_stream = dd_file2list("config.txt") var/server_gen = 0 // if the stream is looking for servers var/admin_gen = 0 // if the stream is looking for admins diff --git a/tools/Redirector/textprocs.dm b/tools/Redirector/textprocs.dm index 5f12d1dc89c..b8d49ade72f 100644 --- a/tools/Redirector/textprocs.dm +++ b/tools/Redirector/textprocs.dm @@ -11,7 +11,7 @@ proc /////////////////// // Reading files // /////////////////// - dd_world.file2list(file_path, separator = "\n") + dd_file2list(file_path, separator = "\n") var/file if (isfile(file_path)) file = file_path From 0ed97ad026785b129c5d413743182b72ccd3bef6 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Sun, 23 Apr 2017 21:18:38 -0400 Subject: [PATCH 16/97] Reeee --- tools/Redirector/Configurations.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Redirector/Configurations.dm b/tools/Redirector/Configurations.dm index 3d5087071ba..6b89ace90d5 100644 --- a/tools/Redirector/Configurations.dm +++ b/tools/Redirector/Configurations.dm @@ -43,7 +43,7 @@ proc/gen_configs() // Generate the list of admins now for(var/file in adminfiles) - var/admin_config_stream = dd_world.file2list(file) + var/admin_config_stream = dd_file2list(file) for(var/line in admin_config_stream) From ff4596a6ba25e5626a0c0f3d3f07aeda7b84d6c6 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 24 Apr 2017 10:47:45 +0200 Subject: [PATCH 17/97] Fixes templates/ruins not updating area list --- code/__HELPERS/unsorted.dm | 2 +- code/controllers/subsystem/mapping.dm | 9 ++++++--- code/modules/mapping/map_template.dm | 5 ++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 35e66d5f4b7..8dd0a9e96b6 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -582,7 +582,7 @@ Turf and target are seperate in case you want to teleport some distance from a t return 0 //Repopulates sortedAreas list -/proc/SortAreas() +/proc/repopulate_sorted_areas() GLOB.sortedAreas = list() for(var/area/A in world) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index bae759ac3aa..cff0876da6f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -18,6 +18,8 @@ SUBSYSTEM_DEF(mapping) var/list/shuttle_templates = list() var/list/shelter_templates = list() + var/loading_ruins = FALSE + /datum/controller/subsystem/mapping/PreInit() if(!config) #ifdef FORCE_MAP @@ -32,13 +34,13 @@ SUBSYSTEM_DEF(mapping) if(config.defaulted) to_chat(world, "Unable to load next map config, defaulting to Box Station") loadWorld() - SortAreas() + repopulate_sorted_areas() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() // Pick a random away mission. createRandomZlevel() // Generate mining. - + loading_ruins = TRUE var/mining_type = config.minetype if (mining_type == "lavaland") seedRuins(list(5), global.config.lavaland_budget, /area/lavaland/surface/outdoors, lava_ruins_templates) @@ -54,7 +56,8 @@ SUBSYSTEM_DEF(mapping) space_zlevels += i seedRuins(space_zlevels, global.config.space_budget, /area/space, space_ruins_templates) - + loading_ruins = FALSE + repopulate_sorted_areas() // Set up Z-level transistions. setup_map_transitions() ..() diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index d47c4da04b2..e0588acf2b5 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -51,7 +51,7 @@ return FALSE smooth_zlevel(world.maxz) - SortAreas() + repopulate_sorted_areas() //initialize things that are normally initialized after map load initTemplateBounds(bounds) @@ -74,6 +74,9 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) + if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init + repopulate_sorted_areas() + log_game("[name] loaded at at [T.x],[T.y],[T.z]") return TRUE From b3e2999b4669eabf36bdf318c21f78ff7cc12608 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 24 Apr 2017 10:55:51 +0200 Subject: [PATCH 18/97] Fixes #26520 --- code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 6cfd8473dd7..8b3a68ab365 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -179,7 +179,7 @@ Doesn't work on other aliens/AI.*/ var/message if(active) message = "You empty your neurotoxin gland." - remove_ranged_ability(message) + remove_ranged_ability(user,message) else message = "You prepare your neurotoxin gland. Left-click to fire at a target!" add_ranged_ability(user, message, TRUE) From 423891d2f224db44a3d71cbc334fe4f4a2635964 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 24 Apr 2017 09:46:03 -0400 Subject: [PATCH 19/97] Admin proc calls are now serialized per admin --- code/modules/admin/verbs/debug.dm | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 66863503072..44178ec1498 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -83,17 +83,23 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that to_chat(usr, .) feedback_add_details("admin_verb","Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -GLOBAL_VAR_INIT(AdminProcCall, null) -GLOBAL_PROTECT(AdminProcCall) +GLOBAL_VAR_INIT(AdminProcCaller, null) +GLOBAL_PROTECT(AdminProcCaller) +GLOBAL_VAR_INIT(AdminProcCallCount, 0) +GLOBAL_PROTECT(AdminProcCallCount) /proc/WrapAdminProcCall(target, procname, list/arguments) - if(GLOB.AdminProcCall) - to_chat(usr, "Another admin called proc is still running, your proc will be run after theirs finishes") - UNTIL(!GLOB.AdminProcCall) + var/current_caller = GLOB.AdminProcCaller + var/ckey = usr.client.ckey + if(current_caller && current_caller != ckey) + to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") + UNTIL(!GLOB.AdminProcCaller) to_chat(usr, "Running your proc") - GLOB.AdminProcCall = usr.client.ckey //if this runtimes, too bad for you + GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you + ++GLOB.AdminProcCallCount world.WrapAdminProcCall(target, procname, arguments) - GLOB.AdminProcCall = null + if(--GLOB.AdminProcCallCount == 0) + GLOB.AdminProcCaller = null //adv proc call this, ya nerds /world/proc/WrapAdminProcCall(target, procname, list/arguments) @@ -103,7 +109,7 @@ GLOBAL_PROTECT(AdminProcCall) return call(procname)(arglist(arguments)) /proc/IsAdminAdvancedProcCall() - return usr && usr.client && GLOB.AdminProcCall == usr.client.ckey + return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey /client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) set category = "Debug" From 2ce2fb10c60c1ace82a83f34b87d7b6cd1967613 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 24 Apr 2017 18:54:32 -0700 Subject: [PATCH 20/97] Automatic changelog generation for PR #26491 [ci skip] --- html/changelogs/AutoChangeLog-pr-26491.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26491.yml diff --git a/html/changelogs/AutoChangeLog-pr-26491.yml b/html/changelogs/AutoChangeLog-pr-26491.yml new file mode 100644 index 00000000000..a84c98f989c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26491.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - bugfix: "The vent in the Escape Coridoor on Omega Station has been fixed." From f5646f082ead6a0c46bfdcf73e311341dc108461 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 24 Apr 2017 18:55:18 -0700 Subject: [PATCH 21/97] Automatic changelog generation for PR #26443 [ci skip] --- html/changelogs/AutoChangeLog-pr-26443.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26443.yml diff --git a/html/changelogs/AutoChangeLog-pr-26443.yml b/html/changelogs/AutoChangeLog-pr-26443.yml new file mode 100644 index 00000000000..c5a7877ffc7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26443.yml @@ -0,0 +1,4 @@ +author: "WJohnston" +delete-after: True +changes: + - tweak: "Skeletons and plasmamen's hitboxes now more closely match that of humans. They are no longer full of holes and incredibly frustrating to hit, should they run around naked." From a050b0db6e3d690dddd189b257f6a152295f148d Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 24 Apr 2017 22:21:55 -0400 Subject: [PATCH 22/97] >We still let old code in the codebase (#26506) --- code/__HELPERS/files.dm | 14 -------------- code/__HELPERS/type2type.dm | 2 +- code/controllers/subsystem/job.dm | 2 +- code/datums/helper_datums/getrev.dm | 2 +- 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index f457278eb0f..5983f26950d 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -1,17 +1,3 @@ -//checks if a file exists and contains text -//returns text as a string if these conditions are met -/proc/return_file_text(filename) - if(fexists(filename) == 0) - throw EXCEPTION("return_file_text(): File not found") - return - - var/text = file2text(filename) - if(!text) - throw EXCEPTION("return_file_text(): File empty") - return - - return text - //Sends resource files to client cache /client/proc/getFiles() for(var/file in args) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 92636ee9dc1..304a8968278 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -73,7 +73,7 @@ //Splits the text of a file at seperator and returns them in a list. /proc/file2list(filename, seperator="\n") - return splittext(return_file_text(filename),seperator) + return splittext(file2text(filename),seperator) //Turns a direction into text diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 68e27c9900d..137bd2a2c10 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -448,7 +448,7 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/LoadJobs() - var/jobstext = return_file_text("config/jobs.txt") + var/jobstext = file2text("config/jobs.txt") for(var/datum/job/J in occupations) var/regex/jobs = new("[J.title]=(-1|\\d+),(-1|\\d+)") jobs.Find(jobstext) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index f285effc0fb..428046d8eeb 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -6,7 +6,7 @@ var/date /datum/getrev/New() - var/head_file = return_file_text(".git/logs/HEAD") + var/head_file = file2text(".git/logs/HEAD") if(SERVERTOOLS && fexists("..\\prtestjob.lk")) var/list/tmp = file2list("..\\prtestjob.lk") for(var/I in tmp) From 01efacfe4cb32d4969e51c3a223253d79a841089 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 24 Apr 2017 23:33:53 -0400 Subject: [PATCH 23/97] Fixes map rotation with disabled voting --- code/controllers/subsystem/mapping.dm | 46 +++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 1499bc5029f..dd66f3638e2 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -144,31 +144,35 @@ SUBSYSTEM_DEF(mapping) mapvotes[global.config.defaultmap.map_name] += 1 continue mapvotes[vote] += 1 + else + for(var/M in global.config.maplist) + mapvotes[M] = 1 - //filter votes - for (var/map in mapvotes) - if (!map) - mapvotes.Remove(map) - if (!(map in global.config.maplist)) - mapvotes.Remove(map) - continue - var/datum/map_config/VM = global.config.maplist[map] - if (!VM) - mapvotes.Remove(map) - continue - if (VM.voteweight <= 0) - mapvotes.Remove(map) - continue - if (VM.config_min_users > 0 && players < VM.config_min_users) - mapvotes.Remove(map) - continue - if (VM.config_max_users > 0 && players > VM.config_max_users) - mapvotes.Remove(map) - continue + //filter votes + for (var/map in mapvotes) + if (!map) + mapvotes.Remove(map) + if (!(map in global.config.maplist)) + mapvotes.Remove(map) + continue + var/datum/map_config/VM = global.config.maplist[map] + if (!VM) + mapvotes.Remove(map) + continue + if (VM.voteweight <= 0) + mapvotes.Remove(map) + continue + if (VM.config_min_users > 0 && players < VM.config_min_users) + mapvotes.Remove(map) + continue + if (VM.config_max_users > 0 && players > VM.config_max_users) + mapvotes.Remove(map) + continue + if(global.config.allow_map_voting) mapvotes[map] = mapvotes[map]*VM.voteweight - var/pickedmap = global.config.allow_map_voting ? pickweight(mapvotes) : pick(global.config.maplist) + var/pickedmap = pickweight(mapvotes) if (!pickedmap) return var/datum/map_config/VM = global.config.maplist[pickedmap] From 4d2e52697823bf56b14954626c8e5834b0977660 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Mon, 24 Apr 2017 20:51:46 -0700 Subject: [PATCH 24/97] Changes card program to only require head of staff access to download --- code/modules/modular_computers/file_system/programs/card.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index b959ced6cf4..eec36d6c4c2 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -3,7 +3,7 @@ filedesc = "ID card modification program" program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." - transfer_access = GLOB.access_change_ids + transfer_access = GLOB.access_heads requires_ntnet = 0 size = 8 var/mod_mode = 1 @@ -452,7 +452,7 @@ var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2 if(auth_card) region_access = list() - if(transfer_access in auth_card.GetAccess()) + if(GLOB.access_change_ids in auth_card.GetAccess()) minor = 0 authenticated = 1 return 1 From 39113655ebea329d07a2948cd7ba58722289c58a Mon Sep 17 00:00:00 2001 From: QualityVan Date: Tue, 25 Apr 2017 04:50:44 -0400 Subject: [PATCH 25/97] Fixes flashlight eyes (#26497) * Fixes flashlight eyes * jesus that's a lotta light * Rebasing * test * nothing to see here --- code/game/objects/items/devices/flashlight.dm | 8 ++++++++ code/modules/surgery/organs/eyes.dm | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 62e0667f149..385e177b6f8 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -428,3 +428,11 @@ item_state = "flashdark" brightness_on = 2.5 flashlight_power = -3 + +/obj/item/device/flashlight/eyelight + name = "eyelight" + desc = "This shouldn't exist outside of someone's head, how are you seeing this?" + brightness_on = 15 + flashlight_power = 1 + flags = CONDUCT | DROPDEL + actions_types = list() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 672ac924adb..4ad8b9c518e 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -106,19 +106,27 @@ icon_state = "flashlight_eyes" flash_protect = 2 tint = INFINITY + var/obj/item/device/flashlight/eyelight/eye /obj/item/organ/eyes/robotic/flashlight/emp_act(severity) return /obj/item/organ/eyes/robotic/flashlight/Insert(var/mob/living/carbon/M, var/special = 0) ..() - M.set_light(M.light_range + 15, M.light_power + 1) + if(!eye) + eye = new /obj/item/device/flashlight/eyelight() + eye.on = TRUE + eye.forceMove(M) + eye.update_brightness(M) /obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, var/special = 0) - M.set_light(M.light_range -15, M.light_power - 1) + eye.on = FALSE + eye.update_brightness(M) + eye.forceMove(src) ..() + // Welding shield implant /obj/item/organ/eyes/robotic/shield name = "shielded robotic eyes" From dc0e007a2364b723ce3d05a6529343ee694097b3 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Tue, 25 Apr 2017 04:51:40 -0400 Subject: [PATCH 26/97] A bunch of Initialize()s now have return values (#26464) --- code/game/objects/structures/electricchair.dm | 3 +-- code/game/objects/structures/fireaxe.dm | 3 +-- code/game/objects/structures/lattice.dm | 2 +- code/modules/VR/vr_human.dm | 2 +- .../mob/living/simple_animal/hostile/megafauna/colossus.dm | 4 ++-- .../mob/living/simple_animal/hostile/megafauna/dragon.dm | 6 +++--- .../living/simple_animal/hostile/megafauna/hierophant.dm | 2 +- .../mob/living/simple_animal/hostile/megafauna/legion.dm | 2 +- .../mob/living/simple_animal/hostile/megafauna/swarmer.dm | 6 +++--- .../mob/living/simple_animal/hostile/retaliate/frog.dm | 2 +- .../mob/living/simple_animal/hostile/retaliate/ghost.dm | 2 +- code/modules/mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/modular_computers/computers/item/laptop.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/paperbin.dm | 2 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/rtg.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- code/modules/power/solar.dm | 2 +- code/modules/power/turbine.dm | 6 +++--- code/modules/projectiles/guns/ballistic/bow.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 6 +++--- code/modules/recycling/conveyor2.dm | 2 +- code/modules/research/server.dm | 4 ++-- code/modules/research/xenobiology/xenobio_camera.dm | 2 +- code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm | 2 +- code/modules/shuttle/arrivals.dm | 2 +- code/modules/shuttle/emergency.dm | 2 +- code/modules/shuttle/shuttle.dm | 4 ++-- code/modules/spells/spell_types/lichdom.dm | 2 +- code/modules/spells/spell_types/spacetime_distortion.dm | 2 +- code/modules/station_goals/dna_vault.dm | 2 +- code/modules/surgery/organs/autosurgeon.dm | 2 +- code/modules/surgery/organs/tongue.dm | 6 +++--- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/vehicles/pimpin_ride.dm | 2 +- 40 files changed, 53 insertions(+), 55 deletions(-) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index c44181f9719..929cfaee993 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -42,6 +42,5 @@ var/mob/living/buckled_mob = m buckled_mob.electrocute_act(85, src, 1) to_chat(buckled_mob, "You feel a deep shock course through your body!") - spawn(1) - buckled_mob.electrocute_act(85, src, 1) + addtimer(CALLBACK(buckled_mob, /mob/living.proc/electrocute_act, 85, src, 1), 1) visible_message("The electric chair went off!", "You hear a deep sharp shock!") diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 970f1d594b4..e2331e13dc7 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -19,8 +19,7 @@ /obj/structure/fireaxecabinet/Destroy() if(fireaxe) - qdel(fireaxe) - fireaxe = null + QDEL_NULL(fireaxe) return ..() /obj/structure/fireaxecabinet/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ba859d5952b..ba9e5f8a338 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -18,7 +18,7 @@ // flags = CONDUCT /obj/structure/lattice/Initialize(mapload) - ..() + . = ..() for(var/obj/structure/lattice/LAT in loc) if(LAT != src) QDEL_IN(LAT, 0) diff --git a/code/modules/VR/vr_human.dm b/code/modules/VR/vr_human.dm index f8d59e060bb..1b83b323c83 100644 --- a/code/modules/VR/vr_human.dm +++ b/code/modules/VR/vr_human.dm @@ -7,7 +7,7 @@ /mob/living/carbon/human/virtual_reality/Initialize() - ..() + . = ..() quit_action = new() quit_action.Grant(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index a0e7c3694f3..edcc2eedb71 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -106,7 +106,7 @@ Difficulty: Very Hard var/target /obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target) - ..() + . = ..() target = new_target INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE) @@ -628,7 +628,7 @@ Difficulty: Very Hard var/heal_power = 5 /mob/living/simple_animal/hostile/lightgeist/Initialize() - ..() + . = ..() verbs -= /mob/living/verb/pulled verbs -= /mob/verb/me_verb var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 9bc32993fa9..c56e963aefc 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -54,7 +54,7 @@ Difficulty: Medium death_sound = 'sound/magic/demon_dies.ogg' /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() - ..() + . = ..() internal = new/obj/item/device/gps/internal/dragon(src) /mob/living/simple_animal/hostile/megafauna/dragon/ex_act(severity, target) @@ -97,7 +97,7 @@ Difficulty: Medium pixel_z = 500 /obj/effect/overlay/temp/fireball/Initialize(loc) - ..() + . = ..() animate(src, pixel_z = 0, time = 12) /obj/effect/overlay/temp/target @@ -122,7 +122,7 @@ Difficulty: Medium return /obj/effect/overlay/temp/target/Initialize(loc) - ..() + . = ..() INVOKE_ASYNC(src, .proc/fall) /obj/effect/overlay/temp/target/proc/fall() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index d9f099e2f11..f0c1a7ec04c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -74,7 +74,7 @@ Difficulty: Hard death_sound = 'sound/magic/Repulse.ogg' /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize() - ..() + . = ..() internal = new/obj/item/device/gps/internal/hierophant(src) spawned_beacon = new(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index bf834fce03d..1e97dedb745 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -51,7 +51,7 @@ Difficulty: Medium mouse_opacity = 1 /mob/living/simple_animal/hostile/megafauna/legion/Initialize() - ..() + . = ..() internal = new/obj/item/device/gps/internal/legion(src) /mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 8b6c9c5e1cd..62833132ec3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize() - ..() + . = ..() swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits internal = new/obj/item/device/gps/internal/swarmer_beacon(src) for(var/ddir in GLOB.cardinal) @@ -109,7 +109,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/Initialize() - ..() + . = ..() ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity LAZYINITLIST(GLOB.AISwarmersByType[type]) GLOB.AISwarmers += src @@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa /mob/living/simple_animal/hostile/swarmer/ai/resource/Initialize() - ..() + . = ..() sharedWanted = typecacheof(sharedWanted) sharedIgnore = typecacheof(sharedIgnore) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 3f54f3d20ba..0dc4609e912 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -26,7 +26,7 @@ gold_core_spawnable = 1 /mob/living/simple_animal/hostile/retaliate/frog/Initialize() - ..() + . = ..() if(prob(1)) name = "rare frog" desc = "It seems a little smug." diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 20bb9c497e3..9deb139497d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -39,7 +39,7 @@ var/random = TRUE //if you want random names for ghosts or not /mob/living/simple_animal/hostile/retaliate/ghost/Initialize() - ..() + . = ..() if(!random) give_hair() else diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 4ff8904625f..d9c6ed54c76 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -92,7 +92,7 @@ E.Grant(src) create_reagents(100) set_colour(new_colour) - ..() + . = ..() /mob/living/simple_animal/slime/proc/set_colour(new_colour) colour = new_colour diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 6a14d3a43fe..e1d20c3ecc2 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -19,7 +19,7 @@ var/slowdown_open = 1 /obj/item/device/modular_computer/laptop/Initialize() - ..() + . = ..() // No running around with open laptops in hands. SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 3b120840c0f..dadb1ddd60a 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -32,7 +32,7 @@ /obj/structure/filingcabinet/Initialize(mapload) - ..() + . = ..() if(mapload) for(var/obj/item/I in loc) if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo)) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 2fca29b45c5..227aee9681f 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -15,7 +15,7 @@ var/obj/item/weapon/pen/bin_pen /obj/item/weapon/paper_bin/Initialize(mapload) - ..() + . = ..() if(!mapload) return var/obj/item/weapon/pen/P = locate(/obj/item/weapon/pen) in src.loc diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index d294e094f56..e7742b4bc86 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -14,7 +14,7 @@ var/obj/item/weapon/paper/internalPaper /obj/item/weapon/paperplane/Initialize(mapload, obj/item/weapon/paper/newPaper) - ..() + . = ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) if(newPaper) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a9dd0e78f2f..3c8cc467325 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -172,7 +172,7 @@ terminal.master = src /obj/machinery/power/apc/Initialize(mapload) - ..() + . = ..() if(!mapload) return has_electronics = 2 //installed and secured diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 3dfba8e952c..9ae006dfbd2 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -28,7 +28,7 @@ /obj/machinery/power/generator/Initialize(mapload) - ..() + . = ..() var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index c23597f95f8..4f8cd308752 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // /obj/machinery/gravity_generator/main/station/Initialize() - ..() + . = ..() setup_parts() middle.add_overlay("activated") update_list() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 30ec0f41707..f24c7fdd5fb 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -60,7 +60,7 @@ var/current_heat = 0 /obj/machinery/power/port_gen/pacman/Initialize() - ..() + . = ..() if(anchored) connect_to_network() diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 2f006d1965a..53bcc0869b5 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -34,7 +34,7 @@ /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it. /obj/machinery/power/rtg/Initialize() - ..() + . = ..() connect_to_network() /obj/machinery/power/rtg/process() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e007949b088..02953a70242 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -88,7 +88,7 @@ rotate() /obj/machinery/power/emitter/Initialize() - ..() + . = ..() if(state == 2 && anchored) connect_to_network() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index e5097d422a0..e18e6781c20 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -282,7 +282,7 @@ var/list/connected_panels = list() /obj/machinery/power/solar_control/Initialize() - ..() + . = ..() if(powernet) set_panels(currentdir) connect_to_network() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8f0e4d0f330..4f194129bd0 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -86,7 +86,7 @@ /obj/item/weapon/stock_parts/manipulator = 6) /obj/machinery/power/compressor/Initialize() - ..() + . = ..() locate_machinery() if(!turbine) stat |= BROKEN @@ -202,7 +202,7 @@ /obj/item/weapon/stock_parts/capacitor = 6) /obj/machinery/power/turbine/Initialize() - ..() + . = ..() locate_machinery() if(!compressor) stat |= BROKEN @@ -338,7 +338,7 @@ /obj/machinery/computer/turbine_computer/Initialize() - ..() + . = ..() locate_machinery() /obj/machinery/computer/turbine_computer/locate_machinery() diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm index bd00fdd7d92..89a5faa9283 100644 --- a/code/modules/projectiles/guns/ballistic/bow.dm +++ b/code/modules/projectiles/guns/ballistic/bow.dm @@ -15,7 +15,7 @@ var/slowdown_when_ready = 2 /obj/item/weapon/gun/ballistic/bow/Initialize(mapload) - ..() + . = ..() SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND) /obj/item/weapon/gun/ballistic/bow/update_icon() diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index a3dd75c3749..7c845759ea0 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -42,7 +42,7 @@ range = 10 /obj/item/projectile/energy/net/Initialize() - ..() + . = ..() SpinAnimation() /obj/item/projectile/energy/net/on_hit(atom/target, blocked = 0) @@ -61,11 +61,11 @@ desc = "A field of bluespace energy, locking on to teleport a target." icon = 'icons/effects/effects.dmi' icon_state = "dragnetfield" + light_range = 3 anchored = 1 /obj/effect/nettingportal/Initialize() - ..() - set_light(3) + . = ..() var/obj/item/device/radio/beacon/teletarget = null for(var/obj/machinery/computer/teleporter/com in GLOB.machines) if(com.target) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 060e3e98704..264b6a167d2 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -214,7 +214,7 @@ /obj/machinery/conveyor_switch/Initialize(mapload, newid) if(mapload) return TRUE //need machines list - ..() + . = ..() if(!id) id = newid update() diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 4b8242c1f86..42143f6e3ad 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -38,7 +38,7 @@ heat_gen /= max(1, tot_rating) /obj/machinery/r_n_d/server/Initialize(mapload) - ..() + . = ..() if(!files) files = new /datum/research(src) var/list/temp_list if(!id_with_upload.len) @@ -137,7 +137,7 @@ server_id = -1 /obj/machinery/r_n_d/server/centcom/Initialize() - ..() + . = ..() fix_noid_research_servers() /proc/fix_noid_research_servers() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index c02894bc3c9..bd34ff60c0d 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -8,7 +8,7 @@ /mob/camera/aiEye/remote/xenobio/Initialize() var/area/A = get_area(loc) allowed_area = A.name - ..() + . = ..() /mob/camera/aiEye/remote/xenobio/setLoc(var/t) var/area/new_area = get_area(t) diff --git a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm index 4db811604d8..669890a279a 100644 --- a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm +++ b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm @@ -7,7 +7,7 @@ var/baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface /obj/effect/baseturf_helper/Initialize() - ..() + . = ..() var/area/thearea = get_area(src) for(var/turf/T in get_area_turfs(thearea, z)) if(T.baseturf != T.type) //Don't break indestructible walls and the like diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index cc0efd53594..aa0b9e6f786 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -34,7 +34,7 @@ SSshuttle.arrivals = src - ..() + . = ..() areas = list() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 07c135d7955..553210a5f72 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -450,7 +450,7 @@ // Minimal distance from the map edge, setting this too low can result in shuttle landing on the edge and getting "sliced" /obj/docking_port/stationary/random/Initialize(mapload) - ..() + . = ..() if(!mapload) return diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 94d10392ccd..f214d018b40 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -241,7 +241,7 @@ . = ..() /obj/docking_port/mobile/Initialize(mapload) - ..() + . = ..() var/area/A = get_area(src) if(istype(A, /area/shuttle)) @@ -316,7 +316,7 @@ if(!check_dock(S)) testing("check_dock failed on request for [src]") return - + if(mode == SHUTTLE_IGNITING && destination == S) return diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index f72eff6302c..50f51a0b3b9 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -85,7 +85,7 @@ var/static/active_phylacteries = 0 /obj/item/phylactery/Initialize(mapload, datum/mind/newmind) - ..() + . = ..() mind = newmind name = "phylactery of [mind.name]" diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm index bed0255b027..6a68643d557 100644 --- a/code/modules/spells/spell_types/spacetime_distortion.dm +++ b/code/modules/spells/spell_types/spacetime_distortion.dm @@ -74,7 +74,7 @@ var/walks_left = 50 //prevents the game from hanging in extreme cases (such as minigun fire) /obj/effect/cross_action/spacetime_dist/Initialize(mapload) - ..() + . = ..() sound = "sound/guitar/[safepick(GLOB.guitar_notes)]" dir = pick(GLOB.cardinal) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index d7f9a72a9ef..02ce0f77069 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -170,7 +170,7 @@ plants_max = G.plant_count dna_max = G.human_count break - ..() + . = ..() /obj/machinery/dna_vault/Destroy() for(var/V in fillers) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 981e6000c37..53b0d5f17f4 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -12,7 +12,7 @@ var/starting_organ /obj/item/device/autosurgeon/Initialize(mapload) - ..() + . = ..() if(starting_organ) insert_organ(new starting_organ(src)) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 096e7e955a4..c70058039d8 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -10,7 +10,7 @@ var/taste_sensitivity = 15 // lower is more sensitive. /obj/item/organ/tongue/Initialize(mapload) - ..() + . = ..() languages_possible = typecacheof(list( /datum/language/common, /datum/language/monkey, @@ -123,7 +123,7 @@ taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED /obj/item/organ/tongue/alien/Initialize(mapload) - ..() + . = ..() languages_possible = typecacheof(list( /datum/language/xenocommon, /datum/language/common, @@ -186,7 +186,7 @@ taste_sensitivity = 25 // not as good as an organic tongue /obj/item/organ/tongue/robot/Initialize(mapload) - ..() + . = ..() languages_possible = typecacheof(list( /datum/language/xenocommon, /datum/language/common, diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 60ac49a529c..868aa5d6ae8 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -46,7 +46,7 @@ to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.") /obj/machinery/computer/telescience/Initialize(mapload) - ..() + . = ..() if(mapload) for(var/i = 1; i <= starting_crystals; i++) crystals += new /obj/item/weapon/ore/bluespace_crystal/artificial(null) // starting crystals diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index ae34cfd5157..42e9298c881 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -8,7 +8,7 @@ var/floorbuffer = FALSE /obj/vehicle/janicart/Initialize(mapload) - ..() + . = ..() update_icon() /obj/vehicle/janicart/Destroy() From 572696292a6cd9817aa6739267221e4d4625a05d Mon Sep 17 00:00:00 2001 From: Core0verload Date: Tue, 25 Apr 2017 11:58:19 +0300 Subject: [PATCH 27/97] Small abductors refactor (#26501) * Small abductors refactor * Abductors no longer get hungry --- code/datums/mind.dm | 25 +- .../abduction/abductee_objectives.dm | 148 ++++++++++ .../miniantags/abduction/abduction.dm | 269 +----------------- .../miniantags/abduction/abduction_gear.dm | 19 ++ .../miniantags/abduction/abduction_outfits.dm | 62 ++++ .../carbon/human/species_types/abductors.dm | 3 +- icons/mob/ears.dmi | Bin 881 -> 901 bytes icons/obj/abductor.dmi | Bin 55429 -> 55757 bytes tgstation.dme | 2 + 9 files changed, 257 insertions(+), 271 deletions(-) create mode 100644 code/game/gamemodes/miniantags/abduction/abductee_objectives.dm create mode 100644 code/game/gamemodes/miniantags/abduction/abduction_outfits.dm diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b4844b32bf4..e78d996f643 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1192,14 +1192,17 @@ log_admin("[key_name(usr)] turned [current] into abductor.") SSticker.mode.update_abductor_icons_added(src) if("equip") + if(!ishuman(current)) + to_chat(usr, "This only works on humans!") + return + + var/mob/living/carbon/human/H = current var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") if(gear) - var/datum/game_mode/abduction/temp = new - temp.equip_common(current) if(gear=="Agent") - temp.equip_agent(current) + H.equipOutfit(/datum/outfit/abductor/agent) else - temp.equip_scientist(current) + H.equipOutfit(/datum/outfit/abductor/scientist) else if (href_list["monkey"]) var/mob/living/L = current @@ -1468,11 +1471,8 @@ H.set_species(/datum/species/abductor) var/datum/species/abductor/S = H.dna.species - switch(role) - if("Agent") - S.agent = 1 - if("Scientist") - S.scientist = 1 + if(role == "Scientist") + S.scientist = TRUE S.team = team var/list/obj/effect/landmark/abductor/agent_landmarks = new @@ -1489,13 +1489,10 @@ if(teleport=="Yes") switch(role) if("Agent") - S.agent = 1 L = agent_landmarks[team] - H.loc = L.loc if("Scientist") - S.scientist = 1 - L = agent_landmarks[team] - H.loc = L.loc + L = scientist_landmarks[team] + H.forceMove(L.loc) /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm new file mode 100644 index 00000000000..aa633e1ef59 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm @@ -0,0 +1,148 @@ +/datum/objective/abductee + dangerrating = 5 + completed = 1 + +/datum/objective/abductee/steal + explanation_text = "Steal all" + +/datum/objective/abductee/steal/New() + var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) + explanation_text+=" [target]." + +/datum/objective/abductee/paint + explanation_text = "The station is hideous. You must color it all" + +/datum/objective/abductee/paint/New() + var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) + explanation_text+= " [color]!" + +/datum/objective/abductee/speech + explanation_text = "Your brain is broken... you can only communicate in" + +/datum/objective/abductee/speech/New() + var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon")) + explanation_text+= " [style]." + +/datum/objective/abductee/capture + explanation_text = "Capture" + +/datum/objective/abductee/capture/New() + var/list/jobs = SSjob.occupations.Copy() + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " a [target.title]." + else + explanation_text += " someone." + +/datum/objective/abductee/shuttle + explanation_text = "You must escape the station! Get the shuttle called!" + +/datum/objective/abductee/noclone + explanation_text = "Don't allow anyone to be cloned." + +/datum/objective/abductee/oxygen + explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station." + +/datum/objective/abductee/blazeit + explanation_text = "Your body must be improved. Ingest as many drugs as you can." + +/datum/objective/abductee/yumyum + explanation_text = "You are hungry. Eat as much food as you can find." + +/datum/objective/abductee/insane + explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL" + +/datum/objective/abductee/cannotmove + explanation_text = "Convince the crew that you are a paraplegic." + +/datum/objective/abductee/deadbodies + explanation_text = "Start a collection of corpses. Don't kill people to get these corpses." + +/datum/objective/abductee/floors + explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling." + +/datum/objective/abductee/POWERUNLIMITED + explanation_text = "Flood the station's powernet with as much electricity as you can." + +/datum/objective/abductee/pristine + explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition." + +/datum/objective/abductee/nowalls + explanation_text = "The crew must get to know one another better. Break down the walls inside the station!" + +/datum/objective/abductee/nations + explanation_text = "Ensure your department prospers over all else." + +/datum/objective/abductee/abductception + explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine." + +/datum/objective/abductee/summon + explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one." + +/datum/objective/abductee/machine + explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last." + +/datum/objective/abductee/calling + explanation_text = "Call forth a spirit from the other side." + +/datum/objective/abductee/calling/New() + var/mob/dead/D = pick(GLOB.dead_mob_list) + if(D) + explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm." + +/datum/objective/abductee/social_experiment + explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth." + +/datum/objective/abductee/vr + explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR." + +/datum/objective/abductee/pets + explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!" + +/datum/objective/abductee/defect + explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Lavaland or the derelict. Recruit crewmates if you can." + +/datum/objective/abductee/promote + explanation_text = "Climb the corporate ladder all the way to the top!" + +/datum/objective/abductee/science + explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe." + +/datum/objective/abductee/build + explanation_text = "Expand the station." + +/datum/objective/abductee/pragnant + explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby." + +/datum/objective/abductee/engine + explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds." + +/datum/objective/abductee/music + explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!" + +/datum/objective/abductee/clown + explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!" + +/datum/objective/abductee/party + explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!" + +/datum/objective/abductee/pets + explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!" + +/datum/objective/abductee/conspiracy + explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!" + +/datum/objective/abductee/stalker + explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it." + +/datum/objective/abductee/narrator + explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story." + +/datum/objective/abductee/lurve + explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!" + +/datum/objective/abductee/sixthsense + explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo." diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index aa5a688596e..e692654bf3d 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -85,56 +85,14 @@ return 1 /datum/game_mode/abduction/post_setup() - //Spawn Team - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new - agent_landmarks.len = max_teams - scientist_landmarks.len = max_teams - for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) - if(istype(A,/obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A,/obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/datum/mind/agent - var/obj/effect/landmark/L - var/datum/mind/scientist - var/team_name - var/mob/living/carbon/human/H - var/datum/species/abductor/S for(var/team_number=1,team_number<=abductor_teams,team_number++) - team_name = team_names[team_number] - agent = agents[team_number] - H = agent.current - L = agent_landmarks[team_number] - H.loc = L.loc - H.set_species(/datum/species/abductor) - S = H.dna.species - S.agent = 1 - S.team = team_number - H.real_name = team_name + " Agent" - equip_common(H,team_number) - equip_agent(H,team_number) - greet_agent(agent,team_number) - - scientist = scientists[team_number] - H = scientist.current - L = scientist_landmarks[team_number] - H.loc = L.loc - H.set_species(/datum/species/abductor) - S = H.dna.species - S.scientist = 1 - S.team = team_number - H.real_name = team_name + " Scientist" - equip_common(H,team_number) - equip_scientist(H,team_number) - greet_scientist(scientist,team_number) + post_setup_team(team_number) return ..() //Used for create antag buttons /datum/game_mode/abduction/proc/post_setup_team(team_number) - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new + var/list/obj/effect/landmark/abductor/agent_landmarks = list() + var/list/obj/effect/landmark/abductor/scientist_landmarks = list() agent_landmarks.len = max_teams scientist_landmarks.len = max_teams for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) @@ -143,39 +101,36 @@ else if(istype(A,/obj/effect/landmark/abductor/scientist)) scientist_landmarks[text2num(A.team)] = A + var/team_name = team_names[team_number] + var/datum/mind/agent var/obj/effect/landmark/L var/datum/mind/scientist - var/team_name var/mob/living/carbon/human/H var/datum/species/abductor/S - team_name = team_names[team_number] agent = agents[team_number] H = agent.current L = agent_landmarks[team_number] - H.loc = L.loc + H.forceMove(L.loc) H.set_species(/datum/species/abductor) S = H.dna.species - S.agent = 1 S.team = team_number H.real_name = team_name + " Agent" - equip_common(H,team_number) - equip_agent(H,team_number) + H.equipOutfit(/datum/outfit/abductor/agent) greet_agent(agent,team_number) scientist = scientists[team_number] H = scientist.current L = scientist_landmarks[team_number] - H.loc = L.loc + H.forceMove(L.loc) H.set_species(/datum/species/abductor) S = H.dna.species - S.scientist = 1 + S.scientist = TRUE S.team = team_number H.real_name = team_name + " Scientist" - equip_common(H,team_number) - equip_scientist(H,team_number) + H.equipOutfit(/datum/outfit/abductor/scientist) greet_scientist(scientist,team_number) @@ -200,57 +155,10 @@ abductor.announce_objectives() -/datum/game_mode/abduction/proc/equip_common(mob/living/carbon/human/agent,team_number) - var/radio_freq = GLOB.SYND_FREQ - - var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(agent) - R.set_frequency(radio_freq) - agent.equip_to_slot_or_del(R, slot_ears) - agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) - agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit - agent.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(agent), slot_back) - -/datum/game_mode/abduction/proc/get_team_console(team) - var/obj/machinery/abductor/console/console - for(var/obj/machinery/abductor/console/c in GLOB.machines) - if(c.team == team) - console = c - break - return console - -/datum/game_mode/abduction/proc/equip_agent(mob/living/carbon/human/agent,team_number) - if(!team_number) - var/datum/species/abductor/S = agent.dna.species - team_number = S.team - - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent) - if(console!=null) - console.vest = V - V.flags |= NODROP - agent.equip_to_slot_or_del(V, slot_wear_suit) - agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) - agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt) - - -/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number) - if(!team_number) - var/datum/species/abductor/S = scientist.dna.species - team_number = S.team - - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist) - if(console!=null) - console.gizmo = G - G.console = console - scientist.equip_to_slot_or_del(G, slot_in_backpack) - - var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(scientist) - beamplant.implant(scientist) - +/datum/game_mode/abduction/proc/get_team_console(team_number) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.team == team_number) + return C /datum/game_mode/abduction/check_finished() if(!finished) @@ -336,152 +244,3 @@ var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR] hud.leave_hud(alien_mind.current) set_antag_hud(alien_mind.current, null) - -/datum/objective/abductee - dangerrating = 5 - completed = 1 - -/datum/objective/abductee/steal - explanation_text = "Steal all" - -/datum/objective/abductee/steal/New() - var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) - explanation_text+=" [target]." - -/datum/objective/abductee/paint - explanation_text = "The station is hideous. You must color it all" - -/datum/objective/abductee/paint/New() - var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) - explanation_text+= " [color]!" - -/datum/objective/abductee/speech - explanation_text = "Your brain is broken... you can only communicate in" - -/datum/objective/abductee/speech/New() - var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon")) - explanation_text+= " [style]." - -/datum/objective/abductee/capture - explanation_text = "Capture" - -/datum/objective/abductee/capture/New() - var/list/jobs = SSjob.occupations.Copy() - for(var/datum/job/J in jobs) - if(J.current_positions < 1) - jobs -= J - if(jobs.len > 0) - var/datum/job/target = pick(jobs) - explanation_text += " a [target.title]." - else - explanation_text += " someone." - -/datum/objective/abductee/shuttle - explanation_text = "You must escape the station! Get the shuttle called!" - -/datum/objective/abductee/noclone - explanation_text = "Don't allow anyone to be cloned." - -/datum/objective/abductee/oxygen - explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station." - -/datum/objective/abductee/blazeit - explanation_text = "Your body must be improved. Ingest as many drugs as you can." - -/datum/objective/abductee/yumyum - explanation_text = "You are hungry. Eat as much food as you can find." - -/datum/objective/abductee/insane - explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL" - -/datum/objective/abductee/cannotmove - explanation_text = "Convince the crew that you are a paraplegic." - -/datum/objective/abductee/deadbodies - explanation_text = "Start a collection of corpses. Don't kill people to get these corpses." - -/datum/objective/abductee/floors - explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling." - -/datum/objective/abductee/POWERUNLIMITED - explanation_text = "Flood the station's powernet with as much electricity as you can." - -/datum/objective/abductee/pristine - explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition." - -/datum/objective/abductee/nowalls - explanation_text = "The crew must get to know one another better. Break down the walls inside the station!" - -/datum/objective/abductee/nations - explanation_text = "Ensure your department prospers over all else." - -/datum/objective/abductee/abductception - explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine." - -/datum/objective/abductee/summon - explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one." - -/datum/objective/abductee/machine - explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last." - -/datum/objective/abductee/calling - explanation_text = "Call forth a spirit from the other side." - -/datum/objective/abductee/calling/New() - var/mob/dead/D = pick(GLOB.dead_mob_list) - if(D) - explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm." - -/datum/objective/abductee/social_experiment - explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth." - -/datum/objective/abductee/vr - explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR." - -/datum/objective/abductee/pets - explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!" - -/datum/objective/abductee/defect - explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Lavaland or the derelict. Recruit crewmates if you can." - -/datum/objective/abductee/promote - explanation_text = "Climb the corporate ladder all the way to the top!" - -/datum/objective/abductee/science - explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe." - -/datum/objective/abductee/build - explanation_text = "Expand the station." - -/datum/objective/abductee/pragnant - explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby." - -/datum/objective/abductee/engine - explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds." - -/datum/objective/abductee/music - explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!" - -/datum/objective/abductee/clown - explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!" - -/datum/objective/abductee/party - explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!" - -/datum/objective/abductee/pets - explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!" - -/datum/objective/abductee/conspiracy - explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!" - -/datum/objective/abductee/stalker - explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it." - -/datum/objective/abductee/narrator - explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story." - -/datum/objective/abductee/lurve - explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!" - -/datum/objective/abductee/sixthsense - explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo." \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index f735bf253ca..e6365d5e651 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -479,6 +479,25 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") +/obj/item/device/radio/headset/abductor + name = "alien headset" + desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows." + origin_tech = "magnets=2;abductor=3" + icon = 'icons/obj/abductor.dmi' + icon_state = "abductor_headset" + item_state = "abductor_headset" + keyslot2 = new /obj/item/device/encryptionkey/heads/captain + +/obj/item/device/radio/headset/abductor/Initialize(mapload) + ..() + SET_SECONDARY_FLAG(src, BANG_PROTECT) + make_syndie() + +/obj/item/device/radio/headset/abductor/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/screwdriver)) + return // Stops humans from disassembling abductor headsets. + return ..() + /obj/item/weapon/scalpel/alien name = "alien scalpel" diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm new file mode 100644 index 00000000000..100c4852632 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -0,0 +1,62 @@ +/datum/outfit/abductor + name = "Abductor Basic" + uniform = /obj/item/clothing/under/color/grey //they're greys gettit + shoes = /obj/item/clothing/shoes/combat + back = /obj/item/weapon/storage/backpack + ears = /obj/item/device/radio/headset/abductor + +/datum/outfit/abductor/proc/get_team_console(team_number) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.team == team_number) + return C + +/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) + if(!team_number && isabductor(H)) + var/datum/species/abductor/S = H.dna.species + team_number = S.team + + if(!team_number) + team_number = 1 + + var/obj/machinery/abductor/console/console = get_team_console(team_number) + if(console) + var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H + if(V) + console.vest = V + V.flags |= NODROP + + var/obj/item/device/abductor/gizmo/G = locate() in H.getBackSlot() + if(G) + console.gizmo = G + G.console = console + +/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(!visualsOnly) + link_to_console(H) + + +/datum/outfit/abductor/agent + name = "Abductor Agent" + head = /obj/item/clothing/head/helmet/abductor + suit = /obj/item/clothing/suit/armor/abductor/vest + belt = /obj/item/weapon/storage/belt/military/abductor/full + + backpack_contents = list( + /obj/item/weapon/abductor_baton = 1, + /obj/item/weapon/gun/energy/alien = 1, + /obj/item/device/abductor/silencer = 1 + ) + +/datum/outfit/abductor/scientist + name = "Abductor Scientist" + + backpack_contents = list( + /obj/item/device/abductor/gizmo = 1 + ) + +/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(!visualsOnly) + var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(H) + beamplant.implant(H) diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 750c88fd881..0b8ca1500d7 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,8 +3,7 @@ id = "abductor" say_mod = "gibbers" sexes = 0 - species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS) + species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER) mutant_organs = list(/obj/item/organ/tongue/abductor) var/scientist = 0 // vars to not pollute spieces list with castes - var/agent = 0 var/team = 1 \ No newline at end of file diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi index f87713f7a1f665cfb6208eab710e1700a872943b..0a5154c396c8ddb81e09c1f4a26ee302c686435a 100644 GIT binary patch delta 763 zcmV289QZBmq&8B~=x@=~Y_*0004WQchC%1+xRF@O1s+;QR(LG9B>2J}0CHxigj#t*jt^fc4 z00000$RvNhUrf~e-72SOz8{{B!5~+&lmP00000z#o-6-ydWDz>xX=;%QZ= z^P87r|3J=szqtryzB&G6D;)17-J^)kN63*6WicA0i002ovPDHLkV1iq#c{Bh3 delta 743 zcmV;2k{1wBmq>BB~=)}z`#I*XpH~>00DGTPE!Ct=GbNc005qmk0pOg>A}82 z2+70*Obgjn@$GF@@S5Ic;G5Znsnxmd`aw09UOtd1PNO=h<7O+xGdd2lIqanfh}Xbh zLu?qctOAT9a3zI{nUicjV?l$zH6tns@`Jc zRe=Oo!q=)Dn$IwA6<>SDx66N?Q2+n}AxT6*RCt{2-0M!lKoExEr9!PmKm|E?{}*aG z#RfVDnZkm;k3q@KGSepY&sQKNpk+`DLiOB=!{gF=ZiCkEOX|5jo&5c6Jq?|MlzrY7 zT}I{MNjbWxp3<{(lCsa+qDyr=z^b~ao?hIe#GU>YUBZ`;cf7JMb_Ra{0000006-@B z^ZjC==I>THMf3gGd{_3aY>DUlvH2-IiMgp~PdJ>U@jBKUn7Nw1 zAv%B3Jf=#0TFl<`4)1^JA=bMM*POrG^&u2KrW5nU^X5k_OU+yJ7eZm-n7>m>>-Ndd z=j!n{8>HqfpVGQLf3NHguq(%GQzbNSTXtWB_0l<`w(|W5v3YBY^iSjq-mjX^JDPKU z0000000030Qs#U=I{y~=z8;as<|jwKFNOC%rqXxx4EwmhV0?c8ke%;4ve!Vq-^+Ye zJ+eDQ^L=%GG`)@lLQ57joY%F}!~ag!cdd00000 Z2j5#;5F-PT{ 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 delta 6494 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 F{ReMyc+LO- diff --git a/tgstation.dme b/tgstation.dme index 5d2c8cc7fa3..fcd8d95738c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -454,8 +454,10 @@ #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" #include "code\game\gamemodes\miniantags\abduction\abduction.dm" #include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" #include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" #include "code\game\gamemodes\miniantags\abduction\gland.dm" #include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" From ff3f84ab81761802f34310e65627c9ff591232a4 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 25 Apr 2017 03:15:16 -0700 Subject: [PATCH 28/97] Replaces /image with /mutable_appearance, where appropriate (#26518) In cases where you're creating an image to use as an overlay, it makes more sense to use a mutable_appearance if you can. The image will create a static appearance for not just the image but also each intermediate step if you change vars along the way. The mutable appearance avoids this unnecessary and expensive process. The only situation that requires an image instead of a mutable_appearance is if the overlay is supposed to be directional. MA's ignore direction while images don't. I dunno why, probably another BYOND-ism. I added a convenience function, mutable_appearance(), designed to emulate image(). Also went ahead and set the default plane of /mutable_appearance to FLOAT_PLANE because it's fucking 0 by default. Several overlays that were image() calls were changed to just text strings when I could. overlays += "string" has the same result as overlays += image(icon, "string") and saves a proc call. --- code/__HELPERS/icon_smoothing.dm | 30 ++--- code/__HELPERS/unsorted.dm | 8 +- code/_onclick/hud/action_button.dm | 3 +- code/_onclick/hud/parallax.dm | 6 +- code/_onclick/hud/screen_objects.dm | 17 +-- .../subsystem/processing/overlays.dm | 10 +- code/datums/action.dm | 6 +- code/datums/antagonists/datum_clockcult.dm | 2 +- code/datums/dog_fashion.dm | 4 +- code/datums/mutable_appearance.dm | 18 +++ code/datums/mutations.dm | 14 +-- code/game/gamemodes/blob/blobs/blob_mobs.dm | 6 +- code/game/gamemodes/blob/blobs/core.dm | 9 +- code/game/gamemodes/blob/blobs/node.dm | 9 +- .../clock_structures/geis_binding.dm | 3 +- .../ratvar_the_clockwork_justicar.dm | 2 +- .../clock_structures/tinkerers_daemon.dm | 11 +- code/game/gamemodes/cult/cult_items.dm | 6 +- code/game/gamemodes/cult/runes.dm | 10 +- .../gamemodes/devil/true_devil/inventory.dm | 15 ++- code/game/gamemodes/nuclear/nuclearbomb.dm | 28 ++--- code/game/machinery/computer/apc_control.dm | 9 +- code/game/machinery/computer/message.dm | 4 +- code/game/machinery/doors/airlock.dm | 20 ++-- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/iv_drip.dm | 20 ++-- code/game/machinery/status_display.dm | 4 +- code/game/machinery/vending.dm | 2 +- code/game/machinery/washing_machine.dm | 2 +- code/game/mecha/mecha_wreckage.dm | 2 +- code/game/mecha/working/ripley.dm | 4 +- .../effects/decals/cleanable/humans.dm | 24 ++-- code/game/objects/items.dm | 2 +- code/game/objects/items/crayons.dm | 9 +- code/game/objects/items/devices/PDA/PDA.dm | 26 +++-- code/game/objects/items/devices/aicard.dm | 4 +- code/game/objects/items/devices/flashlight.dm | 5 +- code/game/objects/items/robot/robot_items.dm | 2 +- code/game/objects/items/shooting_range.dm | 16 +-- .../objects/items/weapons/chrono_eraser.dm | 4 +- .../objects/items/weapons/cigs_lighters.dm | 18 +-- code/game/objects/items/weapons/cosmetics.dm | 6 +- code/game/objects/items/weapons/explosives.dm | 6 +- .../items/weapons/grenades/ghettobomb.dm | 17 ++- .../objects/items/weapons/grenades/plastic.dm | 8 +- .../objects/items/weapons/holy_weapons.dm | 2 +- .../objects/items/weapons/pneumaticCannon.dm | 2 +- .../objects/items/weapons/storage/bags.dm | 4 +- .../objects/items/weapons/storage/boxes.dm | 2 +- .../objects/items/weapons/storage/fancy.dm | 16 ++- .../objects/items/weapons/storage/secure.dm | 2 +- .../objects/items/weapons/storage/toolbox.dm | 2 +- .../objects/items/weapons/tanks/watertank.dm | 4 +- code/game/objects/obj_defense.dm | 2 +- .../structures/beds_chairs/alien_nest.dm | 6 +- .../objects/structures/beds_chairs/chair.dm | 4 +- code/game/objects/structures/electricchair.dm | 2 +- code/game/objects/structures/guncase.dm | 6 +- .../structures/transit_tubes/transit_tube.dm | 16 +-- code/game/objects/structures/watercloset.dm | 2 +- code/game/objects/structures/window.dm | 6 +- code/game/turfs/closed.dm | 6 +- code/game/turfs/open.dm | 17 ++- code/game/turfs/simulated/minerals.dm | 15 ++- code/modules/admin/verbs/pray.dm | 6 +- code/modules/assembly/holder.dm | 11 +- .../atmospherics/machinery/atmosmachinery.dm | 15 +-- .../atmospherics/machinery/other/miner.dm | 9 +- code/modules/clothing/clothing.dm | 36 +++--- .../modules/clothing/spacesuits/chronosuit.dm | 16 --- code/modules/clothing/spacesuits/hardsuit.dm | 6 +- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/detectivework/evidence.dm | 15 +-- code/modules/events/portal_storm.dm | 4 +- .../drinks/drinks/drinkingglass.dm | 12 +- .../food_and_drinks/food/customizables.dm | 41 ++++--- code/modules/food_and_drinks/food/snacks.dm | 8 +- .../food_and_drinks/food/snacks/meat.dm | 6 +- .../food_and_drinks/food/snacks_other.dm | 4 +- .../food_and_drinks/food/snacks_pie.dm | 2 +- .../kitchen_machinery/gibber.dm | 10 +- code/modules/food_and_drinks/pizzabox.dm | 19 ++-- code/modules/games/cards.dm | 29 +++-- code/modules/holiday/easter.dm | 4 +- .../hydroponics/beekeeping/honeycomb.dm | 10 +- code/modules/hydroponics/grown/towercap.dm | 5 +- code/modules/hydroponics/hydroponics.dm | 25 ++--- code/modules/hydroponics/sample.dm | 6 +- code/modules/mining/equipment.dm | 20 ++-- code/modules/mining/fulton.dm | 12 +- code/modules/mining/lavaland/ruins/gym.dm | 7 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 32 +++--- .../carbon/alien/humanoid/update_icons.dm | 10 +- .../modules/mob/living/carbon/alien/screen.dm | 3 +- .../carbon/alien/special/alien_embryo.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 18 +-- .../mob/living/carbon/human/species.dm | 106 +++++++++--------- .../mob/living/carbon/human/update_icons.dm | 78 ++++++------- .../mob/living/carbon/monkey/update_icons.dm | 9 +- .../modules/mob/living/carbon/update_icons.dm | 36 +++--- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/silicon/robot/life.dm | 6 +- .../modules/mob/living/silicon/robot/robot.dm | 4 +- .../living/simple_animal/bot/construction.dm | 4 +- .../mob/living/simple_animal/bot/ed209bot.dm | 2 +- .../mob/living/simple_animal/bot/medbot.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 18 +-- .../friendly/drone/visuals_icons.dm | 21 ++-- .../mob/living/simple_animal/friendly/pet.dm | 14 ++- .../living/simple_animal/guardian/guardian.dm | 13 +-- .../simple_animal/guardian/types/protector.dm | 6 +- .../mob/living/simple_animal/hostile/bear.dm | 4 +- .../mob/living/simple_animal/hostile/bees.dm | 24 ++-- .../mob/living/simple_animal/hostile/mimic.dm | 8 +- .../living/simple_animal/hostile/mushroom.dm | 16 +-- .../simple_animal/hostile/retaliate/ghost.dm | 16 +-- .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/mob/mob_helpers.dm | 17 +-- code/modules/paperwork/paper.dm | 4 +- code/modules/paperwork/paperbin.dm | 2 +- code/modules/paperwork/paperplane.dm | 3 +- code/modules/power/apc.dm | 45 +------- code/modules/power/cell.dm | 6 +- code/modules/power/generator.dm | 4 +- code/modules/power/singularity/collector.dm | 4 +- code/modules/power/singularity/narsie.dm | 2 +- code/modules/power/smes.dm | 29 +---- code/modules/power/solar.dm | 7 +- code/modules/power/turbine.dm | 10 +- code/modules/projectiles/guns/energy.dm | 11 +- .../guns/energy/kinetic_accelerator.dm | 5 +- .../chemistry/machinery/chem_dispenser.dm | 9 +- .../reagents/pyrotechnic_reagents.dm | 2 +- .../reagents/reagent_containers/bottle.dm | 2 +- .../reagents/reagent_containers/dropper.dm | 2 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 7 +- code/modules/recycling/disposal-unit.dm | 8 +- code/modules/research/message_server.dm | 2 +- .../ruins/objects_and_mobs/necropolis_gate.dm | 2 +- code/modules/shuttle/manipulator.dm | 4 +- code/modules/spells/spell_types/lightning.dm | 7 +- code/modules/station_goals/bsa.dm | 9 +- code/modules/surgery/bodyparts/bodyparts.dm | 69 +++++------- code/modules/surgery/bodyparts/head.dm | 45 ++++---- .../surgery/organs/augments_internal.dm | 2 +- code/modules/vehicles/atv.dm | 6 +- code/modules/vehicles/speedbike.dm | 5 +- tgstation.dme | 1 + 151 files changed, 763 insertions(+), 921 deletions(-) create mode 100644 code/datums/mutable_appearance.dm diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index d890788c91d..de46e18fde2 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -1,7 +1,7 @@ //generic (by snowflake) tile smoothing code; smooth your icons with this! /* - Each tile is divided in 4 corners, each corner has an image associated to it; the tile is then overlayed by these 4 images + Each tile is divided in 4 corners, each corner has an appearance associated to it; the tile is then overlayed by these 4 appearances To use this, just set your atom's 'smooth' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. If you don't want your atom's icon to smooth with anything but atoms of the same type, set the list 'canSmoothWith' to null; Otherwise, put all types you want the atom icon to smooth with in 'canSmoothWith' INCLUDING THE TYPE OF THE ATOM ITSELF. @@ -44,7 +44,6 @@ #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" -#define DEFAULT_UNDERLAY_IMAGE image(DEFAULT_UNDERLAY_ICON, DEFAULT_UNDERLAY_ICON_STATE) /atom/var/smooth = SMOOTH_FALSE /atom/var/top_left_corner @@ -157,14 +156,16 @@ /turf/closed/wall/diagonal_smooth(adjacencies) adjacencies = reverse_ndir(..()) if(adjacencies) - var/list/U = list() + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER) + var/list/U = list(underlay_appearance) if(fixed_underlay) if(fixed_underlay["space"]) - var/image/I = image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) - I.plane = PLANE_SPACE - U += I + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE else - U += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER) + underlay_appearance.icon = fixed_underlay["icon"] + underlay_appearance.icon_state = fixed_underlay["icon_state"] else var/turf/T = get_step(src, turn(adjacencies, 180)) if(T && (T.density || T.smooth)) @@ -173,15 +174,18 @@ T = get_step(src, turn(adjacencies, 225)) if(isspaceturf(T) && !istype(T, /turf/open/space/transit)) - var/image/I = image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) - I.plane = PLANE_SPACE - U += I + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE else if(T && !T.density && !T.smooth) - U += T + underlay_appearance.icon = T.icon + underlay_appearance.icon_state = T.icon_state else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth)) - U += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER) + underlay_appearance.icon = initial(baseturf.icon) + underlay_appearance.icon_state = initial(baseturf.icon_state) else - U += DEFAULT_UNDERLAY_IMAGE + underlay_appearance.icon = DEFAULT_UNDERLAY_ICON + underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE underlays = U diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 35e66d5f4b7..a7338a0c5d2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1138,13 +1138,13 @@ B --><-- A if(location == src) return 1 -/proc/flick_overlay_static(image/I, atom/A, duration) +/proc/flick_overlay_static(O, atom/A, duration) set waitfor = 0 - if(!A || !I) + if(!A || !O) return - A.add_overlay(I) + A.add_overlay(O) sleep(duration) - A.cut_overlay(I) + A.cut_overlay(O) /proc/get_areas_in_z(zlevel) . = list() diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 407137dfcfd..96a07bad24c 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -57,8 +57,7 @@ /obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() cut_overlays() - var/image/img = image(hide_icon, src, hidden ? show_state : hide_state) - add_overlay(img) + add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state)) /obj/screen/movable/action_button/MouseEntered(location,control,params) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index df0894403c2..4bf86f414bc 100644 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -261,9 +261,9 @@ for(var/y in -count to count) if(x == 0 && y == 0) continue - var/image/I = image(icon, null, icon_state) - I.transform = matrix(1, 0, x*480, 0, 1, y*480) - new_overlays += I + var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state) + texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480) + new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) view_sized = view diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 0c2871a26b0..206a9fabc1a 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -134,21 +134,16 @@ icon_state = icon_empty /obj/screen/inventory/hand - var/image/active_overlay - var/image/handcuff_overlay - var/image/blocked_overlay + var/mutable_appearance/handcuff_overlay + var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 /obj/screen/inventory/hand/update_icon() ..() - if(!active_overlay) - active_overlay = image("icon"=icon, "icon_state"="hand_active") if(!handcuff_overlay) var/state = (!(held_index % 2)) ? "markus" : "gabrielle" - handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"=state) - if(!blocked_overlay) - blocked_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"="blocked") + handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) cut_overlays() @@ -163,7 +158,7 @@ add_overlay(blocked_overlay) if(held_index == hud.mymob.active_hand_index) - add_overlay(active_overlay) + add_overlay("hand_active") /obj/screen/inventory/hand/Click(location, control, params) @@ -445,7 +440,7 @@ /obj/screen/zone_sel/update_icon(mob/user) cut_overlays() - add_overlay(image('icons/mob/screen_gen.dmi', "[selecting]")) + add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) user.zone_selected = selecting /obj/screen/zone_sel/alien @@ -453,7 +448,7 @@ /obj/screen/zone_sel/alien/update_icon(mob/user) cut_overlays() - add_overlay(image('icons/mob/screen_alien.dmi', "[selecting]")) + add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) user.zone_selected = selecting /obj/screen/zone_sel/robot diff --git a/code/controllers/subsystem/processing/overlays.dm b/code/controllers/subsystem/processing/overlays.dm index 1a42944bb5f..1aa76e6b3de 100644 --- a/code/controllers/subsystem/processing/overlays.dm +++ b/code/controllers/subsystem/processing/overlays.dm @@ -55,7 +55,7 @@ PROCESSING_SUBSYSTEM_DEF(overlays) /proc/iconstate2appearance(icon, iconstate) var/static/image/stringbro = new() - var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches + var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches var/list/cached_icon = icon_states_cache[icon] if (cached_icon) var/cached_appearance = cached_icon["[iconstate]"] @@ -91,7 +91,7 @@ PROCESSING_SUBSYSTEM_DEF(overlays) new_overlays[i] = iconstate2appearance(icon, cached_overlay) else if(isicon(cached_overlay)) new_overlays[i] = icon2appearance(cached_overlay) - else //image probable + else //image/mutable_appearance probable appearance_bro.appearance = cached_overlay if(!ispath(cached_overlay)) appearance_bro.dir = cached_overlay.dir @@ -99,11 +99,11 @@ PROCESSING_SUBSYSTEM_DEF(overlays) return new_overlays #define NOT_QUEUED_ALREADY (!(flags & OVERLAY_QUEUED)) -#define QUEUE_FOR_COMPILE flags |= OVERLAY_QUEUED; SSoverlays.processing += src; +#define QUEUE_FOR_COMPILE flags |= OVERLAY_QUEUED; SSoverlays.processing += src; /atom/proc/cut_overlays(priority = FALSE) var/list/cached_overlays = our_overlays var/list/cached_priority = priority_overlays - + var/need_compile = FALSE if(LAZYLEN(cached_overlays)) //don't queue empty lists, don't cut priority overlays @@ -165,7 +165,7 @@ PROCESSING_SUBSYSTEM_DEF(overlays) if(cut_old) cut_overlays() return - + var/list/cached_other = other.our_overlays if(cached_other) if(cut_old || !LAZYLEN(our_overlays)) diff --git a/code/datums/action.dm b/code/datums/action.dm index bd18d646e2d..08239492f33 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -110,12 +110,8 @@ /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) if(icon_icon && button_icon_state && current_button.button_icon_state != button_icon_state) - var/image/img - img = image(icon_icon, current_button, button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 current_button.cut_overlays(TRUE) - current_button.add_overlay(img) + current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) current_button.button_icon_state = button_icon_state diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index 89be685f761..0c39b5a9899 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -83,7 +83,7 @@ var/mob/living/silicon/ai/A = S A.can_be_carded = FALSE A.requires_power = POWER_REQ_CLOCKCULT - var/list/AI_frame = list(image('icons/mob/clockwork_mobs.dmi', A, "aiframe")) //make the AI's cool frame + var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame for(var/d in GLOB.cardinal) AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow A.add_overlay(AI_frame) diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index 75c8379524d..c798f352189 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -31,9 +31,9 @@ if(speak_emote) D.speak_emote = speak_emote -/datum/dog_fashion/proc/get_image(var/dir) +/datum/dog_fashion/proc/get_overlay(var/dir) if(icon_file && obj_icon_state) - var/image/corgI = image(icon_file, icon_state = obj_icon_state, dir = dir) + var/image/corgI = image(icon_file, obj_icon_state, dir = dir) corgI.alpha = obj_alpha corgI.color = obj_color return corgI diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm new file mode 100644 index 00000000000..1cb3a97d9f7 --- /dev/null +++ b/code/datums/mutable_appearance.dm @@ -0,0 +1,18 @@ +// Mutable appearances are an inbuilt byond datastructure. Read the documentation on them by hitting F1 in DM. +// Basically use them instead of images for overlays/underlays and when changing an object's appearance if you're doing so with any regularity. +// Unless you need the overlay/underlay to have a different direction than the base object. Then you have to use an image due to a bug. + +// Mutable appearances are children of images, just so you know. + +/mutable_appearance/New() + ..() + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + +// Helper similar to image() +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER) + var/mutable_appearance/MA = new() + MA.icon = icon + MA.icon_state = icon_state + MA.layer = layer + return MA \ No newline at end of file diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 55f2b03161c..caab422e8b1 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_EMPTY(mutations_list) var/lowest_value = 256 * 8 var/text_gain_indication = "" var/text_lose_indication = "" - var/list/visual_indicators = list() + var/list/mutable_appearance/visual_indicators = list() var/layer_used = MUTATIONS_LAYER //which mutation layer to use var/list/species_allowed = list() //to restrict mutation to only certain species var/health_req //minimum health required to acquire the mutation @@ -161,7 +161,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/telekinesis/New() ..() - visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="telekinesishead", "layer"=-MUTATIONS_LAYER) + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER) /datum/mutation/human/telekinesis/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] @@ -180,7 +180,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/cold_resistance/New() ..() - visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="fire", "layer"=-MUTATIONS_LAYER) + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER) /datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] @@ -618,7 +618,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/laser_eyes/New() ..() - visual_indicators |= image("icon"='icons/effects/genetics.dmi', "icon_state"="lasereyes", "layer"=-FRONT_MUTATIONS_LAYER) + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER) /datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] @@ -640,11 +640,11 @@ GLOBAL_LIST_EMPTY(mutations_list) var/list/mut_overlay = list() if(overlays_standing[CM.layer_used]) mut_overlay = overlays_standing[CM.layer_used] - var/image/V = CM.get_visual_indicator(src) + var/mutable_appearance/V = CM.get_visual_indicator(src) if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one remove_overlay(CM.layer_used) - for(var/image/I in CM.visual_indicators) - mut_overlay.Remove(I) + for(var/mutable_appearance/MA in CM.visual_indicators) + mut_overlay.Remove(MA) mut_overlay |= V overlays_standing[CM.layer_used] = mut_overlay apply_overlay(CM.layer_used) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 7a8bc7f517f..46853995cb3 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -179,11 +179,11 @@ remove_atom_colour(FIXED_COLOUR_PRIORITY) if(is_zombie) copy_overlays(oldguy, TRUE) - var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head") + var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/blob.dmi', "blob_head") if(overmind) - I.color = overmind.blob_reagent_datum.complementary_color + blob_head_overlay.color = overmind.blob_reagent_datum.complementary_color color = initial(color)//looks better. - add_overlay(I) + add_overlay(blob_head_overlay) /mob/living/simple_animal/hostile/blob/blobspore/weak name = "fragile blob spore" diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 7ae47f4c0e6..6ee0a56ceec 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -33,12 +33,11 @@ /obj/structure/blob/core/update_icon() cut_overlays() color = null - var/image/I = new('icons/mob/blob.dmi', "blob") + var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob") if(overmind) - I.color = overmind.blob_reagent_datum.color - add_overlay(I) - var/image/C = new('icons/mob/blob.dmi', "blob_core_overlay") - add_overlay(C) + blob_overlay.color = overmind.blob_reagent_datum.color + add_overlay(blob_overlay) + add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_core_overlay")) /obj/structure/blob/core/Destroy() GLOB.blob_cores -= src diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index d778323ac23..ba92b7e03f5 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -21,12 +21,11 @@ /obj/structure/blob/node/update_icon() cut_overlays() color = null - var/image/I = new('icons/mob/blob.dmi', "blob") + var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob") if(overmind) - I.color = overmind.blob_reagent_datum.color - add_overlay(I) - var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay") - add_overlay(C) + blob_overlay.color = overmind.blob_reagent_datum.color + add_overlay(blob_overlay) + add_overlay(mutable_appearance('icons/mob/blob.dmi', "blob_node_overlay")) /obj/structure/blob/node/Destroy() GLOB.blob_nodes -= src diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm index 31b88010281..1203c7119a7 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm @@ -42,8 +42,7 @@ icon_state = "geisbinding" mob_layer = M.layer layer = M.layer - 0.01 - var/image/GB = new('icons/effects/clockwork_effects.dmi', src, "geisbinding_top", M.layer + 0.01) - add_overlay(GB) + add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", M.layer + 0.01)) for(var/obj/item/I in M.held_items) M.dropItemToGround(I) for(var/i in M.get_empty_held_indexes()) diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index ffc3d5e1a14..9b2d868730e 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -25,7 +25,7 @@ START_PROCESSING(SSobj, src) send_to_playing_players("\"[text2ratvar("ONCE AGAIN MY LIGHT SHALL SHINE ACROSS THIS PATHETIC REALM")]!!\"") send_to_playing_players('sound/effects/ratvar_reveal.ogg') - var/image/alert_overlay = image('icons/effects/clockwork_effects.dmi', "ratvar_alert") + var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") var/area/A = get_area(src) notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0) diff --git a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm index 727f13fea4a..22ea9e2ce50 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm @@ -14,8 +14,8 @@ debris = list(/obj/item/clockwork/alloy_shards/medium = 1, \ /obj/item/clockwork/alloy_shards/small = 6, \ /obj/item/clockwork/component/replicant_alloy/replication_plate = 1) - var/image/daemon_glow - var/image/component_glow + var/static/mutable_appearance/daemon_glow = mutable_appearance('icons/obj/clockwork_objects.dmi', "tinkerglow") + var/static/mutable_appearance/component_glow = mutable_appearance('icons/obj/clockwork_objects.dmi', "t_random_component") var/component_id_to_produce var/production_time = 0 //last time we produced a component var/production_cooldown = 120 @@ -119,14 +119,9 @@ . = ..() if(active) var/component_color = get_component_color(component_id_to_produce) - if(!daemon_glow) - daemon_glow = new('icons/obj/clockwork_objects.dmi', "tinkerglow") daemon_glow.color = component_color add_overlay(daemon_glow) - if(!component_glow) - component_glow = new('icons/obj/clockwork_objects.dmi', "t_[component_id_to_produce ? component_id_to_produce :"random_component"]") - else - component_glow.icon_state = "t_[component_id_to_produce ? component_id_to_produce :"random_component"]" + component_glow.icon_state = "t_[component_id_to_produce ? component_id_to_produce :"random_component"]" component_glow.color = component_color add_overlay(component_glow) production_time = world.time + production_cooldown //don't immediately produce when turned on after being off diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 8d87eeb4fcd..a90aeb78bc2 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -201,9 +201,9 @@ return 0 /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands) - . = list() - if(!isinhands && current_charges) - . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") + . = list() + if(!isinhands && current_charges) + . += mutable_appearance('icons/effects/effects.dmi', "shield-cult", MOB_LAYER + 0.01) /obj/item/clothing/suit/hooded/cultrobes/berserker name = "flagellant's robes" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 2e2ff9c46bc..296b248938f 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -775,11 +775,11 @@ structure_check() searches for nearby cultist structures required for the invoca deltimer(density_timer) air_update_turf(1) if(density) - var/image/I = image(layer = ABOVE_MOB_LAYER, icon = 'icons/effects/effects.dmi', icon_state = "barriershimmer") - I.appearance_flags = RESET_COLOR - I.alpha = 60 - I.color = "#701414" - add_overlay(I) + var/mutable_appearance/shimmer = mutable_appearance('icons/effects/effects.dmi', "barriershimmer", ABOVE_MOB_LAYER) + shimmer.appearance_flags |= RESET_COLOR + shimmer.alpha = 60 + shimmer.color = "#701414" + add_overlay(shimmer) add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) else cut_overlays() diff --git a/code/game/gamemodes/devil/true_devil/inventory.dm b/code/game/gamemodes/devil/true_devil/inventory.dm index c474eaf1161..778c4216160 100644 --- a/code/game/gamemodes/devil/true_devil/inventory.dm +++ b/code/game/gamemodes/devil/true_devil/inventory.dm @@ -5,7 +5,7 @@ return 0 /mob/living/carbon/true_devil/update_inv_hands() - //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_image should use the down sprite when facing down, left, or right, and the up sprite when facing up. + //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_overlay should use the down sprite when facing down, left, or right, and the up sprite when facing up. remove_overlay(DEVIL_HANDS_LAYER) var/list/hands_overlays = list() var/obj/item/l_hand = get_item_for_held_index(1) //hardcoded 2-hands only, for now. @@ -17,9 +17,9 @@ if(!r_state) r_state = r_hand.icon_state - var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - hands_overlays += r_hand_image + hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -33,9 +33,9 @@ if(!l_state) l_state = l_hand.icon_state - var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - hands_overlays += l_hand_image + hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER @@ -54,6 +54,5 @@ /mob/living/carbon/true_devil/apply_overlay(cache_index) - var/image/I = devil_overlays[cache_index] - if(I) - add_overlay(I) + if((. = devil_overlays[cache_index])) + add_overlay(.) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 575db19f5ce..1f01b38860d 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -37,8 +37,8 @@ var/previous_level = "" var/obj/item/nuke_core/core = null var/deconstruction_state = NUKESTATE_INTACT - var/image/lights = null - var/image/interior = null + var/lights = "" + var/interior = "" var/obj/effect/countdown/nuclearbomb/countdown var/static/bomb_set @@ -201,30 +201,32 @@ cut_overlay(interior) switch(deconstruction_state) if(NUKESTATE_UNSCREWED) - interior = image(icon,"panel-unscrewed") + interior = "panel-unscrewed" if(NUKESTATE_PANEL_REMOVED) - interior = image(icon,"panel-removed") + interior = "panel-removed" if(NUKESTATE_WELDED) - interior = image(icon,"plate-welded") + interior = "plate-welded" if(NUKESTATE_CORE_EXPOSED) - interior = image(icon,"plate-removed") + interior = "plate-removed" if(NUKESTATE_CORE_REMOVED) - interior = image(icon,"core-removed") + interior = "core-removed" if(NUKESTATE_INTACT) - interior = null + return add_overlay(interior) /obj/machinery/nuclearbomb/proc/update_icon_lights() - cut_overlay(lights) + if(lights) + cut_overlay(lights) switch(get_nuke_state()) if(NUKE_OFF_LOCKED) - lights = null + lights = "" + return if(NUKE_OFF_UNLOCKED) - lights = image(icon,"lights-safety") + lights = "lights-safety" if(NUKE_ON_TIMING) - lights = image(icon,"lights-timing") + lights = "lights-timing" if(NUKE_ON_EXPLODING) - lights = image(icon,"lights-exploding") + lights = "lights-exploding" add_overlay(lights) /obj/machinery/nuclearbomb/process() diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 39bd31bdb7b..753cd42a4f7 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -96,7 +96,6 @@ return if(!usr || !usr.canUseTopic(src) || usr.incapacitated() || stat || QDELETED(src)) return - var/image/I = image(src) //For feedback message flavor if(href_list["authenticate"]) var/obj/item/weapon/card/id/ID = usr.get_active_held_item() if(!istype(ID)) @@ -117,24 +116,24 @@ authenticated = FALSE auth_id = "\[NULL\]" if(href_list["restore_logging"]) - to_chat(usr, "\icon[I] Logging functionality restored from backup data.") + to_chat(usr, "\icon[src] Logging functionality restored from backup data.") emagged = FALSE LAZYADD(logs, "-=- Logging restored to full functionality at this point -=-") if(href_list["access_apc"]) playsound(src, "terminal_type", 50, 0) var/obj/machinery/power/apc/APC = locate(href_list["access_apc"]) in GLOB.apcs_list if(!APC || APC.aidisabled || APC.panel_open || QDELETED(APC)) - to_chat(usr, "\icon[I] APC does not return interface request. Remote access may be disabled.") + to_chat(usr, "\icon[src] APC does not return interface request. Remote access may be disabled.") return if(active_apc) - to_chat(usr, "\icon[I] Disconnected from [active_apc].") + to_chat(usr, "\icon[src] Disconnected from [active_apc].") active_apc.say("Remote access canceled. Interface locked.") playsound(active_apc, 'sound/machines/BoltsDown.ogg', 25, 0) playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0) active_apc.locked = TRUE active_apc.update_icon() active_apc = null - to_chat(usr, "\icon[I] Connected to APC in [get_area(APC)]. Interface request sent.") + to_chat(usr, "\icon[src] Connected to APC in [get_area(APC)]. Interface request sent.") log_activity("remotely accessed APC in [get_area(APC)]") APC.interact(usr, GLOB.not_incapacitated_state) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 00ac48ad5a7..7a2f58bc01b 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -419,7 +419,7 @@ to_chat(H, "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.cut_overlays() - customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r")) + customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) //Sender is faking as someone who exists else src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") @@ -432,7 +432,7 @@ to_chat(H, "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.cut_overlays() - customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r")) + customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) //Finally.. ResetMessage() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c8555e47ad2..a9331cd142f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -366,13 +366,13 @@ set_airlock_overlays(state) /obj/machinery/door/airlock/proc/set_airlock_overlays(state) - var/image/frame_overlay - var/image/filling_overlay - var/image/lights_overlay - var/image/panel_overlay - var/image/weld_overlay - var/image/damag_overlay - var/image/sparks_overlay + var/mutable_appearance/frame_overlay + var/mutable_appearance/filling_overlay + var/mutable_appearance/lights_overlay + var/mutable_appearance/panel_overlay + var/mutable_appearance/weld_overlay + var/mutable_appearance/damag_overlay + var/mutable_appearance/sparks_overlay switch(state) if(AIRLOCK_CLOSED) @@ -494,10 +494,8 @@ pass(A) //suppress unused warning var/list/airlock_overlays = A.airlock_overlays var/iconkey = "[icon_state][icon_file]" - if(airlock_overlays[iconkey]) - return airlock_overlays[iconkey] - airlock_overlays[iconkey] = image(icon_file, icon_state) - return airlock_overlays[iconkey] + if((!(. = airlock_overlays[iconkey]))) + . = airlock_overlays[iconkey] = mutable_appearance(icon_file, icon_state) /obj/machinery/door/airlock/do_animate(animation) switch(animation) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 607c6870ce3..18dde20df2d 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -184,7 +184,7 @@ if(maptext) maptext = "" cut_overlays() - add_overlay(image('icons/obj/status_display.dmi', icon_state=state)) + add_overlay(mutable_appearance('icons/obj/status_display.dmi', state)) //Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e4e1f7e75d8..e6d84699436 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -36,27 +36,27 @@ else add_overlay("beakeridle") if(beaker.reagents.total_volume) - var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent") + var/mutable_appearance/filling_overlay = mutable_appearance('icons/obj/iv_drip.dmi', "reagent") var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100) switch(percent) if(0 to 9) - filling.icon_state = "reagent0" + filling_overlay.icon_state = "reagent0" if(10 to 24) - filling.icon_state = "reagent10" + filling_overlay.icon_state = "reagent10" if(25 to 49) - filling.icon_state = "reagent25" + filling_overlay.icon_state = "reagent25" if(50 to 74) - filling.icon_state = "reagent50" + filling_overlay.icon_state = "reagent50" if(75 to 79) - filling.icon_state = "reagent75" + filling_overlay.icon_state = "reagent75" if(80 to 90) - filling.icon_state = "reagent80" + filling_overlay.icon_state = "reagent80" if(91 to INFINITY) - filling.icon_state = "reagent100" + filling_overlay.icon_state = "reagent100" - filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list) - add_overlay(filling) + filling_overlay.color = list("#0000", "#0000", "#0000", "#000f", mix_color_from_reagents(beaker.reagents.reagent_list)) + add_overlay(filling_overlay) /obj/machinery/iv_drip/MouseDrop(mob/living/target) if(!ishuman(usr) || !usr.canUseTopic(src,BE_CLOSE) || !isliving(target)) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 24ac822ad08..a91b1fbf0ec 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -146,7 +146,7 @@ /obj/machinery/status_display/proc/set_picture(state) picture_state = state remove_display() - add_overlay(image('icons/obj/status_display.dmi', icon_state=picture_state)) + add_overlay(picture_state) /obj/machinery/status_display/proc/update_display(line1, line2) var/new_text = {"
[line1]
[line2]
"} @@ -278,7 +278,7 @@ /obj/machinery/ai_status_display/proc/set_picture(state) picture_state = state cut_overlays() - add_overlay(image('icons/obj/status_display.dmi', icon_state=picture_state)) + add_overlay(picture_state) #undef CHARS_PER_LINE #undef FOND_SIZE diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a05a5af3755..774e6d9082b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -297,7 +297,7 @@ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") cut_overlays() if(panel_open) - add_overlay(image(icon, "[initial(icon_state)]-panel")) + add_overlay("[initial(icon_state)]-panel") playsound(src.loc, W.usesound, 50, 1) updateUsrDialog() else diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 46ae55e9b82..40b973c5969 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -186,7 +186,7 @@ var/full = contents.len ? 1 : 0 icon_state = "wm_[state_open]_[full]" if(panel_open) - add_overlay(image(icon, icon_state = "wm_panel")) + add_overlay("wm_panel") /obj/machinery/washing_machine/attackby(obj/item/weapon/W, mob/user, params) if(default_deconstruction_screwdriver(user, null, null, W)) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 667f5896406..950f6eaafbc 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -23,7 +23,7 @@ AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. AI.forceMove(src) //Put the dead AI inside the wreckage for recovery - add_overlay(image('icons/obj/projectiles.dmi', icon_state = "green_laser")) //Overlay for the recovery beacon + add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon AI.controlled_mech = null AI.remote_control = null diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 8b855c7c3d2..6539ab64563 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -48,9 +48,9 @@ if (hides) cut_overlays() if(hides < 3) - add_overlay(image("icon" = "mecha.dmi", "icon_state" = occupant ? "ripley-g" : "ripley-g-open")) + add_overlay(occupant ? "ripley-g" : "ripley-g-open") else - add_overlay(image("icon" = "mecha.dmi", "icon_state" = occupant ? "ripley-g-full" : "ripley-g-full-open")) + add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open") /obj/mecha/working/ripley/firefighter diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 0d4b5786536..7727b4d9e94 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -161,23 +161,15 @@ for(var/Ddir in GLOB.cardinal) if(entered_dirs & Ddir) - var/image/I - if(GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"]) - I = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] - else - I = image(icon,"[blood_state]1",dir = Ddir) - GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = I - if(I) - add_overlay(I) + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] + if(!bloodstep_overlay) + GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]1", dir = Ddir) + add_overlay(bloodstep_overlay) if(exited_dirs & Ddir) - var/image/I - if(GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"]) - I = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] - else - I = image(icon,"[blood_state]2",dir = Ddir) - GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = I - if(I) - add_overlay(I) + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] + if(!bloodstep_overlay) + GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) + add_overlay(bloodstep_overlay) alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d1f7522e216..28388d656d3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,4 +1,4 @@ -GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire")) +GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/effects/fire.dmi', "fire")) GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // if true, everyone item when created will have its name changed to be diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 098d3371233..039237c63c7 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -521,7 +521,7 @@ /obj/item/weapon/storage/crayons/update_icon() cut_overlays() for(var/obj/item/toy/crayon/crayon in contents) - add_overlay(image('icons/obj/crayons.dmi',crayon.item_color)) + add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.item_color)) /obj/item/weapon/storage/crayons/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/toy/crayon)) @@ -667,10 +667,9 @@ icon_state = is_capped ? icon_capped : icon_uncapped if(use_overlays) cut_overlays() - var/image/I = image('icons/obj/crayons.dmi', - icon_state = "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]") - I.color = paint_color - add_overlay(I) + var/mutable_appearance/spray_overlay = mutable_appearance('icons/obj/crayons.dmi', "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]") + spray_overlay.color = paint_color + add_overlay(spray_overlay) /obj/item/toy/crayon/spraycan/gang //desc = "A modified container containing suspicious paint." diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 068717f667c..0d1c6444689 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/obj/item/device/paicard/pai = null // A slot for a personal AI device - var/image/photo = null //Scanned photo + var/icon/photo //Scanned photo var/list/contained_item = list(/obj/item/weapon/pen, /obj/item/toy/crayon, /obj/item/weapon/lipstick, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/cigarette) var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above. @@ -82,22 +82,24 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/device/pda/update_icon() cut_overlays() + var/mutable_appearance/overlay = new() + overlay.pixel_x = overlays_x_offset if(id) - var/image/I = image(icon_state = "id_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "id_overlay" + add_overlay(new /mutable_appearance(overlay)) if(inserted_item) - var/image/I = image(icon_state = "insert_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "insert_overlay" + add_overlay(new /mutable_appearance(overlay)) if(fon) - var/image/I = image(icon_state = "light_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "light_overlay" + add_overlay(new /mutable_appearance(overlay)) if(pai) if(pai.pai) - var/image/I = image(icon_state = "pai_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "pai_overlay" + add_overlay(new /mutable_appearance(overlay)) else - var/image/I = image(icon_state = "pai_off_overlay", pixel_x = overlays_x_offset) - add_overlay(I) + overlay.icon_state = "pai_off_overlay" + add_overlay(new /mutable_appearance(overlay)) /obj/item/device/pda/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr @@ -633,7 +635,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(L, "\icon[src] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)") update_icon() - add_overlay(image(icon, icon_alert)) + add_overlay(icon_alert) /obj/item/device/pda/proc/show_to_ghosts(mob/living/user, datum/data_pda_msg/msg,multiple = 0) for(var/mob/M in GLOB.player_list) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 86104f7b941..5c8dd2fe805 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -23,6 +23,7 @@ update_icon() //Whatever happened, update the card's state (icon, name) to match. /obj/item/device/aicard/update_icon() + cut_overlays() if(AI) name = "[initial(name)]- [AI.name]" if(AI.stat == DEAD) @@ -30,12 +31,11 @@ else icon_state = "aicard-full" if(!AI.control_disabled) - add_overlay(image('icons/obj/aicards.dmi', "aicard-on")) + add_overlay("aicard-on") AI.cancel_camera() else name = initial(name) icon_state = initial(icon_state) - cut_overlays() /obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 385e177b6f8..5d47f304f05 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -344,8 +344,9 @@ cut_overlays() set_light(0) else if(on) - var/image/I = image(icon,"glowstick-glow",color) - add_overlay(I) + var/mutable_appearance/glowstick_overlay = mutable_appearance(icon, "glowstick-glow") + glowstick_overlay.color = color + add_overlay(glowstick_overlay) item_state = "glowstick-on" set_light(brightness_on) else diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index f17b5adbbdd..73581f9269d 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -493,7 +493,7 @@ /obj/item/projectile/bullet/reusable/lollipop/New() var/obj/item/weapon/reagent_containers/food/snacks/lollipop/S = new ammo_type(src) color2 = S.headcolor - var/image/head = image(icon = 'icons/obj/projectiles.dmi', icon_state = "lollipop_2") + var/mutable_appearance/head = mutable_appearance('icons/obj/projectiles.dmi', "lollipop_2") head.color = color2 add_overlay(head) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 673c1a56006..2e31e597144 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -73,18 +73,18 @@ if(hp <= 0) visible_message("[src] breaks into tiny pieces and collapses!") qdel(src) - var/image/I = image("icon"='icons/effects/effects.dmi', "icon_state"="scorch", "layer"=OBJ_LAYER+0.5) - I.pixel_x = p_x - 1 //offset correction - I.pixel_y = p_y - 1 + var/image/bullet_hole = image('icons/effects/effects.dmi', "scorch", OBJ_LAYER + 0.5) + bullet_hole.pixel_x = p_x - 1 //offset correction + bullet_hole.pixel_y = p_y - 1 if(decaltype == DECALTYPE_SCORCH) - I.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design + bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design if(P.damage >= 20 || istype(P, /obj/item/projectile/beam/practice)) - I.setDir(pick(NORTH,SOUTH,EAST,WEST)) + bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST)) else - I.icon_state = "light_scorch" + bullet_hole.icon_state = "light_scorch" else - I.icon_state = "dent" - add_overlay(I) + bullet_hole.icon_state = "dent" + add_overlay(bullet_hole) return return -1 diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 5613891326c..e32d365298a 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -155,7 +155,7 @@ var/mob/living/captured = null var/obj/item/weapon/gun/energy/chrono_gun/gun = null var/tickstokill = 15 - var/image/mob_underlay = null + var/mutable_appearance/mob_underlay var/preloaded = 0 var/RPpos = null @@ -172,7 +172,7 @@ mob_icon.Blend(removing_frame, ICON_MULTIPLY) cached_icon.Insert(mob_icon, "frame[i]") - mob_underlay = new(cached_icon, "frame1") + mob_underlay = mutable_appearance(cached_icon, "frame1") update_icon() desc = initial(desc) + "
It appears to contain [target.name]." diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d4e19865029..f53c9f66976 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -496,11 +496,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/lighter/greyscale/update_icon() cut_overlays() - var/image/I = image(icon,"[initial(icon_state)]_base") - I.appearance_flags = RESET_COLOR //the edging doesn't change color + var/mutable_appearance/base_overlay = mutable_appearance(icon,"[initial(icon_state)]_base") + base_overlay.appearance_flags = RESET_COLOR //the edging doesn't change color if(lit) - I.icon_state = "[initial(icon_state)]_on" - add_overlay(I) + base_overlay.icon_state = "[initial(icon_state)]_on" + add_overlay(base_overlay) /obj/item/weapon/lighter/greyscale/ignition_effect(atom/A, mob/user) . = "After some fiddling, [user] manages to light [A] with [src]." @@ -651,9 +651,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM screw = 1 to_chat(user, "You open the cap on the [src]") if(super) - add_overlay(image(icon, "vapeopen_med")) + add_overlay("vapeopen_med") else - add_overlay(image(icon, "vapeopen_low")) + add_overlay("vapeopen_low") else screw = 0 to_chat(user, "You close the cap on the [src]") @@ -665,12 +665,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM cut_overlays() super = 1 to_chat(user, "You increase the voltage in the [src]") - add_overlay(image(icon, "vapeopen_med")) + add_overlay("vapeopen_med") else cut_overlays() super = 0 to_chat(user, "You decrease the voltage in the [src]") - add_overlay(image(icon, "vapeopen_low")) + add_overlay("vapeopen_low") if(screw && emagged) to_chat(user, "The [name] can't be modified!") @@ -683,7 +683,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM emagged = 1 super = 0 to_chat(user, "You maximize the voltage in the [src]") - add_overlay(image(icon, "vapeopen_high")) + add_overlay("vapeopen_high") var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect sp.set_up(5, 1, src) sp.start() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 31d700a7b69..fd586c815b7 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -38,10 +38,10 @@ to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") open = !open if(open) - var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") - colored.color = colour + var/mutable_appearance/colored_overlay = mutable_appearance(icon, "lipstick_uncap_color") + colored_overlay.color = colour icon_state = "lipstick_uncap" - add_overlay(colored) + add_overlay(colored_overlay) else icon_state = "lipstick" diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 65d191927e2..404c40c4b6a 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -16,7 +16,7 @@ /obj/item/weapon/c4/New() wires = new /datum/wires/explosive/c4(src) - image_overlay = image('icons/obj/grenade.dmi', "plastic-explosive2") + plastic_overlay = mutable_appearance(icon, "plastic-explosive2") ..() /obj/item/weapon/c4/Destroy() @@ -92,7 +92,7 @@ message_admins(message,0,1) log_game("[key_name(user)] planted [name] on [target.name] at [COORD(target)] with [timer] second fuse") - target.add_overlay(image_overlay, 1) + target.add_overlay(plastic_overlay, 1) to_chat(user, "You plant the bomb. Timer counting down from [timer].") addtimer(CALLBACK(src, .proc/explode), timer * 10) @@ -103,7 +103,7 @@ if(target) if(!QDELETED(target)) location = get_turf(target) - target.cut_overlay(image_overlay, TRUE) + target.cut_overlay(plastic_overlay, TRUE) else location = get_turf(src) if(location) diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index d461ae6dcda..9bcbbfe0720 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -19,8 +19,8 @@ /obj/item/weapon/grenade/iedcasing/New(loc) ..() - add_overlay(image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled")) - add_overlay(image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired")) + add_overlay("improvised_grenade_filled") + add_overlay("improvised_grenade_wired") times = list("5" = 10, "-1" = 20, "[rand(30,80)]" = 50, "[rand(65,180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] det_time = text2num(pickweight(times)) if(det_time < 0) //checking for 'duds' @@ -33,13 +33,10 @@ ..() var/obj/item/weapon/reagent_containers/food/drinks/soda_cans/can = locate() in contents if(can) - var/muh_layer = can.layer - var/muh_plane = can.plane - can.layer = FLOAT_LAYER - can.plane = FLOAT_PLANE - underlays += can - can.layer = muh_layer - can.plane = muh_plane + var/mutable_appearance/can_underlay = new(can) + can_underlay.layer = FLOAT_LAYER + can_underlay.plane = FLOAT_PLANE + underlays += can_underlay /obj/item/weapon/grenade/iedcasing/attack_self(mob/user) // @@ -47,7 +44,7 @@ if(clown_check(user)) to_chat(user, "You light the [name]!") active = 1 - cut_overlay(image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled"), TRUE) //this line make no sense + cut_overlay("improvised_grenade_filled") icon_state = initial(icon_state) + "_active" add_fingerprint(user) var/turf/bombturf = get_turf(src) diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index 477a50330ed..aedf0954c2a 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -7,7 +7,7 @@ det_time = 10 display_timer = 0 var/atom/target = null - var/image_overlay = null + var/mutable_appearance/plastic_overlay var/obj/item/device/assembly_holder/nadeassembly = null var/assemblyattacher var/directional = FALSE @@ -15,7 +15,7 @@ var/boom_sizes = list(0, 0, 3) /obj/item/weapon/grenade/plastic/New() - image_overlay = image('icons/obj/grenade.dmi', "[item_state]2") + plastic_overlay = mutable_appearance(icon, "[item_state]2") ..() /obj/item/weapon/grenade/plastic/Destroy() @@ -50,7 +50,7 @@ if(target) if(!QDELETED(target)) location = get_turf(target) - target.cut_overlay(image_overlay, TRUE) + target.cut_overlay(plastic_overlay, TRUE) else location = get_turf(src) if(location) @@ -111,7 +111,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_COORDJMP(target)] with [det_time] second fuse",0,1) log_game("[key_name(user)] planted [name] on [target.name] at [COORD(src)] with [det_time] second fuse") - target.add_overlay(image_overlay, 1) + target.add_overlay(plastic_overlay, 1) if(!nadeassembly) to_chat(user, "You plant the bomb. Timer counting down from [det_time].") addtimer(CALLBACK(src, .proc/prime), det_time*10) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index d42e135aebf..571aece4c3d 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -71,7 +71,7 @@ /obj/item/weapon/nullrod/staff/worn_overlays(isinhands) . = list() if(isinhands) - . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "[shield_icon]") + . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) /obj/item/weapon/nullrod/staff/blue name = "blue holy staff" diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index c053b6ed470..61e68934b92 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -162,5 +162,5 @@ src.cut_overlays() if(!tank) return - src.add_overlay(image('icons/obj/pneumaticCannon.dmi', "[tank.icon_state]")) + add_overlay(tank.icon_state) src.update_icon() diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index ddf6dc1c172..266fe875792 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -334,14 +334,14 @@ /obj/item/weapon/storage/bag/tray/proc/rebuild_overlays() cut_overlays() for(var/obj/item/I in contents) - add_overlay(image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1)) + add_overlay(mutable_appearance(I.icon, I.icon_state)) /obj/item/weapon/storage/bag/tray/remove_from_storage(obj/item/W as obj, atom/new_location) ..() rebuild_overlays() /obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0) - add_overlay(image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1)) + add_overlay(mutable_appearance(I.icon, I.icon_state)) . = ..() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 91810c5a13b..5c53db06cf2 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -38,7 +38,7 @@ . = ..() if(illustration) cut_overlays() - add_overlay(image('icons/obj/storage.dmi', "[illustration]")) + add_overlay(illustration) /obj/item/weapon/storage/box/attack_self(mob/user) ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e3975843c8f..14938b92262 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -141,12 +141,15 @@ add_overlay("[icon_state]_open") var/i = contents.len for(var/C in contents) + var/mutable_appearance/inserted_overlay = mutable_appearance(icon) + inserted_overlay.pixel_x = 1 * (i - 1) if(istype(C, /obj/item/weapon/lighter/greyscale)) - add_overlay(image(icon = src.icon, icon_state = "lighter_in", pixel_x = 1 * (i -1))) + inserted_overlay.icon_state = "lighter_in" else if(istype(C, /obj/item/weapon/lighter)) - add_overlay(image(icon = src.icon, icon_state = "zippo_in", pixel_x = 1 * (i -1))) + inserted_overlay.icon_state = "zippo_in" else - add_overlay(image(icon = src.icon, icon_state = "cigarette", pixel_x = 1 * (i -1))) + inserted_overlay.icon_state = "cigarette" + add_overlay(inserted_overlay) i-- else cut_overlays() @@ -247,13 +250,14 @@ spawn_type = /obj/item/clothing/mask/cigarette/cigar /obj/item/weapon/storage/fancy/cigarettes/cigars/update_icon() + cut_overlays() if(fancy_open) - cut_overlays() add_overlay("[icon_state]_open") + var/mutable_appearance/cigar_overlay = mutable_appearance(icon, icon_type) for(var/c = contents.len, c >= 1, c--) - add_overlay(image(icon = src.icon, icon_state = icon_type, pixel_x = 4 * (c -1))) + cigar_overlay.pixel_x = 4 * (c - 1) + add_overlay(cigar_overlay) else - cut_overlays() icon_state = "cigarcase" /obj/item/weapon/storage/fancy/cigarettes/cigars/cohiba diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 68c7c74363f..e455a0277c1 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -94,7 +94,7 @@ else if ((src.code == src.l_code) && (src.l_set == 1)) src.locked = 0 cut_overlays() - add_overlay(image('icons/obj/storage.dmi', icon_opened)) + add_overlay(icon_opened) src.code = null else src.code = "ERROR" diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 66cb97d3a56..94b0709ae20 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -29,7 +29,7 @@ ..() cut_overlays() if(has_latches) - add_overlay(image('icons/obj/storage.dmi', "[latches]")) + add_overlay(latches) /obj/item/weapon/storage/toolbox/suicide_act(mob/user) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index ecca6aabfcd..265e6bb2e5d 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -370,7 +370,7 @@ cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi',icon_state = "backpack-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpack-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) @@ -388,7 +388,7 @@ . = list() //inhands + reagent_filling if(!isinhands && reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi',icon_state = "backpackmob-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 45f082f72c5..702e72842f6 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -148,7 +148,7 @@ ///// ACID -GLOBAL_DATUM_INIT(acid_overlay, /image, image("icon" = 'icons/effects/effects.dmi', "icon_state" = "acid")) +GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/effects/effects.dmi', "acid")) //the obj's reaction when touched by acid /obj/acid_act(acidpwr, acid_volume) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index f79e06e92d5..ce3d0882ce6 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -12,11 +12,7 @@ canSmoothWith = null buildstacktype = null flags = NODECONSTRUCT - var/image/nest_overlay - -/obj/structure/bed/nest/New() - nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=LYING_MOB_LAYER) - return ..() + var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/alien.dmi', "nestoverlay", LYING_MOB_LAYER) /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) if(has_buckled_mobs()) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index fdded787bd6..87560f426fd 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -145,11 +145,11 @@ obj_integrity = 70 max_integrity = 70 buildstackamount = 2 - var/image/armrest = null + var/mutable_appearance/armrest item_chair = null /obj/structure/chair/comfy/Initialize() - armrest = image("icons/obj/chairs.dmi", "comfychair_armrest") + armrest = mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") armrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 929cfaee993..6d3f4197607 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -8,7 +8,7 @@ /obj/structure/chair/e_chair/New() ..() - add_overlay(image('icons/obj/chairs.dmi', src, "echair_over", MOB_LAYER + 1)) + add_overlay(mutable_appearance('icons/obj/chairs.dmi', "echair_over", MOB_LAYER + 1)) /obj/structure/chair/e_chair/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 077e4056161..be8c336c066 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -7,7 +7,7 @@ anchored = 0 density = 1 opacity = 0 - var/case_type = null + var/case_type = "" var/gun_category = /obj/item/weapon/gun var/open = 1 var/capacity = 4 @@ -25,8 +25,10 @@ /obj/structure/guncase/update_icon() cut_overlays() if(case_type && LAZYLEN(contents)) + var/mutable_appearance/gun_overlay = mutable_appearance(icon, case_type) for(var/i in 1 to contents.len) - add_overlay(image(icon = src.icon, icon_state = "[case_type]", pixel_x = 3 * (i - 1) )) + gun_overlay.pixel_x = 3 * (i - 1) + add_overlay(gun_overlay) if(open) add_overlay("[icon_state]_open") else diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index eae2041a315..730b9e057c4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -143,21 +143,21 @@ /obj/structure/transit_tube/proc/create_tube_overlay(direction, shift_dir) - var/image/I + var/image/tube_overlay = new(dir = direction) if(shift_dir) - I = image(loc = src, icon_state = "decorative_diag", dir = direction) + tube_overlay.icon_state = "decorative_diag" switch(shift_dir) if(NORTH) - I.pixel_y = 32 + tube_overlay.pixel_y = 32 if(SOUTH) - I.pixel_y = -32 + tube_overlay.pixel_y = -32 if(EAST) - I.pixel_x = 32 + tube_overlay.pixel_x = 32 if(WEST) - I.pixel_x = -32 + tube_overlay.pixel_x = -32 else - I = image(loc = src, icon_state = "decorative", dir = direction) - add_overlay(I) + tube_overlay.icon_state = "decorative" + add_overlay(tube_overlay) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 56a8d0410c0..3db570db83d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -239,7 +239,7 @@ qdel(mymist) if(on) - add_overlay(image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir)) + add_overlay(mutable_appearance('icons/obj/watercloset.dmi', "water", MOB_LAYER + 1)) if(watertemp == "freezing") return if(!ismist) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c6c2ef358bc..e1336d1d245 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -18,7 +18,7 @@ var/fulltile = 0 var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 - var/image/crack_overlay + var/static/mutable_appearance/crack_overlay = mutable_appearance('icons/obj/structures.dmi') var/list/debris = list() can_be_unanchored = 1 resistance_flags = ACID_PROOF @@ -361,10 +361,10 @@ if(smooth) queue_smooth(src) - cut_overlay(crack_overlay) + cut_overlays() if(ratio > 75) return - crack_overlay = image('icons/obj/structures.dmi',"damage[ratio]",-(layer+0.1)) + crack_overlay.icon_state = "damage[ratio]" add_overlay(crack_overlay) /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index f8cb0d1be3b..741d4f29587 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -71,10 +71,8 @@ /turf/closed/indestructible/fakeglass/Initialize() ..() icon_state = null //set the icon state to null, so our base state isn't visible - var/image/I = image('icons/obj/structures.dmi', loc = src, icon_state = "grille") - underlays += I //add a grille underlay - I = image('icons/turf/floors.dmi', loc = src, icon_state = "plating") - underlays += I //add the plating underlay, below the grille + underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay + underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille /turf/closed/indestructible/fakedoor name = "Centcom Access" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index ee5527c0f59..7183d33ef9d 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -3,7 +3,7 @@ var/wet = 0 var/wet_time = 0 // Time in seconds that this floor will be wet for. - var/image/wet_overlay = null + var/mutable_appearance/wet_overlay /turf/open/indestructible name = "floor" @@ -183,17 +183,22 @@ if(wet_setting != TURF_DRY) if(wet_overlay) cut_overlay(wet_overlay) - wet_overlay = null + else + wet_overlay = mutable_appearance() var/turf/open/floor/F = src if(istype(F)) if(wet_setting == TURF_WET_PERMAFROST) - wet_overlay = image('icons/effects/water.dmi', src, "ice_floor") + wet_overlay.icon = 'icons/effects/water.dmi' + wet_overlay.icon_state = "ice_floor" else if(wet_setting == TURF_WET_ICE) - wet_overlay = image('icons/turf/overlays.dmi', src, "snowfloor") + wet_overlay.icon = 'icons/turf/overlays.dmi' + wet_overlay.icon_state = "snowfloor" else - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + wet_overlay.icon = 'icons/effects/water.dmi' + wet_overlay.icon_state = "wet_floor_static" else - wet_overlay = image('icons/effects/water.dmi', src, "wet_static") + wet_overlay.icon = 'icons/effects/water.dmi' + wet_overlay.icon_state = "wet_static" add_overlay(wet_overlay) HandleWet() diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index d418c0a48a5..5805d75e565 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -21,7 +21,7 @@ var/spread = 0 //will the seam spread? var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles var/last_act = 0 - var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner + var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner var/defer_change = 0 /turf/closed/mineral/Initialize() @@ -380,7 +380,7 @@ var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes var/activated_name = null - var/activated_image = null + var/mutable_appearance/activated_overlay /turf/closed/mineral/gibtonite/Initialize() det_time = rand(8,10) //So you don't know exactly when the hot potato will explode @@ -394,9 +394,8 @@ /turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0) if(stage == 0) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER) - add_overlay(I) - activated_image = I + activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER) + add_overlay(activated_overlay) name = "gibtonite deposit" desc = "An active gibtonite reserve. Run!" stage = 1 @@ -433,9 +432,9 @@ /turf/closed/mineral/gibtonite/proc/defuse() if(stage == 1) - cut_overlay(activated_image) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER) - add_overlay(I) + cut_overlay(activated_overlay) + activated_overlay.icon_state = "rock_Gibtonite_inactive" + add_overlay(activated_overlay) desc = "An inactive gibtonite reserve. The ore can be extracted." stage = 2 if(det_time < 0) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index f79a80f220e..2285466b3d3 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,18 +17,18 @@ if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return - var/image/cross = image('icons/obj/storage.dmi',"bible") + var/mutable_appearance/cross = mutable_appearance('icons/obj/storage.dmi', "bible") var/font_color = "purple" var/prayer_type = "PRAYER" var/deity if(usr.job == "Chaplain") - cross = image('icons/obj/storage.dmi',"kingyellow") + cross.icon_state = "kingyellow" font_color = "blue" prayer_type = "CHAPLAIN PRAYER" if(SSreligion.deity) deity = SSreligion.deity else if(iscultist(usr)) - cross = image('icons/obj/storage.dmi',"tome") + cross.icon_state = "tome" font_color = "red" prayer_type = "CULTIST PRAYER" deity = "Nar-Sie" diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f2e6b451200..4615629f1a9 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -44,14 +44,11 @@ add_overlay("[O]_l") if(a_right) - var/list/images = list() - images += image(icon, icon_state = "[a_right.icon_state]_left") + var/mutable_appearance/right = mutable_appearance(icon, "[a_right.icon_state]_left") + right.transform = matrix(-1, 0, 0, 0, 1, 0) for(var/O in a_right.attached_overlays) - images += image(icon, icon_state = "[O]_l") - var/matrix = matrix(-1, 0, 0, 0, 1, 0) - for(var/image/I in images) - I.transform = matrix - add_overlay(I) + right.add_overlay("[O]_l") + add_overlay(right) if(master) master.update_icon() diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index c003c1b1021..a4c0641be09 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -201,17 +201,10 @@ Pipelines + Other Objects -> Pipe network //Generate a unique identifier for this image combination var/identifier = iconsetids[iconset] + "_[iconstate]_[direction]_[col]" - var/image/img - if(pipeimages[identifier] == null) - img = image(iconset, icon_state=iconstate, dir=direction) - img.color = col - - pipeimages[identifier] = img - - else - img = pipeimages[identifier] - - return img + if((!(. = pipeimages[identifier]))) + var/image/pipe_overlay + pipe_overlay = . = pipeimages[identifier] = image(iconset, iconstate, dir = direction) + pipe_overlay.color = col /obj/machinery/atmospherics/on_construction(pipe_type, obj_color) if(can_unwrench) diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 8b55ce14fc5..d12204d8ad3 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -98,12 +98,11 @@ /obj/machinery/atmospherics/miner/update_icon() overlays.Cut() if(broken) - var/image/A = image(icon, "broken") - add_overlay(A) + add_overlay("broken") else if(active) - var/image/A = image(icon, "on") - A.color = overlay_color - add_overlay(A) + var/mutable_appearance/on_overlay = mutable_appearance(icon, "on") + on_overlay.color = overlay_color + add_overlay(on_overlay) /obj/machinery/atmospherics/miner/process() update_power() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9a21f3c4a4e..7db86ee3594 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -251,9 +251,9 @@ BLIND // can't see anything . = list() if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedgloves") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands") + . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") /obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE) ..() @@ -279,9 +279,9 @@ BLIND // can't see anything . = list() if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedhelmet") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="helmetblood") + . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") /obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE) ..() @@ -304,9 +304,9 @@ BLIND // can't see anything if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedmask") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood") + . += mutable_appearance('icons/effects/blood.dmi', "maskblood") //Mask @@ -326,9 +326,9 @@ BLIND // can't see anything if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedmask") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="maskblood") + . += mutable_appearance('icons/effects/blood.dmi', "maskblood") /obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE) ..() @@ -400,9 +400,9 @@ BLIND // can't see anything bloody = bloody_shoes[BLOOD_STATE_HUMAN] if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damagedshoe") + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") if(bloody) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="shoeblood") + . += mutable_appearance('icons/effects/blood.dmi', "shoeblood") /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() @@ -455,9 +455,9 @@ BLIND // can't see anything . = list() if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damaged[blood_overlay_type]") + . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="[blood_overlay_type]blood") + . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") /obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE) ..() @@ -534,17 +534,17 @@ BLIND // can't see anything if(!isinhands) if(damaged_clothes) - . += image("icon"='icons/effects/item_damage.dmi', "icon_state"="damageduniform") + . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") if(blood_DNA) - . += image("icon"='icons/effects/blood.dmi', "icon_state"="uniformblood") + . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") if(hastie) var/tie_color = hastie.item_color if(!tie_color) tie_color = hastie.icon_state - var/image/tI = image("icon"='icons/mob/ties.dmi', "icon_state"="[tie_color]") - tI.alpha = hastie.alpha - tI.color = hastie.color - . += tI + var/mutable_appearance/tie = mutable_appearance('icons/mob/ties.dmi', "[tie_color]") + tie.alpha = hastie.alpha + tie.color = hastie.color + . += tie /obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE) ..() diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 15e4d3f885a..10924c233ae 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -30,7 +30,6 @@ var/list/hands_nodrop = list() var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null - var/image/phase_underlay = null var/datum/action/innate/chrono_teleport/teleport_now = new var/activating = 0 var/activated = 0 @@ -97,10 +96,6 @@ for(var/obj/item/I in user.held_items) if(I in hands_nodrop) I.flags &= ~NODROP - if(phase_underlay && !QDELETED(phase_underlay)) - user.underlays -= phase_underlay - qdel(phase_underlay) - phase_underlay = null if(camera) camera.remove_target_ui() camera.loc = user @@ -133,8 +128,6 @@ user.ExtinguishMob() - phase_underlay = create_phase_underlay(user) - hands_nodrop = list() for(var/obj/item/I in user.held_items) if(!(I.flags & NODROP)) @@ -171,15 +164,6 @@ else finish_chronowalk(user, to_turf) - -/obj/item/clothing/suit/space/chronos/proc/create_phase_underlay(var/mob/user) - var/icon/user_icon = icon('icons/effects/alphacolors.dmi', "") - user_icon.AddAlphaMask(getFlatIcon(user)) - var/image/phase = new(user_icon) - phase.appearance_flags = RESET_COLOR|RESET_ALPHA - user.underlays += phase - return phase - /obj/item/clothing/suit/space/chronos/process() if(activated) var/mob/living/carbon/human/user = src.loc diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index d8a0c97f51c..0c3d20892fd 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -597,9 +597,9 @@ C.update_inv_wear_suit() /obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands) - . = list() - if(!isinhands) - . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "[shield_state]") + . = list() + if(!isinhands) + . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) /obj/item/clothing/head/helmet/space/hardsuit/shielded resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b55cb58f41d..45606035a42 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -178,7 +178,7 @@ if(istype(borghead, /obj/item/clothing/head/cardborg)) //why is this done this way? because equipped() is called BEFORE THE ITEM IS IN THE SLOT WHYYYY var/image/I = image(icon = 'icons/mob/robots.dmi' , icon_state = "robot", loc = H) I.override = 1 - I.add_overlay(image(icon = 'icons/mob/robots.dmi' , icon_state = "robot_e")) //gotta look realistic + I.add_overlay(mutable_appearance('icons/mob/robots.dmi', "robot_e")) //gotta look realistic add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "standard_borg_disguise", I) //you look like a robot to robots! (including yourself because you're totally a robot) diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 94e22b8b22a..dbfc2caee29 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -47,15 +47,12 @@ icon_state = "evidence" - var/xx = I.pixel_x //save the offset of the item - var/yy = I.pixel_y - I.pixel_x = 0 //then remove it so it'll stay within the evidence bag - I.pixel_y = 0 - var/image/img = image("icon"=I, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn - img.plane = FLOAT_PLANE - I.pixel_x = xx //and then return it - I.pixel_y = yy - add_overlay(img) + var/mutable_appearance/in_evidence = new(I) + in_evidence.plane = FLOAT_PLANE + in_evidence.layer = FLOAT_LAYER + in_evidence.pixel_x = 0 + in_evidence.pixel_y = 0 + add_overlay(in_evidence) add_overlay("evidence") //should look nicer for transparent stuff. not really that important, but hey. desc = "An evidence bag containing [I]. [I.desc]" diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 8f95552a4b9..888b87cc026 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -34,10 +34,10 @@ var/list/hostile_types = list() var/number_of_hostiles var/list/station_areas = list() - var/image/storm + var/mutable_appearance/storm /datum/round_event/portal_storm/setup() - storm = image('icons/obj/tesla_engine/energy_ball.dmi', "energy_ball_fast", layer=FLY_LAYER) + storm = storm = mutable_appearance('icons/obj/tesla_engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER) storm.color = "#00FF00" station_areas = get_areas_in_z(ZLEVEL_STATION) diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 7e2deff368b..1e2710afb69 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -22,9 +22,9 @@ if(R.glass_icon_state) icon_state = R.glass_icon_state else - var/image/I = image(icon, "glassoverlay") - I.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(I) + var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "glassoverlay") + reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(reagent_overlay) else icon_state = "glass_empty" name = "drinking glass" @@ -64,9 +64,9 @@ icon_state = largest_reagent.shot_glass_icon_state else icon_state = "shotglassclear" - var/image/I = image(icon, "shotglassoverlay") - I.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(I) + var/mutable_appearance/shot_overlay = mutable_appearance(icon, "shotglassoverlay") + shot_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(shot_overlay) else diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 705319f7c3a..3a6c2d91f66 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -101,37 +101,36 @@ filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4]) /obj/item/weapon/reagent_containers/food/snacks/customizable/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S) - var/image/I = new(icon, "[initial(icon_state)]_filling") + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") - I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") else - I.color = S.filling_color + filling.color = S.filling_color switch(ingredients_placement) if(INGREDIENTS_SCATTER) - I.pixel_x = rand(-1,1) - I.pixel_y = rand(-1,1) + filling.pixel_x = rand(-1,1) + filling.pixel_y = rand(-1,1) if(INGREDIENTS_STACK) - I.pixel_x = rand(-1,1) - I.pixel_y = 2 * ingredients.len - 1 + filling.pixel_x = rand(-1,1) + filling.pixel_y = 2 * ingredients.len - 1 if(INGREDIENTS_STACKPLUSTOP) - I.pixel_x = rand(-1,1) - I.pixel_y = 2 * ingredients.len - 1 + filling.pixel_x = rand(-1,1) + filling.pixel_y = 2 * ingredients.len - 1 if(our_overlays) our_overlays.Cut(ingredients.len) //???, add overlay calls later in this proc will queue the compile if necessary - var/image/TOP = new(icon, "[icon_state]_top") + var/mutable_appearance/TOP = mutable_appearance(icon, "[icon_state]_top") TOP.pixel_y = 2 * ingredients.len + 3 - add_overlay(I) + add_overlay(filling) add_overlay(TOP) return if(INGREDIENTS_FILL) cut_overlays() - I.color = filling_color + filling.color = filling_color if(INGREDIENTS_LINE) - I.pixel_y = rand(-8,3) - I.pixel_x = I.pixel_y + filling.pixel_x = filling.pixel_y = rand(-8,3) - add_overlay(I) + add_overlay(filling) /obj/item/weapon/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice) @@ -248,14 +247,14 @@ name = "[customname] sandwich" BS.reagents.trans_to(src, BS.reagents.total_volume) ingMax = ingredients.len //can't add more ingredients after that - var/image/TOP = new(icon, "[BS.icon_state]") + var/mutable_appearance/TOP = mutable_appearance(icon, "[BS.icon_state]") TOP.pixel_y = 2 * ingredients.len + 3 add_overlay(TOP) if(istype(BS, /obj/item/weapon/reagent_containers/food/snacks/breadslice/custom)) - var/image/O = new(icon, "[initial(BS.icon_state)]_filling") - O.color = BS.filling_color - O.pixel_y = 2 * ingredients.len + 3 - add_overlay(O) + var/mutable_appearance/filling = new(icon, "[initial(BS.icon_state)]_filling") + filling.color = BS.filling_color + filling.pixel_y = 2 * ingredients.len + 3 + add_overlay(filling) qdel(BS) return else @@ -313,7 +312,7 @@ /obj/item/weapon/reagent_containers/glass/bowl/update_icon() cut_overlays() if(reagents && reagents.total_volume) - var/image/filling = image('icons/obj/food/soupsalad.dmi', "fullbowl") + var/mutable_appearance/filling = mutable_appearance('icons/obj/food/soupsalad.dmi', "fullbowl") filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) else diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 96b88269718..d50c80567a5 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -234,13 +234,13 @@ /obj/item/weapon/reagent_containers/food/snacks/proc/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S) cut_overlays() - var/image/I = new(src.icon, "[initial(icon_state)]_filling") + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") - I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") else - I.color = S.filling_color + filling.color = S.filling_color - add_overlay(I) + add_overlay(filling) // initialize_cooked_food() is called when microwaving the food /obj/item/weapon/reagent_containers/food/snacks/proc/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency = 1) diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index 625a0bfd560..c1b5a55ac06 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -17,9 +17,9 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/slice, reagents_per_slice) ..() - var/image/I = new(icon, "rawcutlet_coloration") - I.color = filling_color - slice.add_overlay(I) + var/mutable_appearance/filling = mutable_appearance(icon, "rawcutlet_coloration") + filling.color = filling_color + slice.add_overlay(filling) slice.filling_color = filling_color slice.name = "raw [name] cutlet" slice.meat_type = name diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 4a9001c68f6..6ec7fd9a1e7 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -383,13 +383,13 @@ icon = 'icons/obj/lollipop.dmi' icon_state = "lollipop_stick" list_reagents = list("nutriment" = 1, "vitamin" = 1, "iron" = 10, "sugar" = 5, "omnizine" = 2) //Honk - var/image/head + var/mutable_appearance/head var/headcolor = rgb(0, 0, 0) tastes = list("candy" = 1) /obj/item/weapon/reagent_containers/food/snacks/lollipop/New() ..() - head = image(icon = 'icons/obj/lollipop.dmi', icon_state = "lollipop_head") + head = mutable_appearance('icons/obj/lollipop.dmi', "lollipop_head") change_head_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255))) /obj/item/weapon/reagent_containers/food/snacks/lollipop/proc/change_head_color(C) diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 68ccce9f2f4..27016d0c20c 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -33,7 +33,7 @@ if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom - var/image/creamoverlay = image('icons/effects/creampie.dmi') + var/mutable_appearance/creamoverlay = mutable_appearance('icons/effects/creampie.dmi') if(H.dna.species.id == "lizard") creamoverlay.icon_state = "creampie_lizard" else diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 13442c40320..a4d9a32d3d2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -47,7 +47,7 @@ /obj/machinery/gibber/New() ..() - src.add_overlay(image('icons/obj/kitchen.dmi', "grjam")) + add_overlay("grjam") var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gibber(null) B.apply_default_parts(src) @@ -72,15 +72,15 @@ /obj/machinery/gibber/update_icon() cut_overlays() if (dirty) - src.add_overlay(image('icons/obj/kitchen.dmi', "grbloody")) + add_overlay("grbloody") if(stat & (NOPOWER|BROKEN)) return if (!occupant) - src.add_overlay(image('icons/obj/kitchen.dmi', "grjam")) + add_overlay("grjam") else if (operating) - src.add_overlay(image('icons/obj/kitchen.dmi', "gruse")) + add_overlay("gruse") else - src.add_overlay(image('icons/obj/kitchen.dmi', "gridle")) + add_overlay("gridle") /obj/machinery/gibber/attack_paw(mob/user) return src.attack_hand(user) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index c84b381ac5b..a10bf27a0ef 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -59,21 +59,20 @@ icon_state = "pizzabox_open" if(pizza) icon_state = "pizzabox_messy" - var/image/pizzaimg = image(pizza.icon, icon_state = pizza.icon_state) - pizzaimg.pixel_y = -3 - add_overlay(pizzaimg) + var/mutable_appearance/pizza_overlay = mutable_appearance(pizza.icon, pizza.icon_state) + pizza_overlay.pixel_y = -3 + add_overlay(pizza_overlay) if(bomb) bomb.icon_state = "pizzabomb_[bomb_active ? "active" : "inactive"]" - var/image/bombimg = image(bomb.icon, icon_state = bomb.icon_state) - bombimg.pixel_y = 5 - add_overlay(bombimg) - else + var/mutable_appearance/bomb_overlay = mutable_appearance(bomb.icon, bomb.icon_state) + bomb_overlay.pixel_y = 5 + add_overlay(bomb_overlay) icon_state = "pizzabox[boxes.len + 1]" var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src if(box.boxtag != "") - var/image/tagimg = image(icon, icon_state = "pizzabox_tag") - tagimg.pixel_y = boxes.len * 3 - add_overlay(tagimg) + var/mutable_appearance/tag_overlay = mutable_appearance(icon, "pizzabox_tag") + tag_overlay.pixel_y = boxes.len * 3 + add_overlay(tag_overlay) /obj/item/pizzabox/attack_self(mob/user) if(boxes.len > 0) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index ebc9f84ae90..4e6f4c734e5 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -234,31 +234,30 @@ if (cards.len == 1) var/datum/playingcard/P = cards[1] - var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) + var/mutable_appearance/card_overlay = mutable_appearance(icon, (concealed ? "card_back" : "[P.card_icon]") ) - I.pixel_x = I.pixel_x + (-5 + rand(10)) - I.pixel_y = I.pixel_y + (-5 + rand(10)) + card_overlay.pixel_x = card_overlay.pixel_x + (-5 + rand(10)) + card_overlay.pixel_y = card_overlay.pixel_y + (-5 + rand(10)) - add_overlay(I) + add_overlay(card_overlay) else - var/origin = -12 - var/offset = round(32 / cards.len) + var/origin = -12 + var/offset = round(32 / cards.len) - var/i = 0 - var/image/I + var/i = 0 + var/mutable_appearance/card_overlay for(var/datum/playingcard/P in cards) - I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) - I.pixel_x = origin + (offset * i) + card_overlay = mutable_appearance(icon, (concealed ? "card_back" : P.card_icon)) + card_overlay.pixel_x = origin + (offset * i) - add_overlay(I) + add_overlay(card_overlay) + i = i + 1 - i = i + 1 - - var/html = "" + var/html = "" for(var/datum/playingcard/card in cards) - html = html + "" + html = html + "" src.hi.updateContent("hand", html) diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 067162be8ca..d418b40b811 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -73,8 +73,8 @@ /obj/item/weapon/storage/bag/easterbasket/proc/countEggs() cut_overlays() - add_overlay(image("icon" = icon, "icon_state" = "basket-grass", "layer" = -1)) - add_overlay(image("icon" = icon, "icon_state" = "basket-egg[contents.len <= 5 ? contents.len : 5]", "layer" = -1)) + add_overlay("basket-grass") + add_overlay("basket-egg[min(contents.len, 5)]") /obj/item/weapon/storage/bag/easterbasket/remove_from_storage(obj/item/W as obj, atom/new_location) ..() diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index 442dd84aaf5..85d623d1e98 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -21,13 +21,11 @@ /obj/item/weapon/reagent_containers/honeycomb/update_icon() cut_overlays() - var/image/honey + var/mutable_appearance/honey_overlay = mutable_appearance(icon, "honey") if(honey_color) - honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "greyscale_honey") - honey.color = honey_color - else - honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "honey") - add_overlay(honey) + honey_overlay.icon_state = "greyscale_honey" + honey_overlay.color = honey_color + add_overlay(honey_overlay) /obj/item/weapon/reagent_containers/honeycomb/proc/set_reagent(reagent) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 2c995695d14..6a1c877b97f 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -116,8 +116,9 @@ can_buckle = 1 buckle_requires_restraints = 1 to_chat(user, "You add a rod to [src].") - var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16) - underlays += U + var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/hydroponics/equipment.dmi', "bonfire_rod") + rod_underlay.pixel_y = 16 + underlays += rod_underlay if(W.is_hot()) StartBurning() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 8e3b2e705a3..22384aa8039 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -259,7 +259,7 @@ if(istype(src, /obj/machinery/hydroponics/soil)) add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY) else - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing")) + overlays += mutable_appearance('icons/obj/hydroponics/equipment.dmi', "gaia_blessing") set_light(3) update_icon_hoses() @@ -287,31 +287,30 @@ icon_state = "hoses-[n]" /obj/machinery/hydroponics/proc/update_icon_plant() - var/image/I + var/mutable_appearance/plant_overlay = mutable_appearance(myseed.growing_icon, layer = OBJ_LAYER + 0.01) if(dead) - I = image(icon = myseed.growing_icon, icon_state = myseed.icon_dead) + plant_overlay.icon_state = myseed.icon_dead else if(harvest) if(!myseed.icon_harvest) - I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][myseed.growthstages]") + plant_overlay.icon_state = "[myseed.icon_grow][myseed.growthstages]" else - I = image(icon = myseed.growing_icon, icon_state = myseed.icon_harvest) + plant_overlay.icon_state = myseed.icon_harvest else var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages) - I = image(icon = myseed.growing_icon, icon_state = "[myseed.icon_grow][t_growthstate]") - I.layer = OBJ_LAYER + 0.01 - add_overlay(I) + plant_overlay.icon_state = "[myseed.icon_grow][t_growthstate]" + add_overlay(plant_overlay) /obj/machinery/hydroponics/proc/update_icon_lights() if(waterlevel <= 10) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowwater3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowwater3")) if(nutrilevel <= 2) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lownutri3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lownutri3")) if(plant_health <= (myseed.endurance / 2)) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_lowhealth3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowhealth3")) if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_alert3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_alert3")) if(harvest) - add_overlay(image('icons/obj/hydroponics/equipment.dmi', icon_state = "over_harvest3")) + add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_harvest3")) /obj/machinery/hydroponics/examine(user) diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm index a4ab2919be8..52c2e1052fe 100644 --- a/code/modules/hydroponics/sample.dm +++ b/code/modules/hydroponics/sample.dm @@ -8,9 +8,9 @@ /obj/item/seeds/sample/New() ..() if(sample_color) - var/image/I = image(icon, icon_state = "sample-filling") - I.color = sample_color - add_overlay(I) + var/mutable_appearance/filling = mutable_appearance(icon, "sample-filling") + filling.color = sample_color + add_overlay(filling) /obj/item/seeds/sample/get_analyzer_text() return " The DNA of this sample is damaged beyond recovery, it can't support life on its own.\n*---------*" diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm index 02a752c2d76..36c30531431 100644 --- a/code/modules/mining/equipment.dm +++ b/code/modules/mining/equipment.dm @@ -513,7 +513,7 @@ var/charged = 1 var/charge_time = 16 var/atom/mark = null - var/marked_image = null + var/mutable_appearance/marked_underlay /obj/item/projectile/destabilizer name = "destabilizing force" @@ -530,15 +530,16 @@ if(hammer_synced.mark == target) return ..() if(isliving(target)) - if(hammer_synced.mark && hammer_synced.marked_image) - hammer_synced.mark.underlays -= hammer_synced.marked_image - hammer_synced.marked_image = null + if(hammer_synced.mark && hammer_synced.marked_underlay) + hammer_synced.mark.underlays -= hammer_synced.marked_underlay + hammer_synced.marked_underlay = null var/mob/living/L = target if(L.mob_size >= MOB_SIZE_LARGE) hammer_synced.mark = L - var/image/I = image('icons/effects/effects.dmi', loc = L, icon_state = "shield2",pixel_y = (-L.pixel_y),pixel_x = (-L.pixel_x)) - L.underlays += I - hammer_synced.marked_image = I + hammer_synced.marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") + hammer_synced.marked_underlay.pixel_x = -L.pixel_x + hammer_synced.marked_underlay.pixel_y = -L.pixel_y + L.underlays += hammer_synced.marked_underlay var/target_turf = get_turf(target) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf @@ -570,9 +571,8 @@ new /obj/effect/overlay/temp/kinetic_blast(get_turf(L)) mark = 0 if(L.mob_size >= MOB_SIZE_LARGE) - L.underlays -= marked_image - qdel(marked_image) - marked_image = null + L.underlays -= marked_underlay + QDEL_NULL(marked_underlay) var/backstab_dir = get_dir(user, L) var/def_check = L.getarmor(type = "bomb") if((user.dir & backstab_dir) && (L.dir & backstab_dir)) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 463ee524f94..b8b1bcc6b9e 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -69,9 +69,9 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(uses_left <= 0) user.drop_item(src) loc = A - var/image/balloon - var/image/balloon2 - var/image/balloon3 + var/mutable_appearance/balloon + var/mutable_appearance/balloon2 + var/mutable_appearance/balloon3 if(isliving(A)) var/mob/living/M = A M.Weaken(16) // Keep them from moving during the duration of the extraction @@ -82,12 +82,12 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/obj/effect/extraction_holder/holder_obj = new(A.loc) holder_obj.appearance = A.appearance A.loc = holder_obj - balloon2 = image('icons/obj/fulton_balloon.dmi',"fulton_expand") + balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand") balloon2.pixel_y = 10 balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.add_overlay(balloon2) sleep(4) - balloon = image('icons/obj/fulton_balloon.dmi',"fulton_balloon") + balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon") balloon.pixel_y = 10 balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon2) @@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) sleep(10) animate(holder_obj, pixel_z = 10, time = 10) sleep(10) - balloon3 = image('icons/obj/fulton_balloon.dmi',"fulton_retract") + balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract") balloon3.pixel_y = 10 balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon) diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index c390851b1b3..13e3e56f667 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -68,9 +68,8 @@ user.setDir(SOUTH) user.Stun(4) user.loc = src.loc - var/image/W = image('goon/icons/obj/fitness.dmi',"fitnessweight-w") - W.layer = WALL_OBJ_LAYER - add_overlay(W) + var/mutable_appearance/swole_overlay = mutable_appearance(icon, "fitnessweight-w", WALL_OBJ_LAYER) + add_overlay(swole_overlay) var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") user.visible_message("[user] is [bragmessage]!") var/reps = 0 @@ -93,5 +92,5 @@ animate(user, pixel_y = 0, time = 3) var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") icon_state = "fitnessweight" - cut_overlay(W) + cut_overlay(swole_overlay) to_chat(user, "[finishmessage]") \ No newline at end of file diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index eff7e4780b7..1f7f4b4695f 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -392,7 +392,7 @@ return if (CC.use(1)) - add_overlay(image('icons/obj/economy.dmi',"coin_string_overlay")) + add_overlay("coin_string_overlay") string_attached = 1 to_chat(user, "You attach a string to the coin.") else diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7a77aab7cdf..7946d67d10a 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -37,10 +37,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) //These variables store hair data if the ghost originates from a species with head and/or facial hair. var/hair_style var/hair_color - var/image/hair_image + var/mutable_appearance/hair_overlay var/facial_hair_style var/facial_hair_color - var/image/facial_hair_image + var/mutable_appearance/facial_hair_overlay var/updatedir = 1 //Do we have to update our dir as the ghost moves around? var/lastsetting = null //Stores the last setting that ghost_others was set to, for a little more efficiency when we update ghost images. Null means no update is necessary @@ -161,13 +161,13 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) ghost_accs = client.prefs.ghost_accs ghost_others = client.prefs.ghost_others - if(hair_image) - cut_overlay(hair_image) - hair_image = null + if(hair_overlay) + cut_overlay(hair_overlay) + hair_overlay = null - if(facial_hair_image) - cut_overlay(facial_hair_image) - facial_hair_image = null + if(facial_hair_overlay) + cut_overlay(facial_hair_overlay) + facial_hair_overlay = null if(new_form) @@ -188,19 +188,19 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) if(facial_hair_style) S = GLOB.facial_hair_styles_list[facial_hair_style] if(S) - facial_hair_image = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER) + facial_hair_overlay = mutable_appearance(S.icon, "[S.icon_state]", -HAIR_LAYER) if(facial_hair_color) - facial_hair_image.color = "#" + facial_hair_color - facial_hair_image.alpha = 200 - add_overlay(facial_hair_image) + facial_hair_overlay.color = "#" + facial_hair_color + facial_hair_overlay.alpha = 200 + add_overlay(facial_hair_overlay) if(hair_style) S = GLOB.hair_styles_list[hair_style] if(S) - hair_image = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER) + hair_overlay = mutable_appearance(S.icon, "[S.icon_state]", -HAIR_LAYER) if(hair_color) - hair_image.color = "#" + hair_color - hair_image.alpha = 200 - add_overlay(hair_image) + hair_overlay.color = "#" + hair_color + hair_overlay.alpha = 200 + add_overlay(hair_overlay) /* * Increase the brightness of a color by calculating the average distance between the R, G and B values, diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 556d5ac7db7..8b88440a8ef 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/humanoid/update_icons() cut_overlays() - for(var/image/I in overlays_standing) + for(var/I in overlays_standing) add_overlay(I) if(stat == DEAD) @@ -66,7 +66,7 @@ dmi_file = 'icons/mob/alienqueen.dmi' if(handcuffed) - overlays_standing[HANDCUFF_LAYER] = image(dmi_file,icon_state= cuff_icon, layer =-HANDCUFF_LAYER) + overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER) apply_overlay(HANDCUFF_LAYER) //Royals have bigger sprites, so inhand things must be handled differently. @@ -80,16 +80,14 @@ var/itm_state = l_hand.item_state if(!itm_state) itm_state = l_hand.icon_state - var/image/I = image("icon" = alt_inhands_file , "icon_state"="[itm_state][caste]_l", "layer"=-HANDS_LAYER) - hands += I + hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) var/itm_state = r_hand.item_state if(!itm_state) itm_state = r_hand.icon_state - var/image/I = image("icon" = alt_inhands_file , "icon_state"="[itm_state][caste]_r", "layer"=-HANDS_LAYER) - hands += I + hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm index 58f10ab1222..b5b646b08b6 100644 --- a/code/modules/mob/living/carbon/alien/screen.dm +++ b/code/modules/mob/living/carbon/alien/screen.dm @@ -18,7 +18,6 @@ return var/Qdir = get_dir(src, Q) var/Qdist = get_dist(src, Q) - image(icon,loc,icon_state,layer,dir) var/finder_icon = "finder_center" //Overlay showed when adjacent to or on top of the queen! switch(Qdist) if(2 to 7) @@ -27,7 +26,7 @@ finder_icon = "finder_med" if(21 to INFINITY) finder_icon = "finder_far" - var/image/finder_eye = image('icons/mob/screen_alien.dmi', icon_state = finder_icon, dir = Qdir) + var/image/finder_eye = image('icons/mob/screen_alien.dmi', finder_icon, dir = Qdir) hud_used.alien_queen_finder.add_overlay(finder_eye) /mob/living/carbon/alien/humanoid/royal/queen/findQueen() diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 63f79d2eb8c..7eb6d182ef4 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -81,7 +81,7 @@ var/mob/dead/observer/ghost = pick(candidates) - var/overlay = image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie") + var/mutable_appearance/overlay = mutable_appearance('icons/mob/alien.dmi', "burst_lie") owner.add_overlay(overlay) var/atom/xeno_loc = get_turf(owner) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 80fbdbb71df..44e578c909d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -754,7 +754,7 @@ ..() /mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning") - var/image/new_fire_overlay = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER) + var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) new_fire_overlay.appearance_flags = RESET_COLOR overlays_standing[FIRE_LAYER] = new_fire_overlay apply_overlay(FIRE_LAYER) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 57d7d4e2f87..d3f2bd5bfa7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -730,8 +730,8 @@ /mob/living/carbon/human/wash_cream() //clean both to prevent a rare bug - cut_overlay(image('icons/effects/creampie.dmi', "creampie_lizard")) - cut_overlay(image('icons/effects/creampie.dmi', "creampie_human")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) //Turns a mob black, flashes a skeleton overlay @@ -740,17 +740,19 @@ //Handle mutant parts if possible if(dna && dna.species) add_atom_colour("#000000", TEMPORARY_COLOUR_PRIORITY) - var/static/image/electrocution_skeleton_anim = image(icon = icon, icon_state = "electrocuted_base") - electrocution_skeleton_anim.appearance_flags = RESET_COLOR + var/static/mutable_appearance/electrocution_skeleton_anim + if(!electrocution_skeleton_anim) + electrocution_skeleton_anim = mutable_appearance(icon, "electrocuted_base") + electrocution_skeleton_anim.appearance_flags |= RESET_COLOR add_overlay(electrocution_skeleton_anim) addtimer(CALLBACK(src, .proc/end_electrocution_animation, electrocution_skeleton_anim), anim_duration) else //or just do a generic animation flick_overlay_view(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), src, anim_duration) -/mob/living/carbon/human/proc/end_electrocution_animation(image/I) +/mob/living/carbon/human/proc/end_electrocution_animation(mutable_appearance/MA) remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000") - cut_overlay(I) + cut_overlay(MA) /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close = 0) if(incapacitated() || lying ) @@ -819,9 +821,9 @@ if(hal_screwyhud == SCREWYHUD_HEALTHY) icon_num = 0 if(icon_num) - hud_used.healthdoll.add_overlay(image('icons/mob/screen_gen.dmi',"[BP.body_zone][icon_num]")) + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone][icon_num]")) for(var/t in get_missing_limbs()) //Missing limbs - hud_used.healthdoll.add_overlay(image('icons/mob/screen_gen.dmi',"[t]6")) + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]6")) else hud_used.healthdoll.icon_state = "healthdoll_DEAD" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ac2fed005f8..f64d30e90ac 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -228,22 +228,22 @@ fhair_state += dynamic_fhair_suffix fhair_file = 'icons/mob/facialhair_extensions.dmi' - var/image/img_facial = image("icon" = fhair_file, "icon_state" = fhair_state, "layer" = -HAIR_LAYER) + var/mutable_appearance/facial_overlay = mutable_appearance(fhair_file, fhair_state, -HAIR_LAYER) if(!forced_colour) if(hair_color) if(hair_color == "mutcolor") - img_facial.color = "#" + H.dna.features["mcolor"] + facial_overlay.color = "#" + H.dna.features["mcolor"] else - img_facial.color = "#" + hair_color + facial_overlay.color = "#" + hair_color else - img_facial.color = "#" + H.facial_hair_color + facial_overlay.color = "#" + H.facial_hair_color else - img_facial.color = forced_colour + facial_overlay.color = forced_colour - img_facial.alpha = hair_alpha + facial_overlay.alpha = hair_alpha - standing += img_facial + standing += facial_overlay if(H.head) var/obj/item/I = H.head @@ -261,9 +261,11 @@ hair_hidden = TRUE if(!hair_hidden || dynamic_hair_suffix) + var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER) if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain if(!(NOBLOOD in species_traits)) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER) + hair_overlay.icon = 'icons/mob/human_face.dmi' + hair_overlay.icon_state = "debrained" else if(H.hair_style && (HAIR in species_traits)) S = GLOB.hair_styles_list[H.hair_style] @@ -285,67 +287,69 @@ hair_state += dynamic_hair_suffix hair_file = 'icons/mob/hair_extensions.dmi' - var/image/img_hair = image("icon" = hair_file, "icon_state" = hair_state, "layer" = -HAIR_LAYER) + hair_overlay.icon = hair_file + hair_overlay.icon_state = hair_state if(!forced_colour) if(hair_color) if(hair_color == "mutcolor") - img_hair.color = "#" + H.dna.features["mcolor"] + hair_overlay.color = "#" + H.dna.features["mcolor"] else - img_hair.color = "#" + hair_color + hair_overlay.color = "#" + hair_color else - img_hair.color = "#" + H.hair_color + hair_overlay.color = "#" + H.hair_color else - img_hair.color = forced_colour - img_hair.alpha = hair_alpha - img_hair.pixel_y += hair_y_offset - standing += img_hair + hair_overlay.color = forced_colour + hair_overlay.alpha = hair_alpha + hair_overlay.pixel_y += hair_y_offset + if(hair_overlay.icon) + standing += hair_overlay if(standing.len) - H.overlays_standing[HAIR_LAYER] = standing + H.overlays_standing[HAIR_LAYER] = standing H.apply_overlay(HAIR_LAYER) /datum/species/proc/handle_body(mob/living/carbon/human/H) H.remove_overlay(BODY_LAYER) - var/list/standing = list() + var/list/standing = list() var/obj/item/bodypart/head/HD = H.get_bodypart("head") if(!(H.disabilities & HUSK)) // lipstick if(H.lip_style && (LIPS in species_traits) && HD) - var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]", "layer" = -BODY_LAYER) - lips.color = H.lip_color - lips.pixel_y += face_y_offset - standing += lips + var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER) + lip_overlay.color = H.lip_color + lip_overlay.pixel_y += face_y_offset + standing += lip_overlay // eyes if((EYECOLOR in species_traits) && HD) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER) - img_eyes.color = "#" + H.eye_color - img_eyes.pixel_y += face_y_offset - standing += img_eyes + var/mutable_appearance/eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER) + eye_overlay.color = "#" + H.eye_color + eye_overlay.pixel_y += face_y_offset + standing += eye_overlay //Underwear, Undershirts & Socks if(H.underwear) var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear] if(underwear) - standing += image("icon"=underwear.icon, "icon_state"="[underwear.icon_state]", "layer"=-BODY_LAYER) + standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) if(H.undershirt) var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt] if(undershirt) if(H.dna.species.sexes && H.gender == FEMALE) - standing += wear_female_version("[undershirt.icon_state]", undershirt.icon, BODY_LAYER) + standing += wear_female_version(undershirt.icon_state, undershirt.icon, -BODY_LAYER) else - standing += image("icon"=undershirt.icon, "icon_state"="[undershirt.icon_state]", "layer"=-BODY_LAYER) + standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) if(H.socks && H.get_num_legs() >= 2 && !(DIGITIGRADE in species_traits)) var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks] if(socks) - standing += image("icon"=socks.icon, "icon_state"="[socks.icon_state]", "layer"=-BODY_LAYER) + standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) if(standing.len) H.overlays_standing[BODY_LAYER] = standing @@ -453,8 +457,6 @@ var/g = (H.gender == FEMALE) ? "f" : "m" - var/image/I - for(var/layer in relevent_layers) var/layertext = mutant_bodyparts_layertext(layer) @@ -493,58 +495,54 @@ if(!S || S.icon_state == "none") continue + var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer) + //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. if(bodypart == "tail_lizard" || bodypart == "tail_human") bodypart = "tail" else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human") bodypart = "waggingtail" - - var/icon_string - if(S.gender_specific) - icon_string = "[g]_[bodypart]_[S.icon_state]_[layertext]" + accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" else - icon_string = "m_[bodypart]_[S.icon_state]_[layertext]" - - I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) + accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]" if(S.center) - I = center_image(I,S.dimension_x,S.dimension_y) + accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) if(!(H.disabilities & HUSK)) if(!forced_colour) switch(S.color_src) if(MUTCOLORS) if(fixed_mut_color) - I.color = "#[fixed_mut_color]" + accessory_overlay.color = "#[fixed_mut_color]" else - I.color = "#[H.dna.features["mcolor"]]" + accessory_overlay.color = "#[H.dna.features["mcolor"]]" if(HAIR) if(hair_color == "mutcolor") - I.color = "#[H.dna.features["mcolor"]]" + accessory_overlay.color = "#[H.dna.features["mcolor"]]" else - I.color = "#[H.hair_color]" + accessory_overlay.color = "#[H.hair_color]" if(FACEHAIR) - I.color = "#[H.facial_hair_color]" + accessory_overlay.color = "#[H.facial_hair_color]" if(EYECOLOR) - I.color = "#[H.eye_color]" + accessory_overlay.color = "#[H.eye_color]" else - I.color = forced_colour - standing += I + accessory_overlay.color = forced_colour + standing += accessory_overlay if(S.hasinner) + var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) if(S.gender_specific) - icon_string = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" + inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" else - icon_string = "m_[bodypart]inner_[S.icon_state]_[layertext]" - - I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) + inner_accessory_overlay.icon_state = "m_[bodypart]inner_[S.icon_state]_[layertext]" if(S.center) - I = center_image(I,S.dimension_x,S.dimension_y) + inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y) - standing += I + standing += inner_accessory_overlay H.overlays_standing[layer] = standing.Copy() standing = list() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index b5f047b0da9..f8e62704518 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -124,17 +124,17 @@ There are several things that need to be remembered: else if(U.adjusted == DIGITIGRADE_STYLE) t_color = "[t_color]_l" - var/image/standing + var/mutable_appearance/uniform_overlay if(dna && dna.species.sexes) var/G = (gender == FEMALE) ? "f" : "m" if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - standing = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted) - if(!standing) - standing = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE) + if(!uniform_overlay) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE) - overlays_standing[UNIFORM_LAYER] = standing + overlays_standing[UNIFORM_LAYER] = uniform_overlay else if(!(dna && dna.species.nojumpsuit) && invdrop) // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY @@ -159,8 +159,7 @@ There are several things that need to be remembered: update_observer_view(wear_id) //TODO: add an icon file for ID slot stuff, so it's less snowflakey - var/image/standing = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi') - overlays_standing[ID_LAYER] = standing + overlays_standing[ID_LAYER] = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi') apply_overlay(ID_LAYER) @@ -168,20 +167,20 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_gloves() remove_overlay(GLOVES_LAYER) - if(get_num_arms() <2) - if(!gloves && blood_DNA) - if(has_left_hand()) - overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands_left", "layer"=-GLOVES_LAYER) - apply_overlay(GLOVES_LAYER) - else if(has_right_hand()) - overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands_right", "layer"=-GLOVES_LAYER) - apply_overlay(GLOVES_LAYER) - return - if(client && hud_used && hud_used.inv_slots[slot_gloves]) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves] inv.update_icon() + if(!gloves && blood_DNA) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) + if(get_num_arms() < 2) + if(has_left_hand()) + bloody_overlay.icon_state = "bloodyhands_left" + else if(has_right_hand()) + bloody_overlay.icon_state = "bloodyhands_right" + + overlays_standing[GLOVES_LAYER] = bloody_overlay + if(gloves) gloves.screen_loc = ui_gloves if(client && hud_used && hud_used.hud_shown) @@ -191,14 +190,7 @@ There are several things that need to be remembered: var/t_state = gloves.item_state if(!t_state) t_state = gloves.icon_state - - var/image/standing = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi') - - overlays_standing[GLOVES_LAYER] = standing - - else - if(blood_DNA) - overlays_standing[GLOVES_LAYER] = image("icon"='icons/effects/blood.dmi', "icon_state"="bloodyhands", "layer"=-GLOVES_LAYER) + overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi') apply_overlay(GLOVES_LAYER) @@ -221,8 +213,7 @@ There are several things that need to be remembered: update_observer_view(glasses,1) if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) - var/image/standing = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi') - overlays_standing[GLASSES_LAYER] = standing + overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi') apply_overlay(GLASSES_LAYER) @@ -244,8 +235,7 @@ There are several things that need to be remembered: client.screen += ears //add it to the client's screen update_observer_view(ears,1) - var/image/standing = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') - overlays_standing[EARS_LAYER] = standing + overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') apply_overlay(EARS_LAYER) @@ -266,8 +256,7 @@ There are several things that need to be remembered: if(hud_used.inventory_shown) //if the inventory is open client.screen += shoes //add it to client's screen update_observer_view(shoes,1) - var/image/standing = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi') - overlays_standing[SHOES_LAYER] = standing + overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi') apply_overlay(SHOES_LAYER) @@ -287,7 +276,7 @@ There are several things that need to be remembered: var/t_state = s_store.item_state if(!t_state) t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = image("icon"='icons/mob/belt_mirror.dmi', "icon_state"="[t_state]", "layer"=-SUIT_STORE_LAYER) + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance('icons/mob/belt_mirror.dmi', t_state, -SUIT_STORE_LAYER) apply_overlay(SUIT_STORE_LAYER) @@ -313,8 +302,7 @@ There are several things that need to be remembered: if(!t_state) t_state = belt.icon_state - var/image/standing = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi') - overlays_standing[BELT_LAYER] = standing + overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi') apply_overlay(BELT_LAYER) @@ -335,8 +323,7 @@ There are several things that need to be remembered: client.screen += wear_suit update_observer_view(wear_suit,1) - var/image/standing = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi') - overlays_standing[SUIT_LAYER] = standing + overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi') if(wear_suit.breakouttime) //suit is restraining drop_all_held_items() @@ -379,7 +366,7 @@ There are several things that need to be remembered: remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) + overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER) apply_overlay(LEGCUFF_LAYER) throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed) @@ -388,8 +375,7 @@ There are several things that need to be remembered: var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] if(!female_clothing_icon) //Create standing/laying icons if they don't exist generate_female_clothing(index,t_color,icon,type) - var/standing = image("icon"=GLOB.female_clothing_icons["[t_color]"], "layer"=-layer) - return(standing) + return mutable_appearance(GLOB.female_clothing_icons[t_color], layer = -layer) /mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) var/list/out = new @@ -438,12 +424,12 @@ There are several things that need to be remembered: /* -Does everything in relation to building the /image used in the mob's overlays list +Does everything in relation to building the /mutable_appearance used in the mob's overlays list covers: inhands and any other form of worn item - centering large images - layering images on custom layers - building images from custom icon files + centering large appearances + layering appearances on custom layers + building appearances from custom icon files By Remie Richards (yes I'm taking credit because this just removed 90% of the copypaste in update_icons()) @@ -478,13 +464,13 @@ generate/load female uniform sprites matching all previously decided variables if(!layer2use) layer2use = default_layer - var/image/standing + var/mutable_appearance/standing if(femaleuniform) standing = wear_female_version(state,file2use,layer2use,femaleuniform) if(!standing) - standing = image("icon"=file2use, "icon_state"=state,"layer"=-layer2use) + standing = mutable_appearance(file2use, state, -layer2use) - //Get the overlay images for this item when it's being worn + //Get the overlays for this item when it's being worn //eg: ammo counters, primed grenade flashes, etc. var/list/worn_overlays = worn_overlays(isinhands) if(worn_overlays && worn_overlays.len) diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 57e2bb7e02f..5a4ba686b25 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -34,8 +34,7 @@ hair_hidden = 1 if(!hair_hidden) if(!getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain - var/image/I = image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER) - overlays_standing[HAIR_LAYER] = I + overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_face.dmi', "debrained", -HAIR_LAYER) apply_overlay(HAIR_LAYER) @@ -45,9 +44,9 @@ /mob/living/carbon/monkey/update_inv_legcuffed() remove_overlay(LEGCUFF_LAYER) if(legcuffed) - var/image/standing = image("icon"='icons/mob/mob.dmi', "icon_state"="legcuff1", "layer"=-LEGCUFF_LAYER) - standing.pixel_y = 8 - overlays_standing[LEGCUFF_LAYER] = standing + var/mutable_appearance/legcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER) + legcuff_overlay.pixel_y = 8 + overlays_standing[LEGCUFF_LAYER] = legcuff_overlay apply_overlay(LEGCUFF_LAYER) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 4e76b3da1e9..762ebd56cc5 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -30,9 +30,8 @@ var/list/overlays_standing[TOTAL_LAYERS] /mob/living/carbon/proc/apply_overlay(cache_index) - var/I = overlays_standing[cache_index] - if(I) - add_overlay(I) + if((. = overlays_standing[cache_index])) + add_overlay(.) /mob/living/carbon/proc/remove_overlay(cache_index) var/I = overlays_standing[cache_index] @@ -79,8 +78,7 @@ if(get_held_index_of_item(I) % 2 == 0) icon_file = I.righthand_file - var/image/standing = I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) - hands += standing + hands += I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) @@ -89,7 +87,7 @@ /mob/living/carbon/update_fire(var/fire_icon = "Generic_mob_burning") remove_overlay(FIRE_LAYER) if(on_fire) - var/image/new_fire_overlay = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER) + var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) new_fire_overlay.appearance_flags = RESET_COLOR overlays_standing[FIRE_LAYER] = new_fire_overlay @@ -100,16 +98,16 @@ /mob/living/carbon/update_damage_overlays() remove_overlay(DAMAGE_LAYER) - var/image/standing = image("icon"='icons/mob/dam_mob.dmi', "icon_state"="blank", "layer"=-DAMAGE_LAYER) - overlays_standing[DAMAGE_LAYER] = standing + var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER) + overlays_standing[DAMAGE_LAYER] = damage_overlay for(var/X in bodyparts) var/obj/item/bodypart/BP = X if(BP.dmg_overlay_type) if(BP.brutestate) - standing.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays + damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays if(BP.burnstate) - standing.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]") + damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]") apply_overlay(DAMAGE_LAYER) @@ -126,8 +124,7 @@ if(wear_mask) if(!(head && (head.flags_inv & HIDEMASK))) - var/image/standing = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') - overlays_standing[FACEMASK_LAYER] = standing + overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') update_hud_wear_mask(wear_mask) apply_overlay(FACEMASK_LAYER) @@ -141,8 +138,7 @@ if(wear_neck) if(!(head && (head.flags_inv & HIDENECK))) - var/image/standing = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') - overlays_standing[NECK_LAYER] = standing + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -155,8 +151,7 @@ inv.update_icon() if(back) - var/image/standing = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') - overlays_standing[BACK_LAYER] = standing + overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') update_hud_back(back) apply_overlay(BACK_LAYER) @@ -171,8 +166,7 @@ inv.update_icon() if(head) - var/image/standing = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') - overlays_standing[HEAD_LAYER] = standing + overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') update_hud_head(head) apply_overlay(HEAD_LAYER) @@ -181,7 +175,7 @@ /mob/living/carbon/update_inv_handcuffed() remove_overlay(HANDCUFF_LAYER) if(handcuffed) - overlays_standing[HANDCUFF_LAYER] = image("icon"='icons/mob/mob.dmi', "icon_state"="handcuff1", "layer"=-HANDCUFF_LAYER) + overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", -HANDCUFF_LAYER) apply_overlay(HANDCUFF_LAYER) @@ -244,9 +238,7 @@ var/list/new_limbs = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X - var/image/temp = BP.get_limb_icon() - if(temp) - new_limbs += temp + new_limbs += BP.get_limb_icon() if(new_limbs.len) overlays_standing[BODYPARTS_LAYER] = new_limbs limb_icon_cache[icon_render_key] = new_limbs diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b06223a7cbf..78970c0bc97 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -489,7 +489,7 @@ for(var/obj/effect/decal/cleanable/trail_holder/TH in src.loc) if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) TH.existing_dirs += newdir - TH.overlays.Add(image('icons/effects/blood.dmi',trail_type,dir = newdir)) + TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) TH.transfer_mob_blood_dna(src) /mob/living/carbon/human/makeTrail(turf/T) @@ -925,4 +925,4 @@ /mob/living/ConveyorMove() if((movement_type & FLYING) && !stat) return - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index bb25eb2e4d6..fba4f50080f 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -102,11 +102,11 @@ return /mob/living/silicon/robot/update_fire() - var/I = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning") + var/mutable_appearance/fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', "Generic_mob_burning") if(on_fire) - add_overlay(I) + add_overlay(fire_overlay) else - cut_overlay(I) + cut_overlay(fire_overlay) /mob/living/silicon/robot/update_canmove() if(stat || buckled || lockcharge) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 023ddd9719d..6ef36096dc8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -38,7 +38,7 @@ var/obj/item/module_active = null held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do! - var/image/eye_lights + var/mutable_appearance/eye_lights var/mob/living/silicon/ai/connected_ai = null var/obj/item/weapon/stock_parts/cell/cell = null @@ -602,7 +602,7 @@ else add_overlay("ov-opencover -c") if(hat) - var/image/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi') + var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi') head_overlay.pixel_y += hat_offset add_overlay(head_overlay) update_fire() diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 95e62a556d3..25be0495467 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -286,7 +286,7 @@ ..() spawn(5) if(skin) - add_overlay(image('icons/mob/aibots.dmi', "kit_skin_[skin]")) + add_overlay("kit_skin_[skin]") /obj/item/weapon/storage/firstaid/attackby(obj/item/bodypart/S, mob/user, params) @@ -333,7 +333,7 @@ build_step++ to_chat(user, "You add the health sensor to [src].") name = "First aid/robot arm/health analyzer assembly" - add_overlay(image('icons/mob/aibots.dmi', "na_scanner")) + add_overlay("na_scanner") if(1) if(isprox(W)) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index ef133252d70..8c96a70cc0e 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -358,7 +358,7 @@ Auto Patrol[]"}, var/obj/item/weapon/ed209_assembly/Sa = new /obj/item/weapon/ed209_assembly(Tsec) Sa.build_step = 1 - Sa.add_overlay(image('icons/mob/aibots.dmi', "hs_hole")) + Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/device/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index b2a4eaefc68..f1629296a7c 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -90,7 +90,7 @@ update_icon() if(skin) - add_overlay(image('icons/mob/aibots.dmi', "medskin_[skin]")) + add_overlay("medskin_[skin]") var/datum/job/doctor/J = new /datum/job/doctor access_card.access += J.get_access() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index bcc8e1d90e9..75cc8ff1b8a 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -406,7 +406,7 @@ cut_overlays() if(inventory_head) var/image/head_icon - var/datum/dog_fashion.DF = new inventory_head.dog_fashion(src) + var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src) if(!DF.obj_icon_state) DF.obj_icon_state = inventory_head.icon_state @@ -416,17 +416,17 @@ DF.obj_color = inventory_head.color if(health <= 0) - head_icon = DF.get_image(dir = EAST) + head_icon = DF.get_overlay(dir = EAST) head_icon.pixel_y = -8 head_icon.transform = turn(head_icon.transform, 180) else - head_icon = DF.get_image() + head_icon = DF.get_overlay() add_overlay(head_icon) if(inventory_back) var/image/back_icon - var/datum/dog_fashion.DF = new inventory_back.dog_fashion(src) + var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src) if(!DF.obj_icon_state) DF.obj_icon_state = inventory_back.icon_state @@ -436,18 +436,20 @@ DF.obj_color = inventory_back.color if(health <= 0) - back_icon = DF.get_image(dir = EAST) + back_icon = DF.get_overlay(dir = EAST) back_icon.pixel_y = -11 back_icon.transform = turn(back_icon.transform, 180) else - back_icon = DF.get_image() + back_icon = DF.get_overlay() add_overlay(back_icon) if(facehugger) + var/mutable_appearance/facehugger_overlay = mutable_appearance('icons/mob/mask.dmi') if(istype(src, /mob/living/simple_animal/pet/dog/corgi/puppy)) - add_overlay(image('icons/mob/mask.dmi',"facehugger_corgipuppy")) + facehugger_overlay.icon_state = "facehugger_corgipuppy" else - add_overlay(image('icons/mob/mask.dmi',"facehugger_corgi")) + facehugger_overlay.icon_state = "facehugger_corgi" + add_overlay(facehugger_overlay) if(pcollar) add_overlay(collar) add_overlay(pettag) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 7fb7caf8e9f..259ca4327dc 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -7,9 +7,8 @@ /mob/living/simple_animal/drone/proc/apply_overlay(cache_index) - var/I = drone_overlays[cache_index] - if(I) - add_overlay(I) + if((. = drone_overlays[cache_index])) + add_overlay(.) /mob/living/simple_animal/drone/proc/remove_overlay(cache_index) @@ -34,11 +33,11 @@ if(!r_state) r_state = r_hand.icon_state - var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) if(y_shift) - r_hand_image.pixel_y += y_shift + r_hand_overlay.pixel_y += y_shift - hands_overlays += r_hand_image + hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -52,11 +51,11 @@ if(!l_state) l_state = l_hand.icon_state - var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) if(y_shift) - l_hand_image.pixel_y += y_shift + l_hand_overlay.pixel_y += y_shift - hands_overlays += l_hand_image + hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER @@ -86,10 +85,10 @@ var/used_head_icon = 'icons/mob/head.dmi' if(istype(head, /obj/item/clothing/mask)) used_head_icon = 'icons/mob/mask.dmi' - var/image/head_overlay = head.build_worn_icon(state = head.icon_state, default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon) + var/mutable_appearance/head_overlay = head.build_worn_icon(state = head.icon_state, default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon) head_overlay.pixel_y += -15 - drone_overlays[DRONE_HEAD_LAYER] = head_overlay + drone_overlays[DRONE_HEAD_LAYER] = head_overlay apply_overlay(DRONE_HEAD_LAYER) diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index baad2da95cf..ae707fb2e6f 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -2,16 +2,16 @@ icon = 'icons/mob/pets.dmi' mob_size = MOB_SIZE_SMALL var/obj/item/clothing/neck/petcollar/pcollar = null - var/image/collar = null - var/image/pettag = null + var/collar = "" + var/pettag = "" blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar) var/obj/item/clothing/neck/petcollar/P = O pcollar = P - collar = image('icons/mob/pets.dmi', src, "[icon_state]collar") - pettag = image('icons/mob/pets.dmi', src, "[icon_state]tag") + collar = "[icon_state]collar" + pettag = "[icon_state]tag" regenerate_icons() to_chat(user, "You put the [P] around [src]'s neck.") if(P.tagname) @@ -46,5 +46,7 @@ /mob/living/simple_animal/pet/regenerate_icons() cut_overlays() - add_overlay(collar) - add_overlay(pettag) + if(collar) + add_overlay(collar) + if(pettag) + add_overlay(pettag) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index e49e4120478..be889a4183c 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -260,9 +260,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians I.plane = ABOVE_HUD_PLANE /mob/living/simple_animal/hostile/guardian/proc/apply_overlay(cache_index) - var/I = guardian_overlays[cache_index] - if(I) - add_overlay(I) + if((. = guardian_overlays[cache_index])) + add_overlay(.) /mob/living/simple_animal/hostile/guardian/proc/remove_overlay(cache_index) var/I = guardian_overlays[cache_index] @@ -281,9 +280,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(!r_state) r_state = r_hand.icon_state - var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - - hands_overlays += r_hand_image + hands_overlays += r_hand.build_worn_icon(state = r_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -296,9 +293,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(!l_state) l_state = l_hand.icon_state - var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - - hands_overlays += l_hand_image + hands_overlays += l_hand.build_worn_icon(state = l_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 80212004217..eacf58410b4 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -40,10 +40,10 @@ to_chat(src, "You switch to combat mode.") toggle = FALSE else - var/image/I = new('icons/effects/effects.dmi', "shield-grey") + var/mutable_appearance/shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey") if(namedatum) - I.color = namedatum.colour - add_overlay(I) + shield_overlay.color = namedatum.colour + add_overlay(shield_overlay) melee_damage_lower = 2 melee_damage_upper = 2 speed = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 462bad0df16..67b3d451b9a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -71,9 +71,7 @@ /mob/living/simple_animal/hostile/bear/update_icons() ..() if(armored) - var/image/B = image(icon = 'icons/mob/animal.dmi', icon_state = "armor_bear") - if(B) - add_overlay(B) + add_overlay("armor_bear") /obj/item/bear_armor name = "pile of bear armor" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index fbbd2c20c87..e7ab6e1b565 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -49,7 +49,6 @@ var/idle = 0 var/isqueen = FALSE var/icon_base = "bee" - var/static/list/bee_icons = list() /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) @@ -91,24 +90,15 @@ if(beegent && beegent.color) col = beegent.color - var/image/base - if(!bee_icons["[icon_base]_base"]) - bee_icons["[icon_base]_base"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_base") - base = bee_icons["[icon_base]_base"] - add_overlay(base) + add_overlay("[icon_base]_base") - var/image/greyscale - if(!bee_icons["[icon_base]_grey_[col]"]) - bee_icons["[icon_base]_grey_[col]"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_grey") - greyscale = bee_icons["[icon_base]_grey_[col]"] - greyscale.color = col - add_overlay(greyscale) + var/static/mutable_appearance/greyscale_overlay + greyscale_overlay = greyscale_overlay || mutable_appearance('icons/mob/bees.dmi') + greyscale_overlay.icon_state = "[icon_base]_grey" + greyscale_overlay.color = col + add_overlay(greyscale_overlay) - var/image/wings - if(!bee_icons["[icon_base]_wings"]) - bee_icons["[icon_base]_wings"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_wings") - wings = bee_icons["[icon_base]_wings"] - add_overlay(wings) + add_overlay("[icon_base]_wings") //We don't attack beekeepers/people dressed as bees//Todo: bee costume diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 825b376a07f..aade8cbca16 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca var/mob/living/creator = null // the creator var/destroy_objects = 0 var/knockdown_people = 0 - var/image/googly_eyes = null + var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes") gold_core_spawnable = 0 /mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0) @@ -143,7 +143,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_state = O.icon_state icon_living = icon_state copy_overlays(O) - googly_eyes = image('icons/mob/mob.dmi',"googly_eyes") add_overlay(googly_eyes) if(istype(O, /obj/structure) || istype(O, /obj/machinery)) health = (anchored * 50) + 50 @@ -178,11 +177,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") -/mob/living/simple_animal/hostile/mimic/copy/Aggro() - ..() - googly_eyes.setDir(get_dir(src,target)) - - /mob/living/simple_animal/hostile/mimic/copy/machine speak = list("HUMANS ARE IMPERFECT!", "YOU SHALL BE ASSIMILATED!", "YOU ARE HARMING YOURSELF", "You have been deemed hazardous. Will you comply?", \ "My logic is undeniable.", "One of us.", "FLESH IS WEAK", "THIS ISN'T WAR, THIS IS EXTERMINATION!") diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 4419b3eb04d..202a26b355c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -29,12 +29,13 @@ unique_name = 1 speak_emote = list("squeaks") deathmessage = "fainted." + var/cap_color = "#ffffff" var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight var/faint_ticker = 0 //If we hit three, another mushroom's gonna eat us - var/image/cap_living = null //Where we store our cap icons so we dont generate them constantly to update our icon - var/image/cap_dead = null + var/static/mutable_appearance/cap_living //Where we store our cap icons so we dont generate them constantly to update our icon + var/static/mutable_appearance/cap_dead /mob/living/simple_animal/hostile/mushroom/examine(mob/user) ..() @@ -53,11 +54,10 @@ melee_damage_upper += rand(10,20) maxHealth += rand(40,60) move_to_delay = rand(3,11) - var/cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - cap_living = image('icons/mob/animal.dmi',icon_state = "mushroom_cap") - cap_dead = image('icons/mob/animal.dmi',icon_state = "mushroom_cap_dead") - cap_living.color = cap_color - cap_dead.color = cap_color + cap_living = cap_living || mutable_appearance(icon, "mushroom_cap") + cap_dead = cap_dead || mutable_appearance(icon, "mushroom_cap_dead") + + cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) UpdateMushroomCap() health = maxHealth ..() @@ -101,6 +101,8 @@ /mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap() cut_overlays() + cap_living.color = cap_color + cap_dead.color = cap_color if(health == 0) add_overlay(cap_dead) else diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 9deb139497d..a0078013c7a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -32,35 +32,31 @@ gold_core_spawnable = 0 //too spooky for science var/ghost_hair_style var/ghost_hair_color - var/image/ghost_hair = null + var/mutable_appearance/ghost_hair var/ghost_facial_hair_style var/ghost_facial_hair_color - var/image/ghost_facial_hair = null + var/mutable_appearance/ghost_facial_hair var/random = TRUE //if you want random names for ghosts or not /mob/living/simple_animal/hostile/retaliate/ghost/Initialize() . = ..() - if(!random) - give_hair() - else + give_hair() + if(random) switch(rand(0,1)) if(0) name = "ghost of [pick(GLOB.first_names_male)] [pick(GLOB.last_names)]" if(1) name = "ghost of [pick(GLOB.first_names_female)] [pick(GLOB.last_names)]" - give_hair() /mob/living/simple_animal/hostile/retaliate/ghost/proc/give_hair() if(ghost_hair_style != null) - ghost_hair = image('icons/mob/human_face.dmi', "hair_[ghost_hair_style]") - ghost_hair.layer = -HAIR_LAYER + ghost_hair = mutable_appearance('icons/mob/human_face.dmi', "hair_[ghost_hair_style]", -HAIR_LAYER) ghost_hair.alpha = 200 ghost_hair.color = ghost_hair_color add_overlay(ghost_hair) if(ghost_facial_hair_style != null) - ghost_facial_hair = image('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]") - ghost_facial_hair.layer = -HAIR_LAYER + ghost_facial_hair = mutable_appearance('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER) ghost_facial_hair.alpha = 200 ghost_facial_hair.color = ghost_facial_hair_color add_overlay(ghost_facial_hair) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index d9c6ed54c76..8971d33b284 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -118,7 +118,7 @@ if(stat != DEAD) icon_state = icon_text if(mood && !stat) - add_overlay(image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")) + add_overlay("aslime-[mood]") else icon_state = icon_dead ..() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3942014fb9f..2700d35092f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -377,7 +377,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code return 1 -/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/image/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE) //Easy notification of ghosts. +/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/mutable_appearance/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE) //Easy notification of ghosts. if(SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load return for(var/mob/dead/observer/O in GLOB.player_list) @@ -396,17 +396,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp A.action = action A.target = source if(!alert_overlay) - var/old_layer = source.layer - var/old_plane = source.plane - source.layer = FLOAT_LAYER - source.plane = FLOAT_PLANE - A.add_overlay(source) - source.layer = old_layer - source.plane = old_plane - else - alert_overlay.layer = FLOAT_LAYER - alert_overlay.plane = FLOAT_PLANE - A.add_overlay(alert_overlay) + alert_overlay = new(src) + alert_overlay.layer = FLOAT_LAYER + alert_overlay.plane = FLOAT_PLANE + A.add_overlay(alert_overlay) /proc/item_heal_robotic(mob/living/carbon/human/H, mob/user, brute_heal, burn_heal) var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 72fe84de458..36e69828b27 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -336,12 +336,10 @@ return stamps += "" - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[P.icon_state]") stampoverlay.pixel_x = rand(-2, 2) stampoverlay.pixel_y = rand(-3, 2) - stampoverlay.icon_state = "paper_[P.icon_state]" - LAZYADD(stamped, P.icon_state) add_overlay(stampoverlay) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 227aee9681f..6a25273b83e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -135,7 +135,7 @@ icon_state = "[initial(icon_state)]" cut_overlays() if(bin_pen) - add_overlay(image(icon=bin_pen.icon,icon_state=bin_pen.icon_state)) + add_overlay(mutable_appearance(bin_pen.icon, bin_pen.icon_state)) /obj/item/weapon/paper_bin/construction name = "construction paper bin" diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index e7742b4bc86..2514784bcb5 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -44,8 +44,7 @@ var/list/stamped = internalPaper.stamped if(stamped) for(var/S in stamped) - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi', "paperplane_[stamped]") - add_overlay(stampoverlay) + add_overlay("paperplane_[S]") /obj/item/weapon/paperplane/attack_self(mob/user) to_chat(user, "You unfold [src].") diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 3c8cc467325..46332854887 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -93,12 +93,6 @@ var/force_update = 0 var/update_state = -1 var/update_overlay = -1 - var/global/status_overlays = 0 - var/global/list/status_overlays_lock - var/global/list/status_overlays_charging - var/global/list/status_overlays_equipment - var/global/list/status_overlays_lighting - var/global/list/status_overlays_environ /obj/machinery/power/apc/connect_to_network() @@ -218,35 +212,6 @@ // update the APC icon to show the three base states // also add overlays for indicator lights /obj/machinery/power/apc/update_icon() - if (!status_overlays) - status_overlays = 1 - status_overlays_lock = new(2) - status_overlays_charging = new(3) - status_overlays_equipment = new(4) - status_overlays_lighting = new(4) - status_overlays_environ = new(4) - - status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red - status_overlays_lock[2] = image(icon, "apcox-1") - - status_overlays_charging[1] = image(icon, "apco3-0") - status_overlays_charging[2] = image(icon, "apco3-1") - status_overlays_charging[3] = image(icon, "apco3-2") - - status_overlays_equipment[1] = image(icon, "apco0-0") - status_overlays_equipment[2] = image(icon, "apco0-1") - status_overlays_equipment[3] = image(icon, "apco0-2") - status_overlays_equipment[4] = image(icon, "apco0-3") - - status_overlays_lighting[1] = image(icon, "apco1-0") - status_overlays_lighting[2] = image(icon, "apco1-1") - status_overlays_lighting[3] = image(icon, "apco1-2") - status_overlays_lighting[4] = image(icon, "apco1-3") - - status_overlays_environ[1] = image(icon, "apco2-0") - status_overlays_environ[2] = image(icon, "apco2-1") - status_overlays_environ[3] = image(icon, "apco2-2") - status_overlays_environ[4] = image(icon, "apco2-3") var/update = check_updates() //returns 0 if no need to update icons. // 1 if we need to update the icon_state @@ -283,12 +248,12 @@ cut_overlays() if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) var/list/O = list( - status_overlays_lock[locked+1], - status_overlays_charging[charging+1]) + "apcox-[locked]", + "apco3-[charging]") if(operating) - O += status_overlays_equipment[equipment+1] - O += status_overlays_lighting[lighting+1] - O += status_overlays_environ[environ+1] + O += "apco0-[equipment]" + O += "apco1-[lighting]" + O += "apco2-[environ]" add_overlay(O) // And now, seperately for cleanness, the lighting changing diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index c12be4e0135..985fceec23f 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -49,13 +49,13 @@ /obj/item/weapon/stock_parts/cell/proc/updateicon() cut_overlays() if(grown_battery) - add_overlay(image('icons/obj/power.dmi', "grown_wires")) + add_overlay("grown_wires") if(charge < 0.01) return else if(charge/maxcharge >=0.995) - add_overlay(image('icons/obj/power.dmi', "cell-o2")) + add_overlay("cell-o2") else - add_overlay(image('icons/obj/power.dmi', "cell-o1")) + add_overlay("cell-o1") /obj/item/weapon/stock_parts/cell/proc/percent() // return % charge of cell return 100*charge/maxcharge diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 9ae006dfbd2..f3bbc205663 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -64,9 +64,9 @@ cut_overlays() if(lastgenlev != 0) - add_overlay(image('icons/obj/power.dmi', "teg-op[lastgenlev]")) + add_overlay("teg-op[lastgenlev]") - add_overlay(image('icons/obj/power.dmi', "teg-oc[lastcirc]")) + add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 7e04df570f2..9fc4f668c9c 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -141,11 +141,11 @@ GLOBAL_LIST_EMPTY(rad_collectors) /obj/machinery/power/rad_collector/proc/update_icons() cut_overlays() if(loaded_tank) - add_overlay(image('icons/obj/singularity.dmi', "ptank")) + add_overlay("ptank") if(stat & (NOPOWER|BROKEN)) return if(active) - add_overlay(image('icons/obj/singularity.dmi', "on")) + add_overlay("on") /obj/machinery/power/rad_collector/proc/toggle_power() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index dc54a3db4e7..410181dede6 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -33,7 +33,7 @@ var/area/A = get_area(src) if(A) - var/image/alert_overlay = image('icons/effects/effects.dmi', "ghostalertsie") + var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/effects.dmi', "ghostalertsie") notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK) narsie_spawn_animation() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index e03eaf944ac..fdb4699ae5d 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -38,9 +38,6 @@ var/obj/machinery/power/terminal/terminal = null - var/static/list/smesImageCache - - /obj/machinery/power/smes/examine(user) ..() if(!terminal) @@ -226,36 +223,20 @@ if(panel_open) return - if(!smesImageCache || !smesImageCache.len) - smesImageCache = list() - smesImageCache.len = 9 - - smesImageCache[SMES_CLEVEL_1] = image('icons/obj/power.dmi',"smes-og1") - smesImageCache[SMES_CLEVEL_2] = image('icons/obj/power.dmi',"smes-og2") - smesImageCache[SMES_CLEVEL_3] = image('icons/obj/power.dmi',"smes-og3") - smesImageCache[SMES_CLEVEL_4] = image('icons/obj/power.dmi',"smes-og4") - smesImageCache[SMES_CLEVEL_5] = image('icons/obj/power.dmi',"smes-og5") - - smesImageCache[SMES_OUTPUTTING] = image('icons/obj/power.dmi', "smes-op1") - smesImageCache[SMES_NOT_OUTPUTTING] = image('icons/obj/power.dmi',"smes-op0") - smesImageCache[SMES_INPUTTING] = image('icons/obj/power.dmi', "smes-oc1") - smesImageCache[SMES_INPUT_ATTEMPT] = image('icons/obj/power.dmi', "smes-oc0") - if(outputting) - add_overlay(smesImageCache[SMES_OUTPUTTING]) + add_overlay("smes-op1") else - add_overlay(smesImageCache[SMES_NOT_OUTPUTTING]) + add_overlay("smes-op0") if(inputting) - add_overlay(smesImageCache[SMES_INPUTTING]) + add_overlay("smes-oc1") else if(input_attempt) - add_overlay(smesImageCache[SMES_INPUT_ATTEMPT]) + add_overlay("smes-oc0") var/clevel = chargedisplay() if(clevel>0) - add_overlay(smesImageCache[clevel]) - return + add_overlay("smes-og[clevel]") /obj/machinery/power/smes/proc/chargedisplay() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index e18e6781c20..47e04339d49 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -103,9 +103,9 @@ ..() cut_overlays() if(stat & BROKEN) - add_overlay(image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)) + add_overlay(mutable_appearance(icon, "solar_panel-b", FLY_LAYER)) else - add_overlay(image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)) + add_overlay(mutable_appearance(icon, "solar_panel", FLY_LAYER)) src.setDir(angle2dir(adir)) //calculates the fraction of the sunlight that the panel recieves @@ -345,7 +345,8 @@ else add_overlay(icon_screen) if(currentdir > -1) - add_overlay(image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(currentdir))) + setDir(angle2dir(currentdir)) + add_overlay(mutable_appearance(icon, "solcon-o", FLY_LAYER)) /obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 4f194129bd0..120dd0b46c6 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -170,13 +170,13 @@ if(rpm>50000) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o4", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o4", FLY_LAYER)) else if(rpm>10000) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o3", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o3", FLY_LAYER)) else if(rpm>2000) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o2", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o2", FLY_LAYER)) else if(rpm>500) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "comp-o1", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "comp-o1", FLY_LAYER)) //TODO: DEFERRED // These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from @@ -255,7 +255,7 @@ // If it works, put an overlay that it works! if(lastgen > 100) - add_overlay(image('icons/obj/atmospherics/pipes/simple.dmi', "turb-o", FLY_LAYER)) + add_overlay(mutable_appearance(icon, "turb-o", FLY_LAYER)) updateDialog() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 77910478423..4b2a43a3fcf 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -132,15 +132,20 @@ add_overlay("[icon_state]_empty") else if(!shaded_charge) + var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState) for(var/i = ratio, i >= 1, i--) - add_overlay(image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))) + charge_overlay.pixel_x = ammo_x_offset * (i - 1) + add_overlay(charge_overlay) else - add_overlay(image(icon = icon, icon_state = "[icon_state]_charge[ratio]")) + add_overlay("[icon_state]_charge[ratio]") if(gun_light && can_flashlight) var/iconF = "flight" if(gun_light.on) iconF = "flight_on" - add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) + var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF) + flashlight_overlay.pixel_x = flight_x_offset + flashlight_overlay.pixel_y = flight_y_offset + add_overlay(flashlight_overlay) if(itemState) itemState += "[ratio]" item_state = itemState diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 07450fc9b5a..6a5dab12bf6 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -136,7 +136,10 @@ var/iconF = "flight" if(gun_light.on) iconF = "flight_on" - add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) + var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF) + flashlight_overlay.pixel_x = flight_x_offset + flashlight_overlay.pixel_y = flight_y_offset + add_overlay(flashlight_overlay) //Casing /obj/item/ammo_casing/energy/kinetic diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b4166d8070e..f8989a2304d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -14,7 +14,7 @@ var/amount = 30 var/recharged = 0 var/recharge_delay = 5 - var/image/icon_beaker = null + var/mutable_appearance/beaker_overlay var/obj/item/weapon/reagent_containers/beaker = null var/list/dispensable_reagents = list( "hydrogen", @@ -184,10 +184,9 @@ beaker.loc = src to_chat(user, "You add \the [B] to the machine.") - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - add_overlay(icon_beaker) + beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker") + beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position. + add_overlay(beaker_overlay) else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag)) to_chat(user, "You can't load \the [I] into the machine!") else diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index cb06dc29eec..5eb034d6043 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -15,7 +15,7 @@ else Wall.thermite = Wall.thermite+(reac_volume*10) Wall.overlays = list() - Wall.add_overlay(image('icons/effects/effects.dmi',"thermite")) + Wall.add_overlay(mutable_appearance('icons/effects/effects.dmi', "thermite")) /datum/reagent/thermite/on_mob_life(mob/living/M) M.adjustFireLoss(1, 0) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 01f39db4d35..fc08ebdbe8d 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -21,7 +21,7 @@ /obj/item/weapon/reagent_containers/glass/bottle/update_icon() cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]-10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 7b4faf0f7a0..9f0094bfc32 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -91,6 +91,6 @@ /obj/item/weapon/reagent_containers/dropper/update_icon() cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "dropper") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "dropper") filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 9a4ccada9b2..af130dbce7c 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -133,7 +133,7 @@ cut_overlays() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 0cb848974af..0c40639f1a7 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -167,10 +167,9 @@ item_state = "syringe_[rounded_vol]" if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "syringe10") - filling.icon_state = "syringe[rounded_vol]" - filling.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(filling) + var/image/filling_overlay = mutable_appearance('icons/obj/reagentfillings.dmi', "syringe[rounded_vol]") + filling_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling_overlay) /obj/item/weapon/reagent_containers/syringe/epinephrine name = "syringe (epinephrine)" diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 7cc890c1f64..9b1d5e649f2 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -364,7 +364,7 @@ //flush handle if(flush) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-handle")) + add_overlay("dispover-handle") //only handle is shown if no power if(stat & NOPOWER || panel_open) @@ -372,13 +372,13 @@ //check for items in disposal - occupied light if(contents.len > 0) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-full")) + add_overlay("dispover-full") //charging and ready light if(pressure_charging) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-charge")) + add_overlay("dispover-charge") else if(full_pressure) - add_overlay(image('icons/obj/atmospherics/pipes/disposal.dmi', "dispover-ready")) + add_overlay("dispover-ready") //timed process //charge the gas reservoir and perform flush if ready diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index ec99299f06d..adc03f829ea 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(message_servers, list()) var/recipient = "Unspecified" //name of the person var/sender = "Unspecified" //name of the sender var/message = "Blank" //transferred message - var/image/photo = null //Attached photo + var/icon/photo //Attached photo /datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_photo=null) diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index 6d18ce98f7e..2938f9263cf 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -47,7 +47,7 @@ to_chat(M, "Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has come.") M << 'sound/creatures/legion_spawn.ogg' flash_color(M, flash_color = "#FF0000", flash_time = 50) - var/image/door_overlay = image('icons/effects/effects.dmi', "legiondoor") + var/mutable_appearance/door_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor") notify_ghosts("Legion has been summoned in the [get_area(src)]!", source = src, alert_overlay = door_overlay, action = NOTIFY_JUMP) is_anyone_home = FALSE new/mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH)) diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index bb2f401cdba..594a6855da0 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -26,9 +26,9 @@ /obj/machinery/shuttle_manipulator/update_icon() cut_overlays() - var/image/hologram_projection = image(icon, "hologram_on") + var/mutable_appearance/hologram_projection = mutable_appearance(icon, "hologram_on") hologram_projection.pixel_y = 22 - var/image/hologram_ship = image(icon, "hologram_whiteship") + var/mutable_appearance/hologram_ship = mutable_appearance(icon, "hologram_whiteship") hologram_ship.pixel_y = 27 add_overlay(hologram_projection) add_overlay(hologram_ship) diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index 4f469b61b2a..3a84f73ef91 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -11,7 +11,7 @@ selection_type = "view" random_target = 1 var/ready = 0 - var/image/halo = null + var/static/mutable_appearance/halo var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea. action_icon_state = "lightning" @@ -25,7 +25,7 @@ ready = 1 to_chat(user, "You start gathering the power.") Snd = new/sound('sound/magic/lightning_chargeup.ogg',channel = 7) - halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) + halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) user.add_overlay(halo) playsound(get_turf(user), Snd, 50, 0) if(do_mob(user,user,100,1)) @@ -38,8 +38,7 @@ /obj/effect/proc_holder/spell/targeted/tesla/proc/Reset(mob/user = usr) ready = 0 - if(halo) - user.cut_overlay(halo) + user.cut_overlay(halo) /obj/effect/proc_holder/spell/targeted/tesla/revert_cast(mob/user = usr, message = 1) if(message) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 0d4200d49eb..53a71983023 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -127,7 +127,7 @@ icon = 'icons/obj/lavaland/cannon.dmi' icon_state = "orbital_cannon1" unsecuring_tool = null - var/static/image/top_layer = null + var/static/mutable_appearance/top_layer var/ex_power = 3 var/power_used_per_shot = 2000000 //enough to kil standard apc - todo : make this use wires instead and scale explosion power with it var/ready @@ -163,17 +163,16 @@ /obj/machinery/bsa/full/New(loc,cannon_direction = WEST) ..() + top_layer = top_layer || mutable_appearance(icon, layer = ABOVE_MOB_LAYER) switch(cannon_direction) if(WEST) dir = WEST pixel_x = -192 - top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_west") - top_layer.layer = ABOVE_MOB_LAYER + top_layer.icon_state = "top_west" icon_state = "cannon_west" if(EAST) dir = EAST - top_layer = image("icons/obj/lavaland/orbital_cannon.dmi", "top_east") - top_layer.layer = ABOVE_MOB_LAYER + top_layer.icon_state = "top_east" icon_state = "cannon_east" add_overlay(top_layer) reload() diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 56d35be23b3..d93fc658ddb 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -284,79 +284,66 @@ /obj/item/bodypart/proc/get_limb_icon(dropped) icon_state = "" //to erase the default sprite, we're building the visual aspects of the bodypart through overlays alone. - var/list/standing = list() + . = list() - var/image_dir + var/image_dir = 0 if(dropped) image_dir = SOUTH if(dmg_overlay_type) if(brutestate) - standing += image("icon"='icons/mob/dam_mob.dmi', "icon_state"="[dmg_overlay_type]_[body_zone]_[brutestate]0", "layer"=-DAMAGE_LAYER, "dir"=image_dir) + . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) if(burnstate) - standing += image("icon"='icons/mob/dam_mob.dmi', "icon_state"="[dmg_overlay_type]_[body_zone]_0[burnstate]", "layer"=-DAMAGE_LAYER, "dir"=image_dir) + . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) + var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) + . += limb if(animal_origin) if(status == BODYPART_ORGANIC) + limb.icon = 'icons/mob/animal_parts.dmi' if(species_id == "husk") - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state"="[animal_origin]_husk_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[animal_origin]_husk_[body_zone]" else - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state"="[animal_origin]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[animal_origin]_[body_zone]" else - standing += image("icon"='icons/mob/augments.dmi', "icon_state"="[animal_origin]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) - return standing + limb.icon = 'icons/mob/augments.dmi' + limb.icon_state = "[animal_origin]_[body_zone]" + return var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable if((body_zone != "head" && body_zone != "chest")) should_draw_gender = FALSE - var/image/I - if(status == BODYPART_ORGANIC) if(should_draw_greyscale) + limb.icon = 'icons/mob/human_parts_greyscale.dmi' if(should_draw_gender) - I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" else if(use_digitigrade) - I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="digitigrade_[use_digitigrade]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]" else - I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]" else + limb.icon = 'icons/mob/human_parts.dmi' if(should_draw_gender) - I = image("icon"='icons/mob/human_parts.dmi', "icon_state"="[species_id]_[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" else - I = image("icon"='icons/mob/human_parts.dmi', "icon_state"="[species_id]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[species_id]_[body_zone]" + else + limb.icon = icon if(should_draw_gender) - I = image("icon"= icon, "icon_state"="[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) + limb.icon_state = "[body_zone]_[icon_gender]" else - I = image("icon"= icon, "icon_state"="[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir) - standing += I - return standing - - - if(!should_draw_greyscale) - standing += I - return standing - - //Greyscale Colouring - var/draw_color - - if(skin_tone) //Limb has skin color variable defined, use it - draw_color = skintone2hex(skin_tone) - if(species_color) - draw_color = species_color - if(mutation_color) - draw_color = mutation_color - - if(draw_color) - I.color = "#[draw_color]" - //End Greyscale Colouring - standing += I - - return standing + limb.icon_state = "[body_zone]" + return + if(should_draw_greyscale) + var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) + if(draw_color) + limb.color = "#[draw_color]" /obj/item/bodypart/deconstruct(disassembled = TRUE) drop_organs() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 6417ade8198..909f83e4d71 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -119,7 +119,7 @@ /obj/item/bodypart/head/get_limb_icon(dropped) cut_overlays() - var/list/standing = ..() + . = ..() if(dropped) //certain overlays only appear when the limb is being detached from its owner. var/datum/sprite_accessory/S @@ -128,45 +128,48 @@ if(facial_hair_style) S = GLOB.facial_hair_styles_list[facial_hair_style] if(S) - var/image/img_facial = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER, "dir"=SOUTH) - img_facial.color = "#" + facial_hair_color - img_facial.alpha = hair_alpha - standing += img_facial + var/image/facial_overlay = image(S.icon, "[S.icon_state]", -HAIR_LAYER, SOUTH) + facial_overlay.color = "#" + facial_hair_color + facial_overlay.alpha = hair_alpha + . += facial_overlay + var/image/hair_overlay = image(layer = -HAIR_LAYER, dir = SOUTH) + . += hair_overlay //Applies the debrained overlay if there is no brain if(!brain) if(animal_origin == ALIEN_BODYPART) - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state" = "debrained_alien", "layer" = -HAIR_LAYER, "dir"=SOUTH) + hair_overlay.icon = 'icons/mob/animal_parts.dmi' + hair_overlay.icon_state = "debrained_alien" else if(animal_origin == LARVA_BODYPART) - standing += image("icon"='icons/mob/animal_parts.dmi', "icon_state" = "debrained_larva", "layer" = -HAIR_LAYER, "dir"=SOUTH) + hair_overlay.icon = 'icons/mob/animal_parts.dmi' + hair_overlay.icon_state = "debrained_larva" else if(!(NOBLOOD in species_flags_list)) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER, "dir"=SOUTH) + hair_overlay.icon = 'icons/mob/human_face.dmi' + hair_overlay.icon_state = "debrained" else if(hair_style) S = GLOB.hair_styles_list[hair_style] if(S) - var/image/img_hair = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER, "dir"=SOUTH) - img_hair.color = "#" + hair_color - img_hair.alpha = hair_alpha - standing += img_hair + hair_overlay.icon = icon + hair_overlay.icon_state = "[S.icon_state]" + hair_overlay.color = "#" + hair_color + hair_overlay.alpha = hair_alpha // lipstick if(lip_style) - var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]", "layer" = -BODY_LAYER, "dir"=SOUTH) - lips.color = lip_color - standing += lips + var/image/lips_overlay = image('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH) + lips_overlay.color = lip_color + . += lips_overlay // eyes + var/image/eyes_overlay = image('icons/mob/human_face.dmi', "eyes", -BODY_LAYER, SOUTH) + . += eyes_overlay if(!eyes) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER, "dir"=SOUTH) + eyes_overlay.icon_state = "eyes_missing" else if(eyes.eye_color) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER, "dir"=SOUTH) - img_eyes.color = "#" + eyes.eye_color - standing += img_eyes - - return standing + eyes_overlay.color = "#" + eyes.eye_color /obj/item/bodypart/head/monkey icon = 'icons/mob/animal_parts.dmi' diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 85a98b09e6f..7b4f98693ca 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -11,7 +11,7 @@ if(iscarbon(M)) src.Insert(M) if(implant_overlay) - var/image/overlay = new /image(icon, implant_overlay) + var/mutable_appearance/overlay = mutable_appearance(icon, implant_overlay) overlay.color = implant_color add_overlay(overlay) return ..() diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 6afd401b75a..5f663b85f84 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -3,7 +3,7 @@ name = "all-terrain vehicle" desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts." icon_state = "atv" - var/static/image/atvcover = null + var/static/mutable_appearance/atvcover /obj/vehicle/atv/buckle_mob(mob/living/buckled_mob, force = 0, check_loc = 1) . = ..() @@ -11,9 +11,7 @@ /obj/vehicle/atv/New() ..() - if(!atvcover) - atvcover = image("icons/obj/vehicles.dmi", "atvcover") - atvcover.layer = ABOVE_MOB_LAYER + atvcover = atvcover || mutable_appearance(icon, "atvcover", ABOVE_MOB_LAYER) /obj/vehicle/atv/post_buckle_mob(mob/living/M) diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 3db99e736b6..21d8cff1be2 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -4,7 +4,7 @@ icon_state = "speedbike_blue" layer = LYING_MOB_LAYER var/overlay_state = "cover_blue" - var/image/overlay = null + var/static/mutable_appearance/overlay /obj/vehicle/space/speedbike/buckle_mob(mob/living/M, force = 0, check_loc = 1) . = ..() @@ -12,8 +12,7 @@ /obj/vehicle/space/speedbike/New() . = ..() - overlay = image("icons/obj/bike.dmi", overlay_state) - overlay.layer = ABOVE_MOB_LAYER + overlay = overlay || mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER) add_overlay(overlay) /obj/effect/overlay/temp/speedbike_trail diff --git a/tgstation.dme b/tgstation.dme index fcd8d95738c..6785056c1ac 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -218,6 +218,7 @@ #include "code\datums\martial.dm" #include "code\datums\material_container.dm" #include "code\datums\mind.dm" +#include "code\datums\mutable_appearance.dm" #include "code\datums\mutations.dm" #include "code\datums\outfit.dm" #include "code\datums\progressbar.dm" From 0c8cd780b7fb7d820c3fd4a5b04c91a2adf6daed Mon Sep 17 00:00:00 2001 From: QualityVan Date: Tue, 25 Apr 2017 08:39:22 -0400 Subject: [PATCH 29/97] Minor IV/bloodbag grammar fixes --- code/game/machinery/iv_drip.dm | 2 +- .../modules/reagents/reagent_containers/blood_pack.dm | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e4e1f7e75d8..2776a7c4d7f 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -200,7 +200,7 @@ if(beaker.reagents && beaker.reagents.reagent_list.len) to_chat(usr, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else - to_chat(usr, "Attached is an empty [beaker].") + to_chat(usr, "Attached is an empty [beaker.name].") else to_chat(usr, "No chemicals are attached.") diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 1ed89a74db8..09fae5ff904 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -25,13 +25,10 @@ /obj/item/weapon/reagent_containers/blood/proc/update_pack_name() if(!labelled) - if(volume) - if(blood_type) - name = "blood pack [blood_type]" - else - name = "blood pack" + if(blood_type) + name = "blood pack - [blood_type]" else - name = "empty blood pack" + name = "blood pack" /obj/item/weapon/reagent_containers/blood/update_icon() var/percent = round((reagents.total_volume / volume) * 100) @@ -69,7 +66,7 @@ blood_type = "L" /obj/item/weapon/reagent_containers/blood/empty - name = "empty blood pack" + name = "blood pack" icon_state = "empty" /obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params) From 079592069d2e1a4159fa6b50dbee8ea32cfd24f4 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 25 Apr 2017 07:38:59 -0700 Subject: [PATCH 30/97] Automatic changelog generation for PR #26380 [ci skip] --- html/changelogs/AutoChangeLog-pr-26380.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26380.yml diff --git a/html/changelogs/AutoChangeLog-pr-26380.yml b/html/changelogs/AutoChangeLog-pr-26380.yml new file mode 100644 index 00000000000..145254887e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26380.yml @@ -0,0 +1,5 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Examining a window now gives hints to the appropriate tool for the +next stage of construction/deconstruction." From 3d1f7ce8486ad0061e4eb0bd2722eba59a307c69 Mon Sep 17 00:00:00 2001 From: Mark9013100 Date: Tue, 25 Apr 2017 10:56:30 -0400 Subject: [PATCH 31/97] Renames generic armor and athletic shorts --- code/modules/clothing/suits/armor.dm | 4 ++-- code/modules/clothing/under/shorts.dm | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 058803cc574..62a65559a87 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -13,7 +13,7 @@ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50) /obj/item/clothing/suit/armor/vest - name = "armor" + name = "armor vest" desc = "A slim armored vest that protects against most types of damage." icon_state = "armoralt" item_state = "armoralt" @@ -140,7 +140,7 @@ return 1 /obj/item/clothing/suit/armor/vest/det_suit - name = "armor" + name = "detective's armor vest" desc = "An armored vest with a detective's badge on it." icon_state = "detective-armor" allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton/telescopic) diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 0da22fc678e..1464c4a6848 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -8,25 +8,31 @@ can_adjust = 0 /obj/item/clothing/under/shorts/red + name = "red athletic shorts" icon_state = "redshorts" item_color = "redshorts" /obj/item/clothing/under/shorts/green + name = "green athletic shorts" icon_state = "greenshorts" item_color = "greenshorts" /obj/item/clothing/under/shorts/blue + name = "blue athletic shorts" icon_state = "blueshorts" item_color = "blueshorts" /obj/item/clothing/under/shorts/black + name = "black athletic shorts" icon_state = "blackshorts" item_color = "blackshorts" /obj/item/clothing/under/shorts/grey + name = "grey athletic shorts" icon_state = "greyshorts" item_color = "greyshorts" /obj/item/clothing/under/shorts/purple + name = "purple athletic shorts" icon_state = "purpleshorts" item_color = "purpleshorts" \ No newline at end of file From d8208efaff98e52100f1dc73b35bf9af2513e923 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 25 Apr 2017 11:49:53 -0700 Subject: [PATCH 32/97] Fixes some edges cases in the garbage controller We no longer pause when we use up a tick, instead making us wait the delay between fires. (to cut down on lag from consecutive hard deletes) In a later pr I'll also make the MC punish subsystems who go over their allocated tick time with delayed fires and lower tick allotments. Long hard delete logging moved to HardDelete proc so it can take effect on QDEL_HINT_HARDDEL items as well. QDEL_HINT_HARDDEL_NOW uses the HardDelete proc now. --- code/controllers/subsystem/garbage.dm | 43 ++++++++++++++++----------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 083127c9c35..837aa9fcab0 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -66,6 +66,9 @@ SUBSYSTEM_DEF(garbage) HandleToBeQueued() if(state == SS_RUNNING) HandleQueue() + + if (state == SS_PAUSED) //make us wait again before the next run. + state = SS_RUNNING //If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. //Don't attempt to optimize, not worth the effort. @@ -110,24 +113,9 @@ SUBSYSTEM_DEF(garbage) var/type = A.type testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --") didntgc["[type]"]++ - var/time = world.timeofday - var/tick = world.tick_usage - var/ticktime = world.time + HardDelete(A) - tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) - if (tick > highest_del_tickusage) - highest_del_tickusage = tick - time = world.timeofday - time - if (!time && TICK_DELTA_TO_MS(tick) > 1) - time = TICK_DELTA_TO_MS(tick)/100 - if (time > highest_del_time) - highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") - postpone(time/5) - break ++delslasttick ++totaldels else @@ -157,8 +145,27 @@ SUBSYSTEM_DEF(garbage) //this is purely to seperate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/A) + var/time = world.timeofday + var/tick = world.tick_usage + var/ticktime = world.time + var/type = A.type + del(A) - + + tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + if (tick > highest_del_tickusage) + highest_del_tickusage = tick + time = world.timeofday - time + if (!time && TICK_DELTA_TO_MS(tick) > 1) + time = TICK_DELTA_TO_MS(tick)/100 + if (time > highest_del_time) + highest_del_time = time + if (time > 10) + log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") + postpone(time/5) + break + /datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A @@ -211,7 +218,7 @@ SUBSYSTEM_DEF(garbage) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. - del(D) + HardDelete(D) if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.QueueForQueuing(D) #ifdef TESTING From 127bda2042dc0b0ce8fe1bb11aa8b846e1068e5a Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 25 Apr 2017 12:10:17 -0700 Subject: [PATCH 33/97] Compile errors. --- code/controllers/subsystem/garbage.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 837aa9fcab0..0b576fe25a6 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -148,7 +148,9 @@ SUBSYSTEM_DEF(garbage) var/time = world.timeofday var/tick = world.tick_usage var/ticktime = world.time + var/type = A.type + var/refid = "\ref[A]" del(A) @@ -164,7 +166,6 @@ SUBSYSTEM_DEF(garbage) log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") postpone(time/5) - break /datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) @@ -218,7 +219,7 @@ SUBSYSTEM_DEF(garbage) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. - HardDelete(D) + SSgarbage.HardDelete(D) if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.QueueForQueuing(D) #ifdef TESTING From 7f77a221f4670bcca09219321239def48596d0a5 Mon Sep 17 00:00:00 2001 From: bagil Date: Tue, 25 Apr 2017 19:12:01 +0000 Subject: [PATCH 34/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 101 ++++++++++----------- html/changelogs/.all_changelog.yml | 39 ++++++++ html/changelogs/AutoChangeLog-pr-26292.yml | 4 - html/changelogs/AutoChangeLog-pr-26346.yml | 4 - html/changelogs/AutoChangeLog-pr-26380.yml | 5 - html/changelogs/AutoChangeLog-pr-26381.yml | 7 -- html/changelogs/AutoChangeLog-pr-26397.yml | 5 - html/changelogs/AutoChangeLog-pr-26400.yml | 6 -- html/changelogs/AutoChangeLog-pr-26416.yml | 4 - html/changelogs/AutoChangeLog-pr-26436.yml | 5 - html/changelogs/AutoChangeLog-pr-26441.yml | 7 -- html/changelogs/AutoChangeLog-pr-26443.yml | 4 - html/changelogs/AutoChangeLog-pr-26445.yml | 4 - html/changelogs/AutoChangeLog-pr-26456.yml | 4 - html/changelogs/AutoChangeLog-pr-26457.yml | 5 - html/changelogs/AutoChangeLog-pr-26484.yml | 4 - html/changelogs/AutoChangeLog-pr-26491.yml | 4 - 17 files changed, 88 insertions(+), 124 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26292.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26346.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26380.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26381.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26397.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26400.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26416.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26436.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26441.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26443.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26456.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26457.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26484.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26491.yml diff --git a/html/changelog.html b/html/changelog.html index 25e46e97e11..63a04c0c86e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,55 @@ -->
+

25 April 2017

+

BeeSting12 updated:

+
    +
  • Deltastation's secure tech storage is no longer all access.
  • +
+

CoreOverload updated:

+
    +
  • Disposals no longer get broken by shuttles rotation.
  • +
  • Wires no longer get broken by shuttles movement and rotation.
  • +
  • Atmospheric equipment no longer gets broken by shuttles movement and rotation. Glory to the Flying Fortress of Atmosia!
  • +
+

Jalleo updated:

+
    +
  • WW_maze from lavaland has been removed it wasnt that good really anyhow
  • +
+

QualityVan updated:

+
    +
  • Changeling brains are now more fully vestigial
  • +
+

WJohnston updated:

+
    +
  • Skeletons and plasmamen's hitboxes now more closely match that of humans. They are no longer full of holes and incredibly frustrating to hit, should they run around naked.
  • +
+

XDTM updated:

+
    +
  • Items will no longer be used on backpacks if they fail to insert when they're too full.
  • +
+

basilman updated:

+
    +
  • fixed species with no skin dropping skin when gibbed.
  • +
+

coiax updated:

+
    +
  • Examining a window now gives hints to the appropriate tool for the next stage of construction/deconstruction.
  • +
  • You can examine a firedoor for hints on how to construct/deconstruct it.
  • +
  • Add an additional hint during construction where you can add plasteel to make the firedoor reinforced.
  • +
  • Fixed easter eggs spawning during non-Easter.
  • +
  • Fixes stations not having holiday specific prefixes during the holidays.
  • +
  • Ghosts no longer drift in space.
  • +
  • Swarmers now only speak their own language, rather than swarmer and common.
  • +
  • When you are crushed by a door, it prints a visible message, instead of, in some cases, silently damaging you.
  • +
  • The vent in the Escape Coridoor on Omega Station has been fixed.
  • +
+

coiax, WJohnston updated:

+
    +
  • Plasmamen lungs, also known as "plasma filters" now look different from human lungs.
  • +
  • Plasmamen now have their own special type of bone tongue. They still sound the same, it's just purple. Like them.
  • +
+

23 April 2017

coiax updated:

    @@ -1226,58 +1275,6 @@
  • Highlanders can no longer hide behind chairs and plants.
  • Highlanders no longer bleed and are no longer slowed down by damage.
- -

21 February 2017

-

Cyberboss updated:

-
    -
  • You can now unshunt as a malfunctioning AI again
  • -
-

Kor updated:

-
    -
  • You will now retain your facing when getting pushed by another mob.
  • -
-

Tofa01 updated:

-
    -
  • [Z2] Fixed Centcomm shutters to have proper access levels for inspectors and other Admin given roles
  • -
-

coiax updated:

-
    -
  • Refactors heart attack code, a cardiac arrest will knock someone unconscious and kill them very quickly.
  • -
  • Adds corazone, an anti-heart attack drug, made by mixing 2 parts Phenol, 1 part Lithium. A person with corazone in their system will not suffer any negative effects from missing a heart. Use it during surgery.
  • -
  • Abductor glands are now hearts, the abductor operation table now automatically injects corazone to prevent deaths during surgery. The gland will restart if it stops beating.
  • -
  • Cloning pods always know the name of the person they are cloning.
  • -
  • You can swipe a medical ID card to eject someone from the cloning pod early. The cloning pod will announce this over the radio.
  • -
  • Fresh clones have no organs or limbs, they gain them during the cloning process. Ejecting a clone too early is not recommended. Power loss will also eject a clone as before.
  • -
  • An ejected clone will take damage from being at critical health very quickly upon ejection, rather than before, where a clone could be stable in critical for up to two minutes.
  • -
  • Occupants of cloning pods do not interact with the air outside the pod.
  • -
-

uraniummeltdown updated:

-
    -
  • All shuttle engines should now be facing the right way
  • -
- -

20 February 2017

-

Cyberboss updated:

-
    -
  • The frequncy fire alarms play at is now consistent
  • -
-

MrStonedOne updated:

-
    -
  • bluespace ore cap changed from 100 ores to 500
  • -
-

Tofa01 updated:

-
    -
  • [Meta] Replaces orange jumpsuit in holding cell with prisoner jumpsuits
  • -
-

XDTM updated:

-
    -
  • Repairing someone else's robotic limb is instant. Repairing your own robotic limbs will still take time.
  • -
  • Repairing limbs with cable or welding will now heal more.
  • -
-

Xhuis updated:

-
    -
  • Medipens are no longer reusable.
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bd0f91fdc75..d18e4882e05 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10644,3 +10644,42 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Centcom would like to inform all employees that they have ears. - rscadd: Adds "ear" organs to all carbons. These organs store ear damage and deafness. A carbon without any ears is deaf. Genetic deafness functions as before. +2017-04-25: + BeeSting12: + - bugfix: Deltastation's secure tech storage is no longer all access. + CoreOverload: + - bugfix: Disposals no longer get broken by shuttles rotation. + - bugfix: Wires no longer get broken by shuttles movement and rotation. + - bugfix: Atmospheric equipment no longer gets broken by shuttles movement and rotation. + Glory to the Flying Fortress of Atmosia! + Jalleo: + - rscdel: WW_maze from lavaland has been removed it wasnt that good really anyhow + QualityVan: + - bugfix: Changeling brains are now more fully vestigial + WJohnston: + - tweak: Skeletons and plasmamen's hitboxes now more closely match that of humans. + They are no longer full of holes and incredibly frustrating to hit, should they + run around naked. + XDTM: + - bugfix: Items will no longer be used on backpacks if they fail to insert when + they're too full. + basilman: + - bugfix: fixed species with no skin dropping skin when gibbed. + coiax: + - rscadd: Examining a window now gives hints to the appropriate tool for the next + stage of construction/deconstruction. + - rscadd: You can examine a firedoor for hints on how to construct/deconstruct it. + - rscadd: Add an additional hint during construction where you can add plasteel + to make the firedoor reinforced. + - bugfix: Fixed easter eggs spawning during non-Easter. + - bugfix: Fixes stations not having holiday specific prefixes during the holidays. + - bugfix: Ghosts no longer drift in space. + - bugfix: Swarmers now only speak their own language, rather than swarmer and common. + - bugfix: When you are crushed by a door, it prints a visible message, instead of, + in some cases, silently damaging you. + - bugfix: The vent in the Escape Coridoor on Omega Station has been fixed. + coiax, WJohnston: + - rscadd: Plasmamen lungs, also known as "plasma filters" now look different from + human lungs. + - rscadd: Plasmamen now have their own special type of bone tongue. They still sound + the same, it's just purple. Like them. diff --git a/html/changelogs/AutoChangeLog-pr-26292.yml b/html/changelogs/AutoChangeLog-pr-26292.yml deleted file mode 100644 index 9d91cc6f1f5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26292.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BeeSting12" -delete-after: True -changes: - - bugfix: "Deltastation's secure tech storage is no longer all access." diff --git a/html/changelogs/AutoChangeLog-pr-26346.yml b/html/changelogs/AutoChangeLog-pr-26346.yml deleted file mode 100644 index f1756d26d8c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26346.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - bugfix: "Changeling brains are now more fully vestigial" diff --git a/html/changelogs/AutoChangeLog-pr-26380.yml b/html/changelogs/AutoChangeLog-pr-26380.yml deleted file mode 100644 index 145254887e9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26380.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Examining a window now gives hints to the appropriate tool for the -next stage of construction/deconstruction." diff --git a/html/changelogs/AutoChangeLog-pr-26381.yml b/html/changelogs/AutoChangeLog-pr-26381.yml deleted file mode 100644 index b81943d30fb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26381.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "You can examine a firedoor for hints on how to -construct/deconstruct it." - - rscadd: "Add an additional hint during construction where you can add -plasteel to make the firedoor reinforced." diff --git a/html/changelogs/AutoChangeLog-pr-26397.yml b/html/changelogs/AutoChangeLog-pr-26397.yml deleted file mode 100644 index 0e555c64add..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26397.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Fixed easter eggs spawning during non-Easter." - - bugfix: "Fixes stations not having holiday specific prefixes during the holidays." diff --git a/html/changelogs/AutoChangeLog-pr-26400.yml b/html/changelogs/AutoChangeLog-pr-26400.yml deleted file mode 100644 index 821d37f331e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CoreOverload" -delete-after: True -changes: - - bugfix: "Disposals no longer get broken by shuttles rotation." - - bugfix: "Wires no longer get broken by shuttles movement and rotation." - - bugfix: "Atmospheric equipment no longer gets broken by shuttles movement and rotation. Glory to the Flying Fortress of Atmosia!" diff --git a/html/changelogs/AutoChangeLog-pr-26416.yml b/html/changelogs/AutoChangeLog-pr-26416.yml deleted file mode 100644 index cbfa45a0a50..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Ghosts no longer drift in space." diff --git a/html/changelogs/AutoChangeLog-pr-26436.yml b/html/changelogs/AutoChangeLog-pr-26436.yml deleted file mode 100644 index 87f80c1ad07..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26436.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Swarmers now only speak their own language, rather than swarmer and -common." diff --git a/html/changelogs/AutoChangeLog-pr-26441.yml b/html/changelogs/AutoChangeLog-pr-26441.yml deleted file mode 100644 index 731e4a870b0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26441.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax, WJohnston" -delete-after: True -changes: - - rscadd: "Plasmamen lungs, also known as \"plasma filters\" now look different -from human lungs." - - rscadd: "Plasmamen now have their own special type of bone tongue. They -still sound the same, it's just purple. Like them." diff --git a/html/changelogs/AutoChangeLog-pr-26443.yml b/html/changelogs/AutoChangeLog-pr-26443.yml deleted file mode 100644 index c5a7877ffc7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26443.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WJohnston" -delete-after: True -changes: - - tweak: "Skeletons and plasmamen's hitboxes now more closely match that of humans. They are no longer full of holes and incredibly frustrating to hit, should they run around naked." diff --git a/html/changelogs/AutoChangeLog-pr-26445.yml b/html/changelogs/AutoChangeLog-pr-26445.yml deleted file mode 100644 index e61bf150ef9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "Items will no longer be used on backpacks if they fail to insert when they're too full." diff --git a/html/changelogs/AutoChangeLog-pr-26456.yml b/html/changelogs/AutoChangeLog-pr-26456.yml deleted file mode 100644 index 758f0c4c15c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26456.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "basilman" -delete-after: True -changes: - - bugfix: "fixed species with no skin dropping skin when gibbed." diff --git a/html/changelogs/AutoChangeLog-pr-26457.yml b/html/changelogs/AutoChangeLog-pr-26457.yml deleted file mode 100644 index 43829911c1b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26457.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "When you are crushed by a door, it prints a visible message, -instead of, in some cases, silently damaging you." diff --git a/html/changelogs/AutoChangeLog-pr-26484.yml b/html/changelogs/AutoChangeLog-pr-26484.yml deleted file mode 100644 index cc711de25cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26484.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jalleo" -delete-after: True -changes: - - rscdel: "WW_maze from lavaland has been removed it wasnt that good really anyhow" diff --git a/html/changelogs/AutoChangeLog-pr-26491.yml b/html/changelogs/AutoChangeLog-pr-26491.yml deleted file mode 100644 index a84c98f989c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26491.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "The vent in the Escape Coridoor on Omega Station has been fixed." From 8da8c74dfb357a4b9f74edb7625ed4c9f8ab5065 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 25 Apr 2017 12:14:49 -0700 Subject: [PATCH 35/97] >caps --- code/controllers/subsystem/garbage.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 0b576fe25a6..7d3682cf5f7 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -150,7 +150,7 @@ SUBSYSTEM_DEF(garbage) var/ticktime = world.time var/type = A.type - var/refid = "\ref[A]" + var/refID = "\ref[A]" del(A) From 21818a5b5f27eb91e570d21152e16221c97d05a3 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Tue, 25 Apr 2017 12:26:33 -0700 Subject: [PATCH 36/97] lowers max list size in vv since you can vv lists now, this doesn't need to be as big. --- code/datums/datumvars.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index d49b1e227a0..628ff520aa5 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -445,7 +445,7 @@ var/list/L = value var/list/items = list() - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > 500)) + if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150))) for (var/i in 1 to L.len) var/key = L[i] var/val From 691cc018338f5c029e3d5e8a23490d9a3dfd9964 Mon Sep 17 00:00:00 2001 From: XDTM Date: Tue, 25 Apr 2017 21:29:51 +0200 Subject: [PATCH 37/97] Refactors T-Ray Scanners (#25093) * Refactors T-Ray Scanners --- code/game/objects/items/devices/scanners.dm | 26 ++++++---------- .../clothing/glasses/engine_goggles.dm | 30 +++++++------------ 2 files changed, 19 insertions(+), 37 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 4c19700a786..5d7cf915cac 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -28,9 +28,14 @@ MASS SPECTROMETER START_PROCESSING(SSobj, src) /obj/item/device/t_scanner/proc/flick_sonar(obj/pipe) - var/image/I = image('icons/effects/effects.dmi', pipe, "blip", pipe.layer+1) - I.alpha = 128 - flick_overlay_view(I, pipe, 8) + if(ismob(loc)) + var/mob/M = loc + var/image/I = new(loc = get_turf(pipe)) + var/mutable_appearance/MA = new(pipe) + MA.alpha = 128 + I.appearance = MA + if(M.client) + flick_overlay(I, list(M.client), 8) /obj/item/device/t_scanner/process() if(!on) @@ -46,21 +51,8 @@ MASS SPECTROMETER if(O.level != 1) continue - var/mob/living/L = locate() in O - if(O.invisibility == INVISIBILITY_MAXIMUM) - O.invisibility = 0 - if(L) - flick_sonar(O) - spawn(10) - if(O && O.loc) - var/turf/U = O.loc - if(U.intact) - O.invisibility = INVISIBILITY_MAXIMUM - else - if(L) - flick_sonar(O) - + flick_sonar(O) /obj/item/device/healthanalyzer name = "health analyzer" diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 9c6c960448e..6720663fb73 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -8,7 +8,6 @@ origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3" var/mode = 0 //0 - regular mesons mode 1 - t-ray mode - var/invis_objects = list() var/range = 1 /obj/item/clothing/glasses/meson/engine/attack_self(mob/user) @@ -26,7 +25,6 @@ darkness_view = 1 lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE to_chat(loc, "You toggle the goggles' scanning mode to \[Meson].") - invis_update() if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -43,39 +41,32 @@ return if(!ishuman(loc)) - invis_update() return var/mob/living/carbon/human/user = loc if(user.glasses != src) - invis_update() return scan() /obj/item/clothing/glasses/meson/engine/proc/scan() for(var/turf/T in range(range, loc)) - - if(!T.intact) - continue - for(var/obj/O in T.contents) if(O.level != 1) continue if(O.invisibility == INVISIBILITY_MAXIMUM) - O.invisibility = 0 - invis_objects += O + flick_sonar(O) - addtimer(CALLBACK(src, .proc/invis_update), 5) - -/obj/item/clothing/glasses/meson/engine/proc/invis_update() - for(var/obj/O in invis_objects) - if(!t_ray_on() || !(O in range(range, loc))) - invis_objects -= O - var/turf/T = O.loc - if(T && T.intact) - O.invisibility = INVISIBILITY_MAXIMUM +/obj/item/clothing/glasses/meson/engine/proc/flick_sonar(obj/pipe) + if(ismob(loc)) + var/mob/M = loc + var/image/I = new(loc = get_turf(pipe)) + var/mutable_appearance/MA = new(pipe) + MA.alpha = 128 + I.appearance = MA + if(M.client) + flick_overlay(I, list(M.client), 8) /obj/item/clothing/glasses/meson/engine/proc/t_ray_on() if(!ishuman(loc)) @@ -125,7 +116,6 @@ else STOP_PROCESSING(SSobj, src) to_chat(user, "You turn the goggles off.") - invis_update() update_icon() for(var/X in actions) From e6e95cbf49d12c96ccb9158594d7896f07b95825 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 25 Apr 2017 12:29:52 -0700 Subject: [PATCH 38/97] Automatic changelog generation for PR #25093 [ci skip] --- html/changelogs/AutoChangeLog-pr-25093.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25093.yml diff --git a/html/changelogs/AutoChangeLog-pr-25093.yml b/html/changelogs/AutoChangeLog-pr-25093.yml new file mode 100644 index 00000000000..29024c2ce66 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25093.yml @@ -0,0 +1,5 @@ +author: "XDTM" +delete-after: True +changes: + - bugfix: "T-Ray scans are no longer visible to bystanders." + - bugfix: "T-Ray scans no longer allow viewers to interact with underfloor objects." From ee763a5aa44003a3f20a7c1ab38abfe1dd6afc91 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Tue, 25 Apr 2017 15:36:07 -0400 Subject: [PATCH 39/97] Removes a few spawns (#26507) --- code/modules/ninja/suit/n_suit_verbs/ninja_net.dm | 3 +-- code/modules/power/antimatter/shielding.dm | 12 ++++-------- code/modules/procedural_mapping/mapGenerator.dm | 6 ++---- code/modules/projectiles/gun.dm | 3 +-- code/modules/spells/spell_types/area_teleport.dm | 5 ++--- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm index 33f1a307cbd..481c4d46b5f 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm @@ -14,8 +14,7 @@ if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. to_chat(H, "You may not use an energy net through solid obstacles!") return - spawn(0) - H.Beam(C,"n_beam",time=15) + H.Beam(C,"n_beam",time=15) H.say("Get over here!") var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.loc) H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!") diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 527d5d62a26..8bdc5c1015c 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -28,11 +28,9 @@ var/dirs = 0 -/obj/machinery/am_shielding/New(loc) - ..(loc) - spawn(10) - controllerscan() - return +/obj/machinery/am_shielding/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/controllerscan), 10) /obj/machinery/am_shielding/proc/controllerscan(priorscan = 0) @@ -59,11 +57,9 @@ if(!control_unit) if(!priorscan) - spawn(20) - controllerscan(1)//Last chance + addtimer(CALLBACK(src, .proc/controllerscan, 1), 20) return qdel(src) - return /obj/machinery/am_shielding/Destroy() diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index 0de4a45dcb1..5653e804224 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -107,8 +107,7 @@ if(!modules || !modules.len) return for(var/datum/mapGeneratorModule/mod in modules) - spawn(0) - mod.generate() + INVOKE_ASYNC(mod, /datum/mapGeneratorModule.proc/generate) //Requests the mapGeneratorModule(s) to (re)generate this one turf @@ -119,8 +118,7 @@ if(!modules || !modules.len) return for(var/datum/mapGeneratorModule/mod in modules) - spawn(0) - mod.place(T) + INVOKE_ASYNC(mod, /datum/mapGeneratorModule.proc/place, T) //Replaces all paths in the module list with actual module datums diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8b889a70801..f69d4cc23f0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -175,8 +175,7 @@ else if(G.can_trigger_gun(user)) bonus_spread += 24 * G.weapon_weight loop_counter++ - spawn(loop_counter) - G.process_fire(target,user,1,params, null, bonus_spread) + addtimer(CALLBACK(G, /obj/item/weapon/gun.proc/process_fire, target, user, 1, params, null, bonus_spread), loop_counter) process_fire(target,user,1,params, null, bonus_spread) diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm index 0ff91495ed1..2da4b5aa10b 100644 --- a/code/modules/spells/spell_types/area_teleport.dm +++ b/code/modules/spells/spell_types/area_teleport.dm @@ -14,9 +14,8 @@ revert_cast() return invocation(thearea,user) - spawn(0) - if(charge_type == "recharge" && recharge) - start_recharge() + if(charge_type == "recharge" && recharge) + INVOKE_ASYNC(src, .proc/start_recharge) cast(targets,thearea,user) after_cast(targets) From a302303c43ae72ba03c05206b600ff89434814e5 Mon Sep 17 00:00:00 2001 From: sybil Date: Tue, 25 Apr 2017 19:45:02 +0000 Subject: [PATCH 40/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 2 ++ html/changelogs/.all_changelog.yml | 2 ++ html/changelogs/AutoChangeLog-pr-25093.yml | 5 ----- 3 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-25093.yml diff --git a/html/changelog.html b/html/changelog.html index 63a04c0c86e..ab2ad3f3dd8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -81,6 +81,8 @@

XDTM updated:

  • Items will no longer be used on backpacks if they fail to insert when they're too full.
  • +
  • T-Ray scans are no longer visible to bystanders.
  • +
  • T-Ray scans no longer allow viewers to interact with underfloor objects.

basilman updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d18e4882e05..7ccc1c56aaf 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10663,6 +10663,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. XDTM: - bugfix: Items will no longer be used on backpacks if they fail to insert when they're too full. + - bugfix: T-Ray scans are no longer visible to bystanders. + - bugfix: T-Ray scans no longer allow viewers to interact with underfloor objects. basilman: - bugfix: fixed species with no skin dropping skin when gibbed. coiax: diff --git a/html/changelogs/AutoChangeLog-pr-25093.yml b/html/changelogs/AutoChangeLog-pr-25093.yml deleted file mode 100644 index 29024c2ce66..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25093.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "T-Ray scans are no longer visible to bystanders." - - bugfix: "T-Ray scans no longer allow viewers to interact with underfloor objects." From f791536263c0ebd66cd44ff4ad42fa8db14a34e3 Mon Sep 17 00:00:00 2001 From: Robustin Date: Tue, 25 Apr 2017 16:13:53 -0400 Subject: [PATCH 41/97] Dance Machine ~Fixes~ (#26420) --- code/game/machinery/dance_machine.dm | 179 +++++++----------- code/game/objects/items/devices/flashlight.dm | 3 +- 2 files changed, 70 insertions(+), 112 deletions(-) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 685b97614ca..8c935419a5b 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -11,7 +11,6 @@ req_access = list(GLOB.access_engine) var/active = FALSE var/list/rangers = list() - var/list/listeners = list() var/charge = 35 var/stop = 0 var/list/available = list() @@ -66,7 +65,7 @@ else icon_state = "disco0" ..() - + /obj/machinery/disco/interact(mob/user) if (!anchored) @@ -74,7 +73,7 @@ return if(!allowed(user)) to_chat(user,"Error: Access Denied - Message: Only the engineering department can be trusted with this kind of power.") - playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) + playsound_local(src,'sound/misc/compiler-failure.ogg', 25, 1) return if(!Adjacent(user) && !isAI(user)) return @@ -121,11 +120,7 @@ lights_spin() updateUsrDialog() else if(active) - active = FALSE - STOP_PROCESSING(SSobj, src) - update_icon() - dance_over() - stop = world.time + 300 + stop = 0 updateUsrDialog() if("select") if(active) @@ -316,7 +311,7 @@ sleep(selection.song_beat) -/obj/machinery/disco/proc/dance(var/mob/living/carbon/M) //Show your moves +/obj/machinery/disco/proc/dance(var/mob/living/M) //Show your moves switch(rand(0,9)) if(0 to 1) @@ -328,55 +323,64 @@ if(7 to 9) dance5(M) -/obj/machinery/disco/proc/dance2(var/mob/living/carbon/M) - set waitfor = 0 +/obj/machinery/disco/proc/dance2(var/mob/living/M) for(var/i = 1, i < 10, i++) - M.SpinAnimation(15,1) - M.setDir(pick(GLOB.cardinal)) - sleep(8) + for(var/d in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) + M.setDir(d) + if(i == WEST) + M.emote("flip") + sleep(1) + sleep(20) -/obj/machinery/disco/proc/dance3(var/mob/living/carbon/M) +/obj/machinery/disco/proc/dance3(var/mob/living/M) var/matrix/initial_matrix = matrix(M.transform) - for(var/i in 1 to 6) + for (var/i in 1 to 75) if (!M) return - M.SpinAnimation(7,1) - M.setDir(pick(GLOB.cardinal)) - for (var/x in 1 to 12) - sleep(1) - if (!M) - return - if (i<5) + switch(i) + if (1 to 15) initial_matrix = matrix(M.transform) initial_matrix.Translate(0,1) animate(M, transform = initial_matrix, time = 1, loop = 0) - if (i>4) + if (16 to 30) initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-2) + initial_matrix.Translate(1,-1) animate(M, transform = initial_matrix, time = 1, loop = 0) - M.setDir(turn(M.dir, 90)) - switch (M.dir) - if (NORTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (SOUTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (EAST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (WEST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(-3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - sleep(10) - animate(M, transform = null, time = 1, loop = 0) + if (31 to 45) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-1,-1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (46 to 60) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-1,1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (61 to 75) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(1,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + M.setDir(turn(M.dir, 90)) + switch (M.dir) + if (NORTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (SOUTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (EAST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (WEST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + sleep (1) + M.lying_fix() -/obj/machinery/disco/proc/dance4(var/mob/living/carbon/M) +/obj/machinery/disco/proc/dance4(var/mob/living/M) var/speed = rand(1,3) set waitfor = 0 var/time = 30 @@ -387,8 +391,8 @@ M.lay_down(TRUE) time-- -/obj/machinery/disco/proc/dance5(var/mob/living/carbon/M) - INVOKE_ASYNC(M, .proc/dance5helper) +/obj/machinery/disco/proc/dance5(var/mob/living/M) + animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) var/matrix/initial_matrix = matrix(M.transform) for (var/i in 1 to 60) if (!M) @@ -420,59 +424,13 @@ initial_matrix.Translate(-3,0) animate(M, transform = initial_matrix, time = 1, loop = 0) sleep (1) - animate(M, transform = null, time = 1, loop = 0) + M.lying_fix() -/obj/machinery/disco/proc/dance5helper(var/mob/living/carbon/M) - if (M) - animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) - sleep (70) - if (M) - animate(M, transform = null, time = 1, loop = 0) -/mob/living/carbon/proc/dancey() // Dance5 except independent of the machine if admins want to meme it up - INVOKE_ASYNC(src, .proc/danceyhelper) - var/matrix/initial_matrix = matrix(transform) - for (var/i in 1 to 60) - if (!src) - return - if (i<31) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,1) - transform = initial_matrix - animate(src, transform, time = 1, loop = 0) - if (i>30) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,-1) - transform = initial_matrix - animate(src, transform, time = 1, loop = 0) - setDir(turn(src.dir, 90)) - switch (dir) - if (NORTH) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,3) - animate(src, transform, time = 1, loop = 0) - if (SOUTH) - initial_matrix = matrix(transform) - initial_matrix.Translate(0,-3) - animate(src, transform, time = 1, loop = 0) - if (EAST) - initial_matrix = matrix(transform) - initial_matrix.Translate(3,0) - animate(src, transform, time = 1, loop = 0) - if (WEST) - initial_matrix = matrix(transform) - initial_matrix.Translate(-3,0) - animate(src, transform, time = 1, loop = 0) - sleep (1) + +/mob/living/proc/lying_fix() animate(src, transform = null, time = 1, loop = 0) - -/mob/living/carbon/proc/danceyhelper() - if (src) - animate(src, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) - sleep (70) - if (src) - animate(src, transform = null, time = 1, loop = 0) - + lying_prev = 0 /obj/machinery/disco/proc/dance_over() for(var/obj/item/device/flashlight/spotlight/SL in spotlights) @@ -481,35 +439,34 @@ for(var/obj/effect/overlay/sparkles/SP in sparkles) qdel(SP) sparkles.Cut() - rangers.Cut() - for(var/mob/living/L in listeners) + for(var/mob/living/L in rangers) if(!L || !L.client) continue L.stop_sound_channel(CHANNEL_JUKEBOX) - listeners.Cut() + rangers = list() + /obj/machinery/disco/process() if(charge<35) charge += 1 if(world.time < stop && active) - rangers = list() - for(var/mob/living/M in range(9,src)) - rangers += M - if(!(listeners[M])) + for(var/mob/M in range(10,src)) + if(!(M in rangers)) + rangers[M] = TRUE M.playsound_local(get_turf(M), selection.song_path, 100, channel = CHANNEL_JUKEBOX) - listeners[M] = TRUE - if(prob(5+(allowed(M)*4))) + if(prob(5+(allowed(M)*4)) && M.canmove) dance(M) - for(var/mob/living/L in listeners) - if(!(L in rangers)) - listeners -= L + for(var/mob/L in rangers) + if(get_dist(src,L) > 10) + rangers -= L if(!L || !L.client) continue L.stop_sound_channel(CHANNEL_JUKEBOX) else if(active) + active = FALSE STOP_PROCESSING(SSobj, src) dance_over() playsound(src,'sound/machines/terminal_off.ogg',50,1) - active = FALSE icon_state = "disco0" + stop = world.time + 100 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 5d47f304f05..95db28f6eb0 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -409,7 +409,8 @@ . = ..() /obj/item/device/flashlight/spotlight //invisible lighting source - name = "disco lighting" + name = "disco light" + desc = "Groovy..." icon_state = null light_color = null brightness_on = 0 From 29b26c798f5fe8e638266d2d27a5515b3c05ed12 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 25 Apr 2017 16:18:08 -0400 Subject: [PATCH 42/97] Keeps SSnpc from sleeping --- code/modules/mob/living/simple_animal/simple_animal.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d87573edd3f..d2709e614c9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -127,9 +127,11 @@ stuttering = 0 /mob/living/simple_animal/proc/handle_automated_action() + set waitfor = FALSE return /mob/living/simple_animal/proc/handle_automated_movement() + set waitfor = FALSE if(!stop_automated_movement && wander) if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ @@ -142,6 +144,7 @@ return 1 /mob/living/simple_animal/proc/handle_automated_speech(var/override) + set waitfor = FALSE if(speak_chance) if(prob(speak_chance) || override) if(speak && speak.len) From 1c0403e586b9ae17edbc1faa3e2a506886331dad Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 25 Apr 2017 22:23:05 +0200 Subject: [PATCH 43/97] Fixes for Teleport verb --- code/game/area/areas.dm | 1 + code/game/area/areas/holodeck.dm | 1 + code/game/area/areas/ruins.dm | 1 + code/modules/mob/dead/observer/observer.dm | 10 +++++++--- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f3e2de241ff..137229db37f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -42,6 +42,7 @@ var/has_gravity = 0 var/noteleport = 0 //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter) + var/hidden = FALSE //Hides area from player Teleport function. var/safe = 0 //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers var/no_air = null diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 21999a74a15..c4b4e02f7ba 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -3,6 +3,7 @@ icon_state = "Holodeck" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED flags = 0 + hidden = TRUE var/obj/machinery/computer/holodeck/linked var/restricted = 0 // if true, program goes on emag list diff --git a/code/game/area/areas/ruins.dm b/code/game/area/areas/ruins.dm index d697c8436f7..828d165dd86 100644 --- a/code/game/area/areas/ruins.dm +++ b/code/game/area/areas/ruins.dm @@ -4,6 +4,7 @@ name = "\improper Unexplored Location" icon_state = "away" has_gravity = 1 + hidden = TRUE /area/ruin/unpowered diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4175f75744f..391c836bd38 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -355,9 +355,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!isobserver(usr)) to_chat(usr, "Not when you're not dead!") return - var/A - A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas - var/area/thearea = A + var/list/filtered = list() + for(var/V in GLOB.sortedAreas) + var/area/A = V + if(!A.hidden) + filtered += A + var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered + if(!thearea) return From ee52334ca4cad25d2478a6b43e3ea23f08e155f1 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 25 Apr 2017 16:36:12 -0400 Subject: [PATCH 44/97] Makes the GLOB stat_entry more indicative that you can edit it --- code/controllers/globals.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index b25d51bc9be..e0f114778c7 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -16,13 +16,14 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) gvars_datum_in_built_vars = exclude_these.vars + list("gvars_datum_protected_varlist", "gvars_datum_in_built_vars", "gvars_datum_init_order") qdel(exclude_these) + log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") + Initialize() /datum/controller/global_vars/Destroy(force) + stack_trace("Some fucker qdel'd the global holder!") if(!force) return QDEL_HINT_LETMELIVE - - stack_trace("Some fucker deleted the global holder!") QDEL_NULL(statclick) gvars_datum_protected_varlist.Cut() @@ -36,10 +37,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) if(!statclick) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - var/static/num_globals - if(!num_globals) - num_globals = vars.len - gvars_datum_in_built_vars.len - stat("Globals:", statclick.update("Count: [num_globals]")) + stat("Globals:", statclick.update("Edit")) /datum/controller/global_vars/can_vv_get(var_name) if(var_name in gvars_datum_protected_varlist) From b7768c3b95b7d7d1c48e56eef8d121d95e82134d Mon Sep 17 00:00:00 2001 From: coiax Date: Tue, 25 Apr 2017 21:44:52 +0100 Subject: [PATCH 45/97] Fixes monkey transformation instantly killing a person (#26584) :cl: coiax fix: You no longer die when turning into a monkey. /:cl: --- code/modules/surgery/organs/organ_internal.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index f8deed5b289..d90e1448634 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -78,7 +78,9 @@ /obj/item/organ/Destroy() if(owner) - Remove(owner) + // The special flag is important, because otherwise mobs can die + // while undergoing transformation into different mobs. + Remove(owner, special=TRUE) return ..() /obj/item/organ/attack(mob/living/carbon/M, mob/user) From a881b84210885611ae922314d1af5b803ce3e25b Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 25 Apr 2017 13:44:54 -0700 Subject: [PATCH 46/97] Automatic changelog generation for PR #26584 [ci skip] --- html/changelogs/AutoChangeLog-pr-26584.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26584.yml diff --git a/html/changelogs/AutoChangeLog-pr-26584.yml b/html/changelogs/AutoChangeLog-pr-26584.yml new file mode 100644 index 00000000000..c65852889b3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26584.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - bugfix: "You no longer die when turning into a monkey." From e7fd32d49a41f1a09ac629ef138c7a6ed0dd1291 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 25 Apr 2017 14:43:30 -0700 Subject: [PATCH 47/97] Fixes windows going invisible Fixes #26576 --- code/game/objects/structures/window.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0b2563a7b0f..d5027a0c754 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -18,7 +18,7 @@ var/fulltile = 0 var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 - var/static/mutable_appearance/crack_overlay = mutable_appearance('icons/obj/structures.dmi') + var/mutable_appearance/crack_overlay var/list/debris = list() can_be_unanchored = 1 resistance_flags = ACID_PROOF @@ -377,10 +377,10 @@ if(smooth) queue_smooth(src) - cut_overlays() + cut_overlay(crack_overlay) if(ratio > 75) return - crack_overlay.icon_state = "damage[ratio]" + crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) add_overlay(crack_overlay) /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) From 03f5b5885434949f442d558df3eb1db251ff6602 Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Tue, 25 Apr 2017 23:47:11 +0100 Subject: [PATCH 48/97] Anomalous crystal examine and code cleanup :cl: coiax add: Anomalous crystals can be examined by ghosts to determine their function and activation method. del: Lightbringers can understand Slime and Galactic Common, and can only speak Slime, as before. add: The helper anomalous crystal is in the orbit list after it has been activated. /:cl: - Makes anomalous crystal use Initialize - Replaces the "random" type with a lootdrop spawner. - The language change to Lightbringers was an accidental change, they originally only spoke Slime, but I figure they can understand Common too, as well, why not. --- .../hostile/megafauna/colossus.dm | 134 ++++++++++++------ 1 file changed, 91 insertions(+), 43 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index edcc2eedb71..d822a058864 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -46,7 +46,7 @@ Difficulty: Very Hard del_on_death = 1 medal_type = MEDAL_PREFIX score_type = COLOSSUS_SCORE - loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/vocal_cords/colossus) + loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) deathmessage = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' @@ -360,9 +360,20 @@ Difficulty: Very Hard ///Anomolous Crystal/// +#define ACTIVATE_TOUCH "touch" +#define ACTIVATE_SPEECH "speech" +#define ACTIVATE_HEAT "heat" +#define ACTIVATE_BULLET "bullet" +#define ACTIVATE_ENERGY "energy" +#define ACTIVATE_BOMB "bomb" +#define ACTIVATE_MOB_BUMP "bumping" +#define ACTIVATE_WEAPON "weapon" +#define ACTIVATE_MAGIC "magic" + /obj/machinery/anomalous_crystal name = "anomalous crystal" desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread." + var/observer_desc = "Anomalous crystals have descriptions that only observers can see. But this one hasn't been changed from the default." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "anomaly_crystal" light_range = 8 @@ -370,66 +381,78 @@ Difficulty: Very Hard use_power = 0 density = 1 flags = HEAR - var/activation_method = "touch" + var/activation_method + var/list/possible_methods = list(ACTIVATE_TOUCH, ACTIVATE_SPEECH, ACTIVATE_HEAT, ACTIVATE_BULLET, ACTIVATE_ENERGY, ACTIVATE_BOMB, ACTIVATE_MOB_BUMP, ACTIVATE_WEAPON, ACTIVATE_MAGIC) + var/activation_damage_type = null var/last_use_timer = 0 var/cooldown_add = 30 var/list/affected_targets = list() var/activation_sound = 'sound/effects/break_stone.ogg' -/obj/machinery/anomalous_crystal/New() - activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","heat","weapon","speech") - ..() +/obj/machinery/anomalous_crystal/Initialize(mapload) + . = ..() + if(!activation_method) + activation_method = pick(possible_methods) + +/obj/machinery/anomalous_crystal/examine(mob/user) + . = ..() + if(isobserver(user)) + to_chat(user, observer_desc) + to_chat(user, "It is activated by [activation_method].") /obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) ..() if(isliving(speaker)) - ActivationReaction(speaker,"speech") + ActivationReaction(speaker, ACTIVATE_SPEECH) /obj/machinery/anomalous_crystal/attack_hand(mob/user) ..() - ActivationReaction(user,"touch") + ActivationReaction(user, ACTIVATE_TOUCH) /obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params) if(I.is_hot()) - ActivationReaction(user,"heat") + ActivationReaction(user, ACTIVATE_HEAT) else - ActivationReaction(user,"weapon") + ActivationReaction(user, ACTIVATE_WEAPON) ..() /obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone) ..() if(istype(P, /obj/item/projectile/magic)) - ActivationReaction(P.firer, "magic", P.damage_type) + ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type) return ActivationReaction(P.firer, P.flag, P.damage_type) /obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype) if(world.time < last_use_timer) - return 0 + return FALSE if(activation_damage_type && activation_damage_type != damtype) - return 0 + return FALSE if(method != activation_method) - return 0 + return FALSE last_use_timer = (world.time + cooldown_add) playsound(user, activation_sound, 100, 1) - return 1 + return TRUE /obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj) ..() if(ismob(AM)) - ActivationReaction(AM,"mob_bump") + ActivationReaction(AM, ACTIVATE_MOB_BUMP) /obj/machinery/anomalous_crystal/ex_act() - ActivationReaction(null,"bomb") + ActivationReaction(null, ACTIVATE_BOMB) -/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot - var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random - /obj/machinery/anomalous_crystal) - new random_crystal(loc) - qdel(src) +/obj/effect/spawner/lootdrop/anomalous_crystal + name = "anomalous crystal spawner" + +/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize() + loot = subtypesof(/obj/machinery/anomalous_crystal) + . = ..() /obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing - activation_method = "mob_bump" + observer_desc = "This crystal strips and equips its targets as clowns." + possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) activation_sound = 'sound/items/bikehorn.ogg' /obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user) @@ -442,12 +465,9 @@ Difficulty: Very Hard qdel(C) affected_targets.Add(H) -/obj/machinery/anomalous_crystal/honk/New() - ..() - activation_method = pick("mob_bump","speech") - /obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one - activation_method = "touch" + observer_desc = "This crystal warps the area around it to a theme." + activation_method = ACTIVATE_TOUCH cooldown_add = 200 var/terrain_theme = "winter" var/NewTerrainFloors @@ -457,9 +477,11 @@ Difficulty: Very Hard var/list/NewFlora = list() var/florachance = 8 -/obj/machinery/anomalous_crystal/theme_warp/New() - ..() +/obj/machinery/anomalous_crystal/theme_warp/Initialize() + . = ..() terrain_theme = pick("lavaland","winter","jungle","ayy lmao") + observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"." + switch(terrain_theme) if("lavaland")//Depressurizes the place... and free cult metal, I guess. NewTerrainFloors = /turf/open/floor/grass/snow/basalt @@ -518,15 +540,19 @@ Difficulty: Very Hard affected_targets += A /obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with - activation_method = "touch" + observer_desc = "This crystal generates a projectile when activated." + activation_method = ACTIVATE_TOUCH cooldown_add = 50 - var/generated_projectile = /obj/item/projectile/beam/emitter + var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter -/obj/machinery/anomalous_crystal/emitter/New() - ..() +/obj/machinery/anomalous_crystal/emitter/Initialize() + . = ..() generated_projectile = pick(/obj/item/projectile/magic/aoe/fireball/infernal,/obj/item/projectile/magic/aoe/lightning,/obj/item/projectile/magic/spellblade, /obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus) + var/proj_name = initial(generated_projectile.name) + observer_desc = "This crystal generates \a [proj_name] when activated." + /obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method) if(..()) var/obj/item/projectile/P = new generated_projectile(get_turf(src)) @@ -547,7 +573,8 @@ Difficulty: Very Hard P.fire() /obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down. - activation_method = "touch" + observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again." + activation_method = ACTIVATE_TOUCH activation_sound = 'sound/hallucinations/growl1.ogg' /obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method) @@ -565,13 +592,20 @@ Difficulty: Very Hard H.grab_ghost(force = TRUE) /obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans - activation_method = "touch" - var/ready_to_deploy = 0 + observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people." + activation_method = ACTIVATE_TOUCH + activation_sound = 'sound/effects/ghost2.ogg' + var/ready_to_deploy = FALSE + +/obj/machinery/anomalous_crystal/helpers/Destroy() + GLOB.poi_list -= src + . = ..() /obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method) if(..() && !ready_to_deploy) - ready_to_deploy = 1 - notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) + GLOB.poi_list |= src + ready_to_deploy = TRUE + notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK) /obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user) ..() @@ -613,10 +647,12 @@ Difficulty: Very Hard verb_ask = "floats inquisitively" verb_exclaim = "zaps" verb_yell = "bangs" + initial_languages = list(/datum/language/common, /datum/language/slime) + only_speaks_language = /datum/language/slime damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) light_range = 4 faction = list("neutral") - del_on_death = 1 + del_on_death = TRUE unsuitable_atmos_damage = 0 movement_type = FLYING minbodytemp = 0 @@ -638,7 +674,7 @@ Difficulty: Very Hard . = ..() if(isliving(target) && target != src) var/mob/living/L = target - if(L.stat < DEAD) + if(L.stat != DEAD) L.heal_overall_damage(heal_power, heal_power) new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF") @@ -649,13 +685,14 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it. - activation_method = "touch" + observer_desc = "This crystal \"refreshes\" items that it affects, rendering them as new." + activation_method = ACTIVATE_TOUCH cooldown_add = 50 activation_sound = 'sound/magic/TIMEPARADOX2.ogg' var/list/banned_items_typecache = list(/obj/item/weapon/storage, /obj/item/weapon/implant, /obj/item/weapon/implanter, /obj/item/weapon/disk/nuclear, /obj/item/projectile, /obj/item/weapon/spellbook) -/obj/machinery/anomalous_crystal/refresher/New() - ..() +/obj/machinery/anomalous_crystal/refresher/Initialize() + . = ..() banned_items_typecache = typecacheof(banned_items_typecache) @@ -675,7 +712,8 @@ Difficulty: Very Hard qdel(CHOSEN) /obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU. - activation_method = "touch" + observer_desc = "When activated, this crystal allows you to take over small animals, and then exit them at the possessors leisure. Exiting the animal kills it, and if you die while possessing the animal, you die as well." + activation_method = ACTIVATE_TOUCH /obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method) if(..()) @@ -770,4 +808,14 @@ Difficulty: Very Hard target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) +#undef ACTIVATE_TOUCH +#undef ACTIVATE_SPEECH +#undef ACTIVATE_HEAT +#undef ACTIVATE_BULLET +#undef ACTIVATE_ENERGY +#undef ACTIVATE_BOMB +#undef ACTIVATE_MOB_BUMP +#undef ACTIVATE_WEAPON +#undef ACTIVATE_MAGIC + #undef MEDAL_PREFIX From 034d22933ebba2abdcd442f409064ba1882a63a9 Mon Sep 17 00:00:00 2001 From: sybil Date: Tue, 25 Apr 2017 23:15:10 +0000 Subject: [PATCH 49/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 1 + html/changelogs/.all_changelog.yml | 1 + html/changelogs/AutoChangeLog-pr-26584.yml | 4 ---- 3 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26584.yml diff --git a/html/changelog.html b/html/changelog.html index ab2ad3f3dd8..934f0330523 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -99,6 +99,7 @@
  • Swarmers now only speak their own language, rather than swarmer and common.
  • When you are crushed by a door, it prints a visible message, instead of, in some cases, silently damaging you.
  • The vent in the Escape Coridoor on Omega Station has been fixed.
  • +
  • You no longer die when turning into a monkey.

coiax, WJohnston updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 7ccc1c56aaf..3d8e23c95cf 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10680,6 +10680,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: When you are crushed by a door, it prints a visible message, instead of, in some cases, silently damaging you. - bugfix: The vent in the Escape Coridoor on Omega Station has been fixed. + - bugfix: You no longer die when turning into a monkey. coiax, WJohnston: - rscadd: Plasmamen lungs, also known as "plasma filters" now look different from human lungs. diff --git a/html/changelogs/AutoChangeLog-pr-26584.yml b/html/changelogs/AutoChangeLog-pr-26584.yml deleted file mode 100644 index c65852889b3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26584.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "You no longer die when turning into a monkey." From a0d3f5ec7a31a6b89ab30490bc3826eec5acc902 Mon Sep 17 00:00:00 2001 From: sybil Date: Wed, 26 Apr 2017 00:04:54 +0000 Subject: [PATCH 50/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 934f0330523..8f4b0e20472 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1247,37 +1247,6 @@
    • Nanotrasen reminds its employees that they have ALWAYS been able to taste. Anyone claiming that they've recently only just gained the ability to taste are probably Syndicate agents.
    - -

    22 February 2017

    -

    AnonymousNow updated:

    -
      -
    • Added Medical HUD Sunglasses. Not currently available on-station, unless you can convince Centcom to send you a pair.
    • -
    -

    Cyberboss updated:

    -
      -
    • Spawning to the station should now be a less hitchy experience
    • -
    -

    MrPerson updated:

    -
      -
    • Ion storms have several new additions:
    • -
    • 25% chance to flatly replace the AI's core lawset with something random in the config. Suddenly the AI is Corporate, deal w/ it.
    • -
    • 10% chance to delete one of the AI's core or supplied laws. Hope you treated the AI well without its precious law 1 to protect your sorry ass.
    • -
    • 10% chance that, instead of adding a random law, it will instead replace one of the AI's existing core or supplied laws with the ion law. Otherwise, it adds the generated law as normal. There's still a 100% chance of getting a generated ion law.
    • -
    • 10% chance afterwards to shuffle all the AI's laws.
    • -
    -

    TalkingCactus updated:

    -
      -
    • New characters will now have their backpack preference correctly set to "Department Backpack".
    • -
    -

    Tofa01 updated:

    -
      -
    • [Delta] Fixes missing R&D shutter near public autolathe
    • -
    -

    Xhuis updated:

    -
      -
    • Highlanders can no longer hide behind chairs and plants.
    • -
    • Highlanders no longer bleed and are no longer slowed down by damage.
    • -
    GoonStation 13 Development Team From 990176d5040bf77abc1b1dbf109101a762be0846 Mon Sep 17 00:00:00 2001 From: Ian Turk Date: Tue, 25 Apr 2017 18:25:10 -0600 Subject: [PATCH 51/97] Fixed nulls in the active_alternate_appearances list Added checks for nulls in the active_alternate_appearances list --- code/datums/hud.dm | 2 +- code/game/alternate_appearance.dm | 11 +++++------ code/modules/mob/mob.dm | 2 ++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index d1cbb90c27a..f9444898ceb 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(huds, list( gang_huds += G.ganghud for(var/datum/atom_hud/hud in (GLOB.huds|gang_huds|GLOB.active_alternate_appearances)) - if(hud.hudusers[src]) + if(hud && hud.hudusers[src]) hud.add_hud_to(src) /mob/dead/new_player/reload_huds() diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index ac23d61e7fa..2768c793db8 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -29,12 +29,11 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) appearance_key = key /datum/atom_hud/alternate_appearance/Destroy() - if(!QDELETED(src)) - for(var/v in hudusers) - remove_hud_from(v) - for(var/v in hudatoms) - remove_from_hud(v) - GLOB.active_alternate_appearances -= src + for(var/v in hudusers) + remove_hud_from(v) + for(var/v in hudatoms) + remove_from_hud(v) + GLOB.active_alternate_appearances -= src return ..() /datum/atom_hud/alternate_appearance/proc/onNewMob(mob/M) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 023c1047178..95d3abfa288 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -29,6 +29,8 @@ prepare_huds() can_ride_typecache = typecacheof(can_ride_typecache) for(var/v in GLOB.active_alternate_appearances) + if(!v) + continue var/datum/atom_hud/alternate_appearance/AA = v AA.onNewMob(src) ..() From abf14732462d506a1f1a0514bcb246cb84cb63bd Mon Sep 17 00:00:00 2001 From: Robustin Date: Wed, 26 Apr 2017 00:12:48 -0400 Subject: [PATCH 52/97] The blood loss change everyone's been raving about (#26539) * Sanity to Bleeding * Bigger blood loss margin --- code/__DEFINES/mobs.dm | 2 +- code/modules/mob/living/blood.dm | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index fb11e17b9d0..a3570d840d9 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -10,7 +10,7 @@ #define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_SLIME_SPLIT 1120 #define BLOOD_VOLUME_NORMAL 560 -#define BLOOD_VOLUME_SAFE 501 +#define BLOOD_VOLUME_SAFE 475 #define BLOOD_VOLUME_OKAY 336 #define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_SURVIVE 122 diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index c83ebe90d34..ca380170f73 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -65,12 +65,8 @@ listclearnulls(BP.embedded_objects) temp_bleed += 0.5*BP.embedded_objects.len - if(brutedamage > 30) - temp_bleed += 0.5 - if(brutedamage > 50) - temp_bleed += 1 - if(brutedamage > 70) - temp_bleed += 2 + if(brutedamage >= 20) + temp_bleed += (brutedamage * 0.013) bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases From 93de9a516840303f25031fc1c3e4fccf00e26e95 Mon Sep 17 00:00:00 2001 From: coiax Date: Wed, 26 Apr 2017 05:13:07 +0100 Subject: [PATCH 53/97] Rod Form now costs 3 points (#26537) :cl: coiax balance: The wizard spell Rod Form now costs 3 points, up from 2. /:cl: It's a one hit KO spell that also provides escape, mobility, on a really short cooldown. Pretty much always picked up by any offensive mage. Cost should be pushed up at the least. --- code/game/gamemodes/wizard/spellbook.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index fbd9130594c..8c40d178bc1 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -109,6 +109,7 @@ /datum/spellbook_entry/rod_form name = "Rod Form" spell_type = /obj/effect/proc_holder/spell/targeted/rod_form + cost = 3 /datum/spellbook_entry/magicm name = "Magic Missile" From 4b0762ffc071f77e76c52ed102c75fadf1d359ca Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 25 Apr 2017 21:13:08 -0700 Subject: [PATCH 54/97] Automatic changelog generation for PR #26537 [ci skip] --- html/changelogs/AutoChangeLog-pr-26537.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26537.yml diff --git a/html/changelogs/AutoChangeLog-pr-26537.yml b/html/changelogs/AutoChangeLog-pr-26537.yml new file mode 100644 index 00000000000..4921f4998d9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26537.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - balance: "The wizard spell Rod Form now costs 3 points, up from 2." From 6a31978b5ebb863cd27e78c97f04f9df965b1fdc Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Wed, 26 Apr 2017 00:28:14 -0400 Subject: [PATCH 55/97] Drake swooping is smoother and more dangerous (#26543) * Drake swooping is smoother and more dangerous * tweaky tweak. * don't behave like it * slow it down * swoop at it --- code/game/objects/effects/overlays.dm | 3 +- .../hostile/megafauna/bubblegum.dm | 5 +- .../simple_animal/hostile/megafauna/dragon.dm | 287 ++++++++++++------ icons/mob/lavaland/dragon.dmi | Bin 41255 -> 42396 bytes 4 files changed, 203 insertions(+), 92 deletions(-) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 3d62e850e84..bc9251d9fc6 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -35,7 +35,6 @@ ..() if(randomdir) setDir(pick(GLOB.cardinal)) - flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation. timerid = QDEL_IN(src, duration) @@ -214,7 +213,7 @@ icon = 'icons/effects/fire.dmi' icon_state = "3" duration = 20 - + /obj/effect/overlay/temp/cult randomdir = 0 duration = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 2e64ee526e7..fa61a16e517 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -150,7 +150,7 @@ Difficulty: Hard var/turf/T = get_turf(target) if(!T || T == loc) return - new /obj/effect/overlay/temp/dragon_swoop(T) + new /obj/effect/overlay/temp/dragon_swoop/bubblegum(T) charging = TRUE DestroySurroundings() walk(src, 0) @@ -276,6 +276,9 @@ Difficulty: Hard addtimer(CALLBACK(src, .proc/devour, L), 2) sleep(1) +/obj/effect/overlay/temp/dragon_swoop/bubblegum + duration = 10 + /obj/effect/overlay/temp/bubblegum_hands icon = 'icons/effects/bubblegum.dmi' duration = 9 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index c56e963aefc..3425d08e239 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -1,4 +1,10 @@ #define MEDAL_PREFIX "Drake" + +#define DRAKE_SWOOP_HEIGHT 270 //how high up drakes go, in pixels +#define DRAKE_SWOOP_DIRECTION_CHANGE_RANGE 5 //the range our x has to be within to not change the direction we slam from + +#define SWOOP_DAMAGEABLE 1 +#define SWOOP_INVULNERABLE 2 /* ASH DRAKE @@ -9,8 +15,9 @@ It acts as a melee creature, chasing down and attacking its target while also us Whenever possible, the drake will breathe fire in the four cardinal directions, igniting and heavily damaging anything caught in the blast. It also often causes fire to rain from the sky - many nearby turfs will flash red as a fireball crashes into them, dealing damage to anything on the turfs. -The drake also utilizes its wings to fly into the sky and crash down onto a specified point. Anything on this point takes tremendous damage. +The drake also utilizes its wings to fly into the sky, flying after its target and attempting to slam down on them. Anything near when it slams down takes huge damage. - Sometimes it will chain these swooping attacks over and over, making swiftness a necessity. + - Sometimes, it will spew fire while flying at its target. When an ash drake dies, it leaves behind a chest that can contain four things: 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power @@ -46,7 +53,7 @@ Difficulty: Medium pixel_x = -16 loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) - var/swooping = 0 + var/swooping = NONE var/swoop_cooldown = 0 medal_type = MEDAL_PREFIX score_type = DRAKE_SCORE @@ -63,10 +70,15 @@ Difficulty: Medium ..() /mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(!forced && swooping) + if(!forced && (swooping & SWOOP_INVULNERABLE)) return FALSE return ..() +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message() + if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit + return + return ..() + /mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget() if(!swooping) return ..() @@ -86,62 +98,15 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0) return 1 -/obj/effect/overlay/temp/fireball - icon = 'icons/obj/wizard.dmi' - icon_state = "fireball" - name = "fireball" - desc = "Get out of the way!" - layer = FLY_LAYER - randomdir = 0 - duration = 12 - pixel_z = 500 - -/obj/effect/overlay/temp/fireball/Initialize(loc) - . = ..() - animate(src, pixel_z = 0, time = 12) - -/obj/effect/overlay/temp/target - icon = 'icons/mob/actions.dmi' - icon_state = "sniper_zoom" - layer = BELOW_MOB_LAYER - light_range = 2 - duration = 12 - -/obj/effect/overlay/temp/dragon_swoop - name = "certain death" - desc = "Don't just stand there, move!" - icon = 'icons/effects/96x96.dmi' - icon_state = "landing" - layer = BELOW_MOB_LAYER - pixel_x = -32 - pixel_y = -32 - color = "#FF0000" - duration = 10 - -/obj/effect/overlay/temp/target/ex_act() - return - -/obj/effect/overlay/temp/target/Initialize(loc) - . = ..() - INVOKE_ASYNC(src, .proc/fall) - -/obj/effect/overlay/temp/target/proc/fall() - var/turf/T = get_turf(src) - playsound(T,'sound/magic/Fireball.ogg', 200, 1) - new /obj/effect/overlay/temp/fireball(T) - sleep(12) - explosion(T, 0, 0, 1, 0, 0, 0, 1) - /mob/living/simple_animal/hostile/megafauna/dragon/OpenFire() + if(swooping) + return anger_modifier = Clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + ranged_cooldown_time - if(swooping) - fire_rain() - return if(prob(15 + anger_modifier) && !client) if(health < maxHealth/2) - INVOKE_ASYNC(src, .proc/swoop_attack, 1) + INVOKE_ASYNC(src, .proc/swoop_attack, TRUE, null, 50) else fire_rain() @@ -154,9 +119,11 @@ Difficulty: Medium fire_walls() /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_rain() - visible_message("Fire rains from the sky!") - for(var/turf/turf in range(12,get_turf(src))) - if(prob(10)) + if(!target) + return + target.visible_message("Fire rains from the sky!") + for(var/turf/turf in range(9,get_turf(target))) + if(prob(11)) new /obj/effect/overlay/temp/target(turf) /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls() @@ -177,6 +144,8 @@ Difficulty: Medium new /obj/effect/hotspot(J) J.hotspot_expose(700,50,1) for(var/mob/living/L in J.contents - hit_things) + if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) + continue L.adjustFireLoss(20) to_chat(L, "You're hit by the drake's fire breath!") hit_things += L @@ -184,43 +153,86 @@ Difficulty: Medium sleep(1) /mob/living/simple_animal/hostile/megafauna/dragon/proc/triple_swoop() - swoop_attack() - swoop_attack() - swoop_attack() + swoop_attack(swoop_duration = 30) + swoop_attack(swoop_duration = 30) + swoop_attack(swoop_duration = 30) -/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target) +/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain, atom/movable/manual_target, swoop_duration = 40) if(stat || swooping) return - swoop_cooldown = world.time + 200 - var/atom/swoop_target if(manual_target) - swoop_target = manual_target - else - swoop_target = target + target = manual_target + if(!target) + return + swoop_cooldown = world.time + 200 stop_automated_movement = TRUE - swooping = 1 - density = 0 - icon_state = "swoop" + swooping |= SWOOP_DAMAGEABLE + density = FALSE + icon_state = "shadow" visible_message("[src] swoops up high!") - if(prob(50)) - animate(src, pixel_x = 500, pixel_z = 500, time = 10) + + var/negative + var/initial_x = x + if(target.x < initial_x) //if the target's x is lower than ours, swoop to the left + negative = TRUE + else if(target.x > initial_x) + negative = FALSE + else if(target.x == initial_x) //if their x is the same, pick a direction + negative = prob(50) + var/obj/effect/overlay/temp/dragon_flight/F = new /obj/effect/overlay/temp/dragon_flight(loc, negative) + + negative = !negative //invert it for the swoop down later + + var/oldtransform = transform + animate(src, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING) + for(var/i in 1 to 3) + sleep(1) + if(QDELETED(src)) //we got hit and died, rip us + qdel(F) + return + animate(src, transform = matrix()*0.7, time = 7) + swooping |= SWOOP_INVULNERABLE + sleep(7) + var/list/flame_hit = list() + while(swoop_duration > 0) + if(!target && !FindTarget()) + break //we lost our target while chasing it down and couldn't get a new one + if(swoop_duration < 7) + fire_rain = FALSE //stop raining fire near the end of the swoop + if(loc == get_turf(target)) + if(!fire_rain) + break //we're not spewing fire at our target, slam they + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + break //target is dead and we're on em, slam they + if(fire_rain) + new /obj/effect/overlay/temp/target(loc, flame_hit) + forceMove(get_step(src, get_dir(src, target))) + if(loc == get_turf(target)) + if(!fire_rain) + break + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + break + var/swoop_speed = 1.5 + swoop_duration -= swoop_speed + sleep(swoop_speed) + + //ensure swoop direction continuity. + if(negative) + if(IsInRange(x, initial_x + 1, initial_x + DRAKE_SWOOP_DIRECTION_CHANGE_RANGE)) + negative = FALSE else - animate(src, pixel_x = -500, pixel_z = 500, time = 10) - sleep(30) - - var/turf/tturf - if(fire_rain) - fire_rain() - + if(IsInRange(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1)) + negative = TRUE + new /obj/effect/overlay/temp/dragon_flight/end(loc, negative) + new /obj/effect/overlay/temp/dragon_swoop(loc) + animate(src, transform = oldtransform, time = 5) + sleep(5) + swooping &= ~SWOOP_INVULNERABLE icon_state = "dragon" - if(swoop_target && !QDELETED(swoop_target) && swoop_target.z == src.z) - tturf = get_turf(swoop_target) - else - tturf = get_turf(src) - forceMove(tturf) - new /obj/effect/overlay/temp/dragon_swoop(tturf) - animate(src, pixel_x = initial(pixel_x), pixel_z = 0, time = 10) - sleep(10) playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1) for(var/mob/living/L in orange(1, src)) if(L.stat) @@ -239,9 +251,9 @@ Difficulty: Medium for(var/mob/M in range(7, src)) shake_camera(M, 15, 1) - stop_automated_movement = FALSE - swooping = 0 - density = 1 + density = TRUE + sleep(1) + swooping &= ~SWOOP_DAMAGEABLE /mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A) if(!istype(A)) @@ -249,7 +261,7 @@ Difficulty: Medium if(swoop_cooldown >= world.time) to_chat(src, "You need to wait 20 seconds between swoop attacks!") return - swoop_attack(1, A) + swoop_attack(TRUE, A, 25) /obj/item/device/gps/internal/dragon icon_state = null @@ -257,6 +269,103 @@ Difficulty: Medium desc = "Here there be dragons." invisibility = 100 + +/obj/effect/overlay/temp/fireball + icon = 'icons/obj/wizard.dmi' + icon_state = "fireball" + name = "fireball" + desc = "Get out of the way!" + layer = FLY_LAYER + randomdir = FALSE + duration = 9 + pixel_z = DRAKE_SWOOP_HEIGHT + +/obj/effect/overlay/temp/fireball/Initialize() + . = ..() + animate(src, pixel_z = 0, time = duration) + +/obj/effect/overlay/temp/target + icon = 'icons/mob/actions.dmi' + icon_state = "sniper_zoom" + layer = BELOW_MOB_LAYER + light_range = 2 + duration = 9 + +/obj/effect/overlay/temp/target/ex_act() + return + +/obj/effect/overlay/temp/target/Initialize(mapload, list/flame_hit) + . = ..() + INVOKE_ASYNC(src, .proc/fall, flame_hit) + +/obj/effect/overlay/temp/target/proc/fall(list/flame_hit) + var/turf/T = get_turf(src) + playsound(T,'sound/magic/Fireball.ogg', 80, 1) + new /obj/effect/overlay/temp/fireball(T) + sleep(duration) + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.gets_drilled() + playsound(T, "explosion", 80, 1) + new /obj/effect/hotspot(T) + T.hotspot_expose(700, 50, 1) + for(var/mob/living/L in T.contents) + if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) + continue + if(!islist(flame_hit) || !flame_hit[L]) + L.adjustFireLoss(40) + to_chat(L, "You're hit by the drake's fire breath!") + flame_hit[L] = TRUE + else + L.adjustFireLoss(10) //if we've already hit them, do way less damage + +/obj/effect/overlay/temp/dragon_swoop + name = "certain death" + desc = "Don't just stand there, move!" + icon = 'icons/effects/96x96.dmi' + icon_state = "landing" + layer = BELOW_MOB_LAYER + pixel_x = -32 + pixel_y = -32 + color = "#FF0000" + duration = 5 + +/obj/effect/overlay/temp/dragon_flight + icon = 'icons/mob/lavaland/dragon.dmi' + icon_state = "dragon" + layer = ABOVE_ALL_MOB_LAYER + pixel_x = -16 + duration = 10 + randomdir = FALSE + +/obj/effect/overlay/temp/dragon_flight/Initialize(mapload, negative) + . = ..() + INVOKE_ASYNC(src, .proc/flight, negative) + +/obj/effect/overlay/temp/dragon_flight/proc/flight(negative) + if(negative) + animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + else + animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + sleep(3) + icon_state = "swoop" + if(negative) + animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7) + else + animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7) + +/obj/effect/overlay/temp/dragon_flight/end + pixel_x = DRAKE_SWOOP_HEIGHT + pixel_z = DRAKE_SWOOP_HEIGHT + duration = 5 + +/obj/effect/overlay/temp/dragon_flight/end/flight(negative) + if(negative) + pixel_x = -DRAKE_SWOOP_HEIGHT + animate(src, pixel_x = -16, pixel_z = 0, time = 5) + else + animate(src, pixel_x = -16, pixel_z = 0, time = 5) + /mob/living/simple_animal/hostile/megafauna/dragon/lesser name = "lesser ash drake" maxHealth = 200 diff --git a/icons/mob/lavaland/dragon.dmi b/icons/mob/lavaland/dragon.dmi index 7e44b775de8c48a8d25788af45339c727c221b6f..911d7288d122f08e721231810d02b48fc91f4777 100644 GIT binary patch delta 13511 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 delta 12361 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 Date: Tue, 25 Apr 2017 21:28:15 -0700 Subject: [PATCH 56/97] Automatic changelog generation for PR #26543 [ci skip] --- html/changelogs/AutoChangeLog-pr-26543.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26543.yml diff --git a/html/changelogs/AutoChangeLog-pr-26543.yml b/html/changelogs/AutoChangeLog-pr-26543.yml new file mode 100644 index 00000000000..7e683c1014a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26543.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - tweak: "Ash Drake swoops no longer teleport the Ash Drake to your position." + - balance: "Some other tweaks to Ash Drake attacks and patterns; discover these yourself!" From c6fb750d11f5d74e094110ffbda9826913fe0f24 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 00:32:13 -0400 Subject: [PATCH 57/97] Removes an unused var (#26579) --- code/game/objects/items/weapons/cards_ids.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 635f673e69a..e55d34bc3b4 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -83,7 +83,6 @@ var/list/access = list() var/registered_name = null // The name registered_name on the card var/assignment = null - var/dorm = 0 // determines if this ID has claimed a dorm already /obj/item/weapon/card/id/attack_self(mob/user) user.visible_message("[user] shows you: \icon[src] [src.name].", \ From 1d5b0c700a84dbce9221f680e65192d08ea5d7ee Mon Sep 17 00:00:00 2001 From: flashdim Date: Wed, 26 Apr 2017 00:33:02 -0400 Subject: [PATCH 58/97] fix: Omega Station had two APCs not wired properly. (#26526) (#26549) --- _maps/map_files/OmegaStation/OmegaStation.dmm | 68 +++++++++++-------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 1d6e417a5d1..d841a0f335f 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -25684,6 +25684,10 @@ tag = "icon-4-8"; icon_state = "4-8" }, +/obj/structure/cable/white{ + tag = "icon-0-8"; + icon_state = "0-8" + }, /turf/open/floor/plasteel/green/corner{ tag = "icon-greencorner (NORTH)"; icon_state = "greencorner"; @@ -35403,6 +35407,10 @@ tag = "icon-4-8"; icon_state = "4-8" }, +/obj/structure/cable/white{ + tag = "icon-0-8"; + icon_state = "0-8" + }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/central) "bfN" = ( @@ -71854,7 +71862,7 @@ aSP aEt bvo aad -bvr +bvo aad abi aad @@ -72370,7 +72378,7 @@ aUR aVL aUR aUQ -bvu +bvo ahu aad aac @@ -72627,10 +72635,10 @@ aUS aUU aWz aVL -bvv +bvo ahu -bvG -bvH +bvh +bvg aad aad aad @@ -72884,8 +72892,8 @@ aUR aUU aWz aUQ -bvw -bvD +bvh +bvo aad aad aad @@ -73141,8 +73149,8 @@ aUS aUU aWz aVL -bvx -bvE +bvg +bvh aad aad aad @@ -73398,8 +73406,8 @@ aUT aUU aUU aUQ -bvy -bvF +bvg +bvo aad aad aad @@ -73655,7 +73663,7 @@ aUS aUU aWz aVL -bvz +bvh aad aad aad @@ -73912,7 +73920,7 @@ aUR aUU aWz aUQ -bvA +bvo aad aad aad @@ -74169,7 +74177,7 @@ aUS aUU aWz aVL -bvB +bvo aOH aZo baj @@ -74936,11 +74944,11 @@ aQT aRR aTa aEt -bvp -bvq -bvs -bvt -bvC +bvo +bvg +bvh +bvo +bvo aOH aZr bam @@ -88767,7 +88775,7 @@ aad aad bvg bvh -bvj +bvh adn aec aeS @@ -88834,7 +88842,7 @@ bhj bhT aRz aad -bvN +bvg aac aad aad @@ -89023,7 +89031,7 @@ aaa aac aac aac -bvi +bvg aad adn aed @@ -89090,7 +89098,7 @@ bgv bhk bhU aRy -bvJ +bvg aac aaa aaa @@ -89347,7 +89355,7 @@ bgw bhl bhV aRy -bvK +bvg aaa aaa aaa @@ -89556,9 +89564,9 @@ acv aph aqp abt -bvk -bvl -bvn +bvh +bvh +bvg aac aac aae @@ -89814,7 +89822,7 @@ api amD amC amC -bvm +bvg aac aae aae @@ -89861,7 +89869,7 @@ bgy bhk bhX aRy -bvL +bvg aaa aaa aaa @@ -90118,7 +90126,7 @@ bgz bhk bgw aRy -bvM +bvg aac aaa aaa From c8073a754e4a8ba3df4541a8e75ce30a01d79c0f Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 25 Apr 2017 21:33:03 -0700 Subject: [PATCH 59/97] Automatic changelog generation for PR #26549 [ci skip] --- html/changelogs/AutoChangeLog-pr-26549.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26549.yml diff --git a/html/changelogs/AutoChangeLog-pr-26549.yml b/html/changelogs/AutoChangeLog-pr-26549.yml new file mode 100644 index 00000000000..9fcd56e0297 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26549.yml @@ -0,0 +1,4 @@ +author: "flashdim" +delete-after: True +changes: + - bugfix: "Omega Station had two APCs not wired properly. (#26526)" From 4f4405819f5395ee1daeceae512106508a96dbe1 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 26 Apr 2017 01:21:17 -0400 Subject: [PATCH 60/97] When jumpsuits take damage, their suit sensors break. Can be fixed with cable coil. Changes all suit sensor var references to defines. --- code/__DEFINES/misc.dm | 15 ++++++ code/game/data_huds.dm | 2 +- code/game/machinery/computer/crew.dm | 10 ++-- code/modules/clothing/chameleon.dm | 2 +- code/modules/clothing/clothing.dm | 48 ++++++++++++------- code/modules/clothing/under/jobs/civilian.dm | 2 +- code/modules/clothing/under/jobs/security.dm | 4 +- code/modules/clothing/under/miscellaneous.dm | 6 +-- code/modules/clothing/under/syndicate.dm | 2 +- .../research/xenobiology/xenobiology.dm | 2 +- 10 files changed, 62 insertions(+), 31 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 29b4d7411db..7edf1f5959b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -196,6 +196,21 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_STATE_XENO "xeno" #define BLOOD_STATE_OIL "oil" #define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" + +//suit sensors: sensor_mode defines + +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 + +//suit sensors: has_sensor defines + +#define BROKEN_SENSORS -1 +#define NO_SENSORS 0 +#define HAS_SENSORS 1 +#define LOCKED_SENSORS 2 + //Turf wet states #define TURF_DRY 0 #define TURF_WET_WATER 1 diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index de830c856ba..2e5854509aa 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -24,7 +24,7 @@ if(!istype(H)) return 0 var/obj/item/clothing/under/U = H.w_uniform if(!istype(U)) return 0 - if(U.sensor_mode <= 2) return 0 + if(U.sensor_mode <= SENSOR_VITALS) return 0 return 1 /datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 27ef955ccc5..7bc41bacc66 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -153,8 +153,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) U = H.w_uniform // Are the suit sensors on? - if (U.has_sensor && U.sensor_mode) - pos = H.z == 0 || U.sensor_mode == 3 ? get_turf(H) : null + if ((U.has_sensor > 0) && U.sensor_mode) + pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null // Special case: If the mob is inside an object confirm the z-level on turf level. if (H.z == 0 && (!pos || pos.z != z)) continue @@ -170,10 +170,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) assignment = "" ijob = 80 - if (U.sensor_mode >= 1) life_status = (!H.stat ? "true" : "false") + if (U.sensor_mode >= SENSOR_LIVING) life_status = (!H.stat ? "true" : "false") else life_status = null - if (U.sensor_mode >= 2) + if (U.sensor_mode >= SENSOR_VITALS) dam1 = round(H.getOxyLoss(),1) dam2 = round(H.getToxLoss(),1) dam3 = round(H.getFireLoss(),1) @@ -184,7 +184,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) dam3 = null dam4 = null - if (U.sensor_mode >= 3) + if (U.sensor_mode >= SENSOR_COORDS) if (!pos) pos = get_turf(H) var/area/player_area = get_area(H) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index b15378c3b30..8f7547eaff8 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -202,7 +202,7 @@ item_color = "black" desc = "It's a plain jumpsuit. It has a small dial on the wrist." origin_tech = "syndicate=2" - sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle?? + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? random_sensor = 0 resistance_flags = 0 armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index ede686f7661..6bca888df19 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -83,7 +83,7 @@ C.use(1) update_clothes_damaged_state(FALSE) obj_integrity = max_integrity - to_chat(user, "You fix the damages on [src] with [C].") + to_chat(user, "You fix the damage on [src] with [C].") return 1 if(pockets) var/i = pockets.attackby(W, user, params) @@ -161,7 +161,7 @@ /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) update_clothes_damaged_state(TRUE) - + to_chat(usr, "Your [src] starts to fall apart!") /obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE) var/index = "\ref[initial(icon)]-[initial(icon_state)]" @@ -518,9 +518,9 @@ BLIND // can't see anything slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women - var/has_sensor = 1//For the crew computer 2 = unable to change mode + var/has_sensor = HAS_SENSORS // For the crew computer var/random_sensor = 1 - var/sensor_mode = 0 /* 1 = Report living/dead, 2 = Report detailed damages, 3 = Report location */ + var/sensor_mode = NO_SENSORS var/can_adjust = 1 var/adjusted = NORMAL_STYLE var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only @@ -545,16 +545,26 @@ BLIND // can't see anything tI.color = hastie.color . += tI +/obj/item/clothing/under/attackby(obj/item/W, mob/user, params) + if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = W + C.use(1) + has_sensor = HAS_SENSORS + to_chat(user,"You repair the suit sensors on [src] with [C].") + return 1 + /obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE) ..() if(ismob(loc)) var/mob/M = loc M.update_inv_w_uniform() + if(has_sensor > NO_SENSORS) + has_sensor = BROKEN_SENSORS /obj/item/clothing/under/New() if(random_sensor) //make the sensor mode favor higher levels, except coords. - sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS) adjusted = NORMAL_STYLE ..() @@ -632,15 +642,18 @@ BLIND // can't see anything to_chat(user, "Alt-click on [src] to wear it normally.") else to_chat(user, "Alt-click on [src] to wear it casually.") - switch(sensor_mode) - if(0) - to_chat(user, "Its sensors appear to be disabled.") - if(1) - to_chat(user, "Its binary life sensors appear to be enabled.") - if(2) - to_chat(user, "Its vital tracker appears to be enabled.") - if(3) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + if (has_sensor == BROKEN_SENSORS) + to_chat(user, "Its sensors appear to be shorted out.") + else if(has_sensor > NO_SENSORS) + switch(sensor_mode) + if(SENSOR_OFF) + to_chat(user, "Its sensors appear to be disabled.") + if(SENSOR_LIVING) + to_chat(user, "Its binary life sensors appear to be enabled.") + if(SENSOR_VITALS) + to_chat(user, "Its vital tracker appears to be enabled.") + if(SENSOR_COORDS) + to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") if(hastie) to_chat(user, "\A [hastie] is attached to it.") @@ -660,10 +673,13 @@ BLIND // can't see anything return if (!can_use(M)) return - if(src.has_sensor >= 2) + if(src.has_sensor == LOCKED_SENSORS) to_chat(usr, "The controls are locked.") return 0 - if(src.has_sensor <= 0) + if(src.has_sensor == BROKEN_SENSORS) + to_chat(usr, "The sensors have shorted out!") + return 0 + if(src.has_sensor <= NO_SENSORS) to_chat(usr, "This suit does not have any sensors.") return 0 diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 11951fcf685..509d5421c2f 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -14,7 +14,7 @@ icon_state = "captain" item_state = "b_suit" item_color = "captain" - sensor_mode = 3 + sensor_mode = SENSOR_COORDS random_sensor = 0 /obj/item/clothing/under/rank/cargo diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index a83e85e585f..27e6f061f8b 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -18,7 +18,7 @@ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 30) strip_delay = 50 alt_covers_chest = 1 - sensor_mode = 3 + sensor_mode = SENSOR_COORDS random_sensor = 0 /obj/item/clothing/under/rank/security/grey @@ -27,7 +27,7 @@ icon_state = "security" item_state = "gy_suit" item_color = "security" - + /obj/item/clothing/under/rank/warden name = "security suit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index be458b7a4c4..0a8be08e809 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -61,8 +61,8 @@ icon_state = "prisoner" item_state = "o_suit" item_color = "prisoner" - has_sensor = 2 - sensor_mode = 3 + has_sensor = LOCKED_SENSORS + sensor_mode = SENSOR_COORDS random_sensor = 0 /obj/item/clothing/under/rank/mailman @@ -404,7 +404,7 @@ /obj/item/clothing/under/gladiator/ash_walker desc = "This gladiator uniform appears to be covered in ash and fairly dated." - has_sensor = 0 + has_sensor = NO_SENSORS /obj/item/clothing/under/sundress name = "sundress" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index ec506accf51..f2e70367e1e 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "bl_suit" item_color = "syndicate" - has_sensor = 0 + has_sensor = NO_SENSORS armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 40) alt_covers_chest = 1 diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 38d742c5be0..c31a241489d 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -420,7 +420,7 @@ item_color = "golem" flags = ABSTRACT | NODROP resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - has_sensor = 0 + has_sensor = NO_SENSORS /obj/item/clothing/suit/golem name = "adamantine shell" From 36f0916b448e8345f51600b96acb86e654053ec4 Mon Sep 17 00:00:00 2001 From: Lularian Date: Wed, 26 Apr 2017 02:43:57 -0500 Subject: [PATCH 61/97] SWAT teams use LMGs right? --- .../projectiles/ammunition/ammo_casings.dm | 22 ++++++------ .../boxes_magazines/external_mag.dm | 34 +++++++++---------- .../projectiles/guns/ballistic/automatic.dm | 4 +-- code/modules/uplink/uplink_item.dm | 32 ++++++++--------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 57196e6c80b..65b9ef926f3 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -135,27 +135,27 @@ /// SAW ROUNDS -/obj/item/ammo_casing/mm556x45 - desc = "A 556x45mm bullet casing." +/obj/item/ammo_casing/mm195x129 + desc = "A 1.95x129mm bullet casing." icon_state = "762-casing" - caliber = "mm55645" + caliber = "mm195129" projectile_type = /obj/item/projectile/bullet/saw -/obj/item/ammo_casing/mm556x45/bleeding - desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." +/obj/item/ammo_casing/mm195x129/bleeding + desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." icon_state = "762-casing" projectile_type = /obj/item/projectile/bullet/saw/bleeding -/obj/item/ammo_casing/mm556x45/hollow - desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets." +/obj/item/ammo_casing/mm195x129/hollow + desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." projectile_type = /obj/item/projectile/bullet/saw/hollow -/obj/item/ammo_casing/mm556x45/ap - desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." +/obj/item/ammo_casing/mm195x129/ap + desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." projectile_type = /obj/item/projectile/bullet/saw/ap -/obj/item/ammo_casing/mm556x45/incen - desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " +/obj/item/ammo_casing/mm195x129/incen + desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " projectile_type = /obj/item/projectile/bullet/saw/incen diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index d4c6204233f..11112ec974e 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -234,35 +234,35 @@ //// SAW MAGAZINES -/obj/item/ammo_box/magazine/mm556x45 - name = "box magazine (5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129 + name = "box magazine (1.95x129mm)" icon_state = "a762-50" origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/mm556x45 - caliber = "mm55645" + ammo_type = /obj/item/ammo_casing/mm195x129 + caliber = "mm195129" max_ammo = 50 -/obj/item/ammo_box/magazine/mm556x45/bleeding - name = "box magazine (Bleeding 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/bleeding + name = "box magazine (Bleeding 1.95x129mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm556x45/bleeding + ammo_type = /obj/item/ammo_casing/mm195x129/bleeding -/obj/item/ammo_box/magazine/mm556x45/hollow - name = "box magazine (Hollow-Point 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/hollow + name = "box magazine (Hollow-Point 1.95x129mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm556x45/hollow + ammo_type = /obj/item/ammo_casing/mm195x129/hollow -/obj/item/ammo_box/magazine/mm556x45/ap - name = "box magazine (Armor Penetrating 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/ap + name = "box magazine (Armor Penetrating 1.95x129mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/mm556x45/ap + ammo_type = /obj/item/ammo_casing/mm195x129/ap -/obj/item/ammo_box/magazine/mm556x45/incen - name = "box magazine (Incendiary 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/incen + name = "box magazine (Incendiary 1.95x129mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/mm556x45/incen + ammo_type = /obj/item/ammo_casing/mm195x129/incen -/obj/item/ammo_box/magazine/mm556x45/update_icon() +/obj/item/ammo_box/magazine/mm195x129/update_icon() ..() icon_state = "a762-[round(ammo_count(),10)]" diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index b334b7b7759..1ffdaf0d29b 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -278,13 +278,13 @@ /obj/item/weapon/gun/ballistic/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." icon_state = "l6closed100" item_state = "l6closedmag" w_class = WEIGHT_CLASS_HUGE slot_flags = 0 origin_tech = "combat=6;engineering=3;syndicate=6" - mag_type = /obj/item/ammo_box/magazine/mm556x45 + mag_type = /obj/item/ammo_box/magazine/mm195x129 weapon_weight = WEAPON_HEAVY fire_sound = 'sound/weapons/Gunshot_smg.ogg' var/cover_open = 0 diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 9ed0565ee77..7fcbb87c598 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ - This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition." + This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition." item = /obj/item/weapon/gun/ballistic/automatic/l6_saw cost = 18 surplus = 0 @@ -469,34 +469,34 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/machinegun/basic - name = "5.56x45mm Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \ + name = "1.95x129mm Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \ By the time you need to use this, you'll already be on a pile of corpses." - item = /obj/item/ammo_box/magazine/mm556x45 + item = /obj/item/ammo_box/magazine/mm195x129 /datum/uplink_item/ammo/machinegun/bleeding - name = "5.56x45mm (Bleeding) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "1.95x129mm (Bleeding) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ to induce internal bleeding on targets." - item = /obj/item/ammo_box/magazine/mm556x45/bleeding + item = /obj/item/ammo_box/magazine/mm195x129/bleeding /datum/uplink_item/ammo/machinegun/hollow - name = "5.56x45mm (Hollow-Point) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ + name = "1.95x129mm (Hollow-Point) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ with the unarmored masses of crew." - item = /obj/item/ammo_box/magazine/mm556x45/hollow + item = /obj/item/ammo_box/magazine/mm195x129/hollow /datum/uplink_item/ammo/machinegun/ap - name = "5.56x45mm (Armor Penetrating) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "1.95x129mm (Armor Penetrating) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ to puncture even the most durable armor." - item = /obj/item/ammo_box/magazine/mm556x45/ap + item = /obj/item/ammo_box/magazine/mm195x129/ap /datum/uplink_item/ammo/machinegun/incen - name = "5.56x45mm (Incendiary) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \ + name = "1.95x129mm (Incendiary) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \ mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." - item = /obj/item/ammo_box/magazine/mm556x45/incen + item = /obj/item/ammo_box/magazine/mm195x129/incen /datum/uplink_item/ammo/sniper cost = 4 From 0fd0c991a880434f53eb953d4865f36ea1c522b5 Mon Sep 17 00:00:00 2001 From: Core0verload Date: Wed, 26 Apr 2017 12:35:27 +0300 Subject: [PATCH 62/97] Gas injectors are now buildable (#26474) * Injectors are now constructable and deconstructable * Gives injectors TG UI, fixes a bug with MAX button not working for volumetric pumps --- code/__DEFINES/pipe_construction.dm | 1 + code/game/machinery/pipe/construction.dm | 3 + code/game/objects/items/weapons/RPD.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/binary_devices/volume_pump.dm | 2 +- .../unary_devices/outlet_injector.dm | 67 ++++++++++++++++-- .../unary_devices/portables_connector.dm | 2 +- .../components/unary_devices/unary_devices.dm | 3 + .../components/unary_devices/vent_pump.dm | 4 +- .../components/unary_devices/vent_scrubber.dm | 4 +- .../atmospherics/components/unary_devices.dmi | Bin 30018 -> 31467 bytes icons/obj/atmospherics/pipes/pipe_item.dmi | Bin 18386 -> 19514 bytes tgui/assets/tgui.js | 2 +- tgui/src/interfaces/atmos_pump.ract | 2 +- 15 files changed, 79 insertions(+), 17 deletions(-) diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 84c4563bf2f..b8a83ee3fa4 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -16,6 +16,7 @@ Construction breaks otherwise #define PIPE_CONNECTOR /obj/machinery/atmospherics/components/unary/portables_connector #define PIPE_UVENT /obj/machinery/atmospherics/components/unary/vent_pump #define PIPE_SCRUBBER /obj/machinery/atmospherics/components/unary/vent_scrubber +#define PIPE_INJECTOR /obj/machinery/atmospherics/components/unary/outlet_injector #define PIPE_HEAT_EXCHANGE /obj/machinery/atmospherics/components/unary/heat_exchanger //Binary #define PIPE_PUMP /obj/machinery/atmospherics/components/binary/pump diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 11b21d275d3..74506b0c0f2 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -34,6 +34,7 @@ Buildable meters PIPE_CONNECTOR, \ PIPE_UVENT, \ PIPE_SCRUBBER, \ + PIPE_INJECTOR, \ PIPE_HEAT_EXCHANGE, \ \ PIPE_PUMP, \ @@ -93,6 +94,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_CONNECTOR]" = "connector", \ "[PIPE_UVENT]" = "uvent", \ "[PIPE_SCRUBBER]" = "scrubber", \ + "[PIPE_INJECTOR]" = "injector", \ "[PIPE_HEAT_EXCHANGE]" = "heunary", \ \ "[PIPE_PUMP]" = "pump", \ @@ -120,6 +122,7 @@ GLOBAL_LIST_INIT(pipeID2State, list( "[PIPE_CONNECTOR]" = "connector", \ "[PIPE_UVENT]" = "vent", \ "[PIPE_SCRUBBER]" = "scrubber", \ + "[PIPE_INJECTOR]" = "injector", \ "[PIPE_HEAT_EXCHANGE]" = "heat exchanger", \ \ "[PIPE_PUMP]" = "pump", \ diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index c0065b77514..bff92ea9c68 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -94,10 +94,10 @@ GLOBAL_LIST_INIT(RPD_recipes, list( "Passive Gate" = new /datum/pipe_info(PIPE_PASSIVE_GATE, 1, PIPE_UNARY), "Volume Pump" = new /datum/pipe_info(PIPE_VOLUME_PUMP, 1, PIPE_UNARY), "Scrubber" = new /datum/pipe_info(PIPE_SCRUBBER, 1, PIPE_UNARY), + "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY), "Meter" = new /datum/pipe_info/meter(), "Gas Filter" = new /datum/pipe_info(PIPE_GAS_FILTER, 1, PIPE_TRIN_M), "Gas Mixer" = new /datum/pipe_info(PIPE_GAS_MIXER, 1, PIPE_TRIN_M), -// "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY), ), "Heat Exchange" = list( "Pipe" = new /datum/pipe_info(PIPE_HE, 1, PIPE_BENDABLE), diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 6ddeca63787..e67db7fcd71 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -169,7 +169,7 @@ Passive gate is similar to the regular pump except: /obj/machinery/atmospherics/components/binary/passive_gate/can_unwrench(mob/user) if(..()) if(on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 319c9895317..9307f1ec231 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -176,7 +176,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user) if(..()) if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 6b5c0c18db0..750ffbdedf7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -172,7 +172,7 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user) if(..()) if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 14d15192db1..ca90604ee71 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -1,9 +1,10 @@ /obj/machinery/atmospherics/components/unary/outlet_injector - icon_state = "inje_map" - use_power = 1 - name = "air injector" desc = "Has a valve and pump attached to it" + icon_state = "inje_map" + use_power = 1 + can_unwrench = TRUE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF //really helpful in building gas chambers for xenomorphs var/on = 0 var/injecting = 0 @@ -22,9 +23,13 @@ return ..() /obj/machinery/atmospherics/components/unary/outlet_injector/on - on = 1 + on = TRUE /obj/machinery/atmospherics/components/unary/outlet_injector/update_icon_nopipes() + cut_overlays() + if(showpipe) + add_overlay(getpipeimage(icon, "inje_cap", initialize_directions)) + if(!NODE1 || !on || stat & (NOPOWER|BROKEN)) icon_state = "inje_off" return @@ -42,7 +47,7 @@ ..() injecting = 0 - if(!on || stat & NOPOWER) + if(!on || stat & (NOPOWER|BROKEN)) return 0 var/datum/gas_mixture/air_contents = AIR1 @@ -60,7 +65,7 @@ return 1 /obj/machinery/atmospherics/components/unary/outlet_injector/proc/inject() - if(on || injecting) + if(on || injecting || stat & (NOPOWER|BROKEN)) return 0 var/datum/gas_mixture/air_contents = AIR1 @@ -139,3 +144,53 @@ spawn(2) broadcast_status() update_icon() + + +/obj/machinery/atmospherics/components/unary/outlet_injector/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_pump", name, 310, 115, master_ui, state) + ui.open() + +/obj/machinery/atmospherics/components/unary/outlet_injector/ui_data() + var/data = list() + data["on"] = on + data["rate"] = round(volume_rate) + data["max_rate"] = round(MAX_TRANSFER_RATE) + return data + +/obj/machinery/atmospherics/components/unary/outlet_injector/ui_act(action, params) + if(..()) + return + + switch(action) + if("power") + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") + . = TRUE + if("rate") + var/rate = params["rate"] + if(rate == "max") + rate = MAX_TRANSFER_RATE + . = TRUE + else if(rate == "input") + rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, volume_rate) as num|null + if(!isnull(rate) && !..()) + . = TRUE + else if(text2num(rate) != null) + rate = text2num(rate) + . = TRUE + if(.) + volume_rate = Clamp(rate, 0, MAX_TRANSFER_RATE) + investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", "atmos") + update_icon() + broadcast_status() + +/obj/machinery/atmospherics/components/unary/outlet_injector/can_unwrench(mob/user) + if(..()) + if (!(stat & NOPOWER|BROKEN) && on) + to_chat(user, "You cannot unwrench [src], turn it off first!") + else + return 1 + diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index 99e59e08911..4b4122c6547 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -30,7 +30,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user) if(..()) if(connected_device) - to_chat(user, "You cannot unwrench this [src], detach [connected_device] first!") + to_chat(user, "You cannot unwrench [src], detach [connected_device] first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index 807980318e1..32076d82e1f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -10,6 +10,9 @@ /* Iconnery */ +/obj/machinery/atmospherics/components/unary/on_construction() + ..() + update_icon() /obj/machinery/atmospherics/components/unary/hide(intact) update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 8c43a28da4e..8edf06fbdf7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -70,7 +70,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/update_icon_nopipes() cut_overlays() if(showpipe) - add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "vent_cap", initialize_directions)) + add_overlay(getpipeimage(icon, "vent_cap", initialize_directions)) if(welded) icon_state = "vent_welded" @@ -268,7 +268,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user) if(..()) if(!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index baa3a2e85f3..87800e0b37d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -87,7 +87,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/update_icon_nopipes() cut_overlays() if(showpipe) - add_overlay(getpipeimage('icons/obj/atmospherics/components/unary_devices.dmi', "scrub_cap", initialize_directions)) + add_overlay(getpipeimage(icon, "scrub_cap", initialize_directions)) if(welded) icon_state = "scrub_welded" @@ -361,7 +361,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user) if(..()) if (!(stat & NOPOWER) && on) - to_chat(user, "You cannot unwrench this [src], turn it off first!") + to_chat(user, "You cannot unwrench [src], turn it off first!") else return 1 diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index b1c7922190b89bdb1c465c3e9d71e2dc12d6f4f8..fada1c725170c678d7b6bcf92c40340eb221073c 100644 GIT binary patch literal 31467 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 literal 30018 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 CpBT0P literal 18386 zcmZs@1yodF_ceZpp_DGAQ$hjhZb4E&1nEW)M7pGhP(bOFMnWW%5Tv_1Bn0U$iJ^18 zhu`~t@n7q|mH~I>&b{}EbN1P1?+JUZrhs>s@-75HcuI`fItvHI4@;#xHbiX{nZZjjru*hDJd4fVds%2MwE8Tjc>WaB(e)d|i zm|UjyQH%k{4>=)?XY`9kt}a^mB#M7#k_$*^>JfFF)gW z{aC+eiKDGI%9A2-!OsmJs|r)6 zf1F*e+~|L=e^sS*nqc~~jpfb$QPdIE_2insP9z*RM8gOE*y_rZygCF6g6JV7IT@{Y zY5&r_9bdl8*lW66ks&6oC$i+1#?G2$XsO5&7VKW>H)YHt%nrFH8}cgUOILF@&DQ9n zRZ@$;W3H8>YCK64w1TPvJd~v^YC-RK6uo(EOg|_{(<@dH%VNJN_)OHw&Kly2!nXZ6 zD0z9Uzg{N!vLNm!-S(+L$^7~EDneXLv-jggI-m6P^dLmjWnB{q2ZlL(0x8lnQ24T_ zJuQtI+UcDy@xQhuf*u>!hcc@qR(}ne-@6~wl4W}A&Cz$Nr}3?}R{xp0dKZD;K0KUG zing+{GCRSsxK&@0wWgr3kT?XFBCy6~-F&9n>04nTvi|Dj%a>uxoe^y_H7-1_x(O#; z_b;!PcBXzVo?bp>pSLh-WQHp$Dk;gBm}I8YzirW%3~38pj|O2 zr_W|%X@NL$0a%g%xFuJ_}e#-pmfXW zUoEt(AMzYD>-McX3Wo)(YAh5Nb6}&TVvrZFx(KJWH*1re{dH)1>g81%chMg4pVN2| zf%Np8oOoblpRFyHB@QhqBcg-skG4)VLX$F+@xMb5%2 z;bJxpj*9pYcVts(>F^HwFFjoyrngh|8vGaF{{QkKiZ2(^qEXu>D1F0H(|{GFH+Y4) zxw&#P1R-tR{r%zlPudnsDC&dngG)SGUFWkVjrAeRSQu1R5(l3nWseqAu^sW7jm`jWFDRv;DFNte8 z(ZD{YwZ`vSR8Av!XuS7}GhdZQeLaWzPJ-tC))W{28N{!rTdcX*yFjvvx?c9@C6 zZPveu^V!?kIpXcT6Jklg4Mrc_Rc`{j+SYQ-)u;PhOA$hI()#+85WRo^+4c1`(NORc zhRwz+igO9%HFC8tHp9loCbs44=JvL%FtydAd3+2EjE$|W*0~06&IbR3rKgZIn5Mkb z{AbC5;BI&3o90I^wQb(MB~|=68~)a_F{ZpI3FWmj*O2NdBwcS_bO#r4P9JP^u9C<> zv^J2+N~|8n&)3cMR$2M(=;)~9@z%>TAIUSH#&2lK>fJ1RJ?m`51Oa}(zI>5^pb6wZ z$D1q9Gzsr}`D*FB*FVxFn_F9-q)GYHo}Zt8T@{7dq2DPeD2Sa*kBJF*&h}sxb}$!; zwR?EJf3aO67K@rW)9WgSJyTV+6vbZ3^?5<4*P`F}Qt|hXoSZgo<_e^}o!xiE@H^~j zyy6Ebs4zsH4Y&4;E2|l&)RdBH<*cJ)n(kN_$>pDE0&Z%2zFC6kgsWGq+M}7YWUFHE z8g<4&c!ed@W1ToznwYuMu6*&^*K!7`C737J$IK1#*k5ST{+}J#qb4tp3AM{zkkEvx zQAbj6P)PHR2aeNY+n)E}C%+)U*;IFZp0d`qxM9`<#aazj+D=lxWHDZ06)TIsk;9rJ zYb^`>PV>+iRXj$}4Sr(ktudJR5w|Q45sS?~$;%H`ub^qe$4rJso7?1v6xv#+^ zgykKbp8F`Os;>V2BAi${gY{>Ao~}&zuZnJ;y1O~^bq^*QSOPqY5iFuUvRt~wtz^EN#CkTxa#YS@b7Qux-^8y-UJP>2v4T~0gyE(_WW_fJ8c@qrsduNArqbhS{D8)>5}USgI-2C*M$%zbaex*lWDBHz*%}gaXr3>awo3GgG5^>d7w8rXAjN-^&r+y|`i8 z5k19|CjFM2A+d9wUE&3dJC*M#OHp~E1D06r-w6L=)ss9dhVcFlK4KJjcJ>c@0&y&= zyjMFdL0B|#ebd-w+&9KsG0H5FQqJuYMU zU3^oych~slOVPe=)%1I!!;ADny{F zsw(WUn^vGqhKqS1g*ue_EaX6|{at_cv!pR4LwOJ!OJ z=UhIEy=G=V=2Ck#HA3p3e8VG*!Sy%x=;2QMs~(9LdDXgMsKfy(vO1d;DMkAs*(1tC z+HabjQet9MN6HDRse%QGsuwjoJ8zFpPHJzM+AkqhN}TCSdNXKZ$@JK$wx?)9+!bfE zKF@MQ)tJfGAN}Wn&c!0bq(vUxn3DMbys|YA0|&z0nY-R9DtROM_wV0Nc`8ZD-p{W6I(gIOYyQfT|6nMXP#E^8fo*AWAJnL+HPD^qioN4Lk zY!52U{IW|0tGE5bhYz7jbM~#^mZZHY->8~%Qn)Xv?-mGnCW!N~4kOR3X}aC=8l^m` z<6l|NvYsNWOEh{eU3!^zc6MG}_%W7R_T9_<`c>IBsWRLYEY!ZfzJtH>H}}Ba&DiL= zgxrP?`BxI``qm;+ME``LT5D6-;Kl37n;k>AZ!jkn=jmG1u2y{m-bg8`jZ9B}#G>;V zKH?{BnvaT-x*`Am{d?rrGP4>5>U7?p?%~6Sginc*lao{SURhaXS5}e*(kl*_R{00N zqsx+E`m%1L8}@0+W5w5BKO;Hr+k4x}y(m)w)c6Hjk3>E$s^0VP?Lhv|zgS(PaJSww zlREc-edqcQA22sXc<=6=N|w0jxPq2wlkD^fvGiC_-P8qF&sIYj~c+bM>AIu`5RWzKv~L`f=1P-RMe zJ7IYWmXf14|DR7`jr_$D&-1x$uV$Y7=d^S2pOxEN9h|8`@)UVg&eW+`3KusU%6lOE zh^P-tjt$w2rPOO54yoPPsw#TGg_7QNz>TT=1=1#hPGQsE_$ykU(?a%Y{p~Fu3H$UdsEV%=~J07`$0DbcShc8;76R-z!&V_n@pjtR94s`@R`! z_S>(pwErhi7-R|!%)#2&oNRq#|v9KLhtfN_)xR;3kgqz$|v_Du@(rkL?^j#8w zfsa5e7f#E4FBBj`tv1?X%@v`u`1?TMtF*KR( z;g$l--Jsufz4VFe{FcOd@L;deQy_~v$cw>Ed0fb7oRtpN1@AWzp{!7 z(!9L9e!-s$?-V$~(S8fRJmD-s|3aqQn7sTm-xW@z5t{mF4m}yr;YhJ?$2%R>4{}d8CqFcSpa~tc2U>{ z9Ug!XwjQQGIz3ewlPGe2`yE4Vt(O%W4M6Lk{Gnv2w%Dwxqak|#FOxZEMjf=mjyLf3;r5-1CmuS5i6*20kv zAsy3~VPsFfJa4D?%Axp6{M|vv{io2z?r!2ueu+yOtG^a(qF65oT-1=TPmS>mnGa4bk84llf?6LDEMmtS%Ro3@(2fl5#OTX*iv;y+~hM zvyvUs<3&hj5^!>ITHDx^A-$e(o3~?g7}t|m%{b#sPfzdf*6n#cMgff5;d?q8l954s zb=icf%SSe>`>uqXnz&q z(UqSrd_MBG&r?T~H zi46d2ot$_u325K48LD8GW@XVAJjx`dp`m$qbH1LpcT@p!fuZcQEooRQcs3CYuUA%4 z8JV5sq!2^;tEk}oK71N#uN_eubE<3Ss$s~Fe>*-B%%@q~&+ZRqNPPOiXY~1Em^7SP zg!nuMIpX%UukuhuRPtYYNLQpqmzWTiguT8zkkoh&fXS$hs1H`4^Oe)&rTdNX0V39ZD?p}26cAI--2OKUoM3bF%3^mg^g() z7e}mLZ;z?*gp(~RSWFmbdS~p;KOh-uh}_P+x#F3Qr0y8>KxMkxO_i_jTP<5{it$L> zr&+u>o84PD`Rfq157iC2n%R$QR=aK3bq@}<9$0jNN5+HJB&7Kg{QE!iyjYcTUcq+X zn~NwceB=ZU#G>i5y_C*DiiwIwXJq^+$Rs<5hX0c>AN|iZs*7yDnv@#+duv)&d;1p;OOH-Bp*c^v2@TOyg!fSx{jg0Iz;Cm z7!-nE)NA-*zi>rA))&aw^=JXB>nnz{+oC9PcXAZ z#l$q8KSx|$`9MMnjmpZ(*-IdV4h$s^OZR*_BxX`It@BOOZs;14M4{28Uy$gdsw zE!J@Br>ZGfr`6^8WoGxGu1JcAy1hn&H*ZMb;>TYeLWqY1sxpV(1JypBrX3kJ1mFQm z3JcK?p}mu%qk#tYH5d>#02ra!)`e)4F;d`1D5f(%D@*!rkd_}iG9W-ic6D|2TS*BP zH}@#z-S@fb3u~oU;K{jNH=ctEl3Nc?_A4V9DQQ+w5zhKhCKhybbOb?^R8%>xtbO-u zh>kFYQksjoZ4qf}u3h=oV$S^Ll=wW&(C|f9LoAHNy%jqa#;qdFSl}q^Bp5{d6wfBdgjvZCTZ^2ikghb9CfdfQ&QB-Mq{4F?-Edx(*Ce zlh^T^qvPYJur)}T)?g>c$6w0IMo5O#dK4e@ z3SMb1(>q8S*c28v$eO$sn7&T0+v63$UgS4=U1wwysB*iyJm7VmUE47OVDBy@zs`^W z%M---opbSK9*fR}+ZEm(Mso14YTo>KYdoWynaoHMD}H?ARk5`C2t)MPfp}8-7wU)nA^V zebeo_iCQ{1Ws~Ilx5&GR()7RhnS<;Kf9z=a(AbbtdZIHVIx!JbgEV;ud%#Qft`{>V zD{&F6W3ktuLKLmQ^m9MGCy(PXHhPDgDfC@j_yAmDDV;WZU+I&G9wZa+wl}pn zu0(IiZ3>|FK4&Jw01m28tN`tFuRNQH=(&A;+3}>BA3=>DvW)ID zg}&w}OwD===oTMv{ueP(N#lUx;?t|h7XS!Gq`i(+M2fs!Jl~_9f%JoS9uK_1rv-$c zLyS5c9K;0&5zm_Kt*uSVDd6Dv-j{sD{*^~$weg)+$_bSNKYp4R?kzL$N*M3wWiJzPy%cpwGSL?%jP$IWaEq={&{sw5IW zZTqlzNJT|-WLT3;`N1f?!nM1>sc|S>L?rQ0dK|+14_@l57;7Hn2`|eEq6BPOAU(Ii z$1Z)pY(AH@XED@S0w7=eAbVIL#CnD|KD1vnUc_TL&A&7IQ=#^xmmQw!GUqmFbX!=G zM!sY+%|*h6@S;Z#-Cq@TpjLX~HiR9eKcd1Z_?~NNttekry8fwqP4M+u>W4@;7RPqh zUvw4)GyRr=0a6PYERkZ59J7ZeJ?y8*Vl%GQxQ`0qGd*#vPFrISq2@UWZwPW|x)!{P zgTsW&U8*t!lsK%PfNRqh=}}> zWmu%T*ui4ia^dT^(GaFOC&A58|0{*r*T&aX{w`W9NkiI_MhE3yUfeckj+=8+eMwA> zIr&&gE-p;rF*N2a5G*tlMN?Blbh@#phu@V+KLpPaB_$)<{9xA&M@Q6kMz#R>*SKB+9%7yloUb8}`Q=JhI!d^zY zEy@oasxHcEcJefo6gzJ}gW&ROku!#_8aWZ?Z6D0`@O-;Zxdzi^56%uoFWn;uRp1;^ zsNBUirX{JoEPBQpCY-y&eoJy%SKp6hV_`I6qG{ruFN6qihv2sZqE?X^F8Wz_*LT*r zk8>Y&JTF(Dnx2m5RTDWq=X=Db{MQh5zN~(GYxnvD?c2H5h7@``Bd}2$3ZouqJahJL z{dElU{mzdh&gENUlVB6bglHkLfrVhAj~MVBt*h6AX%FYTw!e>he80-iKl?KPm*5&M z#S(UIcYI}O`Q<9cdFOiB7=q7Do-HxP$H&wAYf0Xs_vI+5$h#ITffx{Gc-#bjIS7cl zwXOwYWle9!3qvn0y23kWJ?1%k7(ztqJ&tJ9boot}22 zk=8e$^5gNB{AxE7$|rS6fe66&suEqBja47bFxHbsGEn2Ic$&%GWIz3+wHn-J*1_AX z-i~Sy_{wp@rBq(eg8qYDo3!`i$FK9P59Tn^!gR?5FXvt5YA@|HS z(8?KcUs>DOEw>z69OxVn9+BKQ;~q?ollHc%!xZ-%*^%m^_4&b1g*<{A$;;B+U7hWB4X5gWyc(8 z^c}Y}u_Sl~nvF@N8efSQQew)ew7$Z2$K}3me7SOv$?sE5iaM&`5AW~&xD_S#E@x&o zIgW(6uCZ~>@#eSaOmbY#H#j#Tip$Gu*n`R6hDMQgrhtdr_79YCwLy9tZKQk%<9`tC zeL8^>QquRDP?DhNr~k;vE8rJ%%k@rA7uL3Z*?ub|DSFIWF=rjv=a!`qa7*6iXz)Ef zlb_eLzVTVu&?rE@UmwD<*OC@m@2FwU%#}Dukvp&w(wF-=hPaxo^N=MB4t4DI$Q;Vo z#nkOf`t7oM*Q)<>fM&j$8Hmy!b4uPsOICw!ME&8Q*oXO?FYD(qYjk#q-@ivmFVVxk z(5pIr?=9&7IkVkmNFtg zG>Wby1xvX$TKwHo7;72@`a?<`@)4B#$&OwD%5J4QrkgGyYPl?Te=j0C~zOfx^ zYwPF?4N8ogU60*P0JCnRVxj1_V_DHV1;OkAsR>c7|6UT=cjx~$z9TAiv?3%Z*qQFb ztcX>ca8m(pAB0ssK?G~l)r+4V1VQ7T8JywmbQ7-n-!IyW84Cg zGK5Q>P@IwRjU~TcNi;qs(cA+)F%O1`dE~!av;Kf79K3WR=;=>=P~Uxts66f#bKfDf z0&%YQusIz62q`UqOC{~UX|fn8cIbHdPZreGIQO}X!?)n#p!g$|kj^LPtA+kcRY=Rx zE%Z}FF|e{?ffD>+Txb2DV?DEmvFYELlTPa@(n3elF8J~Kn*2L+kCip$YgOr2zbAj( zVo_7H12nGnwI!TKjjxzL8vYtTE28mzc$<32TS{S9ZCEm(j(F&W@bX2d$y`9I*U?B% z#D7VZoN^nkUxkIr9H4lQQ0ZZ8JHOJ$}k!GZ3-OJ1wFpCt6f_d3g!%zBd#&DdUjR z0|3ZS3j-bV(PA(tKH))RxlMS8oK&Jx!Dg=m)YZ~co3W{gv+YgkSL)qERcTlsa2KZR z4~d*=ojU{ZgP*engUUKIMwttAxRSHj=^b69q`kxn9}8(6@eKOo-0-b~PxrC&w?ex&CiAv{>u>)5njDg0FnR>SlCxX@xdB znyml)$Ypu_zqJ6|lgkeL1iSq`WyL{-FfGdW%-xflU;o333Q!ABcv)}KClyq<|G7gm zMo&x54sX}@xi|$dw-5Dtj7` zd(fxJotJRB@Ul|h$6I1#t+Npg71h>G|K!}%>%+qQ`tY`bDC@;aMA{@5k7h25M`q$Y zyIU}tMk`iL^pyrc!92-cz~<-142crx_9XRLrlY7|69%@>+tLUFw120b;QtHqL0`V& ze@ImBGTviWjm7`e0FmlJO6X&W^F;j|ZA_o_Mp{>YCIBGH*C#Wu)hv2byh=6FQgF16 z`CJ|p2cW-|?S(p?H0c7YJmU{HcXvSN3vAVj8#2A8pI9|uHeLef7LktxxLxV>2^F@D z6=-VE|Hai-5|RJ}ua?X|!x+#iAO!84kCWqbW#tn7#l2Ne#5+w?u-HG3|Ib;IzZW+~ za)iB(tjFAbiaNr-1?Xod_dFL%U;|wohKywg?Zn@rrIAv$=f)d=%*6-2t``kLz89{b zG%{@PdU7U>jr(q}=yEa?n@-H8W`sgN~bLV1%x{2eX z$x#`cd{AeXR!0Urtud%_x6=|WTJ`t#7W=A}z7_hm=Gip1!FTvC z3F#$_Mm>~q`|E7LY5*OK;7U|;?-^0Nd`sFc$8@0YW0_KeSDyX08Op{T4Pua^ z3yeD_n0W>l^%0#{qSP&b4<5tpMZt95%dIIoSw~M#PbZpRZDK34xYva73wmr|~hGR7A|rdNha8gD2~ ze6K54$fCy|c64-D+t~>)%W~bw5!7<2{S&D}mKZlY@}ztaiC&8~O53Aj;%~=(<4hC3 zB=1d+iq38I8Lm$2BE%%~%ERB!~9ki75c z(4UsxZ(nr2;rS89i*|kwZxszQIzOtw5jm2mTrZA96APQtFr7Zzil{Cp$K_FWaw=QZ zFcoojQ0E*}KBcC@$haQZ`PKv`jPYjX0Xgnneg7YKn`FvM(9Oz-rHcal8Xzu5KD==9 zzIXa}md2vOMtlS{F`rR1gL$I5QF#^X%dE&zjBXn7f@1$}BXPS3ZWJ1zlG{}!mhfM| zmduz#sYJUK%;Jc&E$Owj10OuOq2fh^mF9e+8FNpdH-M3a)BdaR;T;*G6QleYd>UM1|a?_I)WPD>l zW90s%QKz~9E`*@`_U}Pag}jEOWniC&dSg=Qvmjkn|B@Bk%>~jKs4(l->aTHGvudB$ zE8bz+l)57ET@R;vqEY&y!eP=wiEFsc7rN4qr92}oD;QJrn_M=BKrHt3^wi7rJ(;qc z@G1?wO#xN1;@cV62lK64L*ZhyMR_Q#2wdiQ^nw?rA}r15|T zeyX5dd3+O(4Wy^`WVMtTGy#EnM5DpMjrj>kWa%lP{eAP$@$s>>t?i+qJrE9A4Wuw9 zB!JeZF22eLRDOja_yShUA?sX@rrQzflUQz{gjFe!MId=bpOTV7S^}b_mC{R&cqwH4 z$ZJqZGc-CbqR9&gW>=OGLBo9Qv#Qazl`81niJ2pEa7{U`(BRW#3;!pzaXmuN9E~=I zzO7=X?>p<$=o8{Qw{hctHGUaSu0r`t@@uX~SsD1+rTUl^CjqIFzM_D3 zbv=uquKUZjnIOef$M9E4fpwdHp??jn$bq~m@A&vEib-Lgpet&5JcY9OM@bdUFTGHP ziXbaG`fW7mn+^hm)w65A0ac3GLddEt7E`~xLD@g?AYY?bp`4~+eotp6W~u;>zp^(o zgPQfE%q1HiZ4i}p-6e6lFtOZqKzBN`Y+Ws1?Yc>PJ9hr){n=vJ**ej;fp?m#RA2b$ zi}afix;i6RxH&&w{8w-Cn1AjU-emrK(aP$-ay%{#?}_3g`SkE<#lKkxr_Hqdi6p|z zKBVX3+WQ5RHvQV>sv>^W-g`Aznvrx}8Fxr_&@DfH{CKylyqp-~emzL-bG8_AOMyM& z5NyE%H3&)c;JzlEZ>}yhJKdV{7_ssUt%|^^Oh0TOH$Xo?>(Ecp$H2hAs03l$K99>W z)Nbm=7OhRA#n*~(rv1a?_bCLoW$VIgr=UQ_%}oHGMl{%ls~*uI`@ytsT$&TqUV({; z_aJE-n}StG4%J{Q&qw+k)OXt{oymov9-O6jSiU#hMde+ExNqkhjdaCdVc$6TO3<=# zbupS>iBm!hX*IPJNzP(UYg<+Zi@L^lp3wE(FACvhedLPqto=yHD_XD*-ZGBQuG8Av zvLL_mlMSAG=c38>jbl~~1(n~qik7x^c6N5_?{WGZ-i+4C*Zx5o6zWrV6-FQyZ&6d9e$~*|*WX{JLy;Hhl(=&|`-yw!I_DoZDc%BrgT#dpU>L_8tEZ->G{~O+Td)}= z$aPKk%h-rcPyhZ08d3k)D^os3s~{!vO|M#VY7s!3>8;Y`7oyLCeqxOw%wVt*7elGI7~^zp+N zf?>QWlkai59o{?vtr?K3KLFLL!J-Xi^D9mSvh+@S^`j0GKN|ASIac{`J{L!u8eYTj z=SLD3wVDT5m`jkH7p43tqS4`H2tX~STVn;Iib4-99;j~G8WXhk_`ls8S-gE=G*?OZ z-G0`;nm0&ZMRi!L6jKxaH+2#hv>I5sC|L*Yx$K85u)0Ai2d@6Rp$muW3^Q4*b@hlKc1XrwU3duS(BhN$GpZRIV+-?vC${9kj1C*v<>_%|)6o&(|9RWfz+kTna-BwpS>4#xHScFhp^*SY_Tov6MSNflyL=l;d? zXe0FXOyIcwf^H6wuGmf#xBOO@`d47+CHCXHO43rMB_GhMCHaHX0{w z1Jb7>`=Vi5MbOcQc#Ir{zc1wQ8tyK1x~r5i&i|_x$qO=&SF|G#D}S=oc)1(*=!?&A z=fjGnCi9NF>PWVGy|96WmLLsn?GHc=a4VCUNT$|ydL#DO2>wk6nz_QTGJ@&$dU(NA z^4%Q8@WuquDu2?{>m4C8J2~OhIIGflGW$1atX^V|%b8IX>zP&cG)Z4!uk@gbM~DPI zp0xNqcMR7ztX5U7j(h~&8X@{aKn5Xy@chTiB5j)ww(aKq5&sWx?q9 zSlU;jF)Co3K|6H;t-+YgaZfrCygONxLT$V8Zx=CAbMeo1Gx5agP$<5(6C=T`4mmL) zVG&E}EMN@%m)GMGvfGv%2&&n&wUl;tcE45>D5Mc|&juD9$CAZ7ew^*M5m*3)4q(h5 zPL!AowL^kJLP6C1yBjSV6=lv#R}er-!a(i~lsw9_WNME~_>^5-elj7+ZZTAw66TUK zGmu3r3J2tc4O9Obo0#|rmD>Df3Ah2P32CWdtR5I4AR&B!BZP431??=*pk;roUx5u4 z!NIe~BBUX2Cjg1C-6Q|m%PZP;2HUy6Ikg#+AtO<9NTj9KZM&WrgMM@wJcF!}5e?{i zlDG}AOMpfFKqB7N^%G#cWBTK<(b2M#JZW)|BzJaUFRaOO-L@wvc8=B`iYqk#NP?wy6b?5mgB+VY(DbKG31GNbGWh;7fqAaJ%?hIqldbU~{(L!Uhd z+1g7Vdd7psrL2;YlAOyCxQ^~mtBB;t3N+QiPwt3RPu! z#2yt1q`!BgGX=;P5g;jikCxo_Jhxp~?*xrY8hi_gR z<~2%Gtq1m8LgUYo=u$Ul7Mhxx-49;pUGE>c?!O@wW@rD@^C7E@o{pSbl9`0nTvi3= zUVP%xK{DS{u81s6q#c#?MN-O8s|SH6Dsy(dfAsh7AWnl{iX@pmRy9af7aJ~*!8DOS z<(8jTjUvK4YJi4y{Pl|0uxKspK-3-d=KdVi%|A6fZG}n`)wdmszvB_CtUz{l8Cwgv zJ}=?A8X63bv(@zVT`VSF=6zMVP2+UD?Z=hLR#xXEMhQ!%Is~lp9tqD6mrnluz0Xr> zwk{&Z)RwEH9@W?j+z9a*PT3~=w+lK=#N|0qIJl_;wZvE2hX-f<$xA5DU6G1RVIsGZ zcUSKw@gUoC(3Sp;1g0CEL?B43m=pGk9M(69DiBIxaYm-5km6Vafd6fbTB9gff1nz? zYPK>iE4#%2bqz1G;k)-A(#EB zI#vUBMQ`RLxV1lj|KgOB`Q0E_{~ROxbT6(B&!W6{TcoI^BGaW%BHB&+XpN5^wg7m* zgw{VWkRZA?WH=iRz@*ap`^UPa^hxQ>ahz}FR^eBAk=Z(*8x!dB zZyhh000!VyMfebIz#2~*_F&}S=wCIyP*sii+Vyl>nwTE+AKR{hxe5-=xUUBZyPV{c z6JK<((Kx%fXuNn4IONd%b(ygG)Yu1R3R--%wGdp@sJ6z|o%9R@-aCW%TYs021y)0&R3dmYDQNgRw6CWNx#vv{kMa(4 zk>w+mXx>^|BmQId$r}Q?q^lwr4U2k4cw=MZw^JY{aobM2omFz65AUM&#x?l$wuK+} zX!Tjn;2b!!nI8guP8LX!$qu-uMqfYn`^cAh-`o*1w^ijL7%~M4&)aaW&v>gv1-}$x zWE!F_4pFV&b~4dICt!$NTUl9IIqJE0%Xpijde0tDKAme)z*Pp>;U0%B{lGz7&IvV5 zhVlFtoDlVl`G&Z zA6GsAf>_X$0Gb~w-4GzYharxP*+|i#anY_9jjtd+KE5&_@&fsgWot(j`om|2_H}&H z;vkyg8#*cL(j0)_siz)$b9kl;)B(Uu1>94L#{-~PFa!E5kS7VBYIsFm5h$IgQoKp9 zER(1Hz?NqD%;9liI|#P9R+)(bBi?F7sGxU_Z|09Ps;DwZtOYd2G1V(DUxo*73+T^v zmHiT&TyL*=D8X9MX#D&UA2RV$Mn#P_jN88uArwEbvoxe>9)N7%cq7W`Vd5* z>u4Ia1}}>*hSm5T{^f zW{w?U?2HKCMS}-XS?wmp$5-!O7q}UK0+JHBzcQTB;FHzyug34qm37#p0I~%h8z^ZM0bmWd- zl|{&Y8{N(GG(kJcTm2N!Q4RlgankE!6@ACtXLs&o2gTue1yA<+ify?0Z+LoI`4xw9 zuxBjO-Rxsc`jc?d06vKa ztwd=y(pG>bXYY~40bJ6U87ZUK<*lI+!|#;TZ)8wv3Ip80t)xd0OTuQ5c=@T2LwdDC z$iKf;H~?#8p>$oJmW~BIE6IAz`tAC z6Ndk`n6hu%7q0>2=YA4Emocqn;=8@L5CSur3NODZ*_jtN z(xX%|J`~_11S;53n1vxj2hb03Hf+E~MLYvvapV}Dnc?_n7z=7GS0o9BJ!B{C?zi~h z{*l+qpHy2cfmd>YRMMZKVHi~eOiPZ!y9}UZG9d~CVUdsgnoMvpg969*^!H^5fkE>p z;Cq}-cBX)bG&^C>OP3b`qLevc&H@5x3>)k*S?aD{g}7Y+ahwx=A1(cqu@`Voscp5b zy5P2mUhDO(3kQMB$6_kT&(E#*F>VJLM>DZGr0-Y$A2Vqk(c5EKx$*z|!hh_fv)GBw z&q<%=0@1j^|9w@mON0Xz{2sUp>rL)G_`jFNRKes1@!nikK7Xj08?A4a`-P@v43LPj zX8OeHK=S)n>%sxw6X+=@D2OtRfw_yBUq~pYre;dB2H3Lv-pswbc<5 zG4akbg`vO}H~?y;{mXgOoE?t_aPWL7D7drNAT*2)a8}oo>AE~PkE8A6_$OomM|<}O zrrq{LfLE2}p*+xphqq%7-Ws|p$n*9&DVle8?SXi^zqcr|r5FBybaG4)OEXi{t=IjX zeqVu?mlv*1IlIo|ob2o;W7|o*<$aZgAqun)6|Afh86=Ke6@zC>()pWv(ohvnns1iu zr|NlH4>fJ4N9CWhb0GbLv8-Q7EZ-{FM@9mG1_7vn%|J&^_`fRi>1lnZ_D~`q#GkZ_CFD<&zm%w`=nm%Vl#>gutDixb)m2sZfzcsCS5I1=-2dQ{NmgzydW6*Z zokGB@@!zblem?)5Y2Kyo|FM^heYnC$1PvgiUk&?cS1KrijCa|@4o$PcuQPq`0pF8` zS>wf4(TCNLHnUrZq%N)z_C?k~c7NPI;T6%8-2H5WaW4Nb5I4nv+6FRJ^eeY`fbu{2 znYsDlaG8$FQ2^zCT!dFEdUYs;`nh;@tCpb8pgn+Wy4`@?tm17C^oSYyegu?4W$zBm z#Zgy>w?cp5GKN9_@gGxw!ZPZ0h9@S_{kDP1|2t)*=KH3GMp`cJBdAHpUoyi7sYEUQ z?zw3EU;I}d^T4D6tY(J5oD4i#ni8E+baV&j*L(hSV$ib`{yVDBEjluz0>xV=F#A5G z{Nl6yy^8*0HmQ}HTjdf<${S=R_&{;-fvBdlPfg9=t~9V;l!v~}{$$v7xz|JoiZY=G zQd2xBsGn8?FYuO6n@|ng=eOO2n^3h-6&(ef>7)R|%{qpgm^(1GiiRkR9H-a2nAuKdlS$(~ss4*WfDuZYY{zR;+ zKY<|354Yb70PO>LjJ!|dK_?Z204gvX=++7cHDk5V|1hozPeffYSq)`G0Q{k31{1n} z(03@KDtT^+_x@sJq;xCr zIWle@{(e%h7lkidN${K#X1)4%dK!X&p6Tr7v?&V6qn5#3blhBD!k`cWI!r{UoJY~V zm>r^j$(2O>zvu$_h_}b^vF6Pb@Yfz(_eQiz0fRQMKvMyW9z=f~dhR0$HX~(XW=hIO z(DBY$l|qGr-2!M;e-Jbpyz@}U!0RiIoL7{h??C|*V;2$_8x4B>`QVcBhbAQi!?*^5 z4r92txA+i-E)z}6C?P=uBu$Tjp4;)_$OdW#&5AOAl;5Tp1s+S?v$)e)wktJ)C!aeu zS%iHDgNW^;(6)L`pM<<((L0=fOGkg5G0G?3#%Kmy5{hVqZ)|Nlz=pS>y$xo!m{A?4 z{&x_e)qxkK8V7m2?r^||4pMUMb`U|n1dT{adpXKFkp8ij%3AeAFv*9TiW2PiCiIaX z22GvWHqqq+7HWKawZI2)&7bya4ZQMhCC2&dIl+S@m^(>>Cjw{t%>$+ap}Wsof8YJo zXw?G&5|TF+tJ?R{{R;>v9M?r5j$gNN2QyKWdkvF2=Ufl^!v6F;D_-%pv}7Lg4;kKu z8|vziEIuT*5Lz!d2Z7llSV569nNJ7|6tKIoadLJ<`5iFFn^Hij9BO`7I3fq7b4`Qr-4 z{#BI2(FLS5p9xHB>*4|?d>p(lJFQK!ED1`1y>FV3c;Al?;DT_V$N>vmB_(B9z(>K< z9kig90RtnBB0>Mo=QA!Y$vh_hgp*^BO-WGB(v9s|IWTVP<^w$i_3P4C5XLR?aQMH+ z)=LwDic_JU$5K;f=|B$RvID-oAl9T2@INfC8UIf%&Ma;pt7#q>82AHhmd$T$b6zE7 z?v$$e1K|#l&>+Sy{=3h(QZ34g6#k!2ChYFS074a#Ptjq++D*1*-B4|Tv^Wr**!P}Z zUaJ-KEVk3s`XXL2GA4hwJMpe>yOpE32#4WjcDFA&#@@U28>)?(_d>Ni1gsfAjsb-9 zX>x7xFjos&HSw1Jz8lj44SbtK?t7~LG#-JA&@nbqOZqxggdT~`(xB#k(HK)>eROXE z^Vp3vpVhXG$e(W$d|yR>%$rvzA1{xW4K#Z9C&m@yoFaCP2|kPU{Z>jdE?d;TiufuO z(#E4u7~>)`j!&h5e7Di2aum!Oi?v~OH9&g;+MVGscQ-Qo?#OAsm}dGSL5l=zJn5Ra zfYclP4=>KVkP-EJW4;n&YqNF$huC+Ra9&p)fgWim(C}n25QLwIuV6)XOOWuf{){_S z-Pj?Q7ndd$B7S}DaX}GCb)ci-&vdcbJ{0|f`hNw&0X_asB4VfykU*cjPG6TFT5L4D zMCk+cD*kHe&*5;aVWLZaEy9CbXc+M0h$fVN?ICyhZ{Z)$60jy0BQ94n3Vdx zIC)>m1JZkcVO@<@*p}owiJlI2;;$8V4u@kN zQ+4Z{f1;D~0IkY5^A35QH-$MIXE5Cd=p<%GLFH3T$UVEGuy*lk6j&|( z91h1CruzWhxUV-4Zed-GV8mOZM@hB9QVl={rFnN-HgB{o-%9-be!n>9srj1vaX1`p z49^2}13N1rwr<^uIZw^UmdzVMUo+!XIWZ4Vu9Fq{R^zXw51$9f;ph_=eSq>MX5{&W zbu|JRG|-xutQW4$Xuytqz9i<|87 zIh;fzt_&dSb8(YhK8KTN#FYW$a5x+%5rV-WYaMh^TKj9}JD0B+wo__yIC01S2XuW( U&lI%c+W-In07*qoM6N<$g3;>KumAu6 diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index a6e58022815..d2ccdeaee1c 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -7,7 +7,7 @@ e||(e=cf),this.update=e,this.update()}function ta(t,e){var n=e?"svg":"div";retur return this.node},render:function(){return this.node||(this.node=document.createTextNode(this.text)),this.node},toString:function(t){return t?Pe(this.text):this.text},unrender:function(t){return t?this.detach():void 0}};var yc=bc,_c=Ce,xc=Ee,wc=function(t,e,n){var a;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,a=ls(t.root,e,t.parentFragment),void 0!=a?this.resolve(a):bs.addUnresolved(this)};wc.prototype={resolve:function(t){this.keypath&&!t&&bs.addUnresolved(this),this.resolved=!0,this.keypath=t,this.callback(t)},forceResolution:function(){this.resolve(P(this.ref))},rebind:function(t,e){var n;void 0!=this.keypath&&(n=this.keypath.replace(t,e),void 0!==n&&this.resolve(n))},unbind:function(){this.resolved||bs.removeUnresolved(this)}};var kc=wc,Pc=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Cc={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};Pc.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,a=Cc[e];if(!a)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(P("@"+a.prefix+Se(this.cached,a)));if(-1!==a.prop.indexOf("index")||-1!==a.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===Bu&&void 0!==(t=Se(n,a)))return this.cached=n,n.registerIndexRef(this),this.callback(P("@"+a.prefix+t));n=!n.parent&&n.owner&&n.owner.component&&n.owner.component.parentFragment&&!n.owner.component.instance.isolated?n.owner.component.parentFragment:n.parent}else for(;n;){if(void 0!==(t=Se(n,a)))return this.callback(P("@"+a.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Ec=Pc,Sc=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Sc.prototype={rebind:function(){var t,e=this.ref.ref;t="k"===e.ref.t?"k"+e.fragment.key:"i"+e.fragment.index,void 0!==t&&this.callback(P("@"+t))},unbind:function(){this.ref.ref.fragment.unregisterIndexRef(this)}};var Ac=Sc,Oc=Ae;Ae.resolve=function(t){var e,n,a={};for(e in t.refs)n=t.refs[e],a[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return a};var Tc,Mc=Oe,Rc=Te,jc={},Lc=Function.prototype.bind;Tc=function(t,e,n,a){var r,i=this;r=t.root,this.root=r,this.parentFragment=e,this.callback=a,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return Mc(i,t,function(t){i.resolve(e,t)})}),this.ready=!0,this.bubble()},Tc.prototype={bubble:function(){this.ready&&(this.uniqueString=Re(this.str,this.keypaths),this.keypath=je(this.uniqueString),this.createEvaluator(),this.callback(this.keypath))},unbind:function(){for(var t;t=this.refResolvers.pop();)t.unbind()},resolve:function(t,e){this.keypaths[t]=e,this.bubble()},createEvaluator:function(){var t,e,n,a,r,i=this;a=this.keypath,t=this.root.viewmodel.computations[a.str],t?this.root.viewmodel.mark(a):(r=Rc(this.str,this.refResolvers.length),e=this.keypaths.map(function(t){var e;return"undefined"===t?function(){}:t.isSpecial?(e=t.value,function(){return e}):function(){var e=i.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=Ne(e,i.root)),e}}),n={deps:this.keypaths.filter(Le),getter:function(){var t=e.map(Me);return r.apply(null,t)}},t=this.root.viewmodel.compute(a,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Nc=Tc,Dc=function(t,e,n){var a=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Du?this.refResolver=Mc(this,t.n,function(t){a.resolve(t)}):new Nc(e,n,t,function(t){a.resolve(t)})};Dc.prototype={resolve:function(t){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.keypath=t,this.value=this.viewmodel.get(t),this.bind(),this.resolver.bubble()},bind:function(){this.viewmodel.register(this.keypath,this)},rebind:function(t,e){this.refResolver&&this.refResolver.rebind(t,e)},setValue:function(t){this.value=t,this.resolver.bubble()},unbind:function(){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.refResolver&&this.refResolver.unbind()},forceResolution:function(){this.refResolver&&this.refResolver.forceResolution()}};var Fc=Dc,Ic=function(t,e,n){var a,r,i,o,s=this;this.parentFragment=o=t.parentFragment,this.root=a=t.root,this.mustache=t,this.ref=r=e.r,this.callback=n,this.unresolved=[],(i=ls(a,r,o))?this.base=i:this.baseResolver=new kc(this,r,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Fc(t,s,o)}),this.ready=!0,this.bubble()};Ic.prototype={getKeypath:function(){var t=this.members.map(De);return!t.every(Fe)||this.baseResolver?null:this.base.join(t.join("."))},bubble:function(){this.ready&&!this.baseResolver&&this.callback(this.getKeypath())},unbind:function(){this.members.forEach(K)},rebind:function(t,e){var n;if(this.base){var a=this.base.replace(t,e);a&&a!==this.base&&(this.base=a,n=!0)}this.members.forEach(function(a){a.rebind(t,e)&&(n=!0)}),n&&this.bubble()},forceResolution:function(){this.baseResolver&&(this.base=P(this.ref),this.baseResolver.unbind(),this.baseResolver=null),this.members.forEach(Ie),this.bubble()}};var Bc=Ic,qc=Be,Gc=qe,Uc=Ge,Vc={getValue:xc,init:qc,resolve:Gc,rebind:Uc},zc=function(t){this.type=Pu,Vc.init(this,t)};zc.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:Vc.resolve,rebind:Vc.rebind,detach:gc,unbind:_c,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:Vc.getValue,setValue:function(t){var e;this.keypath&&(e=this.root.viewmodel.wrapped[this.keypath.str])&&(t=e.get()),s(t,this.value)||(this.value=t,this.parentFragment.bubble(),this.node&&bs.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?Pe(e):e}};var Wc=zc,Hc=Ue,Kc=Ve,Qc=ze,$c=We,Yc=He,Xc=Ke,Jc=Qe,Zc=$e,tl=Ye,el=function(t,e){Vc.rebind.call(this,t,e)},nl=Je,al=Ze,rl=ln,il=fn,ol=dn,sl=vn,pl=function(t){this.type=Eu,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Iu,this.pElement=t.pElement,this.fragments=[],this.fragmentsToCreate=[],this.fragmentsToRender=[],this.fragmentsToUnrender=[],t.template.i&&(this.indexRefs=t.template.i.split(",").map(function(t,e){return{n:t,t:0===e?"k":"i"}})),this.renderedFragments=[],this.length=0,Vc.init(this,t)};pl.prototype={bubble:Hc,detach:Kc,find:Qc,findAll:$c,findAllComponents:Yc,findComponent:Xc,findNextNode:Jc,firstNode:Zc,getIndexRef:function(t){if(this.indexRefs)for(var e=this.indexRefs.length;e--;){var n=this.indexRefs[e];if(n.n===t)return n}},getValue:Vc.getValue,shuffle:tl,rebind:el,render:nl,resolve:Vc.resolve,setValue:al,toString:rl,unbind:il,unrender:ol,update:sl};var ul,cl,ll=pl,fl=gn,dl=bn,hl=yn,ml=_n,vl={};try{co("table").innerHTML="foo"}catch(Ao){ul=!0,cl={TABLE:['',"
    "],THEAD:['',"
    "],TBODY:['',"
    "],TR:['',"
    "],SELECT:['"]}}var gl=function(t,e,n){var a,r,i,o,s,p=[];if(null!=t&&""!==t){for(ul&&(r=cl[e.tagName])?(a=xn("DIV"),a.innerHTML=r[0]+t+r[1],a=a.querySelector(".x"),"SELECT"===a.tagName&&(i=a.options[a.selectedIndex])):e.namespaceURI===no.svg?(a=xn("DIV"),a.innerHTML=''+t+"",a=a.querySelector(".x")):(a=xn(e.tagName),a.innerHTML=t,"SELECT"===a.tagName&&(i=a.options[a.selectedIndex]));o=a.firstChild;)p.push(o),n.appendChild(o);if("SELECT"===e.tagName)for(s=p.length;s--;)p[s]!==i&&(p[s].selected=!1)}return p},bl=wn,yl=Pn,_l=Cn,xl=En,wl=Sn,kl=An,Pl=function(t){this.type=Cu,Vc.init(this,t)};Pl.prototype={detach:fl,find:dl,findAll:hl,firstNode:ml,getValue:Vc.getValue,rebind:Vc.rebind,render:yl,resolve:Vc.resolve,setValue:_l,toString:xl,unbind:_c,unrender:wl,update:kl};var Cl,El,Sl,Al,Ol=Pl,Tl=function(){this.parentFragment.bubble()},Ml=On,Rl=function(t){return this.node?lo(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},jl=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Ll=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Nl=function(t){return this.fragment?this.fragment.findComponent(t):void 0},Dl=Tn,Fl=Mn,Il=Rn,Bl=/^true|on|yes|1$/i,ql=/^[0-9]+$/,Gl=function(t,e){var n,a,r;return r=e.a||{},a={},n=r.twoway,void 0!==n&&(a.twoway=0===n||Bl.test(n)),n=r.lazy,void 0!==n&&(0!==n&&ql.test(n)?a.lazy=parseInt(n):a.lazy=0===n||Bl.test(n)),a},Ul=jn;Cl="altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath vkern".split(" "),El="attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan".split(" "),Sl=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Al=Sl(Cl.concat(El));var Vl=function(t){var e=t.toLowerCase();return Al[e]||e},zl=function(t,e){var n,a;if(n=e.indexOf(":"),-1===n||(a=e.substr(0,n),"xmlns"===a))t.name=t.element.namespace!==no.html?Vl(e):e;else if(e=e.substring(n+1),t.name=Vl(e),t.namespace=no[a.toLowerCase()],t.namespacePrefix=a,!t.namespace)throw'Unknown namespace ("'+a+'")'},Wl=Ln,Hl=Nn,Kl=Dn,Ql=Fn,$l={"accept-charset":"acceptCharset",accesskey:"accessKey",bgcolor:"bgColor","class":"className",codebase:"codeBase",colspan:"colSpan",contenteditable:"contentEditable",datetime:"dateTime",dirname:"dirName","for":"htmlFor","http-equiv":"httpEquiv",ismap:"isMap",maxlength:"maxLength",novalidate:"noValidate",pubdate:"pubDate",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",usemap:"useMap"},Yl=In,Xl=qn,Jl=Gn,Zl=Un,tf=Vn,ef=zn,nf=Wn,af=Hn,rf=Kn,of=Qn,sf=$n,pf=Yn,uf=Xn,cf=Jn,lf=Zn,ff=function(t){this.init(t)};ff.prototype={bubble:Ul,init:Hl,rebind:Kl,render:Ql,toString:Yl,unbind:Xl,update:lf};var df,hf=ff,mf=function(t,e){var n,a,r=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(a=new hf({element:t,name:n,value:e[n],root:t.root}),r[n]=a,"value"!==n&&r.push(a));return(a=r.value)&&r.push(a),r};"undefined"!=typeof document&&(df=co("div"));var vf=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new rv({root:t.root,owner:this,template:[e]})};vf.prototype={bubble:function(){this.node&&this.update(),this.element.bubble()},rebind:function(t,e){this.fragment.rebind(t,e)},render:function(t){this.node=t,this.isSvg=t.namespaceURI===no.svg,this.update()},unbind:function(){this.fragment.unbind()},update:function(){var t,e,n=this;t=""+this.fragment,e=ta(t,this.isSvg),this.attributes.filter(function(t){return ea(e,t)}).forEach(function(t){n.node.removeAttribute(t.name)}),e.forEach(function(t){n.node.setAttribute(t.name,t.value)}),this.attributes=e},toString:function(){return""+this.fragment}};var gf=vf,bf=function(t,e){return e?e.map(function(e){return new gf(t,e)}):[]},yf=function(t){var e,n,a,r;if(this.element=t,this.root=t.root,this.attribute=t.attributes[this.name||"value"],e=this.attribute.interpolator,e.twowayBinding=this,n=e.keypath){if("}"===n.str.slice(-1))return v("Two-way binding does not work with expressions (`%s` on <%s>)",e.resolver.uniqueString,t.name,{ractive:this.root}),!1;if(n.isSpecial)return v("Two-way binding does not work with %s",e.resolver.ref,{ractive:this.root}),!1}else{var i=e.template.r?"'"+e.template.r+"' reference":"expression";m("The %s being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity",i,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,a=this.root.viewmodel.get(n),void 0===a&&this.getInitialValue&&(a=this.getInitialValue(),void 0!==a&&this.root.viewmodel.set(n,a)),(r=na(t))&&(this.resetValue=a,r.formBindings.push(this))};yf.prototype={handleChange:function(){var t=this;bs.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),bs.scheduleTask(function(){return t.attribute.locked=!1}),bs.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(D(this.root._twowayBindings[e.str],this),this.keypath=n,t=this.root._twowayBindings[n.str]||(this.root._twowayBindings[n.str]=[]),t.push(this))},unbind:function(){}},yf.extend=function(t){var e,n=this;return e=function(t){yf.call(this,t),this.init&&this.init()},e.prototype=Po(n.prototype),a(e.prototype,t),e.extend=yf.extend,e};var _f,xf=yf,wf=aa;_f=xf.extend({getInitialValue:function(){return""},getValue:function(){return this.element.node.value},render:function(){var t,e=this.element.node,n=!1;this.rendered=!0,t=this.root.lazy,this.element.lazy===!0?t=!0:this.element.lazy===!1?t=!1:p(this.element.lazy)?(t=!1,n=+this.element.lazy):p(t||"")&&(n=+t,t=!1,this.element.lazy=n),this.handler=n?ia:wf,e.addEventListener("change",wf,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ra,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",wf,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1),t.removeEventListener("blur",ra,!1)}});var kf=_f,Pf=kf.extend({getInitialValue:function(){return this.element.fragment?""+this.element.fragment:""},getValue:function(){return this.element.node.innerHTML}}),Cf=Pf,Ef=oa,Sf={},Af=xf.extend({name:"checked",init:function(){this.siblings=Ef(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},handleChange:function(){bs.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),bs.end()},getValue:function(){return this.element.node.checked},unbind:function(){D(this.siblings,this)}}),Of=Af,Tf=xf.extend({name:"name",init:function(){this.siblings=Ef(this.root._guid,"radioname",this.keypath.str),this.siblings.push(this),this.radioName=!0},getInitialValue:function(){return this.element.getAttribute("checked")?this.element.getAttribute("value"):void 0},render:function(){var t=this.element.node;t.name="{{"+this.keypath.str+"}}",t.checked=this.root.viewmodel.get(this.keypath)==this.element.getAttribute("value"),t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&xf.prototype.handleChange.call(this)},rebound:function(t,e){var n;xf.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){D(this.siblings,this)}}),Mf=Tf,Rf=xf.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Ef(this.root._guid,"checkboxes",this.keypath.str),this.siblings.push(this),this.noInitialValue&&(this.siblings.noInitialValue=!0),this.siblings.noInitialValue&&this.element.getAttribute("checked")&&(t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),t.push(e))},unbind:function(){D(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),i(t)?this.isChecked=R(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",wf,!1),n.attachEvent&&n.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},changed:function(){var t=!!this.isChecked;return this.isChecked=this.element.node.checked,this.isChecked===t},handleChange:function(){this.isChecked=this.element.node.checked,xf.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sa).map(pa)}}),jf=Rf,Lf=xf.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},getValue:function(){return this.element.node.checked}}),Nf=Lf,Df=xf.extend({getInitialValue:function(){var t,e,n,a,r=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=r.length,t)){for(;e--;)if(r[e].getAttribute("selected")){n=r[e].getAttribute("value"),a=!0;break}if(!a)for(;++ee;e+=1)if(a=t[e],t[e].selected)return r=a._ractive?a._ractive.value:a.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Ff=Df,If=Ff.extend({getInitialValue:function(){return this.element.options.filter(function(t){return t.getAttribute("selected")}).map(function(t){return t.getAttribute("value")})},render:function(){var t;this.element.node.addEventListener("change",wf,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",wf,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,a,r,i;for(t=[],e=this.element.node.options,a=e.length,n=0;a>n;n+=1)r=e[n],r.selected&&(i=r._ractive?r._ractive.value:r.value,t.push(i));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&j(n,e)||Ff.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))},updateModel:function(){void 0!==this.attribute.value&&this.attribute.value.length||this.root.viewmodel.set(this.keypath,this.initialValue)}}),Bf=If,qf=xf.extend({render:function(){this.element.node.addEventListener("change",wf,!1)},unrender:function(){this.element.node.removeEventListener("change",wf,!1)},getValue:function(){return this.element.node.files}}),Gf=qf,Uf=kf.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),Vf=ua,zf=la,Wf=fa,Hf=da,Kf=ha,Qf=/^event(?:\.(.+))?/,$f=ba,Yf=ya,Xf={},Jf={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Zf=xa,td=wa,ed=ka,nd=Pa,ad=Ca,rd=function(t,e,n){this.init(t,e,n)};rd.prototype={bubble:zf,fire:Wf,getAction:Hf,init:Kf,listen:Yf,rebind:Zf,render:td,resolve:ed,unbind:nd,unrender:ad};var id=rd,od=function(t,e){var n,a,r,i,o=[];for(a in e)if(e.hasOwnProperty(a))for(r=a.split("-"),n=r.length;n--;)i=new id(t,r[n],e[a]),o.push(i);return o},sd=function(t,e){var n,a,r,i=this;this.element=t,this.root=n=t.root,a=e.n||e,("string"==typeof a||(r=new rv({template:a,root:n,owner:t}),a=""+r,r.unbind(),""!==a))&&(e.a?this.params=e.a:e.d&&(this.fragment=new rv({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,i.params=this.getArgsList(),i.ready&&i.update()}),this.fn=g("decorators",n,a),this.fn||l(Io(a,"decorator")))};sd.prototype={init:function(){var t,e,n;if(t=this.element.node,this.params?(n=[t].concat(this.params),e=this.fn.apply(this.root,n)):e=this.fn.call(this.root,t),!e||!e.teardown)throw Error("Decorator definition must return an object with a teardown method");this.actual=e,this.ready=!0},update:function(){this.actual.update?this.actual.update.apply(this.root,this.params):(this.actual.teardown(!0),this.init())},rebind:function(t,e){this.fragment&&this.fragment.rebind(t,e)},teardown:function(t){this.torndown=!0,this.ready&&this.actual.teardown(),!t&&this.fragment&&this.fragment.unbind()}};var pd,ud,cd,ld=sd,fd=Ra,dd=ja,hd=Ba,md=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Ji?(ud={},cd=co("div").style,pd=function(t){var e,n,a;if(t=md(t),!ud[t])if(void 0!==cd[t])ud[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cd[n+a]){ud[t]=n+a;break}return ud[t]}):pd=null;var vd,gd,bd=pd;Ji?(gd=window.getComputedStyle||So.getComputedStyle,vd=function(t){var e,n,a,r,o;if(e=gd(this.node),"string"==typeof t)return o=e[bd(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bd(r)],"0px"===o&&(o=0),n[r]=o;return n}):vd=null;var yd=vd,_d=function(t,e){var n;if("string"==typeof t)this.node.style[bd(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bd(n)]=t[n]);return this},xd=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(v(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,xs.add(this)};xd.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wd,kd,Pd,Cd,Ed,Sd,Ad,Od,Td=xd,Md=RegExp("^-(?:"+ro.join("|")+")-"),Rd=function(t){return t.replace(Md,"")},jd=RegExp("^(?:"+ro.join("|")+")([A-Z])"),Ld=function(t){var e;return t?(jd.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Nd={},Dd={};Ji?(kd=co("div").style,function(){void 0!==kd.transition?(Pd="transition",Cd="transitionend",Ed=!0):void 0!==kd.webkitTransition?(Pd="webkitTransition",Cd="webkitTransitionEnd",Ed=!0):Ed=!1}(),Pd&&(Sd=Pd+"Duration",Ad=Pd+"Property",Od=Pd+"TimingFunction"),wd=function(t,e,n,a,r){setTimeout(function(){var i,o,s,p,u;p=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Ad]=a.map(bd).map(Ld).join(","),t.node.style[Od]=Ld(n.easing||"linear"),t.node.style[Sd]=n.duration/1e3+"s",u=function(e){var n;n=a.indexOf(md(Rd(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Cd,u,!1),s=!0,p())},t.node.addEventListener(Cd,u,!1),setTimeout(function(){for(var r,c,l,f,d,h=a.length,v=[];h--;)f=a[h],r=i+f,Ed&&!Dd[r]&&(t.node.style[bd(f)]=e[f],Nd[r]||(c=t.getStyle(f),Nd[r]=t.getStyle(f)!=e[f],Dd[r]=!Nd[r],Dd[r]&&(t.node.style[bd(f)]=c))),(!Ed||Dd[r])&&(void 0===c&&(c=t.getStyle(f)),l=a.indexOf(f),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),d=/[^\d]*$/.exec(e[f])[0],v.push({name:bd(f),interpolator:qo(parseFloat(c),parseFloat(e[f])),suffix:d}));v.length?new Td({root:t.root,duration:n.duration,easing:md(n.easing||""),step:function(e){var n,a;for(a=v.length;a--;)n=v[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,p()}}):o=!0,a.length||(t.node.removeEventListener(Cd,u,!1),s=!0,p())},0)},n.delay||0)}):wd=null;var Fd,Id,Bd,qd,Gd,Ud=wd;if("undefined"!=typeof document){if(Fd="hidden",Gd={},Fd in document)Bd="";else for(qd=ro.length;qd--;)Id=ro[qd],Fd=Id+"Hidden",Fd in document&&(Bd=Id);void 0!==Bd?(document.addEventListener(Bd+"visibilitychange",Ga),Ga()):("onfocusout"in document?(document.addEventListener("focusout",Ua),document.addEventListener("focusin",Va)):(window.addEventListener("pagehide",Ua),window.addEventListener("blur",Ua),window.addEventListener("pageshow",Va),window.addEventListener("focus",Va)),Gd.hidden=!1)}var Vd,zd,Wd,Hd=Gd;Ji?(zd=window.getComputedStyle||So.getComputedStyle,Vd=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hd.hidden)return this.setStyle(t,e),Wd||(Wd=us.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(v('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new us(function(t){var e,i,o,s,p,u,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zd(r.node),p={},u=e.length;u--;)c=e[u],s=o[bd(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bd(c)]=s);return i.length?void Ud(r,a,n,i,t):void t()});return i}):Vd=null;var Kd=Vd,Qd=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},$d=za,Yd=function(t,e,n){this.init(t,e,n)};Yd.prototype={init:hd,start:$d,getStyle:yd,setStyle:_d,animateStyle:Kd,processParams:Qd};var Xd,Jd,Zd=Yd,th=Ha;Xd=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Jd=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Ja).join("")+this.conditionalAttributes.map(Ja).join(""),"option"===this.name&&Ya(this)&&(t+=" selected"),"input"===this.name&&Xa(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Pe(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Ml,find:Rl,findAll:jl,findAllComponents:Ll,findComponent:Nl,findNextNode:Dl,firstNode:Fl,getAttribute:Il,init:fd,rebind:dd,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,ph=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=N(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},uh=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',fh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Au,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Vc.init(this,t),this.keypath||((n=uh(this.root,this.name,e))?(_c.call(this),this.isNamed=!0,this.setTemplate(n)):v(lh,this.name))};fh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Uc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Vc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=uh(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=uh(this.root,this.name,this.parentFragment))&&(_c.call(this),this.isNamed=!0),e||v(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rv({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===ku?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||_c.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var dh,hh,mh,vh=fh,gh=pr,bh=ur,yh=new is("detach"),_h=cr,xh=lr,wh=fr,kh=dr,Ph=hr,Ch=mr,Eh=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Sh=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bp(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Eh(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};Co(Sh,t,{value:e})}),dh={},dh.__proto__?(hh=function(t){t.__proto__=Sh},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],Co(t,n,{value:Sh[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]; }),hh.unpatch=mh;var Oh,Th,Mh,Rh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=P(n),e._ractive||(Co(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Rh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Mh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Mh);a.splice(r,1)}}else delete t._ractive,Rh.unpatch(this.value)}},Mh="Something went wrong in a rather interesting way";var jh,Lh,Nh=Oh,Dh=/^\s*[0-9]+\s*$/,Fh=function(t){return Dh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),jh={filter:function(t,e,n){var a,r;return e?(e=P(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new Lh(t,e,n)}},Lh=function(t,e,n){var a,r,i;return n=P(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void vr(this,e,r)},Lh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){jh=!1}var Ih,Bh,qh=jh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Nh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Nh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Gh=Ih,Uh=gr,Vh={},zh=_r,Wh=xr,Hh=Pr,Kh=Or,Qh=Tr,$h=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};$h.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=$h,Xh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Xh.prototype={constructor:Xh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),f(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Mr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new Yh(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Jh=Xh,Zh=Rr,tm={FAILED_LOOKUP:!0},em=jr,nm={},am=Nr,rm=Dr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,p;s=a,p=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&p>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},pm=Ir,um={},cm=Gr,lm=Vr,fm=zr,dm=Wr,hm=Kr,mm={implicit:!0},vm={noCascade:!0},gm=$r,bm=Yr,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=Po(null),this.deps={computed:Po(null),"default":Po(null)},this.depsMap={computed:Po(null),"default":Po(null)},this.patternObservers=[],this.specials=Po(null),this.wrapped=Po(null),this.computations=Po(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=Po(null);for(e in s)this.map(P(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(P(e),o[e]);this.ready=!0};ym.prototype={adapt:Uh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:pm,register:cm,release:lm,reset:fm,set:dm,smartUpdate:hm,teardown:gm,unregister:bm};var _m=ym;Jr.prototype={constructor:Jr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var xm=Jr,wm=ei,km=/\$\{([^\}]+)\}/g,Pm=new is("construct"),Cm=new is("config"),Em=new xm("init"),Sm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Mm=function(t,e,n,r,o){var s,p,u,c,l,f,d={},h={},v={},g=[];for(p=t.parentFragment,u=t.root,o=o||{},a(d,o),o.content=r||[],d[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=p;c;){if(c.owner.type===Ru){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=fc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");fi(o)?(v[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?f?s.set(e,t.value):(h[e]=t.value,delete v[e]):f?s.viewmodel.mappings[e].resolve(t):v[e].keypath=t})):r=new Tm(t,o,function(t){f?s.set(e,t):h[e]=t}),g.push(r)}}),s=Po(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:u.magic||e.defaults.magic,modifyArrays:u.modifyArrays,adapt:u.adapt},{parent:u,component:t,container:l,mappings:v,inlinePartials:d,cssIds:p.cssIds}),f=!0,t.resolvers=g,s},Rm=di,jm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Lm=mi,Nm=vi,Dm=gi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=xi,Gm=function(t,e){this.init(t,e)};Gm.prototype={detach:bh,find:_h,findAll:xh,findAllComponents:wh,findComponent:kh,findNextNode:Ph,firstNode:Ch,init:Lm,rebind:Nm,render:Dm,toString:Fm,unbind:Im,unrender:qm};var Um=Gm,Vm=function(t){this.type=Ou,this.value=t.template.c};Vm.prototype={detach:gc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Vm,Wm=function(t){var e,n;this.type=Ru,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rv({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),D(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,$m=wi,Ym=Pi,Xm=Ci,Jm=Ei,Zm=Oi,tv=Mi,ev=function(t){this.init(t)};ev.prototype={bubble:cu,detach:lu,find:fu,findAll:du,findAllComponents:hu,findComponent:mu,findNextNode:vu,firstNode:gu,getArgsList:hc,getNode:mc,getValue:vc,init:$m,rebind:Ym,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Xm,toString:Jm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tv};var nv,av,rv=ev,iv=Ri,ov=["template","partials","components","decorators","events"],sv=new is("reset"),pv=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Au&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Mu&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Su&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},uv=ji,cv=_p("reverse"),lv=Li,fv=_p("shift"),dv=_p("sort"),hv=_p("splice"),mv=Di,vv=Fi,gv=new is("teardown"),bv=Bi,yv=qi,_v=Gi,xv=new is("unrender"),wv=_p("unshift"),kv=Ui,Pv=new is("update"),Cv=Vi,Ev={add:Zo,animate:Ps,detach:Es,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Gs,fire:Ws,get:Hs,insert:Qs,merge:Ys,observe:lp,observeOnce:fp,off:mp,on:vp,once:gp,pop:xp,push:wp,render:Tp,reset:iv,resetPartial:pv,resetTemplate:uv,reverse:cv,set:lv,shift:fv,sort:dv,splice:hv,subtract:mv,teardown:vv,toggle:bv,toHTML:yv,toHtml:yv,unrender:_v,unshift:wv,update:kv,updateModel:Cv},Sv=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Av=Hi,Ov=Yi,Tv=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};nv=function(t){return this instanceof nv?void Om(this,t):new nv(t)},av={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Ov},getNodeInfo:{value:Tv},parse:{value:Hp},Promise:{value:us},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:po},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Uo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Eo(nv,av),nv.prototype=a(Ev,so),nv.prototype.constructor=nv,nv.defaults=nv.prototype;var Mv="function";if(typeof Date.now!==Mv||typeof String.prototype.trim!==Mv||typeof Object.keys!==Mv||typeof Array.prototype.indexOf!==Mv||typeof Array.prototype.forEach!==Mv||typeof Array.prototype.map!==Mv||typeof Array.prototype.filter!==Mv||"undefined"!=typeof window&&typeof window.addEventListener!==Mv)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Rv=nv;return Rv})},{}],206:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,293],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,313],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,333]}],style:["width: ",{t:2,r:"percentage",p:[14,48,358]},"%"]}}," ",{p:[15,3,384],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,406]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],207:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(302),a=t(301);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,p=/([\w\-]+)\s*(\dx)/g,u=p.exec(s),c=u[1],l=u[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,1946],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,1966]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2048]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2e3]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2138]}],d:[]}},f:[{t:4,f:[{p:[78,5,2184],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2200]}]}}],n:50,r:"icon",p:[77,3,2167]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2251]}],n:50,r:"icon_stack",p:[80,3,2227]}," ",{t:16,p:[83,3,2297]}]}]},e.exports=a.extend(r.exports)},{205:205,301:301,302:302}],208:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,42],t:7,e:"header",f:[{p:[4,7,57],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,61]}]}," ",{t:4,f:[{p:[6,9,105],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,130]}]}],n:50,r:"button",p:[5,7,82]}]}],n:50,r:"title",p:[2,3,24]}," ",{p:[10,3,193],t:7,e:"article",f:[{t:16,p:[11,5,207]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],209:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{205:205}],210:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(202),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52,i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{202:202,205:205}],211:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,23]}]}]},e.exports=a.extend(r.exports)},{205:205}],212:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(301),a=t(303);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,739],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,716]}]},e.exports=a.extend(r.exports)},{205:205,301:301,303:303}],213:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,82],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,130]}],r:"labelcolor",p:[3,32,109]}]},f:[{t:2,r:"label",p:[3,84,161]},":"]}],n:50,r:"label",p:[2,3,64]}," ",{t:4,f:[{t:16,p:[6,5,210]}],n:50,r:"nowrap",p:[5,3,191]},{t:4,n:51,f:[{p:[8,5,235],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,263]}]},f:[{t:16,p:[9,7,304]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{205:205}],214:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,45],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,99]}],n:50,r:"button",p:[5,7,85]}]}],n:50,r:"title",p:[2,3,27]}," ",{p:[8,3,149],t:7,e:"article",f:[{t:16,p:[9,5,163]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],215:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(216)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,216:216}],216:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],217:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(302),a=t(301),r=t(303);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1391],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1441],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1478]}]}}," ",{p:[52,5,1505],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1525]}]}," ",{t:4,f:[{p:[54,7,1573],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1642],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1546]}]}],n:50,r:"config.titlebar",p:[49,1,1365]}]},e.exports=a.extend(r.exports)},{205:205,301:301,302:302,303:303}],218:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,636],t:7,e:"ui-notice",f:[{p:[28,5,652],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,677]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,784],t:7,e:"br"}," ",{p:[29,5,794],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,870],t:7,e:"br"}," ",{p:[30,5,880],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,997],t:7,e:"br"}," ",{p:[31,5,1007],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1124],t:7,e:"hr"}," ",{p:[33,5,1134],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1207],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1381],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1528],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1699],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1785],t:7,e:"hr"}," ",{p:[43,7,1797],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1815]}]},{p:[43,38,1828],t:7,e:"br"}," ",{p:[44,7,1840],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1858]}]}],n:50,r:"debug",p:[41,5,1765]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,596]}]},e.exports=a.extend(r.exports)},{205:205}],219:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,261],t:7,e:"div",a:{style:"float: left"},f:[{p:[16,2,288],t:7,e:"div",a:{"class":"item"},f:[{p:[17,3,309],t:7,e:"table",f:[{p:[17,10,316],t:7,e:"tr",f:[{t:4,f:[{p:[19,4,381],t:7,e:"td",f:[{p:[19,8,385],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[19,18,395]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[18,3,323]}," ",{t:4,f:[{p:[22,4,494],t:7,e:"td",f:[{p:[22,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[22,11,501]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[21,3,433]}," ",{t:4,f:[{p:[25,4,573],t:7,e:"td",f:[{p:[25,8,577],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[25,18,587]}]}}]}],n:50,r:"data.PC_ntneticon",p:[24,3,544]}," ",{t:4,f:[{p:[28,4,654],t:7,e:"td",f:[{p:[28,8,658],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[28,18,668]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[27,3,623]}," ",{t:4,f:[{p:[31,4,737],t:7,e:"td",f:[{p:[31,8,741], t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[31,11,744]},{p:[31,34,767],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[30,3,706]}," ",{t:4,f:[{p:[34,4,819],t:7,e:"td",f:[{p:[34,8,823],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[34,18,833]}]}}]}],n:52,r:"data.PC_programheaders",p:[33,3,783]}]}]}]}]}," ",{p:[39,1,882],t:7,e:"div",a:{style:"float: right"},f:[{p:[40,2,910],t:7,e:"table",f:[{p:[40,9,917],t:7,e:"tr",f:[{p:[41,3,924],t:7,e:"td",f:[{p:[41,7,928],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[43,4,1018],t:7,e:"td",f:[{p:[43,8,1022],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[44,4,1078],t:7,e:"td",f:[{p:[44,8,1082],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[42,3,983]}]}]}]}]}," ",{p:[48,1,1170],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[52,3,1223],t:7,e:"ui-notice",f:[{p:[53,5,1239],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[51,1,1198]},{p:[58,1,1305],t:7,e:"ui-display",f:[{p:[60,1,1319],t:7,e:"div",a:{"class":"item"},f:[{p:[61,3,1340],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[64,3,1389],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[65,2,1416],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[65,52,1466]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[65,89,1503]}]}]}]}," ",{t:4,f:[{p:[70,2,1586],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[70,12,1596]}]}],n:50,r:"data.error",p:[69,1,1566]},{t:4,n:51,f:[{p:[72,2,1625],t:7,e:"h2",f:["System Status"]}," ",{p:[73,2,1649],t:7,e:"div",a:{"class":"item"},f:[{p:[74,3,1670],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[77,3,1720],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[78,4,1749]}]}," ",{p:[80,3,1774],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[83,3,1820],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[84,4,1849]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[90,3,1936],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[93,3,1992],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,4,2021],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[94,37,2054]}],state:[{t:2,r:"healthState",p:[95,11,2081]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[95,28,2098]},"%"]}]}," ",{p:[97,3,2151],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[100,3,2202],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[101,4,2231],t:7,e:"table",f:[{t:4,f:[{p:[103,6,2271],t:7,e:"tr",f:[{p:[103,10,2275],t:7,e:"td",f:[{p:[103,14,2279],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[103,38,2303]}]}]}]}],n:52,r:"data.ai_laws",p:[102,5,2243]}]}]}," ",{p:[107,2,2352],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[108,3,2386],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[108,33,2416]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],220:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,261],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,304],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,346],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,363]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,414]}]}]}],n:50,r:"data.siliconUser",p:[8,3,275]},{t:4,n:51,f:[{p:[13,5,502],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,528]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,610],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,701],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,743],t:7,e:"ui-section",f:[{p:[21,11,766],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,783]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,853]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,916]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1022],t:7,e:"ui-section",f:[{p:[25,11,1045],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1062]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1130]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1211]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1295],t:7,e:"br"}," ",{p:[29,9,1309],t:7,e:"ui-section",f:[{p:[30,11,1332],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1463],t:7,e:"ui-section",f:[{p:[33,11,1486],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1623],t:7,e:"ui-section",f:[{p:[36,11,1646],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1773],t:7,e:"ui-section",f:[{p:[39,11,1796],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,663]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,1990],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2045],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2100],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2156],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,620]}]},r.exports.components=r.exports.components||{};var i={vents:t(226),modes:t(222),thresholds:t(225),status:t(224),scrubbers:t(223)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,222:222,223:223,224:224,225:225,226:226}],221:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{205:205}],222:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,111],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,161],t:7,e:"ui-section",f:[{p:[9,7,180],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,197]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,258]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,351]},"}"]},f:[{t:2,r:"name",p:[11,51,362]}]}]}],n:52,r:"data.modes",p:[7,3,136]}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],223:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,167],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,189]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,246],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,263]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,305]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,381]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,401]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,415]}]}]}," ",{p:[13,7,478],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,512],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[14,26,529]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[14,71,574]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[15,50,656]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[15,70,676]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[15,88,694]}]}]}," ",{p:[17,7,774],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[18,9,809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[18,26,826]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[18,70,870]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[19,48,950]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[19,68,970]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[19,84,986]}]}]}," ",{p:[21,7,1060],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[22,9,1097],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_co2"],s:'_0?"check-square-o":"square-o"'},p:[22,26,1114]}],style:[{t:2,x:{r:["filter_co2"],s:'_0?"selected":null'},p:[22,81,1169]}],action:"co2_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[23,50,1254]},'", "val": ',{t:2,x:{r:["filter_co2"],s:"+!_0"},p:[23,70,1274]},"}"]},f:["CO2"]}," ",{p:[24,9,1317],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_n2o"],s:'_0?"check-square-o":"square-o"'},p:[24,26,1334]}],style:[{t:2,x:{r:["filter_n2o"],s:'_0?"selected":null'},p:[24,81,1389]}],action:"n2o_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,50,1474]},'", "val": ',{t:2,x:{r:["filter_n2o"],s:"+!_0"},p:[25,70,1494]},"}"]},f:["N2O"]}," ",{p:[26,9,1537],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_toxins"],s:'_0?"check-square-o":"square-o"'},p:[26,26,1554]}],style:[{t:2,x:{r:["filter_toxins"],s:'_0?"selected":null'},p:[26,84,1612]}],action:"tox_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,50,1700]},'", "val": ',{t:2,x:{r:["filter_toxins"],s:"+!_0"},p:[27,70,1720]},"}"]},f:["Plasma"]}," ",{p:[28,3,1763],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_bz"],s:'_0?"check-square-o":"square-o"'},p:[28,20,1780]}],style:[{t:2,x:{r:["filter_bz"],s:'_0?"selected":null'},p:[28,74,1834]}],action:"bz_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[29,43,1911]},'", "val": ',{t:2,x:{r:["filter_bz"],s:"+!_0"},p:[29,63,1931]},"}"]},f:["BZ"]}," ",{p:[30,3,1966],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_freon"],s:'_0?"check-square-o":"square-o"'},p:[30,20,1983]}],style:[{t:2,x:{r:["filter_freon"],s:'_0?"selected":null'},p:[30,77,2040]}],action:"freon_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[31,46,2123]},'", "val": ',{t:2,x:{r:["filter_freon"],s:"+!_0"},p:[31,66,2143]},"}"]},f:["Freon"]}," ",{p:[32,3,2184],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_water_vapor"],s:'_0?"check-square-o":"square-o"'},p:[32,20,2201]}],style:[{t:2,x:{r:["filter_water_vapor"],s:'_0?"selected":null'},p:[32,83,2264]}],action:"water_vapor_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,52,2359]},'", "val": ',{t:2,x:{r:["filter_water_vapor"],s:"+!_0"},p:[33,72,2379]},"}"]},f:["Water Vapor"]}]}]}],n:52,r:"data.scrubbers",p:[7,3,138]},{t:4,n:51,f:[{p:[37,5,2486],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],224:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,107],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,126]}]},f:[{p:[5,6,142],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,155]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,232]},{t:2,r:"unit",p:[6,29,256]}]}]}],n:52,r:"adata.environment_data",p:[3,5,68]}," ",{p:[10,5,313],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,353],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,366]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,464]}]}]}," ",{p:[15,5,605],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,644],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,657]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,728]}]}]}],n:50,r:"data.environment_data",p:[2,3,34]},{t:4,n:51,f:[{p:[21,5,856],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,891],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1015],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1050],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,990]}]}]},e.exports=a.extend(r.exports)},{205:205}],225:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" th, td {\n padding-right: 16px;\n text-align: left;\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,112],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,137],t:7,e:"table",f:[{p:[8,5,149],t:7,e:"thead",f:[{p:[8,12,156],t:7,e:"tr",f:[{p:[9,7,167],t:7,e:"th"}," ",{p:[10,7,183],t:7,e:"th",f:[{p:[10,11,187],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,228],t:7,e:"th",f:[{p:[11,11,232],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,277],t:7,e:"th",f:[{p:[12,11,281],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,326],t:7,e:"th",f:[{p:[13,11,330],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,387],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,426],t:7,e:"tr",f:[{p:[17,9,439],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,443]}]}," ",{t:4,f:[{p:[18,27,485],t:7,e:"td",f:[{p:[19,11,500],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,547]},'", "var": "',{t:2,r:"val",p:[19,76,565]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,576]}]}]}],n:52,r:"settings",p:[18,9,467]}]}],n:52,r:"data.thresholds",p:[16,7,401]}]}," ",{p:[23,3,675],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],226:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,109],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,159],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,181]}]},f:[{p:[9,7,203],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,238],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,255]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,297]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,373]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,393]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,407]}]}]}," ",{p:[13,7,470],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,504],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,510]}]}]}," ",{p:[16,7,601],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,649],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,682]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,762]},'", "val": ',{t:2,r:"checks",p:[18,68,782]},"}"]},f:["Internal"]}," ",{p:[19,9,824],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,858]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,938]},'", "val": ',{t:2,r:"checks",p:[20,68,958]},"}"]},f:["External"]}]}," ",{p:[22,7,1018],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,9,1063],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[24,31,1149]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[24,45,1163]}]}," ",{p:[25,9,1208],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[25,42,1241]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[26,31,1340]},'"}']},f:["Reset"]}]}]}],n:52,r:"data.vents",p:[7,3,134]},{t:4,n:51,f:[{p:[30,5,1428],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],227:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" table {\n width: 100%;\n border-spacing: 2px;\n }\n th {\n text-align: left;\n }\n td {\n vertical-align: top;\n }\n td .button {\n margin-top: 4px\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-section",f:[{p:[3,5,32],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,49]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,109]}," Required"]}," ",{p:[4,5,169],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,246],t:7,e:"hr"}," ",{p:[7,3,254],t:7,e:"table",f:[{p:[8,3,264],t:7,e:"thead",f:[{p:[9,4,275],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,306],t:7,e:"th",f:[{p:[10,9,310],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,339]}]}]}],n:52,r:"data.regions",p:[9,8,279]}]}]}," ",{p:[13,3,391],t:7,e:"tbody",f:[{p:[14,4,402],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,433],t:7,e:"td",f:[{t:4,f:[{p:[16,11,466],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,483]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,531]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,605]},'"}']},f:[{t:2,r:"name",p:[17,56,615]}]}," ",{p:[18,9,644],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,437]}]}],n:52,r:"data.regions",p:[14,8,406]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],228:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1161],t:7,e:"ui-notice",f:[{p:[47,3,1175],t:7,e:"b",f:[{p:[47,6,1178],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1208],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1280],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1307]}," seconds... ",{p:[50,3,1338],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1402],t:7,e:"br"},{p:[50,71,1406],t:7,e:"br"},{p:[50,75,1410],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1138]},{t:4,n:51,f:[{p:[53,2,1439],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1481],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1521],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1538]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1589]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1454]},{t:4,n:51,f:[{p:[59,3,1674],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1700]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1785],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1822],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1903],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1916]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,1955]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1858]},{t:4,n:51,f:[{p:[67,5,2013],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2030]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2083]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2145]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2223],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2261],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2274]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2310]}]}]}," ",{p:[74,4,2417],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2492],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2525]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2558]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2584]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2451]},{t:4,n:51,f:[{p:[78,5,2647],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2749],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2830],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2843]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2881]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2786]},{t:4,n:51,f:[{p:[86,4,2941],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,2958]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3008]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3070]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3147],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3160]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3197]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2710]}]}," ",{p:[94,2,3352],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3422],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3441]}],nowrap:0},f:[{p:[97,5,3464],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[97,26,3485]}," W"]}," ",{p:[98,5,3551],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3572],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3585]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3619]}]}]}," ",{p:[99,5,3667],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3689],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3695]}]},"]"]}," ",{p:[100,5,3764],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3855],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3888]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,3969]}]},f:["Auto"]}," ",{p:[104,6,4013],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4048]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4114]}]},f:["On"]}," ",{p:[106,6,4154],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4185]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4251]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3809]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3391]}," ",{p:[112,4,4342],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4376],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[113,22,4395]}," W"]}]}]}," ",{t:4,f:[{p:[117,4,4497],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4537],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4636],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4653]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4674]}],action:[{t:2,r:"malfAction",p:[120,97,4728]}]},f:[{t:2,r:"malfButton",p:[120,113,4744]}]}],n:50,r:"data.malfStatus",p:[119,3,4608]}]}],n:50,r:"data.siliconUser",p:[116,2,4469]}," ",{p:[124,2,4808],t:7,e:"ui-notice",f:[{p:[125,4,4823],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[127,5,4902],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[127,11,4908]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,3,4857]},{t:4,n:51,f:[{p:[129,5,4978],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[129,22,4995]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[129,79,5052]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{205:205}],229:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],230:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{205:205}],231:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,46],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,63]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,107]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,161]}]}]}," ",{p:[6,3,218],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,259],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,353],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,383]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,510],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,516]}," kPa"]}]}," ",{p:[11,3,576],t:7,e:"ui-section",a:{label:"Filter"},f:[{p:[12,5,608],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==""?"selected":null'},p:[12,23,626]}],action:"filter",params:'{"mode": ""}'},f:["Nothing"]}," ",{p:[14,5,742],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="plasma"?"selected":null'},p:[14,23,760]}],action:"filter",params:'{"mode": "plasma"}'},f:["Plasma"]}," ",{p:[16,5,887],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="o2"?"selected":null'},p:[16,23,905]}],action:"filter",params:'{"mode": "o2"}'},f:["O2"]}," ",{p:[18,5,1020],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2"?"selected":null'},p:[18,23,1038]}],action:"filter",params:'{"mode": "n2"}'},f:["N2"]}," ",{p:[20,5,1153],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="co2"?"selected":null'},p:[20,23,1171]}],action:"filter",params:'{"mode": "co2"}'},f:["CO2"]}," ",{p:[22,5,1289],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2o"?"selected":null'},p:[22,23,1307]}],action:"filter",params:'{"mode": "n2o"}'},f:["N2O"]}," ",{p:[24,2,1422],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="bz"?"selected":null'},p:[24,20,1440]}],action:"filter",params:'{"mode": "bz"}'},f:["BZ"]}," ",{p:[26,2,1553],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="freon"?"selected":null'},p:[26,20,1571]}],action:"filter",params:'{"mode": "freon"}'},f:["Freon"]}," ",{p:[28,2,1693],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="water_vapor"?"selected":null'},p:[28,20,1711]}],action:"filter",params:'{"mode": "water_vapor"}'},f:["Water Vapor"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],232:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,46],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,63]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,107]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,161]}]}]}," ",{p:[6,3,218],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,259],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}' -},f:["Set"]}," ",{p:[8,5,353],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,383]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,514],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,520]}," kPa"]}]}," ",{p:[11,3,584],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,616],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,655]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,770],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,804]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,920],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,953]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1070],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1108]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1224],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1230]},"%"]}]}," ",{p:[22,3,1298],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1330],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1369]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1484],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1518]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1634],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1667]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1784],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1822]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1938],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1944]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,46],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,63]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,107]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,161]}]}]}," ",{t:4,f:[{p:[7,5,244],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,285],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,373],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,403]}],action:"transfer",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,520],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,526]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,218]},{t:4,n:51,f:[{p:[13,5,597],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,640],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,736],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,766]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,895],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,901]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,65],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,98]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,143]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,179]}]}," ",{p:[4,5,230],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,282]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,327]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,405],t:7,e:"ui-section",f:[{p:[7,5,422],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,511],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,595],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,601]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,635]}]}," ",{p:[10,5,680],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,762],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,863],t:7,e:"ui-section",f:[{p:[14,7,882],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,985],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1090],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,22],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,38]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,77],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,160],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,192],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,242]}]}]}," ",{p:[11,3,288],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[12,5,322],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[12,38,355]}],action:"fire"},f:["FIRE!"]}]}],n:50,r:"data.connected",p:[7,3,135]}," ",{t:4,f:[{p:[16,3,477],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[17,7,516],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[15,3,451]}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,14],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,34]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,180],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,259],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,293],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,299]}," kPa"]}]}," ",{p:[11,3,363],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,393],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,406]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,451]}]}]}," ",{t:4,f:[{p:[15,3,559],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,610]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,664]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,705]}]}]}],n:50,r:"data.isPrototype",p:[14,3,531]}]}," ",{p:[22,1,818],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,847],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,889],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,902]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,936]}],value:[{t:2,r:"data.releasePressure",p:[25,14,978]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1004]}," kPa"]}]}," ",{p:[27,3,1073],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1117],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1150]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1304],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1335]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1480],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1574],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1604]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1763],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1794],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1811]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1864]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1957]}]}]}]}," ",{t:4,f:[{p:[42,1,2049],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2112],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2152],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2185]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2312],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2343]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2472],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2504]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2587],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2617]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2091]}," ",{p:[55,3,2779],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2811],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2844]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2913]}]}," ",{p:[59,2,2959],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3005],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3011]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2022]},{p:{button:[{t:4,f:[{p:[69,7,3209],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3240]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3175]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3370],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3400]}]}," ",{p:[76,3,3444],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3477]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3340]},{t:4,n:51,f:[{p:[80,3,3556],t:7,e:"ui-section",f:[{p:[81,4,3572],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"Centcom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to Centcom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,48],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,81]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,166],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,222]}]}]}," ",{p:[8,1,286],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,326],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,345]}],candystripe:0,right:0},f:[{p:[11,5,378],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,384]}]}," ",{p:[12,5,404],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,410]}]}," ",{p:[13,5,434],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,446]}]}," ",{p:[14,5,470],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,494]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,599]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,618]}]}]}],n:52,r:"data.abilities",p:[9,1,299]},{t:4,f:[{p:[23,3,716],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,694]}]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,30],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,62],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,83]}],value:[{t:2,r:"data.energy",p:[3,53,110]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,127]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,307],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,337]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[9,114,414]},"}"]},f:[{t:2,r:".",p:[9,122,422]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,264]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,471],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,519],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,586]},'"}']},f:[{t:2,r:"title",p:[14,84,596]}]}],n:52,r:"data.chemicals",p:[13,5,488]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,766],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,825]},"}"]},f:[{t:2,r:".",p:[21,74,833]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,723]}," ",{p:[23,5,869],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,900]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,995],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1063],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1069]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1111]}," Units"]}," ",{p:[28,7,1155],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1206],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1249]}," units of ",{t:2,r:"name",p:[30,87,1284]}]},{p:[30,102,1299],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1167]},{t:4,n:51,f:[{p:[32,9,1328],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1029]},{t:4,n:51,f:[{p:[35,7,1401],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,34],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,82]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,134]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,182]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,244]}]}]}," ",{p:[8,3,307],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,338],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,413]}," K"]}]}]}," ",{p:{button:[{p:[14,5,551],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,582]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,677],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,745],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,764]}," K"]}," ",{p:[19,7,813],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,865],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,908]}," units of ",{t:2,r:"name",p:[21,87,943]}]},{p:[21,102,958],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,826]},{t:4,n:51,f:[{p:[23,9,987],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,711]},{t:4,n:51,f:[{p:[26,7,1060],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,68],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,85]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,140]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,195]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject and Clear Buffer":"No beaker"'},p:[7,5,262]}]}," ",{p:[10,3,348],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,431],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,450]}," units of ",{t:2,r:"name",p:[13,60,485]}],nowrap:0},f:[{p:[14,7,509],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,558],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,611]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,655],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,708]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,752],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,805]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,953],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1006]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1056],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1100]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,396]},{t:4,n:51,f:[{p:[24,5,1178],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,364]},{t:4,n:51,f:[{p:[27,5,1246],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1329],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1359],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1397]}]},f:["Destroy"]}," ",{p:[34,3,1454],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1492]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1560],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1610],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1629]}," units of ",{t:2,r:"name",p:[37,59,1664]}],nowrap:0},f:[{p:[38,6,1687],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1735],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1790]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1833],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1888]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1931],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,1986]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2031],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2086]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2134],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2189]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2238],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2282]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1576]}]}]}," ",{t:4,f:[{p:[52,3,2410],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2498],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2532]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2581]}]}," ",{p:[55,5,2661],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2683]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2707]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2462]},{t:4,n:51,f:[{p:[57,5,2757],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2818],t:7,e:"br"}," ",{p:[61,4,2827],t:7,e:"br"}," ",{p:[62,4,2836],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2895]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,2978],t:7,e:"br"}," ",{p:[64,4,2987],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3046]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3129],t:7,e:"br"}," ",{p:[66,4,3138],t:7,e:"br"}," ",{p:[67,4,3147],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3207]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3291],t:7,e:"br"}," ",{p:[69,4,3300],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3360]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3445],t:7,e:"br"}," ",{p:[71,4,3454],t:7,e:"br"}," ",{p:[72,4,3463],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3524]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3609],t:7,e:"br"}," ",{p:[74,4,3618],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3679]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2388]},{t:4,n:51,f:[{p:[79,3,3796],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3850],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3909]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,3992],t:7,e:"br"}," ",{p:[82,4,4001],t:7,e:"br"}," ",{p:[83,4,4010],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4071]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4215],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4233]}]},f:[{p:[88,3,4263],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4310],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4353]}]}," ",{p:[90,3,4395],t:7,e:"br"}," ",{p:[91,3,4403],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4444],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4464]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4510]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4538]}]}," ",{p:[93,3,4574],t:7,e:"br"}," ",{p:[94,3,4582],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4623],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4645]}]}," ",{p:[96,3,4681],t:7,e:"br"}," ",{p:[97,3,4689],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4744],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4766]},"µ/minute"]}," ",{p:[99,3,4813],t:7,e:"br"}," ",{p:[100,3,4821],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4875],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4897]}]}," ",{p:[102,3,4933],t:7,e:"br"}," ",{p:[103,3,4941],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,4996],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5018]}]}," ",{p:[105,3,5055],t:7,e:"br"}," ",{p:[106,3,5063],t:7,e:"br"}," ",{p:[107,3,5071],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,42]}]}," ",{p:[3,3,105],t:7,e:"ui-button",a:{action:"component"},f:["Target Component: ",{t:3,r:"data.target_comp",p:[3,51,153]}]}]}," ",{t:4,f:[{p:[6,3,230],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[7,3,245]}]}],n:50,r:"data.recollection",p:[5,1,202]},{t:4,n:51,f:[{p:[10,2,292],t:7,e:"ui-display",a:{title:"Components (with Global Cache)",button:0},f:[{p:[11,4,354],t:7,e:"ui-section",f:[{t:3,r:"data.components",p:[12,6,372]}]}]}," ",{p:[15,2,427],t:7,e:"ui-display",f:[{p:[16,3,442],t:7,e:"ui-section",f:[{p:[17,4,458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[17,22,476]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[18,4,598],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[18,22,616]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[19,4,739],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[19,22,757]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[20,4,895],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Revenant"?"selected":null'},p:[20,22,913]}],action:"select",params:'{"category": "Revenant"}'},f:["Revenant"]}," ",{p:[21,4,1041],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Judgement"?"selected":null'},p:[21,22,1059]}],action:"select",params:'{"category": "Judgement"}'},f:["Judgement"]}," ",{p:[22,4,1189],t:7,e:"br"},{t:3,r:"data.tier_info",p:[22,8,1193]}]},{p:[23,16,1229],t:7,e:"hr"}," ",{p:[24,3,1236],t:7,e:"ui-section",f:[{t:4,f:[{p:[26,4,1279],t:7,e:"div",f:[{p:[26,9,1284],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[26,29,1304]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[26,99,1374]},'"}']},f:["Recite",{t:3,r:"required",p:[26,117,1392]}]}," ",{t:4,f:[{t:4,f:[{p:[29,6,1465],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[29,53,1512]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[29,72,1531]}]}],n:50,r:"bound",p:[28,5,1446]},{t:4,n:51,f:[{p:[31,6,1573],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[31,53,1620]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[27,6,1424]}," ",{t:3,r:"name",p:[34,6,1684]}," ",{t:3,r:"descname",p:[34,17,1695]}," ",{t:3,r:"invokers",p:[34,32,1710]}]}],n:52,r:"data.scripture",p:[25,3,1251]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){ +},f:["Set"]}," ",{p:[8,5,353],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,383]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,514],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,520]}," kPa"]}]}," ",{p:[11,3,584],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,616],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,655]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,770],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,804]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,920],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,953]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1070],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1108]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1224],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1230]},"%"]}]}," ",{p:[22,3,1298],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1330],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1369]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1484],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1518]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1634],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1667]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1784],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1822]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1938],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1944]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,46],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,63]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,107]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,161]}]}]}," ",{t:4,f:[{p:[7,5,244],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,285],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,373],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,403]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,520],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,526]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,218]},{t:4,n:51,f:[{p:[13,5,597],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,640],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,736],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,766]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,895],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,901]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,65],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,98]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,143]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,179]}]}," ",{p:[4,5,230],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,282]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,327]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,405],t:7,e:"ui-section",f:[{p:[7,5,422],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,511],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,595],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,601]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,635]}]}," ",{p:[10,5,680],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,762],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,863],t:7,e:"ui-section",f:[{p:[14,7,882],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,985],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1090],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,22],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,38]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,77],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,160],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,192],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,242]}]}]}," ",{p:[11,3,288],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[12,5,322],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[12,38,355]}],action:"fire"},f:["FIRE!"]}]}],n:50,r:"data.connected",p:[7,3,135]}," ",{t:4,f:[{p:[16,3,477],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[17,7,516],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[15,3,451]}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,14],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,34]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,180],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,259],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,293],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,299]}," kPa"]}]}," ",{p:[11,3,363],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,393],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,406]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,451]}]}]}," ",{t:4,f:[{p:[15,3,559],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,610]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,664]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,705]}]}]}],n:50,r:"data.isPrototype",p:[14,3,531]}]}," ",{p:[22,1,818],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,847],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,889],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,902]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,936]}],value:[{t:2,r:"data.releasePressure",p:[25,14,978]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1004]}," kPa"]}]}," ",{p:[27,3,1073],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1117],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1150]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1304],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1335]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1480],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1574],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1604]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1763],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1794],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1811]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1864]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1957]}]}]}]}," ",{t:4,f:[{p:[42,1,2049],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2112],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2152],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2185]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2312],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2343]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2472],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2504]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2587],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2617]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2091]}," ",{p:[55,3,2779],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2811],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2844]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2913]}]}," ",{p:[59,2,2959],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3005],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3011]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2022]},{p:{button:[{t:4,f:[{p:[69,7,3209],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3240]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3175]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3370],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3400]}]}," ",{p:[76,3,3444],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3477]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3340]},{t:4,n:51,f:[{p:[80,3,3556],t:7,e:"ui-section",f:[{p:[81,4,3572],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"Centcom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to Centcom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,48],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,81]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,166],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,222]}]}]}," ",{p:[8,1,286],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,326],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,345]}],candystripe:0,right:0},f:[{p:[11,5,378],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,384]}]}," ",{p:[12,5,404],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,410]}]}," ",{p:[13,5,434],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,446]}]}," ",{p:[14,5,470],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,494]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,599]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,618]}]}]}],n:52,r:"data.abilities",p:[9,1,299]},{t:4,f:[{p:[23,3,716],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,694]}]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,30],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,62],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,83]}],value:[{t:2,r:"data.energy",p:[3,53,110]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,127]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,307],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,337]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[9,114,414]},"}"]},f:[{t:2,r:".",p:[9,122,422]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,264]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,471],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,519],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,586]},'"}']},f:[{t:2,r:"title",p:[14,84,596]}]}],n:52,r:"data.chemicals",p:[13,5,488]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,766],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,825]},"}"]},f:[{t:2,r:".",p:[21,74,833]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,723]}," ",{p:[23,5,869],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,900]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,995],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1063],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1069]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1111]}," Units"]}," ",{p:[28,7,1155],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1206],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1249]}," units of ",{t:2,r:"name",p:[30,87,1284]}]},{p:[30,102,1299],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1167]},{t:4,n:51,f:[{p:[32,9,1328],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1029]},{t:4,n:51,f:[{p:[35,7,1401],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,34],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,82]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,134]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,182]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,244]}]}]}," ",{p:[8,3,307],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,338],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,413]}," K"]}]}]}," ",{p:{button:[{p:[14,5,551],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,582]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,677],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,745],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,764]}," K"]}," ",{p:[19,7,813],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,865],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,908]}," units of ",{t:2,r:"name",p:[21,87,943]}]},{p:[21,102,958],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,826]},{t:4,n:51,f:[{p:[23,9,987],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,711]},{t:4,n:51,f:[{p:[26,7,1060],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,68],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,85]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,140]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,195]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject and Clear Buffer":"No beaker"'},p:[7,5,262]}]}," ",{p:[10,3,348],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,431],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,450]}," units of ",{t:2,r:"name",p:[13,60,485]}],nowrap:0},f:[{p:[14,7,509],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,558],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,611]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,655],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,708]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,752],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,805]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,953],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1006]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1056],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1100]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,396]},{t:4,n:51,f:[{p:[24,5,1178],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,364]},{t:4,n:51,f:[{p:[27,5,1246],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1329],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1359],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1397]}]},f:["Destroy"]}," ",{p:[34,3,1454],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1492]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1560],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1610],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1629]}," units of ",{t:2,r:"name",p:[37,59,1664]}],nowrap:0},f:[{p:[38,6,1687],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1735],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1790]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1833],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1888]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1931],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,1986]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2031],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2086]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2134],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2189]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2238],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2282]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1576]}]}]}," ",{t:4,f:[{p:[52,3,2410],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2498],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2532]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2581]}]}," ",{p:[55,5,2661],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2683]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2707]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2462]},{t:4,n:51,f:[{p:[57,5,2757],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2818],t:7,e:"br"}," ",{p:[61,4,2827],t:7,e:"br"}," ",{p:[62,4,2836],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2895]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,2978],t:7,e:"br"}," ",{p:[64,4,2987],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3046]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3129],t:7,e:"br"}," ",{p:[66,4,3138],t:7,e:"br"}," ",{p:[67,4,3147],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3207]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3291],t:7,e:"br"}," ",{p:[69,4,3300],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3360]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3445],t:7,e:"br"}," ",{p:[71,4,3454],t:7,e:"br"}," ",{p:[72,4,3463],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3524]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3609],t:7,e:"br"}," ",{p:[74,4,3618],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3679]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2388]},{t:4,n:51,f:[{p:[79,3,3796],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3850],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3909]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,3992],t:7,e:"br"}," ",{p:[82,4,4001],t:7,e:"br"}," ",{p:[83,4,4010],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4071]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4215],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4233]}]},f:[{p:[88,3,4263],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4310],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4353]}]}," ",{p:[90,3,4395],t:7,e:"br"}," ",{p:[91,3,4403],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4444],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4464]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4510]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4538]}]}," ",{p:[93,3,4574],t:7,e:"br"}," ",{p:[94,3,4582],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4623],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4645]}]}," ",{p:[96,3,4681],t:7,e:"br"}," ",{p:[97,3,4689],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4744],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4766]},"µ/minute"]}," ",{p:[99,3,4813],t:7,e:"br"}," ",{p:[100,3,4821],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4875],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4897]}]}," ",{p:[102,3,4933],t:7,e:"br"}," ",{p:[103,3,4941],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,4996],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5018]}]}," ",{p:[105,3,5055],t:7,e:"br"}," ",{p:[106,3,5063],t:7,e:"br"}," ",{p:[107,3,5071],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,42]}]}," ",{p:[3,3,105],t:7,e:"ui-button",a:{action:"component"},f:["Target Component: ",{t:3,r:"data.target_comp",p:[3,51,153]}]}]}," ",{t:4,f:[{p:[6,3,230],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[7,3,245]}]}],n:50,r:"data.recollection",p:[5,1,202]},{t:4,n:51,f:[{p:[10,2,292],t:7,e:"ui-display",a:{title:"Components (with Global Cache)",button:0},f:[{p:[11,4,354],t:7,e:"ui-section",f:[{t:3,r:"data.components",p:[12,6,372]}]}]}," ",{p:[15,2,427],t:7,e:"ui-display",f:[{p:[16,3,442],t:7,e:"ui-section",f:[{p:[17,4,458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[17,22,476]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[18,4,598],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[18,22,616]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[19,4,739],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[19,22,757]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[20,4,895],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Revenant"?"selected":null'},p:[20,22,913]}],action:"select",params:'{"category": "Revenant"}'},f:["Revenant"]}," ",{p:[21,4,1041],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Judgement"?"selected":null'},p:[21,22,1059]}],action:"select",params:'{"category": "Judgement"}'},f:["Judgement"]}," ",{p:[22,4,1189],t:7,e:"br"},{t:3,r:"data.tier_info",p:[22,8,1193]}]},{p:[23,16,1229],t:7,e:"hr"}," ",{p:[24,3,1236],t:7,e:"ui-section",f:[{t:4,f:[{p:[26,4,1279],t:7,e:"div",f:[{p:[26,9,1284],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[26,29,1304]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[26,99,1374]},'"}']},f:["Recite",{t:3,r:"required",p:[26,117,1392]}]}," ",{t:4,f:[{t:4,f:[{p:[29,6,1465],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[29,53,1512]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[29,72,1531]}]}],n:50,r:"bound",p:[28,5,1446]},{t:4,n:51,f:[{p:[31,6,1573],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[31,53,1620]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[27,6,1424]}," ",{t:3,r:"name",p:[34,6,1684]}," ",{t:3,r:"descname",p:[34,17,1695]}," ",{t:3,r:"invokers",p:[34,32,1710]}]}],n:52,r:"data.scripture",p:[25,3,1251]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){ var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,70],t:7,e:"br"},{p:[2,74,74],t:7,e:"br"}," ",{p:[3,1,79],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,159],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,219],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,239],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,281],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,370],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,164]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,492],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,512],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,554],t:7,e:"table",f:[{p:[14,3,564],t:7,e:"tr",f:[{p:[15,4,572],t:7,e:"td",f:[{p:[15,8,576],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,601],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,605]},"C"]}]}," ",{p:[18,3,636],t:7,e:"tr",f:[{p:[19,4,645],t:7,e:"td",f:[{p:[19,8,649],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,668],t:7,e:"td",f:[{p:[20,8,672],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,737]}]},f:["Standard"]}]},{p:[21,4,807],t:7,e:"td",f:[{p:[21,8,811],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,876]}]},f:["Upgraded"]}]},{p:[22,4,946],t:7,e:"td",f:[{p:[22,8,950],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1015]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1092],t:7,e:"tr",f:[{p:[25,4,1100],t:7,e:"td",f:[{p:[25,8,1104],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1126],t:7,e:"td",f:[{p:[26,8,1130],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1189]}]},f:["Standard"]}]},{p:[27,4,1256],t:7,e:"td",f:[{p:[27,8,1260],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1319]}]},f:["Upgraded"]}]},{p:[28,4,1386],t:7,e:"td",f:[{p:[28,8,1390],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1449]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1523],t:7,e:"tr",f:[{p:[31,4,1531],t:7,e:"td",f:[{p:[31,8,1535],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1559],t:7,e:"td",f:[{p:[32,8,1563],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1628]}]},f:["None"]}]},{p:[33,4,1694],t:7,e:"td",f:[{p:[33,8,1698],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1763]}]},f:["Standard"]}]},{p:[34,4,1833],t:7,e:"td",f:[{p:[34,8,1837],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1902]}]},f:["Advanced"]}]}]}," ",{p:[36,3,1979],t:7,e:"tr",f:[{p:[37,4,1987],t:7,e:"td",f:[{p:[37,8,1991],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2015],t:7,e:"td",f:[{p:[38,8,2019],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2084]}]},f:["None"]}]},{p:[39,4,2152],t:7,e:"td",f:[{p:[39,8,2156],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2221]}]},f:["Standard"]}]}]}," ",{p:[41,3,2300],t:7,e:"tr",f:[{p:[42,4,2308],t:7,e:"td",f:[{p:[42,8,2312],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2335],t:7,e:"td",f:[{p:[43,8,2339],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2398]}]},f:["None"]}]},{p:[44,4,2461],t:7,e:"td",f:[{p:[44,8,2465],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2524]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2658],t:7,e:"table",f:[{p:[50,5,2670],t:7,e:"tr",f:[{p:[51,6,2680],t:7,e:"td",f:[{p:[51,10,2684],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2712],t:7,e:"td",f:[{p:[52,10,2716],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2773]}]},f:["Standard"]}]},{p:[53,6,2841],t:7,e:"td",f:[{p:[53,10,2845],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2902]}]},f:["Advanced"]}]}]}," ",{p:[55,5,2979],t:7,e:"tr",f:[{p:[56,6,2989],t:7,e:"td",f:[{p:[56,10,2993],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3018],t:7,e:"td",f:[{p:[57,10,3022],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3083]}]},f:["None"]}]},{p:[58,6,3149],t:7,e:"td",f:[{p:[58,10,3153],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3214]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2612]}," ",{p:[62,3,3313],t:7,e:"table",f:[{p:[63,4,3324],t:7,e:"tr",f:[{p:[64,5,3333],t:7,e:"td",f:[{p:[64,9,3337],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3363],t:7,e:"td",f:[{p:[65,9,3367],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3444],t:7,e:"hr"}," ",{p:[70,2,3450],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3575],t:7,e:"br"}," ",{p:[71,2,3581],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3709],t:7,e:"br"}," ",{p:[72,2,3715],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,3946],t:7,e:"br"}," ",{p:[73,2,3952],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4158],t:7,e:"br"}," ",{p:[74,2,4164],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4408],t:7,e:"br"}," ",{p:[75,2,4414],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4653],t:7,e:"br"}," ",{p:[76,2,4659],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4903],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,4929],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,4978],t:7,e:"br"}," ",{p:[81,2,4984],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5076],t:7,e:"br"}," ",{p:[82,2,5082],t:7,e:"i",f:["Current credits: ",{p:[82,22,5102],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5105]},"C"]}]},{p:[82,50,5130],t:7,e:"br"}," ",{p:[83,2,5136],t:7,e:"i",f:["Total price: ",{p:[83,18,5152],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5155]},"C"]}]},{p:[83,49,5183],t:7,e:"br"},{p:[83,53,5187],t:7,e:"br"}," ",{p:[84,2,5193],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5229]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5337],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5381],t:7,e:"br"}," ",{p:[88,2,5387],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,28],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,49],t:7,e:"table",f:[{p:[4,10,56],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,121],t:7,e:"td",f:[{p:[6,8,125],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,135]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,63]}," ",{t:4,f:[{p:[9,4,234],t:7,e:"td",f:[{p:[9,8,238],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,241]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,173]}," ",{t:4,f:[{p:[12,4,313],t:7,e:"td",f:[{p:[12,8,317],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,327]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,284]}," ",{t:4,f:[{p:[15,4,394],t:7,e:"td",f:[{p:[15,8,398],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,408]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,363]}," ",{t:4,f:[{p:[18,4,477],t:7,e:"td",f:[{p:[18,8,481],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,484]},{p:[18,34,507],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,446]}," ",{t:4,f:[{p:[21,4,559],t:7,e:"td",f:[{p:[21,8,563],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,573]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,523]}]}]}]}]}," ",{p:[26,1,622],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,650],t:7,e:"table",f:[{p:[27,9,657],t:7,e:"tr",f:[{p:[28,3,664],t:7,e:"td",f:[{p:[28,7,668],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,758],t:7,e:"td",f:[{p:[30,8,762],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,818],t:7,e:"td",f:[{p:[31,8,822],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,723]}]}]}]}]}," ",{p:[35,1,910],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,938],t:7,e:"ui-display",f:[{p:[38,2,952],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[39,2,1018],t:7,e:"table",f:[{t:4,f:[{p:[41,4,1055],t:7,e:"tr",f:[{p:[41,8,1059],t:7,e:"td",f:[{p:[41,12,1063],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[41,64,1115]},'"}']},f:[{t:2,r:"desc",p:[42,5,1132]}]}]},{p:[44,4,1160],t:7,e:"td",f:[{p:[44,8,1164],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[44,26,1182]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[44,114,1270]},'"}']}}]}]}],n:52,r:"data.programs",p:[40,3,1028]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,21],t:7,e:"ui-display",f:[{p:[3,2,35],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,62],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,79]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,130]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,197]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,279],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,406],t:7,e:"ui-section",f:[{p:[15,3,421],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,374]}]}," ",{p:[19,1,522],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,579],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,598]}]},f:[{t:4,f:[{p:[23,7,633],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,685]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,708]}]},f:[{t:2,r:"item",p:[25,4,767]}]}],n:52,r:"items",p:[22,3,611]}]}],n:52,r:"data.drawables",p:[20,3,553]}]}," ",{p:[31,1,844],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,876],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,911]}]}," ",{p:[34,2,943],t:7,e:"ui-section",f:[{p:[34,14,955],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{temperatureStatus:function(t){return 225>t?"good":273.15>t?"average":"bad"}},computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,445],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[23,3,477],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[24,3,509],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[24,9,515]}]}]}," ",{t:4,f:[{p:[27,5,629],t:7,e:"ui-section",a:{label:"State"},f:[{p:[28,7,662],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[28,20,675]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[28,43,698]}]}]}," ",{p:[30,4,817],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,6,855],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.occupant.bodyTemperature"],s:"_0(_1)"},p:[31,19,868]}]},f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[31,74,923]}," K"]}]}," ",{p:[33,5,1e3],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[34,7,1034],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[34,20,1047]}],max:[{t:2,r:"data.occupant.maxHealth",p:[34,54,1081]}],value:[{t:2,r:"data.occupant.health",p:[34,90,1117]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[35,16,1158]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[35,68,1210]}]}]}," ",{t:4,f:[{p:[38,7,1444],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[38,26,1463]}]},f:[{p:[39,9,1483],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[39,30,1504]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[39,66,1540]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[39,103,1577]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[37,5,1279]}],n:50,r:"data.hasOccupant",p:[26,3,600]}]}," ",{p:[44,1,1681],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[45,3,1709],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[46,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[46,22,1757]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[47,14,1816]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[48,14,1871]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[49,22,1929]}]}]}," ",{p:[51,3,1995],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[52,3,2030],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.cellTemperature"],s:"_0(_1)"},p:[52,16,2043]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[52,62,2089]}," K"]}]}," ",{p:[54,2,2152],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[55,5,2182],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[55,22,2199]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[55,73,2250]}]}," ",{p:[56,5,2302],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[56,22,2319]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[56,86,2383]}]}]}]}," ",{p:{button:[{p:[61,5,2524],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[61,36,2555]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[63,3,2656],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[66,9,2763],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[66,52,2806]}," units of ",{t:2,r:"name",p:[66,87,2841]}]},{p:[66,102,2856],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[65,7,2724]},{t:4,n:51,f:[{p:[68,9,2885],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[64,5,2690]},{t:4,n:51,f:[{p:[71,7,2958],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,14],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,73],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,43]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,147],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,119]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,239],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,203]},{t:4,n:51,f:[{p:[12,6,299],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,377],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,409],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,442]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,469]},"%"]}]}," ",{p:[20,5,511],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,547],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,568]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,625]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,691]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,739]}]}]}," ",{p:[27,2,811],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,840],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,874]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,951],t:7,e:"br"}]}," ",{p:[30,2,973],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1002],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1037]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1086]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1144]}]}},{p:[31,206,1205],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,42],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,79],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,100]}],value:[{t:2,r:"data.dna",p:[3,53,125]}]},f:[{t:2,r:"data.dna",p:[3,67,139]},"/",{t:2,r:"data.dna_max",p:[3,80,152]}," Samples"]}]}," ",{p:[5,3,204],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,240],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,261]}],value:[{t:2,r:"data.plants",p:[6,54,289]}]},f:[{t:2,r:"data.plants",p:[6,71,306]},"/",{t:2,r:"data.plants_max",p:[6,87,322]}," Samples"]}]}," ",{p:[8,3,377],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,414],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,435]}],value:[{t:2,r:"data.animals",p:[9,55,464]}]},f:[{t:2,r:"data.animals",p:[9,73,482]},"/",{t:2,r:"data.animals_max",p:[9,90,499]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,604],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,650],t:7,e:"ui-section",f:[{p:[15,2,664],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,731],t:7,e:"ui-section",f:[{p:[18,2,745],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,790]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,810]}]}," ",{p:[19,2,840],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,885]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,905]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,567]}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,41]}]},f:[{p:[3,5,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,114],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,169]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,200]}]},f:[{t:2,r:"answer",p:[7,53,235]}," (",{t:2,r:"amount",p:[7,65,247]},")"]}],n:52,r:"data.answers",p:[4,7,83]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,341],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,16],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,41]}]}]}," ",{p:[4,1,80],t:7,e:"ui-notice",f:[{p:[5,3,94],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,109]}]}]}," ",{p:[7,1,174],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,209],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,242]}]}," ",{p:[10,2,309],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,393]}]},f:["AUTHORIZE"]}," ",{p:[15,2,459],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,508]}]},f:["Repeal"]}," ",{p:[19,2,571],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,619]}]},f:["Repeal All"]}]}," ",{p:[24,1,699],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,768],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,799]}," (",{t:2,r:"job",p:[26,44,809]},")"]}],n:52,r:"data.authorizations",p:[25,2,736]},{t:4,n:51,f:[{p:[28,3,843],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,15],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,48]}]}," ",{p:[5,3,90],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,126]}]}," ",{p:[8,3,162],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,196],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,242]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,333]}]}," ",{p:[13,5,368],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,412]}],action:"neutral"}}," ",{p:[17,5,546],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,594]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,691]}]}]}]}," ",{t:4,f:[{p:[24,3,782],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,819],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,852]}]}," ",{p:[26,5,890],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,933]}]}," ",{p:[27,5,972],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,756]}]},e.exports=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,14],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,45]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"ui-display",f:[{p:[4,2,16],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,44],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,66],t:7,e:"table",f:[{p:[6,11,73],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,140],t:7,e:"td",f:[{p:[8,9,144],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,154]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,81]}," ",{t:4,f:[{p:[11,5,256],t:7,e:"td",f:[{p:[11,9,260],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,263]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,194]}," ",{t:4,f:[{p:[14,5,338],t:7,e:"td",f:[{p:[14,9,342],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,352]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,308]}," ",{t:4,f:[{p:[17,5,422],t:7,e:"td",f:[{p:[17,9,426],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,436]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,390]}," ",{t:4,f:[{p:[20,5,508],t:7,e:"td",f:[{p:[20,9,512],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,515]},{p:[20,35,538],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,476]}," ",{t:4,f:[{p:[23,5,593],t:7,e:"td",f:[{p:[23,9,597],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,607]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,556]}]}]}]}]}," ",{p:[28,2,661],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,690],t:7,e:"table",f:[{p:[29,10,697],t:7,e:"tr",f:[{p:[30,4,705],t:7,e:"td",f:[{p:[30,8,709],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,801],t:7,e:"td",f:[{p:[32,9,805],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,862],t:7,e:"td",f:[{p:[33,9,866],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,765]}]}]}]}]}," ",{p:[37,2,958],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[40,3,1007],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[41,27,1099]},{p:[41,41,1113],t:7,e:"br"}," ",{p:[42,3,1120],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[43,3,1221],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[39,2,986]},{t:4,n:51,f:[{t:4,f:[{p:[46,4,1320],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[46,21,1337]}]}," ",{p:[47,4,1363],t:7,e:"div",a:{"class":"item"},f:[{p:[48,4,1385],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[49,4,1440],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[50,4,1489],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[51,10,1550],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[52,4,1558]}],n:50,r:"data.filename",p:[45,3,1295]},{t:4,n:51,f:[{p:[54,4,1592],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[55,4,1629],t:7,e:"table",f:[{p:[56,5,1641],t:7,e:"tr",f:[{p:[57,6,1651],t:7,e:"th",f:["File name"]}," ",{p:[58,6,1675],t:7,e:"th",f:["File type"]}," ",{p:[59,6,1699],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[60,6,1728],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[63,6,1788],t:7,e:"tr",f:[{p:[64,7,1799],t:7,e:"td",f:[{t:2,r:"name",p:[64,11,1803]}]}," ",{p:[65,7,1823],t:7,e:"td",f:[".",{t:2,r:"type",p:[65,12,1828]}]}," ",{p:[66,7,1848],t:7,e:"td",f:[{t:2,r:"size",p:[66,11,1852]},"GQ"]}," ",{p:[67,7,1874],t:7,e:"td",f:[{p:[68,8,1886],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[68,59,1937]},'"}']},f:["VIEW"]}," ",{p:[69,8,1973],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[69,26,1991]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[69,105,2070]},'"}']},f:["DELETE"]}," ",{p:[70,8,2108],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[70,26,2126]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[70,101,2201]},'"}']},f:["RENAME"]}," ",{p:[71,8,2239],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[71,26,2257]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[71,100,2331]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[73,9,2402],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[73,27,2420]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[73,105,2498]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[72,8,2368]}]}]}],n:52,r:"data.files",p:[62,5,1762]}]}," ",{t:4,f:[{p:[80,4,2625],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[81,4,2672],t:7,e:"table",f:[{p:[82,5,2684],t:7,e:"tr",f:[{p:[83,6,2694],t:7,e:"th",f:["File name"]}," ",{p:[84,6,2718],t:7,e:"th",f:["File type"]}," ",{p:[85,6,2742],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[86,6,2771],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[89,6,2834],t:7,e:"tr",f:[{p:[90,7,2845],t:7,e:"td",f:[{t:2,r:"name",p:[90,11,2849]}]}," ",{p:[91,7,2869],t:7,e:"td",f:[".",{t:2,r:"type",p:[91,12,2874]}]}," ",{p:[92,7,2894],t:7,e:"td",f:[{t:2,r:"size",p:[92,11,2898]},"GQ"]}," ",{p:[93,7,2920],t:7,e:"td",f:[{p:[94,8,2932],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[94,26,2950]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[94,108,3032]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[96,9,3104],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[96,27,3122]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[96,107,3202]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[95,8,3070]}]}]}],n:52,r:"data.usbfiles",p:[88,5,2805]}]}],n:50,r:"data.usbconnected",p:[79,4,2596]}," ",{p:[103,4,3311],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,44],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,85],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,98] }]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,136]}]}]}," ",{t:4,f:[{p:[6,4,239],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,273],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,279]}]}]}," ",{p:[9,4,335],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,374],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,391]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,462]}]}," ",{p:[11,5,527],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,559]}]}]}],n:50,r:"data.teleporter",p:[5,3,212]},{t:4,n:51,f:[{p:[14,4,653],t:7,e:"span",f:[{p:[14,10,659],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,754],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,794],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,831],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,844]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,878]}]}]}," ",{t:4,f:[{p:[22,3,971],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1004],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1010]}]}]}],n:50,r:"data.beacon",p:[21,2,949]},{t:4,n:51,f:[{p:[26,4,1072],t:7,e:"span",f:[{p:[26,10,1078],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1165],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1204],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1239],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1269]}]}]}," ",{t:4,f:[{p:[34,2,1359],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1395],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1424]}]}]}],n:50,r:"data.id",p:[33,2,1342]}," ",{p:[38,2,1475],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1507],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1513]}]}]}," ",{t:4,f:[{p:[42,3,1620],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1660],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1666]}]}]}],n:50,r:"data.prisoner",p:[41,2,1596]}]}," ",{p:[47,1,1739],t:7,e:"ui-display",f:[{p:[48,2,1753],t:7,e:"center",f:[{p:[48,10,1761],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1796]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,14],t:7,e:"center",f:[{p:[2,10,22],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,52]}]}]}]}," ",{p:[4,1,132],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,189],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,208]}]},f:[{p:[7,4,222],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,274]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,290]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,167]}]}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{style:"float: left"},f:[{p:[2,2,27],t:7,e:"div",a:{"class":"item"},f:[{p:[3,3,48],t:7,e:"table",f:[{p:[3,10,55],t:7,e:"tr",f:[{t:4,f:[{p:[5,4,120],t:7,e:"td",f:[{p:[5,8,124],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[5,18,134]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[4,3,62]}," ",{t:4,f:[{p:[8,4,233],t:7,e:"td",f:[{p:[8,8,237],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[8,11,240]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,3,172]}," ",{t:4,f:[{p:[11,4,312],t:7,e:"td",f:[{p:[11,8,316],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[11,18,326]}]}}]}],n:50,r:"data.PC_ntneticon",p:[10,3,283]}," ",{t:4,f:[{p:[14,4,393],t:7,e:"td",f:[{p:[14,8,397],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[14,18,407]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[13,3,362]}," ",{t:4,f:[{p:[17,4,476],t:7,e:"td",f:[{p:[17,8,480],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[17,11,483]},{p:[17,34,506],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[16,3,445]}," ",{t:4,f:[{p:[20,4,558],t:7,e:"td",f:[{p:[20,8,562],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[20,18,572]}]}}]}],n:52,r:"data.PC_programheaders",p:[19,3,522]}]}]}]}]}," ",{p:[25,1,621],t:7,e:"div",a:{style:"float: right"},f:[{p:[26,2,649],t:7,e:"table",f:[{p:[26,9,656],t:7,e:"tr",f:[{p:[27,3,663],t:7,e:"td",f:[{p:[27,7,667],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[29,4,757],t:7,e:"td",f:[{p:[29,8,761],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[30,4,817],t:7,e:"td",f:[{p:[30,8,821],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[28,3,722]}]}]}]}]}," ",{p:[34,1,909],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[37,1,962],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[37,80,1041]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[36,1,936]},{p:[39,1,1122],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[39,90,1211]}]},f:["Job Management"]}," ",{p:[40,1,1279],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[40,92,1370]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[42,1,1459],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[42,51,1509]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[41,1,1433]},{t:4,f:[{p:[46,1,1628],t:7,e:"div",a:{"class":"item"},f:[{p:[47,3,1649],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[48,3,1674],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[48,61,1732],t:7,e:"br"},{p:[48,65,1736],t:7,e:"br"}]}," ",{t:4,f:[{p:[51,2,1773],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[52,2,1793]}," - ",{t:2,r:"rank",p:[52,13,1804]}]}],n:52,r:"data.manifest",p:[50,1,1748]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[45,1,1608]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[57,1,1859],t:7,e:"div",a:{"class":"item"},f:[{p:[58,3,1880],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[60,1,1911],t:7,e:"table",f:[{p:[61,1,1919],t:7,e:"tr",f:[{p:[61,5,1923],t:7,e:"td",a:{style:"width:25%"},f:[{p:[61,27,1945],t:7,e:"b",f:["Job"]}]},{p:[61,42,1960],t:7,e:"td",a:{style:"width:25%"},f:[{p:[61,64,1982],t:7,e:"b",f:["Slots"]}]},{p:[61,81,1999],t:7,e:"td",a:{style:"width:25%"},f:[{p:[61,103,2021],t:7,e:"b",f:["Open job"]}]},{p:[61,123,2041],t:7,e:"td",a:{style:"width:25%"},f:[{p:[61,145,2063],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[64,2,2113],t:7,e:"tr",f:[{p:[64,6,2117],t:7,e:"td",f:[{t:2,r:"title",p:[64,10,2121]}]},{p:[64,24,2135],t:7,e:"td",f:[{t:2,r:"current",p:[64,28,2139]},"/",{t:2,r:"total",p:[64,40,2151]}]},{p:[64,54,2165],t:7,e:"td",f:[{p:[64,58,2169],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[64,112,2223]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[64,132,2243]}]},f:[{t:2,r:"desc_open",p:[64,169,2280]}]},{p:[64,194,2305],t:7,e:"br"}]},{p:[64,203,2314],t:7,e:"td",f:[{p:[64,207,2318],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[64,262,2373]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[64,282,2393]}]},f:[{t:2,r:"desc_close",p:[64,320,2431]}]}]}]}],n:52,r:"data.slots",p:[62,1,2090]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[72,1,2501],t:7,e:"div",a:{"class":"item"},f:[{p:[73,3,2522],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[77,3,2582],t:7,e:"span",a:{"class":"alert"},f:[{p:[77,23,2602],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[77,87,2666],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[76,1,2559]},{p:[80,1,2680],t:7,e:"div",a:{"class":"item"},f:[{p:[81,3,2701],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[84,3,2754],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[85,2,2781],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[85,72,2851]}]}]}]}," ",{p:[88,1,2896],t:7,e:"div",a:{"class":"item"},f:[{p:[89,3,2917],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[92,3,2968],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[93,2,2995],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[93,74,3067]}]}]}]}," ",{p:[96,1,3114],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[100,2,3170],t:7,e:"div",a:{"class":"item"},f:[{p:[101,4,3192],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[105,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[106,4,3261],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[109,4,3317],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[110,3,3345]}]}]}," ",{p:[113,2,3382],t:7,e:"div",a:{"class":"item"},f:[{p:[114,4,3404],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[117,4,3449],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[118,3,3477]}]}]}," ",{p:[121,2,3513],t:7,e:"div",a:{"class":"item"},f:[{p:[122,4,3535],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[125,4,3582],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[126,3,3610],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[126,56,3663]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[126,117,3724]}]}]}]}],n:50,r:"data.minor",p:[104,2,3219]},{t:4,n:51,f:[{p:[131,2,3784],t:7,e:"div",a:{"class":"item"},f:[{p:[132,4,3806],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[135,4,3862],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[136,3,3890],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[136,70,3957]}]}]}]}," ",{p:[140,2,4007],t:7,e:"div",a:{"class":"item"},f:[{p:[141,4,4029],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[143,3,4059],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[143,47,4103]}]}," ",{p:[144,2,4179],t:7,e:"div",a:{"class":"item"},f:[{p:[145,4,4201],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[149,2,4254],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[151,4,4304],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[152,3,4332],t:7,e:"table",f:[{p:[153,5,4344],t:7,e:"tr",f:[{p:[154,4,4352],t:7,e:"th"},{p:[154,13,4361],t:7,e:"th",f:["Command"]}]}," ",{p:[156,5,4392],t:7,e:"tr",f:[{p:[157,4,4400],t:7,e:"th",f:["Special"]}," ",{p:[158,4,4420],t:7,e:"td",f:[{p:[159,6,4430],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[159,83,4507]}]},f:["Captain"]}," ",{p:[160,6,4583],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[163,5,4694],t:7,e:"tr",f:[{p:[164,4,4702],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[165,4,4752],t:7,e:"td",f:[{t:4,f:[{p:[167,5,4798],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[167,64,4857]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[167,82,4875]}]},f:[{t:2,r:"display_name",p:[167,127,4920]}]}],n:52,r:"data.engineering_jobs",p:[166,6,4762]}]}]}," ",{p:[171,5,4987],t:7,e:"tr",f:[{p:[172,4,4995],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[173,4,5041],t:7,e:"td",f:[{t:4,f:[{p:[175,5,5083],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[175,64,5142]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[175,82,5160]}]},f:[{t:2,r:"display_name",p:[175,127,5205]}]}],n:52,r:"data.medical_jobs",p:[174,6,5051]}]}]}," ",{p:[179,5,5272],t:7,e:"tr",f:[{p:[180,4,5280],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[181,4,5326],t:7,e:"td",f:[{t:4,f:[{p:[183,5,5368],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[183,64,5427]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[183,82,5445]}]},f:[{t:2,r:"display_name",p:[183,127,5490]}]}],n:52,r:"data.science_jobs",p:[182,6,5336]}]}]}," ",{p:[187,5,5557],t:7,e:"tr",f:[{p:[188,4,5565],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[189,4,5612],t:7,e:"td",f:[{t:4,f:[{p:[191,5,5655],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[191,64,5714]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[191,82,5732]}]},f:[{t:2,r:"display_name",p:[191,127,5777]}]}],n:52,r:"data.security_jobs",p:[190,6,5622]}]}]}," ",{p:[195,5,5844],t:7,e:"tr",f:[{p:[196,4,5852],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[197,4,5896],t:7,e:"td",f:[{t:4,f:[{p:[199,5,5936],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[199,64,5995]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[199,82,6013]}]},f:[{t:2,r:"display_name",p:[199,127,6058]}]}],n:52,r:"data.cargo_jobs",p:[198,6,5906]}]}]}," ",{p:[203,5,6125],t:7,e:"tr",f:[{p:[204,4,6133],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[205,4,6180],t:7,e:"td",f:[{t:4,f:[{p:[207,5,6223],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[207,64,6282]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[207,82,6300]}]},f:[{t:2,r:"display_name",p:[207,127,6345]}]}],n:52,r:"data.civilian_jobs",p:[206,6,6190]}]}]}," ",{t:4,f:[{p:[212,4,6443],t:7,e:"tr",f:[{p:[213,6,6453],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[214,6,6501],t:7,e:"td",f:[{t:4,f:[{p:[217,7,6545],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[217,66,6604]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[217,84,6622]}]},f:[{t:2,r:"display_name",p:[217,129,6667]}]}],n:52,r:"data.centcom_jobs",p:[215,5,6510]}]}]}],n:50,r:"data.centcom_access",p:[211,5,6412]}]}]}],n:50,r:"data.assignments",p:[150,4,4276]}]}],r:"data.minor"}," ",{t:4,f:[{p:[229,4,6824],t:7,e:"div",a:{"class":"item"},f:[{p:[230,3,6845],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[232,4,6883],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[234,5,6962],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[235,5,6996],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[235,64,7055]},'", "allowed" : "',{t:2,r:"allowed",p:[235,87,7078]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[235,109,7100]}]},f:[{t:2,r:"desc",p:[235,140,7131]}]}]}],n:52,r:"data.all_centcom_access",p:[233,3,6924]}]}],n:50,r:"data.centcom_access",p:[228,2,6793]},{t:4,n:51,f:[{p:[240,4,7198],t:7,e:"div",a:{"class":"item"},f:[{p:[241,3,7219],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[241,7,7223]}]}]}," ",{p:[243,4,7263],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[245,5,7331],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[246,4,7393],t:7,e:"div",a:{"class":"average"},f:[{p:[246,25,7414],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[246,63,7452]}],params:['{"region" : "',{t:2,r:"regid",p:[246,116,7505]},'"}']},f:[{p:[246,129,7518],t:7,e:"b",f:[{t:2,r:"name",p:[246,132,7521]}]}]}]}," ",{p:[247,4,7555],t:7,e:"br"}," ",{t:4,f:[{p:[249,6,7589],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[250,5,7623],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[250,64,7682]},'", "allowed" : "',{t:2,r:"allowed",p:[250,87,7705]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[250,109,7727]}]},f:[{t:2,r:"desc",p:[250,140,7758]}]}]}],n:52,r:"accesses",p:[248,6,7565]}]}],n:52,r:"data.regions",p:[244,3,7304]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[99,3,3149]}],n:50,r:"data.authenticated",p:[98,1,3120]}]}],x:{r:["data.mmode"],s:"!_0"}}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,266],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,298],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,330],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,336]}]}]}," ",{t:4,f:[{p:[20,5,447],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,480],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,493]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,516]}]}]}],n:50,r:"data.occupied",p:[19,3,421]}]}," ",{p:[25,1,656],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,687],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,717],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,734]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,783]}]}]}," ",{p:[29,3,846],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,876]}," ",{t:4,f:[{p:[32,7,938],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,906]}]}," ",{p:[35,3,1002],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1038],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1056]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1162]}," "]},{p:[38,19,1265],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,282],t:7,e:"ui-notice",f:[{p:[16,5,298],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,260]},{p:{button:[{t:4,f:[{p:[22,7,458],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,489]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,540]}," AI"]}],n:50,r:"data.name",p:[21,5,434]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,370]}],button:0},f:[" ",{t:4,f:[{p:[26,5,647],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,683],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,696]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,750]}]}]}," ",{p:[29,5,843],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,889],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,922]}],state:[{t:2,r:"healthState",p:[30,64,946]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,963]},"%"]}]}," ",{p:[32,5,1024],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1084],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1108]}]},{p:[34,45,1120],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1056]}]}," ",{p:[37,5,1164],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1200],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1232]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1325],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1361]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,625]}]}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,22],t:7,e:"ui-notice",f:[{p:[3,3,36],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,127],t:7,e:"ui-display",f:[{p:[7,3,142],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,189],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,243]}]}],n:50,r:"data.auth_required",p:[8,4,158]},{t:4,n:51,f:[{p:[11,5,294],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,327]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,412],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,444]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,55],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,74]}]},f:[{p:[4,4,87],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,93]}]}]}],n:52,r:"data.ores",p:[2,2,33]}]}," ",{p:[8,1,151],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,180],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,206],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,236]}]}]}," ",{t:4,f:[{p:[13,3,327],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,368],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,374]}]}]}," ",{p:[16,3,415],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,444],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,450]}]}]}," ",{p:[19,3,489],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,530],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,536]}]}," ",{p:[21,4,572],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,611]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,309]}]}," ",{p:[25,1,721],t:7,e:"ui-display",f:[{p:[26,2,735],t:7,e:"center",f:[{p:[27,3,746],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,785]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,68],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,86]}]},f:[{p:[4,7,102],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,108]}]}," ",{p:[5,7,130],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,142]}]}," ",{p:[6,7,163],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[6,13,169]}]}," ",{p:[7,7,227],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[9,35,304]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[10,16,331]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[11,8,399]}]}," ",{t:4,f:[{p:[14,9,514],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[16,37,596]},'"}']},f:["Remove"]}],n:50,r:"data.admin_mode",p:[13,7,482]}]}],n:52,r:"data.languages",p:[2,3,39]}]}," ",{t:4,f:[{p:[24,3,729],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[26,12,782]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[27,17,839]}]}," ",{p:[29,3,903],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[31,7,985],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[31,25,1003]}]},f:[{p:[32,9,1021],t:7,e:"span",f:[{t:2,r:"desc",p:[32,15,1027]}]}," ",{p:[33,9,1051],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[33,21,1063]}]}," ",{p:[34,9,1086],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[36,37,1167]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[30,5,946]}]}],n:50,r:"data.admin_mode",p:[23,1,703]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,252],t:7,e:"div",a:{style:"float: left"},f:[{p:[16,2,279],t:7,e:"div",a:{"class":"item"},f:[{p:[17,3,300],t:7,e:"table",f:[{p:[17,10,307],t:7,e:"tr",f:[{t:4,f:[{p:[19,4,372],t:7,e:"td",f:[{p:[19,8,376],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[19,18,386]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[18,3,314]}," ",{t:4,f:[{p:[22,4,485],t:7,e:"td",f:[{p:[22,8,489],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[22,11,492]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[21,3,424]}," ",{t:4,f:[{p:[25,4,564],t:7,e:"td",f:[{p:[25,8,568],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[25,18,578]}]}}]}],n:50,r:"data.PC_ntneticon",p:[24,3,535]}," ",{t:4,f:[{p:[28,4,645],t:7,e:"td",f:[{p:[28,8,649],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[28,18,659]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[27,3,614]}," ",{t:4,f:[{p:[31,4,728],t:7,e:"td",f:[{p:[31,8,732],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[31,11,735]},{p:[31,34,758],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[30,3,697]}," ",{t:4,f:[{p:[34,4,810],t:7,e:"td",f:[{p:[34,8,814],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[34,18,824]}]}}]}],n:52,r:"data.PC_programheaders",p:[33,3,774]}]}]}]}]}," ",{p:[39,1,873],t:7,e:"div",a:{style:"float: right"},f:[{p:[40,2,901],t:7,e:"table",f:[{p:[40,9,908],t:7,e:"tr",f:[{p:[41,3,915],t:7,e:"td",f:[{p:[41,7,919],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[43,4,1009],t:7,e:"td",f:[{p:[43,8,1013],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[44,4,1069],t:7,e:"td",f:[{p:[44,8,1073],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[42,3,974]}]}]}]}]}," ",{p:[48,1,1161],t:7,e:"div",a:{style:"clear: both"},f:[{p:[49,1,1187],t:7,e:"ui-display",f:[{p:[50,2,1201],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[50,137,1336],t:7,e:"hr"}," ",{p:[51,2,1342],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{t:4,f:[{p:[53,4,1402],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[56,4,1470],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[57,5,1510]}]}," ",{p:[59,4,1551],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[60,5,1591],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[60,26,1612]}],value:[{t:2,r:"adata.battery.charge",p:[60,56,1642]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[60,89,1675]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[60,128,1714]},"/",{t:2,r:"adata.battery.max",p:[60,165,1751]}]}]}],n:50,r:"data.battery",p:[52,3,1378]},{t:4,n:51,f:[{p:[63,4,1813],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}," ",{p:[68,3,1897],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[69,4,1933]},"W"]}]}," ",{p:[73,2,1989],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[74,3,2024],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[75,4,2062],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[75,25,2083]}],value:[{t:2,r:"adata.disk_used",p:[75,53,2111]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[75,87,2145]},"GQ/",{t:2,r:"adata.disk_size",p:[75,121,2179]},"GQ"]}]}]}," ",{p:[79,2,2244],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[82,4,2315],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[82,26,2337]}]},f:[{p:[84,5,2353],t:7,e:"i",f:[{t:2,r:"desc",p:[84,8,2356]}]},{p:[84,20,2368],t:7,e:"br"}," ",{p:[85,5,2377],t:7,e:"ui-section",a:{label:"State"},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[88,6,2415]}]}," ",{p:[91,5,2478],t:7,e:"ui-section",a:{Label:"Power Usage"},f:[{t:2,r:"powerusage",p:[92,6,2516]},"W"]}," ",{t:4,f:[{p:[95,6,2577],t:7,e:"ui-section",a:{label:"Toggle Component"},f:[{p:[96,7,2621],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"power-off":"close"'},p:[96,24,2638]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[96,108,2722]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"On":"Off"'},p:[97,8,2742]}]}]}],n:50,x:{r:["critical"],s:"!_0"},p:[94,5,2554]}," ",{p:[101,4,2822],t:7,e:"br"},{p:[101,8,2826],t:7,e:"br"}]}],n:52,r:"data.hardware",p:[81,3,2288]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,526],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,624],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,660],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,681]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,728]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,771]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,825]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,873]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1034],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1060],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,984]},{t:4,n:51,f:[{p:[30,11,1141],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1180],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1201]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1253]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1301]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1360]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1413]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,945]},{t:4,n:51,f:[{p:[35,3,1524],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1550],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,589]},{t:4,n:51,f:[{p:[38,4,1625],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,561]},{t:4,n:51,f:[{p:[41,5,1689],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1741],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{ t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,28],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,49],t:7,e:"table",f:[{p:[4,10,56],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,121],t:7,e:"td",f:[{p:[6,8,125],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,135]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,63]}," ",{t:4,f:[{p:[9,4,234],t:7,e:"td",f:[{p:[9,8,238],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,241]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,173]}," ",{t:4,f:[{p:[12,4,313],t:7,e:"td",f:[{p:[12,8,317],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,327]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,284]}," ",{t:4,f:[{p:[15,4,394],t:7,e:"td",f:[{p:[15,8,398],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,408]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,363]}," ",{t:4,f:[{p:[18,4,477],t:7,e:"td",f:[{p:[18,8,481],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,484]},{p:[18,34,507],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,446]}," ",{t:4,f:[{p:[21,4,559],t:7,e:"td",f:[{p:[21,8,563],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,573]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,523]}]}]}]}]}," ",{p:[26,1,622],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,650],t:7,e:"table",f:[{p:[27,9,657],t:7,e:"tr",f:[{p:[28,3,664],t:7,e:"td",f:[{p:[28,7,668],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,758],t:7,e:"td",f:[{p:[30,8,762],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,818],t:7,e:"td",f:[{p:[31,8,822],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,723]}]}]}]}]}," ",{p:[35,1,910],t:7,e:"div",a:{style:"clear: both"},f:[{p:[36,1,936],t:7,e:"ui-display",f:[{t:4,f:[{p:[38,3,975],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[37,2,950]}," ",{t:4,f:[{p:[42,3,1036],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[45,3,1092],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[46,4,1121]}]}," ",{p:[48,3,1147],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[51,3,1203],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[53,5,1261],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[52,4,1232]},{t:4,n:51,f:[{p:[55,5,1292],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[58,3,1330],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[61,3,1379],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[62,4,1408],t:7,e:"table",f:[{p:[63,5,1420],t:7,e:"tr",f:[{p:[63,9,1424],t:7,e:"td",f:[{p:[63,13,1428],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[64,5,1487],t:7,e:"tr",f:[{p:[64,9,1491],t:7,e:"td",f:[{p:[64,13,1495],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[65,5,1562],t:7,e:"tr",f:[{p:[65,9,1566],t:7,e:"td",f:[{p:[65,13,1570],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[66,5,1649],t:7,e:"tr",f:[{p:[66,9,1653],t:7,e:"td",f:[{p:[66,13,1657],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[67,5,1724],t:7,e:"tr",f:[{p:[67,9,1728],t:7,e:"td",f:[{p:[67,13,1732],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[69,6,1834],t:7,e:"tr",f:[{p:[69,10,1838],t:7,e:"td",f:[{p:[69,14,1842],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[70,6,1912],t:7,e:"tr",f:[{p:[70,10,1916],t:7,e:"td",f:[{p:[70,14,1920],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[71,6,1986],t:7,e:"tr",f:[{p:[71,10,1990],t:7,e:"td",f:[{p:[71,14,1994],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[68,5,1804]}]}]}]}]}," ",{p:[75,3,2096],t:7,e:"b",f:["Chat Window"]}," ",{p:[76,4,2118],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[77,4,2173],t:7,e:"div",a:{"class":"item"},f:[{p:[78,5,2196],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[80,7,2278]},{p:[80,14,2285],t:7,e:"br"}],n:52,r:"data.messages",p:[79,6,2248]}]}]}]}," ",{p:[85,3,2339],t:7,e:"b",f:["Connected Users"]},{p:[85,25,2361],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[87,4,2394]},{p:[87,12,2402],t:7,e:"br"}],n:52,r:"data.clients",p:[86,3,2368]}],n:50,r:"data.title",p:[41,2,1015]},{t:4,n:51,f:[{p:[90,3,2431],t:7,e:"b",f:["Controls:"]}," ",{p:[91,3,2450],t:7,e:"table",f:[{p:[92,4,2461],t:7,e:"tr",f:[{p:[92,8,2465],t:7,e:"td",f:[{p:[92,12,2469],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[93,4,2535],t:7,e:"tr",f:[{p:[93,8,2539],t:7,e:"td",f:[{p:[93,12,2543],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[94,4,2605],t:7,e:"tr",f:[{p:[94,8,2609],t:7,e:"td",f:[{p:[94,12,2613],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[96,3,2701],t:7,e:"b",f:["Available channels:"]}," ",{p:[97,3,2730],t:7,e:"table",f:[{t:4,f:[{p:[99,4,2773],t:7,e:"tr",f:[{p:[99,8,2777],t:7,e:"td",f:[{p:[99,12,2781],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[99,64,2833]},'"}']},f:[{t:2,r:"chan",p:[99,74,2843]}]},{p:[99,94,2863],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[98,3,2740]}]}],r:"data.title"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,28],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,49],t:7,e:"table",f:[{p:[4,10,56],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,121],t:7,e:"td",f:[{p:[6,8,125],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,135]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,63]}," ",{t:4,f:[{p:[9,4,234],t:7,e:"td",f:[{p:[9,8,238],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,241]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,173]}," ",{t:4,f:[{p:[12,4,313],t:7,e:"td",f:[{p:[12,8,317],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,327]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,284]}," ",{t:4,f:[{p:[15,4,394],t:7,e:"td",f:[{p:[15,8,398],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,408]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,363]}," ",{t:4,f:[{p:[18,4,477],t:7,e:"td",f:[{p:[18,8,481],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,484]},{p:[18,34,507],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,446]}," ",{t:4,f:[{p:[21,4,559],t:7,e:"td",f:[{p:[21,8,563],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,573]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,523]}]}]}]}]}," ",{p:[26,1,622],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,650],t:7,e:"table",f:[{p:[27,9,657],t:7,e:"tr",f:[{p:[28,3,664],t:7,e:"td",f:[{p:[28,7,668],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,758],t:7,e:"td",f:[{p:[30,8,762],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,818],t:7,e:"td",f:[{p:[31,8,822],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,723]}]}]}]}]}," ",{p:[35,1,910],t:7,e:"div",a:{style:"clear: both"},f:[{p:[36,1,936],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[38,19,987]},{p:[38,33,1001],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[37,2,950]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[40,39,1111]},"GQ/s",{p:[40,57,1129],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[42,4,1166]},{p:[42,12,1174],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[41,3,1136]}," ",{p:[44,3,1193],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[46,55,1305],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[48,24,1354]}],n:50,r:"data.focus",p:[47,3,1312]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[52,3,1420],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[52,54,1471],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[53,31,1532],t:7,e:"br"}," ",{t:4,f:[{p:[55,4,1564],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[55,61,1621]},'"}']},f:[{t:2,r:"id",p:[55,71,1631]}]}],n:52,r:"data.relays",p:[54,3,1539]}]}],r:"data.error"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],268:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,28],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,49],t:7,e:"table",f:[{p:[4,10,56],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,121],t:7,e:"td",f:[{p:[6,8,125],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,135]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,63]}," ",{t:4,f:[{p:[9,4,234],t:7,e:"td",f:[{p:[9,8,238],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,241]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,173]}," ",{t:4,f:[{p:[12,4,313],t:7,e:"td",f:[{p:[12,8,317],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,327]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,284]}," ",{t:4,f:[{p:[15,4,394],t:7,e:"td",f:[{p:[15,8,398],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,408]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,363]}," ",{t:4,f:[{p:[18,4,477],t:7,e:"td",f:[{p:[18,8,481],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,484]},{p:[18,34,507],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,446]}," ",{t:4,f:[{p:[21,4,559],t:7,e:"td",f:[{p:[21,8,563],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,573]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,523]}]}]}]}]}," ",{p:[26,1,622],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,650],t:7,e:"table",f:[{p:[27,9,657],t:7,e:"tr",f:[{p:[28,3,664],t:7,e:"td",f:[{p:[28,7,668],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,758],t:7,e:"td",f:[{p:[30,8,762],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,818],t:7,e:"td",f:[{p:[31,8,822],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,723]}]}]}]}]}," ",{p:[35,1,910],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,937],t:7,e:"ui-display",f:[{p:[38,2,951],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[38,97,1046],t:7,e:"hr"}," ",{t:4,f:[{p:[40,3,1073],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[41,4,1112],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[42,5,1149]}]}," ",{p:[44,4,1184],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[45,5,1223],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[39,2,1052]},{t:4,n:51,f:[{t:4,f:[{p:[52,4,1374],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[53,5,1416],t:7,e:"i",f:["Please wait..."]}," ",{p:[54,5,1442],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[55,6,1478]}]}," ",{p:[57,5,1522],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[58,6,1565]}]}," ",{p:[60,5,1609],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadcompletion",p:[61,6,1645]},"GQ / ",{t:2,r:"data.downloadsize",p:[61,38,1677]},"GQ"]}," ",{p:[63,5,1723],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[64,6,1763]}," GQ/s"]}," ",{p:[66,5,1813],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[67,6,1857],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[67,27,1878]}],value:[{t:2,r:"adata.downloadcompletion",p:[67,58,1909]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[67,101,1952]},"/",{t:2,r:"adata.downloadsize",p:[67,142,1993]}]}]}]}],n:50,r:"data.downloadname",p:[51,3,1345]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[74,4,2132],t:7,e:"ui-display",a:{title:"Primary software repository"},f:[{p:[75,5,2185],t:7,e:"ui-section",a:{label:"Hard drive"},f:[{p:[76,6,2222],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[76,27,2243]}],value:[{t:2,r:"adata.disk_used",p:[76,55,2271]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[76,89,2305]},"GQ/",{t:2,r:"adata.disk_size",p:[76,123,2339]},"GQ"]}]}," ",{t:4,f:[{p:[79,6,2434],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[80,7,2471]}," (",{t:2,r:"size",p:[80,21,2485]}," GQ)"]}," ",{p:[82,6,2522],t:7,e:"ui-section",a:{label:"Program name"},f:[{t:2,r:"filedesc",p:[83,7,2562]}]}," ",{p:[85,6,2600],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"fileinfo",p:[86,7,2639]}]}," ",{p:[88,6,2676],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[89,7,2717]}]}," ",{p:[91,6,2759],t:7,e:"ui-section",a:{label:"File controls"},f:[{p:[92,7,2800],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[92,80,2873]},'"}']},f:["DOWNLOAD"]}]}],n:52,r:"data.downloadable_programs",p:[78,5,2392]}]}," ",{t:4,f:[{p:[99,5,3011],t:7,e:"ui-display",a:{title:"UNKNOWN software repository"},f:[{p:[100,6,3065],t:7,e:"i",f:["Please note that NanoTrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[102,7,3209],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[103,8,3247]}," (",{t:2,r:"size",p:[103,22,3261]}," GQ)"]}," ",{p:[105,7,3300],t:7,e:"ui-section",a:{label:"Program name"},f:[{t:2,r:"filedesc",p:[106,8,3341]}]}," ",{p:[108,7,3381],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"fileinfo",p:[109,8,3421]}]}," ",{p:[111,7,3460],t:7,e:"ui-section",a:{label:"File controls"},f:[{p:[112,8,3502],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[112,81,3575]},'"}']},f:["DOWNLOAD"]}]}],n:52,r:"data.hacked_programs",p:[101,6,3172]}]}],n:50,r:"data.hackedavailable",p:[98,4,2978]}],n:50,x:{r:["data.error"],s:"!_0"},p:[73,3,2109]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[72,2,2080]}," ",{p:[121,2,3714],t:7,e:"br"},{p:[121,6,3718],t:7,e:"br"},{p:[121,10,3722],t:7,e:"hr"},{p:[121,14,3726],t:7,e:"i",f:["NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],269:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[3,1,2],t:7,e:"ui-display",f:[{p:[4,2,16],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,44],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,66],t:7,e:"table",f:[{p:[6,11,73],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,140],t:7,e:"td",f:[{p:[8,9,144],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,154]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,81]}," ",{t:4,f:[{p:[11,5,256],t:7,e:"td",f:[{p:[11,9,260],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,263]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,194]}," ",{t:4,f:[{p:[14,5,338],t:7,e:"td",f:[{p:[14,9,342],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,352]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,308]}," ",{t:4,f:[{p:[17,5,422],t:7,e:"td",f:[{p:[17,9,426],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,436]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,390]}," ",{t:4,f:[{p:[20,5,508],t:7,e:"td",f:[{p:[20,9,512],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,515]},{p:[20,35,538],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,476]}," ",{t:4,f:[{p:[23,5,593],t:7,e:"td",f:[{p:[23,9,597],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,607]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,556]}]}]}]}]}," ",{p:[28,2,661],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,690],t:7,e:"table",f:[{p:[29,10,697],t:7,e:"tr",f:[{p:[30,4,705],t:7,e:"td",f:[{p:[30,8,709],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,801],t:7,e:"td",f:[{p:[32,9,805],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,862],t:7,e:"td",f:[{p:[33,9,866],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,765]}]}]}]}]}," ",{p:[37,2,958],t:7,e:"div",a:{style:"clear: both"},f:[{p:[39,2,986],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[41,3,1032],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[42,4,1075],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[42,7,1078]}]}]}," ",{t:4,f:[{p:[45,4,1149],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[46,6,1189],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[46,9,1192]}]}]}," ",{p:[48,4,1262],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[50,4,1295],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[54,4,1390],t:7,e:"br"},{p:[54,8,1394],t:7,e:"br"}," ",{p:[55,4,1402],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[44,3,1121]},{t:4,n:51,f:[{p:[57,4,1537],t:7,e:"br"},{p:[57,8,1541],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[62,2,1632],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[64,2,1678],t:7,e:"table",f:[{p:[65,3,1688],t:7,e:"tr",f:[{p:[66,4,1696],t:7,e:"th",f:["PROTOCOL"]},{p:[67,4,1712],t:7,e:"th",f:["STATUS"]},{p:[68,4,1726],t:7,e:"th",f:["CONTROL"]}]},{p:[69,3,1740],t:7,e:"tr",f:[" ",{p:[70,4,1748],t:7,e:"td",f:["Software Downloads"]},{p:[71,4,1774],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[71,8,1778]}]},{p:[72,4,1839],t:7,e:"td",f:[" ",{p:[72,9,1844],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[73,3,1922],t:7,e:"tr",f:[" ",{p:[74,4,1930],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[75,4,1958],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[75,8,1962]}]},{p:[76,4,2017],t:7,e:"td",f:[{p:[76,8,2021],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[77,3,2099],t:7,e:"tr",f:[" ",{p:[78,4,2107],t:7,e:"td",f:["Communication Systems"]},{p:[79,4,2136],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[79,8,2140]}]},{p:[80,4,2198],t:7,e:"td",f:[{p:[80,8,2202],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[81,3,2280],t:7,e:"tr",f:[" ",{p:[82,4,2288],t:7,e:"td",f:["Remote System Control"]},{p:[83,4,2317],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[83,8,2321]}]},{p:[84,4,2379],t:7,e:"td",f:[{p:[84,8,2383],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[88,2,2486],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[91,4,2552],t:7,e:"ui-notice",f:[{p:[92,5,2568],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[94,5,2624],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[90,3,2527]}," ",{p:[97,3,2749],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[98,4,2800],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[98,7,2803]}]}]}," ",{p:[101,3,2872],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[102,4,2914],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[102,7,2917]}]}]}," ",{p:[105,3,2964],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[107,4,3013],t:7,e:"table",f:[{p:[108,4,3024],t:7,e:"tr",f:[{p:[108,8,3028],t:7,e:"td",f:[{p:[108,12,3032],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[109,4,3086],t:7,e:"tr",f:[{p:[109,8,3090],t:7,e:"td",f:[{p:[109,12,3094],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[110,4,3150],t:7,e:"tr",f:[{p:[110,8,3154],t:7,e:"td",f:[{p:[110,12,3158],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[111,4,3221],t:7,e:"tr",f:[{p:[111,8,3225],t:7,e:"td",f:[{p:[111,12,3229],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[114,3,3297],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[115,3,3335],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[116,3,3389],t:7,e:"div",a:{"class":"item"},f:[{p:[117,4,3411],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[119,6,3492]},{p:[119,15,3501],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[118,5,3462]}]}]}]}]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,55],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,93],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,127],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,479],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,514],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,555],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,28]},{t:4,n:51,f:[{p:[12,3,652],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,689],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,739]}]}]}," ",{p:[18,3,819],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,865]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,889]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,1],t:7,e:"ui-display",f:[{p:[4,2,16],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,44],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,66],t:7,e:"table",f:[{p:[6,11,73],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,140],t:7,e:"td",f:[{p:[8,9,144],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,154]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,81]}," ",{t:4,f:[{p:[11,5,256],t:7,e:"td",f:[{p:[11,9,260],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,263]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,194]}," ",{t:4,f:[{p:[14,5,338],t:7,e:"td",f:[{p:[14,9,342],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,352]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,308]}," ",{t:4,f:[{p:[17,5,422],t:7,e:"td",f:[{p:[17,9,426],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,436]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,390]}," ",{t:4,f:[{p:[20,5,508],t:7,e:"td",f:[{p:[20,9,512],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,515]},{p:[20,35,538],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,476]}," ",{t:4,f:[{p:[23,5,593],t:7,e:"td",f:[{p:[23,9,597],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,607]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,556]}]}]}]}]}," ",{p:[28,2,661],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,690],t:7,e:"table",f:[{p:[29,10,697],t:7,e:"tr",f:[{p:[30,4,705],t:7,e:"td",f:[{p:[30,8,709],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,801],t:7,e:"td",f:[{p:[32,9,805],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,862],t:7,e:"td",f:[{p:[33,9,866],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,765]}]}]}]}]}," ",{p:[37,2,958],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[40,2,1006],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1027],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[42,3,1080],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[42,34,1111]},{p:[42,48,1125],t:7,e:"br"}," ",{p:[43,3,1132],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[39,2,986]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[46,3,1219],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[47,3,1254],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[50,3,1310],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[51,4,1339]}]}," ",{p:[53,3,1374],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[56,3,1432],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[57,4,1461]}," / ",{t:2,r:"data.download_size",p:[57,33,1490]}," GQ"]}," ",{p:[59,3,1527],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[62,3,1582],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[63,4,1611]},"GQ/s"]}," ",{p:[65,3,1653],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[68,3,1702],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[69,4,1731],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[72,3,1826],t:7,e:"h2",f:["Server enabled"]}," ",{p:[73,3,1852],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[76,3,1910],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[77,4,1939]}]}," ",{p:[79,3,1974],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[82,3,2028],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[83,4,2057]}]}," ",{p:[85,3,2093],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[88,3,2149],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[89,4,2178]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[95,3,2269],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[98,3,2318],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[99,4,2347],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[100,4,2411],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[103,3,2509],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[104,3,2572],t:7,e:"table",f:[{p:[105,3,2582],t:7,e:"tr",f:[{p:[105,7,2586],t:7,e:"th",f:["File name"]},{p:[105,20,2599],t:7,e:"th",f:["File size"]},{p:[105,33,2612],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[107,4,2661],t:7,e:"tr",f:[{p:[107,8,2665],t:7,e:"td",f:[{t:2,r:"filename",p:[107,12,2669]}]},{p:[108,4,2685],t:7,e:"td",f:[{t:2,r:"size",p:[108,8,2689]},"GQ"]},{p:[109,4,2703],t:7,e:"td",f:[{p:[109,8,2707],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[109,59,2758]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[106,3,2627]}]}]}]}," ",{p:[112,3,2813],t:7,e:"hr"}," ",{p:[113,3,2820],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[114,3,2883],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[116,3,2944],t:7,e:"h2",f:["Available files:"]}," ",{p:[117,3,2972],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[117,55,3024],t:7,e:"tr",f:[{p:[117,59,3028],t:7,e:"th",f:["Server UID"]},{p:[117,73,3042],t:7,e:"th",f:["File Name"]},{p:[117,86,3055],t:7,e:"th",f:["File Size"]},{p:[117,99,3068],t:7,e:"th",f:["Password Protection"]},{p:[117,122,3091],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[119,5,3136],t:7,e:"tr",f:[{p:[119,9,3140],t:7,e:"td",f:[{t:2,r:"uid",p:[119,13,3144]}]},{p:[120,5,3156], diff --git a/tgui/src/interfaces/atmos_pump.ract b/tgui/src/interfaces/atmos_pump.ract index 2f1f47aa4f0..a622ae3f183 100644 --- a/tgui/src/interfaces/atmos_pump.ract +++ b/tgui/src/interfaces/atmos_pump.ract @@ -6,7 +6,7 @@ {{#if data.max_rate}} Set - Max + Max {{Math.round(adata.rate)}} L/s {{else}} From 5f2fe8383846309f05cc8de3e994fb965e079c5c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 26 Apr 2017 02:35:29 -0700 Subject: [PATCH 63/97] Automatic changelog generation for PR #26474 [ci skip] --- html/changelogs/AutoChangeLog-pr-26474.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26474.yml diff --git a/html/changelogs/AutoChangeLog-pr-26474.yml b/html/changelogs/AutoChangeLog-pr-26474.yml new file mode 100644 index 00000000000..c35bc68585c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26474.yml @@ -0,0 +1,4 @@ +author: "CoreOverload" +delete-after: True +changes: + - rscadd: "Gas injectors are now buildable!" From 02ff34b14f9b2c3000d1b750024af79a71a21a3b Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 09:52:04 -0400 Subject: [PATCH 64/97] Fixes SDQL global procs --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7375fac4664..bda6354f930 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -477,7 +477,7 @@ var/list/new_args = list() for(var/arg in arguments) new_args += SDQL_expression(source, arg) - if(object == world) // Global proc. + if(object == GLOB) // Global proc. procname = "/proc/[procname]" return WrapAdminProcCall(GLOBAL_PROC, procname, new_args) return WrapAdminProcCall(object, procname, new_args) From 3318aa8ed5c44b6d69df95b49194a78282f71c33 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 10:26:05 -0400 Subject: [PATCH 65/97] Makes minibot listen on a configurable port --- bot/config.py | 1 + bot/minibot.py | 2 +- bot/nudge.py | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bot/config.py b/bot/config.py index 8888753ab71..c0ffc55bed6 100644 --- a/bot/config.py +++ b/bot/config.py @@ -1,6 +1,7 @@ # Configuration for the minibot.py bot starts here server = "irc.rizon.net" port = 6667 +nudge_port = 45678 channels = ["#asdfgbus", "#botbus"] defaultchannel = "#asdfgbus" diff --git a/bot/minibot.py b/bot/minibot.py index 82e46722f83..cc5ac1a5b4d 100755 --- a/bot/minibot.py +++ b/bot/minibot.py @@ -73,7 +73,7 @@ def setup_irc_socket(): def setup_nudge_socket(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind(("", 45678)) # localhost:45678 + s.bind(("", nudge_port)) # localhost:nudge_port s.listen(5) logger.info("Nudge socket up and listening") return s diff --git a/bot/nudge.py b/bot/nudge.py index 1af5c928fa6..afc2cf38b09 100755 --- a/bot/nudge.py +++ b/bot/nudge.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +from config import * import sys import pickle import socket @@ -16,7 +17,7 @@ def pack(): def nudge(data): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(("localhost", 45678)) + s.connect(("localhost", nudge_port)) s.send(data) s.close() From 28ff6252cb73a90958cc1d7541c0a49f4d5ce483 Mon Sep 17 00:00:00 2001 From: ma44 Date: Wed, 26 Apr 2017 09:59:30 -0500 Subject: [PATCH 66/97] Removes a unused chem (#26559) * Update medicine_reagents.dm * Update watertank.dm --- .../objects/items/weapons/tanks/watertank.dm | 7 +--- .../chemistry/reagents/medicine_reagents.dm | 38 ------------------- 2 files changed, 1 insertion(+), 44 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 265e6bb2e5d..3a637571570 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -432,11 +432,6 @@ update_filling() user.update_inv_back() //for overlays update -/obj/item/weapon/reagent_containers/chemtank/stim/New() - ..() - reagents.add_reagent("stimulants_longterm", 300) - update_filling() - //Operator backpack spray /obj/item/weapon/watertank/operator name = "backpack water tank" @@ -468,4 +463,4 @@ possible_transfer_amounts = list(75,100,150) /obj/item/weapon/watertank/operator/make_noz() - return new /obj/item/weapon/reagent_containers/spray/mister/operator(src) \ No newline at end of file + return new /obj/item/weapon/reagent_containers/spray/mister/operator(src) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index dee5b7e68ad..aa913ba8f0a 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -867,44 +867,6 @@ . = 1 ..() -/datum/reagent/medicine/stimulants/longterm - name = "Stimulants" - id = "stimulants_longterm" - description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Highly addictive." - color = "#78008C" - metabolization_rate = 2 * REAGENTS_METABOLISM - overdose_threshold = 0 - addiction_threshold = 5 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage1(mob/living/M) - M.adjustToxLoss(5*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage2(mob/living/M) - M.adjustToxLoss(6*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - M.Stun(2, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage3(mob/living/M) - M.adjustToxLoss(7*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - M.adjustBrainLoss(1*REM) - M.Stun(2, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/longterm/addiction_act_stage4(mob/living/M) - M.adjustToxLoss(8*REM, 0) - M.adjustStaminaLoss(5*REM, 0) - M.adjustBrainLoss(2*REM) - M.Stun(2, 0) - ..() - . = 1 - /datum/reagent/medicine/insulin name = "Insulin" id = "insulin" From 3da3063e8215a112a88a2383ed969ba0ed61f98f Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Wed, 26 Apr 2017 11:58:17 -0400 Subject: [PATCH 67/97] Even admin-called shuttles will be affected by alert level --- code/controllers/subsystem/shuttle.dm | 10 ++++------ code/game/gamemodes/devil/devilinfo.dm | 4 ++-- .../gamemodes/miniantags/abduction/abduction.dm | 2 +- code/modules/power/singularity/narsie.dm | 2 +- code/modules/shuttle/emergency.dm | 13 +++++++++++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index bc8c14a74d1..dcddd37fbfe 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -208,12 +208,10 @@ SUBSYSTEM_DEF(shuttle) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" var/security_num = seclevel2num(get_security_level()) switch(security_num) - if(SEC_LEVEL_GREEN) - emergency.request(null, 2, signal_origin, html_decode(emergency_reason), 0) - if(SEC_LEVEL_BLUE) - emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) + if(SEC_LEVEL_RED,SEC_LEVEL_DELTA) + emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes. else - emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) // There is a serious threat we gotta move no time to give them five minutes. + emergency.request(null, signal_origin, html_decode(emergency_reason), 0) log_game("[key_name(user)] has called the shuttle.") message_admins("[key_name_admin(user)] has called the shuttle.") @@ -272,7 +270,7 @@ SUBSYSTEM_DEF(shuttle) if(callShuttle) if(EMERGENCY_IDLE_OR_RECALLED) - emergency.request(null, 2.5) + emergency.request(null, set_coefficient = 2.5) log_game("There is no means of calling the shuttle anymore. Shuttle automatically called.") message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index ef9091891f0..01437cdf2ea 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(lawlorify, list ( notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK) sleep(50) if(!SSticker.mode.devil_ascended) - SSshuttle.emergency.request(null, 0.3) + SSshuttle.emergency.request(null, set_coefficient = 0.3) SSticker.mode.devil_ascended++ form = ARCH_DEVIL @@ -449,7 +449,7 @@ GLOBAL_LIST_INIT(lawlorify, list ( A.convert_to_archdevil() else throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection") - + /datum/devilinfo/proc/update_hud() if(istype(owner.current, /mob/living/carbon)) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index e692654bf3d..0e4a11f8ab3 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -166,7 +166,7 @@ var/obj/machinery/abductor/console/con = get_team_console(team_number) var/datum/objective/objective = team_objectives[team_number] if (con.experiment.points >= objective.target_amount) - SSshuttle.emergency.request(null, 0.5) + SSshuttle.emergency.request(null, set_coefficient = 0.5) finished = 1 return ..() return ..() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 410181dede6..9deebdfe10a 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -39,7 +39,7 @@ narsie_spawn_animation() sleep(70) - SSshuttle.emergency.request(null, 0.1) // Cannot recall + SSshuttle.emergency.request(null, set_coefficient = 0.1) // Cannot recall /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 553210a5f72..a4cf449b857 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -207,8 +207,17 @@ . = ..() -/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert) - var/call_time = SSshuttle.emergencyCallTime * coefficient +/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null) + if(!isnum(set_coefficient)) + var/security_num = seclevel2num(get_security_level()) + switch(security_num) + if(SEC_LEVEL_GREEN) + set_coefficient = 2 + if(SEC_LEVEL_BLUE) + set_coefficient = 1 + else + set_coefficient = 0.5 + var/call_time = SSshuttle.emergencyCallTime * set_coefficient switch(mode) // The shuttle can not normally be called while "recalling", so // if this proc is called, it's via admin fiat From 1eaacae14adb76dd436c25c12b06e25d9df7650f Mon Sep 17 00:00:00 2001 From: sybil Date: Wed, 26 Apr 2017 16:35:27 +0000 Subject: [PATCH 68/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 19 +++++++++++++++++++ html/changelogs/.all_changelog.yml | 10 ++++++++++ html/changelogs/AutoChangeLog-pr-26474.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26537.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26543.yml | 5 ----- html/changelogs/AutoChangeLog-pr-26549.yml | 4 ---- 6 files changed, 29 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26474.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26537.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26543.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26549.yml diff --git a/html/changelog.html b/html/changelog.html index 8f4b0e20472..e8fc9c22b2b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,25 @@ -->

    +

    26 April 2017

    +

    CoreOverload updated:

    +
      +
    • Gas injectors are now buildable!
    • +
    +

    Joan updated:

    +
      +
    • Ash Drake swoops no longer teleport the Ash Drake to your position.
    • +
    • Some other tweaks to Ash Drake attacks and patterns; discover these yourself!
    • +
    +

    coiax updated:

    +
      +
    • The wizard spell Rod Form now costs 3 points, up from 2.
    • +
    +

    flashdim updated:

    +
      +
    • Omega Station had two APCs not wired properly. (#26526)
    • +
    +

    25 April 2017

    BeeSting12 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3d8e23c95cf..8683e015756 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10686,3 +10686,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. human lungs. - rscadd: Plasmamen now have their own special type of bone tongue. They still sound the same, it's just purple. Like them. +2017-04-26: + CoreOverload: + - rscadd: Gas injectors are now buildable! + Joan: + - tweak: Ash Drake swoops no longer teleport the Ash Drake to your position. + - balance: Some other tweaks to Ash Drake attacks and patterns; discover these yourself! + coiax: + - balance: The wizard spell Rod Form now costs 3 points, up from 2. + flashdim: + - bugfix: Omega Station had two APCs not wired properly. (#26526) diff --git a/html/changelogs/AutoChangeLog-pr-26474.yml b/html/changelogs/AutoChangeLog-pr-26474.yml deleted file mode 100644 index c35bc68585c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26474.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CoreOverload" -delete-after: True -changes: - - rscadd: "Gas injectors are now buildable!" diff --git a/html/changelogs/AutoChangeLog-pr-26537.yml b/html/changelogs/AutoChangeLog-pr-26537.yml deleted file mode 100644 index 4921f4998d9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26537.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - balance: "The wizard spell Rod Form now costs 3 points, up from 2." diff --git a/html/changelogs/AutoChangeLog-pr-26543.yml b/html/changelogs/AutoChangeLog-pr-26543.yml deleted file mode 100644 index 7e683c1014a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26543.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - tweak: "Ash Drake swoops no longer teleport the Ash Drake to your position." - - balance: "Some other tweaks to Ash Drake attacks and patterns; discover these yourself!" diff --git a/html/changelogs/AutoChangeLog-pr-26549.yml b/html/changelogs/AutoChangeLog-pr-26549.yml deleted file mode 100644 index 9fcd56e0297..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26549.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "flashdim" -delete-after: True -changes: - - bugfix: "Omega Station had two APCs not wired properly. (#26526)" From 4009b94df7a8e84fd3dfe013078aa64daa4a181b Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 26 Apr 2017 12:36:09 -0400 Subject: [PATCH 69/97] fixes banana honk recipe --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 29d3f6d5911..a5c21aa0f51 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -416,8 +416,8 @@ /datum/chemical_reaction/bananahonk name = "Banana Honk" id = "bananahonk" - results = list("bananahonk" = 3) - required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) + results = list("bananahonk" = 2) + required_reagents = list("laughter" = 1, "cream" = 1) /datum/chemical_reaction/silencer name = "Silencer" @@ -542,9 +542,9 @@ results = list("chocolate_milk" = 2) required_reagents = list("milk" = 1, "cocoa" = 1) mix_message = "The color changes as the mixture blends smoothly." - + /datum/chemical_reaction/eggnog name = "eggnog" id = "eggnog" results = list("eggnog" = 15) - required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) \ No newline at end of file + required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) \ No newline at end of file From ca9bbaa3339b6ea44c3f690f588ccddb18ae8480 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Wed, 26 Apr 2017 13:35:36 -0700 Subject: [PATCH 70/97] Fixes changelog assets It now uses the asset cache, so opening the changelog more then once does not re-send the assets. Added the scales.png asset --- code/modules/client/asset_cache.dm | 28 ++++++++++++++++++++-------- interface/interface.dm | 20 ++------------------ 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 6d8ffa64381..a29c3179b21 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums) //DEFINITIONS FOR ASSET DATUMS START HERE. - /datum/asset/simple/tgui assets = list( "tgui.css" = 'tgui/assets/tgui.css', @@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums) "sig_none.gif" = 'icons/program_icons/sig_none.gif', ) - - - - - - - /datum/asset/simple/pda assets = list( "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png', @@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums) "jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js' ) +/datum/asset/simple/changelog + assets = list( + "88x31.png" = 'html/88x31.png', + "bug-minus.png" = 'html/bug-minus.png', + "cross-circle.png" = 'html/cross-circle.png', + "hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png', + "image-minus.png" = 'html/image-minus.png', + "image-plus.png" = 'html/image-plus.png', + "music-minus.png" = 'html/music-minus.png', + "music-plus.png" = 'html/music-plus.png', + "tick-circle.png" = 'html/tick-circle.png', + "wrench-screwdriver.png" = 'html/wrench-screwdriver.png', + "spell-check.png" = 'html/spell-check.png', + "burn-exclamation.png" = 'html/burn-exclamation.png', + "chevron.png" = 'html/chevron.png', + "chevron-expand.png" = 'html/chevron-expand.png', + "scales.png" = 'html/scales.png', + "changelog.css" = 'html/changelog.css' + ) + //Registers HTML Interface assets. /datum/asset/HTML_interface/register() for(var/path in typesof(/datum/html_interface)) diff --git a/interface/interface.dm b/interface/interface.dm index fde1c0ea140..574098b0db6 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -83,24 +83,8 @@ Admin: /client/verb/changelog() set name = "Changelog" set category = "OOC" - getFiles( - 'html/88x31.png', - 'html/bug-minus.png', - 'html/cross-circle.png', - 'html/hard-hat-exclamation.png', - 'html/image-minus.png', - 'html/image-plus.png', - 'html/music-minus.png', - 'html/music-plus.png', - 'html/tick-circle.png', - 'html/wrench-screwdriver.png', - 'html/spell-check.png', - 'html/burn-exclamation.png', - 'html/chevron.png', - 'html/chevron-expand.png', - 'html/changelog.css', - 'html/changelog.html' - ) + var/datum/asset/changelog = get_asset_datum(/datum/asset/simple/changelog) + changelog.send(src) src << browse('html/changelog.html', "window=changes;size=675x650") if(prefs.lastchangelog != GLOB.changelog_hash) prefs.lastchangelog = GLOB.changelog_hash From a788823f6d8dbd8195d49901bda542898f1b51bb Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Wed, 26 Apr 2017 13:45:53 -0700 Subject: [PATCH 71/97] Server hop can now be used in lobby --- code/modules/mob/dead/dead.dm | 32 +++++++++++++++++++++- code/modules/mob/dead/observer/observer.dm | 26 ------------------ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index c3441cc16c9..d508fdc25e0 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -5,6 +5,11 @@ args[1] = FALSE Initialize(arglist(args)) //EXIST DAMN YOU!!! +/mob/dead/Initialize() + . = ..() + if(config.cross_allowed) + verbs += /mob/dead/proc/server_hop + /mob/dead/dust() //ghosts can't be vaporised. return @@ -12,4 +17,29 @@ return /mob/dead/ConveyorMove() //lol - return \ No newline at end of file + return + + + +/mob/dead/proc/server_hop() + set category = "OOC" + set name = "Server Hop!" + set desc= "Jump to the other server" + if(notransform) + return + if(!config.cross_allowed) + verbs -= /mob/dead/proc/server_hop + to_chat(src, "Server Hop has been disabled.") + return + if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes") + return 0 + if (client && config.cross_allowed) + to_chat(src, "Sending you to [config.cross_address].") + new /obj/screen/splash(client) + notransform = TRUE + sleep(29) //let the animation play + notransform = FALSE + winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources + client << link(config.cross_address + "?server_hop=[key]") + else + to_chat(src, "There is no other server configured!") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7946d67d10a..652ed56e571 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -58,9 +58,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) verbs += /mob/dead/observer/proc/dead_tele - if(config.cross_allowed) - verbs += /mob/dead/observer/proc/server_hop - if(icon_state in GLOB.ghost_forms_with_directions_list) ghostimage_default = image(src.icon,src,src.icon_state + "_nodir") else @@ -585,29 +582,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp target.faction = list("neutral") return 1 -/mob/dead/observer/proc/server_hop() - set category = "Ghost" - set name = "Server Hop!" - set desc= "Jump to the other server" - if(notransform) - return - if(!config.cross_allowed) - verbs -= /mob/dead/observer/proc/server_hop - to_chat(src, "Server Hop has been disabled.") - return - if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes") - return 0 - if (client && config.cross_allowed) - to_chat(src, "Sending you to [config.cross_address].") - new /obj/screen/splash(client) - notransform = TRUE - sleep(29) //let the animation play - notransform = FALSE - winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources - client << link(config.cross_address + "?server_hop=[key]") - else - to_chat(src, "There is no other server configured!") - /proc/show_server_hop_transfer_screen(expected_key) //only show it to incoming ghosts for(var/mob/dead/observer/O in GLOB.player_list) From 5ace376e4a6f603f8d5b6371c8eedd443081a867 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 17:02:29 -0400 Subject: [PATCH 72/97] Initialize Refactor (#25981) Shouldn't break anything, stops warning spam, logs errors qdel style at the end of the game. Initialize now expects a hint to be returned, one of: INITIALIZE_HINT_NORMAL - Does nothing, returned by the root proc INITIALIZE_HINT_LATELOAD - Call atom/proc/LateInitialize INITIALIZE_HINT_QDEL - Calls qdel on the atom LateInitialize currently defaults to the old re-calling behavior so there should be no issues with that. Things that didn't return a hint or fucked up somehow will be logged less loudly than they were before No more world start warnings! --- code/__DEFINES/qdel.dm | 3 +- code/__DEFINES/subsystems.dm | 17 +++ code/_onclick/hud/screen_objects.dm | 2 +- code/controllers/admin.dm | 4 +- code/controllers/subsystem/atoms.dm | 139 ++++++++++++------ code/game/atoms.dm | 30 ++-- code/game/atoms_movable.dm | 2 +- .../miniantags/abduction/machinery/console.dm | 4 +- .../embedded_controller/access_controller.dm | 12 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures/ladders.dm | 11 +- code/game/turfs/space/space.dm | 2 + code/game/turfs/turf.dm | 1 + code/modules/admin/admin_verbs.dm | 3 +- code/modules/admin/verbs/debug.dm | 7 + code/modules/holodeck/computer.dm | 82 +++++------ code/modules/mob/dead/dead.dm | 7 +- .../modules/mob/dead/new_player/new_player.dm | 1 + code/modules/recycling/conveyor2.dm | 7 +- code/modules/recycling/disposal-unit.dm | 22 +-- code/modules/shuttle/arrivals.dm | 13 +- 21 files changed, 226 insertions(+), 145 deletions(-) diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index fe19d7a5596..041a6283e7c 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -14,5 +14,6 @@ #define GC_QUEUED_FOR_HARD_DEL -2 #define GC_CURRENTLY_BEING_QDELETED -3 -#define QDELETED(X) (!X || X.gc_destroyed) +#define QDELING(X) (X.gc_destroyed) +#define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4596c79ef1e..6143022993e 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,6 +20,23 @@ #define FLIGHTSUIT_PROCESSING_NONE 0 #define FLIGHTSUIT_PROCESSING_FULL 1 +#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize +#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) + +#define INITIALIZE_HINT_NORMAL 0 //Nothing happens +#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize +#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom + +//type and all subtypes should always call Initialize in New() +#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ + ..();\ + if(!initialized) {\ + args[1] = TRUE;\ + SSatoms.InitAtom(src, args);\ + }\ +} + // Subsystem init_order, from highest priority to lowest priority // The numbers just define the ordering, they are meaningless otherwise. diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 206a9fabc1a..af210a274c0 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -544,7 +544,7 @@ plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) +/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE holder = C if(!visible) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 99f6a148a48..2be7139a27b 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -3,7 +3,9 @@ name = "Initializing..." var/target -/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical +INITIALIZE_IMMEDIATE(/obj/effect/statclick) + +/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical ..() name = text src.target = target diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 4ca35e434d2..98e3ba2330c 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,6 +1,7 @@ -#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize -#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) -#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 SUBSYSTEM_DEF(atoms) name = "Atoms" @@ -11,6 +12,9 @@ SUBSYSTEM_DEF(atoms) var/old_initialized var/list/late_loaders + var/list/created_atoms + + var/list/BadInitializeCalls = list() /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR @@ -19,64 +23,82 @@ SUBSYSTEM_DEF(atoms) InitializeAtoms() return ..() -/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms = null) +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) if(initialized == INITIALIZATION_INSSATOMS) return initialized = INITIALIZATION_INNEW_MAPLOAD - var/static/list/NewQdelList = list() - + LAZYINITLIST(late_loaders) + + var/count + var/list/mapload_arg = list(TRUE) if(atoms) + created_atoms = list() + count = atoms.len for(var/I in atoms) var/atom/A = I - if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call - if(QDELETED(A)) - if(!(NewQdelList[A.type])) - WARNING("Found new qdeletion in type [A.type]!") - NewQdelList[A.type] = TRUE - continue - var/start_tick = world.time - if(A.Initialize(TRUE)) - LAZYADD(late_loaders, A) - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") + if(!A.initialized) + if(InitAtom(I, mapload_arg)) + atoms -= I CHECK_TICK - testing("Initialized [atoms.len] atoms") else - #ifdef TESTING - var/count = 0 - #endif + count = 0 for(var/atom/A in world) - if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call - if(QDELETED(A)) - if(!(NewQdelList[A.type])) - WARNING("Found new qdeletion in type [A.type]!") - NewQdelList[A.type] = TRUE - continue - var/start_tick = world.time - if(A.Initialize(TRUE)) - LAZYADD(late_loaders, A) - #ifdef TESTING - else - ++count - #endif TESTING - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") + if(!A.initialized) + InitAtom(A, mapload_arg) + ++count CHECK_TICK - testing("Roundstart initialized [count] atoms") + + log_world("Initialized [count] atoms") initialized = INITIALIZATION_INNEW_REGULAR - for(var/I in late_loaders) - var/atom/A = I - var/start_tick = world.time - A.Initialize(FALSE) - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") - CHECK_TICK - testing("Late-initialized [LAZYLEN(late_loaders)] atoms") - LAZYCLEARLIST(late_loaders) + if(late_loaders.len) + for(var/I in late_loaders) + var/atom/A = I + A.LateInitialize() + testing("Late initialized [late_loaders.len] atoms") + late_loaders.Cut() + + if(atoms) + . = created_atoms + atoms + created_atoms = null + +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) + var/the_type = A.type + if(QDELING(A)) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + var/start_tick = world.time + + var/result = A.Initialize(arglist(arguments)) + + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + + var/qdeleted = FALSE + + if(result != INITIALIZE_HINT_NORMAL) + switch(result) + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!A.initialized) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + + return qdeleted || QDELETED(A) /datum/controller/subsystem/atoms/proc/map_loader_begin() old_initialized = initialized @@ -90,6 +112,7 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() old_initialized = SSatoms.old_initialized + BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) @@ -109,3 +132,27 @@ SUBSYSTEM_DEF(atoms) else if(B.quality == MINOR_NEGATIVE) GLOB.not_good_mutations |= B CHECK_TICK + +/datum/controller/subsystem/atoms/proc/InitLog() + . = "" + for(var/path in BadInitializeCalls) + . += "Path : [path] \n" + var/fails = BadInitializeCalls[path] + if(fails & BAD_INIT_DIDNT_INIT) + . += "- Didn't call atom/Initialize()\n" + if(fails & BAD_INIT_NO_HINT) + . += "- Didn't return an Initialize hint\n" + if(fails & BAD_INIT_QDEL_BEFORE) + . += "- Qdel'd in New()\n" + if(fails & BAD_INIT_SLEPT) + . += "- Slept during Initialize()\n" + +/datum/controller/subsystem/atoms/Shutdown() + var/initlog = InitLog() + if(initlog) + log_world(initlog) + +#undef BAD_INIT_QDEL_BEFORE +#undef BAD_INIT_DIDNT_INIT +#undef BAD_INIT_SLEPT +#undef BAD_INIT_NO_HINT \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index bfa51a09de7..ed496a9ac30 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -39,20 +39,21 @@ var/do_initialize = SSatoms.initialized if(do_initialize > INITIALIZATION_INSSATOMS) - if(QDELETED(src)) - CRASH("Found new qdeletion in type [type]!") - var/mapload = do_initialize == INITIALIZATION_INNEW_MAPLOAD - args[1] = mapload - if(Initialize(arglist(args)) && mapload) - LAZYADD(SSatoms.late_loaders, src) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + //we were deleted + return + + var/list/created = SSatoms.created_atoms + if(created) + created += src //Called after New if the map is being loaded. mapload = TRUE //Called from base of New if the map is being loaded. mapload = FALSE -//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls -//Derivatives must not sleep -//Returning TRUE while mapload is TRUE will cause the object to be initialized again with mapload = FALSE when everything else is done -//(Useful for things that requires turfs to have air). This base may only be called once, however +//This base must be called or derivatives must set initialized to TRUE +//must not sleep //Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm //Note: the following functions don't call the base for optimization and must copypasta: // /turf/Initialize @@ -75,7 +76,16 @@ if (opacity && isturf(loc)) var/turf/T = loc T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. + return INITIALIZE_HINT_NORMAL +//called if Initialize returns INITIALIZE_HINT_LATELOAD +//This version shouldn't be called +/atom/proc/LateInitialize() + var/static/list/warned_types = list() + if(!warned_types[type]) + WARNING("Old style LateInitialize behaviour detected in [type]!") + warned_types[type] = TRUE + Initialize(FALSE) /atom/Destroy() if(alternate_appearances) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index f96d6eb8a23..3b82020c608 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -46,7 +46,7 @@ return ..() /atom/movable/Initialize(mapload) - ..() + . = ..() for(var/L in initial_languages) grant_language(L) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 2a23c374447..27a358081d2 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -135,10 +135,10 @@ /obj/machinery/abductor/console/Initialize(mapload) - if(mapload) - return TRUE //wait for machines list ..() + return INITIALIZE_HINT_LATELOAD +/obj/machinery/abductor/console/LateInitialize() if(!team) return diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 8fcdc7c4a3a..c10cd5f6c8e 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -19,12 +19,12 @@ /obj/machinery/doorButtons/proc/findObjsByTag() return -/obj/machinery/doorButtons/Initialize(mapload) - if(mapload) - ..() - return TRUE - else - findObjsByTag() +/obj/machinery/doorButtons/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/doorButtons/LateInitialize() + findObjsByTag() /obj/machinery/doorButtons/emag_act(mob/user) if(!emagged) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4b20f12bf82..a14d345e2f8 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -37,7 +37,7 @@ ..() /obj/Initialize() - ..() + . = ..() if (!armor) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) if(on_blueprints && isturf(loc)) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index e38bc936e2d..405c2d22253 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -14,18 +14,15 @@ /obj/structure/ladder/Initialize(mapload) - if(!initialized) - GLOB.ladders += src - ..() - if(mapload) - return TRUE - update_link() + GLOB.ladders += src + ..() + return INITIALIZE_HINT_LATELOAD /obj/structure/ladder/Destroy() GLOB.ladders -= src . = ..() -/obj/structure/ladder/proc/update_link() +/obj/structure/ladder/LateInitialize() for(var/obj/structure/ladder/L in GLOB.ladders) if(L.id == id) if(L.height == (height - 1)) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 6c1e2743cd5..a0940eded1f 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -42,6 +42,8 @@ if (opacity) has_opaque_atom = TRUE + + return INITIALIZE_HINT_NORMAL /turf/open/space/attack_ghost(mob/dead/observer/user) if(destination_z) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10eefc4b14e..1c2d65355ea 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -56,6 +56,7 @@ if (opacity) has_opaque_atom = TRUE + return INITIALIZE_HINT_NORMAL /turf/proc/Initalize_Atmos(times_fired) CalculateAdjacentTurfs() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 607b402f1d4..7d6a49afacf 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -160,7 +160,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug()) /client/proc/clear_dynamic_transit, /client/proc/toggle_medal_disable, /client/proc/view_runtimes, - /client/proc/pump_random_event + /client/proc/pump_random_event, + /client/proc/cmd_display_init_log ) GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess,/proc/release)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 51a80223e0f..5b986e971fa 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -721,6 +721,13 @@ GLOBAL_PROTECT(AdminProcCall) usr << browse(dat, "window=dellog") +/client/proc/cmd_display_init_log() + set category = "Debug" + set name = "Display Initialzie() Log" + set desc = "Displays a list of things that didn't handle Initialize() properly" + + usr << browse(replacetext(SSatoms.InitLog(), "\n", "
      "), "window=initlog") + /client/proc/debug_huds(i as num) set category = "Debug" set name = "Debug HUDs" diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 18be292e97f..2648355b10d 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -48,49 +48,49 @@ /obj/machinery/computer/holodeck/Initialize(mapload) - . = mapload //late-initialize, area_copy need turfs to have air - if(!mapload) - ..() + ..() + return INITIALIZE_HINT_LATELOAD - if(ispath(holodeck_type,/area)) - var/list/possible = get_areas(holodeck_type,subtypes = FALSE) - linked = pop(possible) - if(ispath(offline_program,/area)) - var/list/possible = get_areas(offline_program,subtypes = FALSE) - offline_program = pop(possible) - // the following is necessary for power reasons - if(!linked || !offline_program) - log_world("No matching holodeck area found") - qdel(src) - return - var/area/AS = get_area(src) - if(istype(AS,/area/holodeck)) - log_world("### MAPPING ERROR") - log_world("Holodeck computer cannot be in a holodeck.") - log_world("This would cause circular power dependency.") - qdel(src) // todo handle constructed computers - return //l-lewd... - else - linked.linked = src // todo detect multiple/constructed computers +/obj/machinery/computer/holodeck/LateInitialize() + if(ispath(holodeck_type,/area)) + var/list/possible = get_areas(holodeck_type,subtypes = FALSE) + linked = pop(possible) + if(ispath(offline_program,/area)) + var/list/possible = get_areas(offline_program,subtypes = FALSE) + offline_program = pop(possible) + // the following is necessary for power reasons + if(!linked || !offline_program) + log_world("No matching holodeck area found") + qdel(src) + return + var/area/AS = get_area(src) + if(istype(AS,/area/holodeck)) + log_world("### MAPPING ERROR") + log_world("Holodeck computer cannot be in a holodeck.") + log_world("This would cause circular power dependency.") + qdel(src) // todo handle constructed computers + return //l-lewd... + else + linked.linked = src // todo detect multiple/constructed computers - program_cache = list() - emag_programs = list() - for(var/typekey in subtypesof(program_type)) - var/area/holodeck/A = locate(typekey) - if(!A || A == offline_program) - continue - if(A.contents.len == 0) - continue // not loaded - if(A.restricted) - emag_programs += A - else - program_cache += A - if(typekey == init_program) - load_program(A,force=1) - if(random_program && program_cache.len && init_program == null) - load_program(pick(program_cache),force=1) - else if(!program) - load_program(offline_program) + program_cache = list() + emag_programs = list() + for(var/typekey in subtypesof(program_type)) + var/area/holodeck/A = locate(typekey) + if(!A || A == offline_program) + continue + if(A.contents.len == 0) + continue // not loaded + if(A.restricted) + emag_programs += A + else + program_cache += A + if(typekey == init_program) + load_program(A,force=1) + if(random_program && program_cache.len && init_program == null) + load_program(pick(program_cache),force=1) + else if(!program) + load_program(offline_program) /obj/machinery/computer/holodeck/power_change() ..() diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index c3441cc16c9..246bba711f1 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -1,9 +1,6 @@ //Dead mobs can exist whenever. This is needful -/mob/dead/New(loc) - ..() - if(!initialized) - args[1] = FALSE - Initialize(arglist(args)) //EXIST DAMN YOU!!! + +INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/dust() //ghosts can't be vaporised. return diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index ae11de49739..a5f5b2e1768 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -30,6 +30,7 @@ loc = pick(GLOB.newplayer_start) else loc = locate(1,1,1) + return INITIALIZE_HINT_NORMAL /mob/dead/new_player/proc/new_player_panel() diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 264b6a167d2..68190f5e451 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -212,13 +212,14 @@ /obj/machinery/conveyor_switch/Initialize(mapload, newid) - if(mapload) - return TRUE //need machines list - . = ..() + ..() if(!id) id = newid update() + return INITIALIZE_HINT_LATELOAD //for machines list + +/obj/machinery/conveyor_switch/LateInitialize() conveyors = list() for(var/obj/machinery/conveyor/C in GLOB.machines) if(C.id == id) diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 9b1d5e649f2..5013d9d8799 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -64,17 +64,17 @@ deconstruct() /obj/machinery/disposal/Initialize(mapload) - . = mapload //late-initialize, we need turfs to have air - if(initialized) //will only be run on late mapload initialization - //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it - var/atom/L = loc - var/datum/gas_mixture/env = new - env.copy_from(L.return_air()) - var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) - air_contents.merge(removed) - trunk_check() - else - ..() + ..() + return INITIALIZE_HINT_LATELOAD //we need turfs to have air + +/obj/machinery/disposal/LateInitialize() + //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it + var/atom/L = loc + var/datum/gas_mixture/env = new + env.copy_from(L.return_air()) + var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) + air_contents.merge(removed) + trunk_check() /obj/machinery/disposal/attackby(obj/item/I, mob/user, params) add_fingerprint(user) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index aa0b9e6f786..ccb8f6b0914 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -22,20 +22,17 @@ var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!! /obj/docking_port/mobile/arrivals/Initialize(mapload) - if(mapload) - return TRUE //late initialize to make sure the latejoin list is populated - - preferred_direction = dir - if(SSshuttle.arrivals) WARNING("More than one arrivals docking_port placed on map!") - qdel(src) - return - + return INITIALIZE_HINT_QDEL SSshuttle.arrivals = src . = ..() + preferred_direction = dir + return INITIALIZE_HINT_LATELOAD //for latejoin list + +/obj/docking_port/mobile/arrivals/LateInitialize() areas = list() var/list/new_latejoin = list() From 729010bbb2b1b26d4eaafd46580f88fc11111f03 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 18:04:57 -0400 Subject: [PATCH 73/97] Unorphans the blackbox (#26129) Moved sql_poll_population from server_maint to this new SS. Moved few remaining server_maint tasks to SSping and deleted it. --- code/controllers/admin.dm | 4 +- .../subsystem/blackbox.dm} | 510 +++++++++--------- code/controllers/subsystem/job.dm | 2 +- code/controllers/subsystem/mapping.dm | 2 +- code/controllers/subsystem/ping.dm | 28 - code/controllers/subsystem/server_maint.dm | 32 +- code/datums/helper_datums/getrev.dm | 2 +- code/game/gamemodes/blob/blob_finish.dm | 6 +- code/game/gamemodes/changeling/changeling.dm | 8 +- .../gamemodes/changeling/changeling_power.dm | 4 +- .../gamemodes/changeling/evolution_menu.dm | 2 +- .../gamemodes/changeling/powers/absorb.dm | 4 +- .../gamemodes/changeling/powers/linglink.dm | 2 +- code/game/gamemodes/clock_cult/clock_cult.dm | 6 +- .../gamemodes/clock_cult/clock_scripture.dm | 2 +- code/game/gamemodes/cult/cult.dm | 22 +- code/game/gamemodes/cult/ritual.dm | 2 +- code/game/gamemodes/game_mode.dm | 20 +- code/game/gamemodes/gang/gang.dm | 4 +- code/game/gamemodes/meteor/meteor.dm | 4 +- .../gamemodes/miniantags/monkey/monkey.dm | 8 +- code/game/gamemodes/nuclear/nuclear.dm | 20 +- .../gamemodes/nuclear/nuclear_challenge.dm | 2 +- code/game/gamemodes/revolution/revolution.dm | 4 +- code/game/gamemodes/traitor/traitor.dm | 8 +- code/game/gamemodes/wizard/raginmages.dm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 14 +- code/game/gamemodes/wizard/wizard.dm | 10 +- code/game/machinery/computer/arcade.dm | 12 +- .../game/machinery/computer/communications.dm | 10 +- code/game/machinery/newscaster.dm | 6 +- code/game/machinery/telecomms/broadcasting.dm | 25 +- code/game/machinery/vending.dm | 2 +- code/game/mecha/mecha_construction_paths.dm | 14 +- code/game/objects/items/charter.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 4 +- code/game/objects/items/weapons/handcuffs.dm | 6 +- .../objects/items/weapons/holy_weapons.dm | 2 +- .../objects/items/weapons/storage/book.dm | 2 +- code/game/objects/structures/ai_core.dm | 2 +- .../turfs/simulated/floor/plating/asteroid.dm | 2 +- code/game/turfs/simulated/minerals.dm | 4 +- code/modules/admin/NewBan.dm | 2 +- code/modules/admin/admin.dm | 36 +- code/modules/admin/admin_verbs.dm | 40 +- code/modules/admin/secrets.dm | 54 +- code/modules/admin/topic.dm | 30 +- code/modules/admin/verbs/adminhelp.dm | 16 +- code/modules/admin/verbs/adminjump.dm | 16 +- code/modules/admin/verbs/adminpm.dm | 4 +- code/modules/admin/verbs/adminsay.dm | 2 +- code/modules/admin/verbs/atmosdebug.dm | 4 +- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/verbs/debug.dm | 30 +- code/modules/admin/verbs/diagnostics.dm | 8 +- code/modules/admin/verbs/fps.dm | 2 +- code/modules/admin/verbs/getlogs.dm | 4 +- code/modules/admin/verbs/machine_upgrade.dm | 2 +- code/modules/admin/verbs/mapping.dm | 16 +- code/modules/admin/verbs/massmodvar.dm | 2 +- code/modules/admin/verbs/panicbunker.dm | 2 +- code/modules/admin/verbs/playsound.dm | 8 +- code/modules/admin/verbs/possess.dm | 6 +- code/modules/admin/verbs/pray.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 64 +-- .../admin/verbs/reestablish_db_connection.dm | 4 +- code/modules/assembly/holder.dm | 2 +- code/modules/cargo/exports.dm | 4 +- code/modules/client/preferences_toggles.dm | 50 +- code/modules/client/verbs/ooc.dm | 2 +- code/modules/crafting/craft.dm | 2 +- code/modules/events/_event.dm | 4 +- code/modules/food_and_drinks/food/snacks.dm | 4 +- .../kitchen_machinery/processor.dm | 2 +- code/modules/hydroponics/seeds.dm | 2 +- .../jobs/job_types/civilian_chaplain.dm | 4 +- code/modules/mining/aux_base.dm | 2 +- code/modules/mining/equipment.dm | 8 +- .../mining/lavaland/necropolis_chests.dm | 8 +- code/modules/mining/machine_vending.dm | 4 +- code/modules/mob/living/brain/MMI.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../modules/mob/living/silicon/robot/death.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 +- .../hostile/megafauna/megafauna.dm | 2 +- .../simple_animal/hostile/mining_mobs.dm | 12 +- .../mob/living/simple_animal/slime/powers.dm | 2 +- code/modules/power/cell.dm | 2 +- code/modules/power/singularity/generator.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/medbeam.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 2 +- .../chemistry/recipes/slime_extracts.dm | 2 +- code/modules/recycling/disposal-unit.dm | 2 +- code/modules/research/rdconsole.dm | 8 +- .../security_levels/keycard_authentication.dm | 4 +- code/modules/shuttle/arrivals.dm | 2 +- code/modules/shuttle/emergency.dm | 2 +- code/modules/shuttle/manipulator.dm | 4 +- code/modules/shuttle/shuttle.dm | 4 +- code/modules/shuttle/supply.dm | 2 +- code/modules/surgery/surgery.dm | 2 +- code/modules/uplink/uplink_item.dm | 10 +- code/world.dm | 6 +- tgstation.dme | 3 +- 106 files changed, 668 insertions(+), 702 deletions(-) rename code/{orphaned_procs/statistics.dm => controllers/subsystem/blackbox.dm} (57%) delete mode 100644 code/controllers/subsystem/ping.dm diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 2be7139a27b..3565620c88a 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -45,9 +45,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) switch(controller) if("Master") Recreate_MC() - feedback_add_details("admin_verb","Restart Master Controller") + SSblackbox.add_details("admin_verb","Restart Master Controller") if("Failsafe") new /datum/controller/failsafe() - feedback_add_details("admin_verb","Restart Failsafe Controller") + SSblackbox.add_details("admin_verb","Restart Failsafe Controller") message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") diff --git a/code/orphaned_procs/statistics.dm b/code/controllers/subsystem/blackbox.dm similarity index 57% rename from code/orphaned_procs/statistics.dm rename to code/controllers/subsystem/blackbox.dm index d6cdcda6c1c..bac949b0465 100644 --- a/code/orphaned_procs/statistics.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -1,253 +1,257 @@ -GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new) - -//the feedback datum; stores all feedback -/datum/feedback - var/list/messages = list() - var/list/messages_admin = list() - - var/list/msg_common = list() - var/list/msg_science = list() - var/list/msg_command = list() - var/list/msg_medical = list() - var/list/msg_engineering = list() - var/list/msg_security = list() - var/list/msg_deathsquad = list() - var/list/msg_syndicate = list() - var/list/msg_service = list() - var/list/msg_cargo = list() - - var/list/datum/feedback_variable/feedback = new() - -/datum/feedback/proc/find_feedback_datum(variable) - for (var/datum/feedback_variable/FV in feedback) - if (FV.get_variable() == variable) - return FV - var/datum/feedback_variable/FV = new(variable) - feedback += FV - return FV - -/datum/feedback/proc/get_round_feedback() - return feedback - -/datum/feedback/proc/round_end_data_gathering() - var/pda_msg_amt = 0 - var/rc_msg_amt = 0 - - for (var/obj/machinery/message_server/MS in GLOB.message_servers) - if (MS.pda_msgs.len > pda_msg_amt) - pda_msg_amt = MS.pda_msgs.len - if (MS.rc_msgs.len > rc_msg_amt) - rc_msg_amt = MS.rc_msgs.len - - feedback_set_details("radio_usage","") - - feedback_add_details("radio_usage","COM-[msg_common.len]") - feedback_add_details("radio_usage","SCI-[msg_science.len]") - feedback_add_details("radio_usage","HEA-[msg_command.len]") - feedback_add_details("radio_usage","MED-[msg_medical.len]") - feedback_add_details("radio_usage","ENG-[msg_engineering.len]") - feedback_add_details("radio_usage","SEC-[msg_security.len]") - feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]") - feedback_add_details("radio_usage","SYN-[msg_syndicate.len]") - feedback_add_details("radio_usage","SRV-[msg_service.len]") - feedback_add_details("radio_usage","CAR-[msg_cargo.len]") - feedback_add_details("radio_usage","OTH-[messages.len]") - feedback_add_details("radio_usage","PDA-[pda_msg_amt]") - feedback_add_details("radio_usage","RC-[rc_msg_amt]") - - feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. - -//This proc is only to be called at round end. -/datum/feedback/proc/save_all_data_to_sql() - if (!feedback) return - - round_end_data_gathering() //round_end time logging and some other data processing - if (!SSdbcore.Connect()) return - var/round_id - - var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") - if(!query_feedback_max_id.Execute()) - return - while (query_feedback_max_id.NextRow()) - round_id = query_feedback_max_id.item[1] - - if (!isnum(round_id)) - round_id = text2num(round_id) - round_id++ - - var/sqlrowlist = "" - - for (var/datum/feedback_variable/FV in feedback) - if (sqlrowlist != "") - sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error - - sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" - - if (sqlrowlist == "") - return - - var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) - query_feedback_save.Execute() - - -/proc/feedback_set(variable,value) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.set_value(value) - -/proc/feedback_inc(variable,value) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.inc(value) - -/proc/feedback_dec(variable,value) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.dec(value) - -/proc/feedback_set_details(variable,details) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.set_details(details) - -/proc/feedback_add_details(variable,details) - if(!GLOB.blackbox) - return - - var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable) - - if(!FV) - return - - FV.add_details(details) - -//feedback variable datum, for storing all kinds of data -/datum/feedback_variable - var/variable - var/value - var/details - -/datum/feedback_variable/New(var/param_variable,var/param_value = 0) - variable = param_variable - value = param_value - -/datum/feedback_variable/proc/inc(num = 1) - if (isnum(value)) - value += num - else - value = text2num(value) - if (isnum(value)) - value += num - else - value = num - -/datum/feedback_variable/proc/dec(num = 1) - if (isnum(value)) - value -= num - else - value = text2num(value) - if (isnum(value)) - value -= num - else - value = -num - -/datum/feedback_variable/proc/set_value(num) - if (isnum(num)) - value = num - -/datum/feedback_variable/proc/get_value() - if (!isnum(value)) - return 0 - return value - -/datum/feedback_variable/proc/get_variable() - return variable - -/datum/feedback_variable/proc/set_details(text) - if (istext(text)) - details = text - -/datum/feedback_variable/proc/add_details(text) - if (istext(text)) - text = replacetext(text, " ", "_") - if (!details) - details = text - else - details += " [text]" - -/datum/feedback_variable/proc/get_details() - return details - -/datum/feedback_variable/proc/get_parsed() - return list(variable,value,details) - -//sql reporting procs -/proc/sql_poll_population() - if(!config.sql_enabled) - return - if(!SSdbcore.Connect()) - return - var/playercount = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - playercount += 1 - var/admincount = GLOB.admins.len - var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')") - query_record_playercount.Execute() - -/proc/sql_report_death(mob/living/L) - if(!config.sql_enabled) - return - if(!SSdbcore.Connect()) - return - if(!L || !L.key || !L.mind) - return - var/turf/T = get_turf(L) - var/area/placeofdeath = get_area(T.loc) - var/sqlname = sanitizeSQL(L.real_name) - var/sqlkey = sanitizeSQL(L.ckey) - var/sqljob = sanitizeSQL(L.mind.assigned_role) - var/sqlspecial = sanitizeSQL(L.mind.special_role) - var/sqlpod = sanitizeSQL(placeofdeath.name) - var/laname - var/lakey - if(L.lastattacker && ismob(L.lastattacker)) - var/mob/LA = L.lastattacker - laname = sanitizeSQL(LA.real_name) - lakey = sanitizeSQL(LA.key) - var/sqlgender = sanitizeSQL(L.gender) - var/sqlbrute = sanitizeSQL(L.getBruteLoss()) - var/sqlfire = sanitizeSQL(L.getFireLoss()) - var/sqlbrain = sanitizeSQL(L.getBrainLoss()) - var/sqloxy = sanitizeSQL(L.getOxyLoss()) - var/sqltox = sanitizeSQL(L.getStaminaLoss()) - var/sqlclone = sanitizeSQL(L.getStaminaLoss()) - var/sqlstamina = sanitizeSQL(L.getStaminaLoss()) - var/coord = sanitizeSQL("[L.x], [L.y], [L.z]") - var/map = sanitizeSQL(SSmapping.config.map_name) - var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')") - query_report_death.Execute() +SUBSYSTEM_DEF(blackbox) + name = "Blackbox" + wait = 6000 + flags = SS_NO_TICK_CHECK + + var/list/msg_common = list() + var/list/msg_science = list() + var/list/msg_command = list() + var/list/msg_medical = list() + var/list/msg_engineering = list() + var/list/msg_security = list() + var/list/msg_deathsquad = list() + var/list/msg_syndicate = list() + var/list/msg_service = list() + var/list/msg_cargo = list() + var/list/msg_other = list() + + var/list/feedback = list() //list of datum/feedback_variable + +//poll population +/datum/controller/subsystem/blackbox/fire() + if(!SSdbcore.Connect()) + return + var/playercount = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + playercount += 1 + var/admincount = GLOB.admins.len + var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')") + query_record_playercount.Execute() + +/datum/controller/subsystem/blackbox/Recover() + msg_common = SSblackbox.msg_common + msg_science = SSblackbox.msg_science + msg_command = SSblackbox.msg_command + msg_medical = SSblackbox.msg_medical + msg_engineering = SSblackbox.msg_engineering + msg_security = SSblackbox.msg_security + msg_deathsquad = SSblackbox.msg_deathsquad + msg_syndicate = SSblackbox.msg_syndicate + msg_service = SSblackbox.msg_service + msg_cargo = SSblackbox.msg_cargo + msg_other = SSblackbox.msg_other + + feedback = SSblackbox.feedback + +//no touchie +/datum/controller/subsystem/blackbox/can_vv_get(var_name) + if(var_name == "feedback") + return FALSE + return ..() + +/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value) + return FALSE + +/datum/controller/subsystem/blackbox/Shutdown() + var/pda_msg_amt = 0 + var/rc_msg_amt = 0 + + for (var/obj/machinery/message_server/MS in GLOB.message_servers) + if (MS.pda_msgs.len > pda_msg_amt) + pda_msg_amt = MS.pda_msgs.len + if (MS.rc_msgs.len > rc_msg_amt) + rc_msg_amt = MS.rc_msgs.len + + set_details("radio_usage","") + + add_details("radio_usage","COM-[msg_common.len]") + add_details("radio_usage","SCI-[msg_science.len]") + add_details("radio_usage","HEA-[msg_command.len]") + add_details("radio_usage","MED-[msg_medical.len]") + add_details("radio_usage","ENG-[msg_engineering.len]") + add_details("radio_usage","SEC-[msg_security.len]") + add_details("radio_usage","DTH-[msg_deathsquad.len]") + add_details("radio_usage","SYN-[msg_syndicate.len]") + add_details("radio_usage","SRV-[msg_service.len]") + add_details("radio_usage","CAR-[msg_cargo.len]") + add_details("radio_usage","OTH-[msg_other.len]") + add_details("radio_usage","PDA-[pda_msg_amt]") + add_details("radio_usage","RC-[rc_msg_amt]") + + set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. + + if (!SSdbcore.Connect()) + return + + var/round_id + + var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") + if(!query_feedback_max_id.Execute()) + return + while (query_feedback_max_id.NextRow()) + round_id = query_feedback_max_id.item[1] + + if (!isnum(round_id)) + round_id = text2num(round_id) + round_id++ + + var/sqlrowlist = "" + + for (var/datum/feedback_variable/FV in feedback) + if (sqlrowlist != "") + sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error + + sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" + + if (sqlrowlist == "") + return + + var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) + query_feedback_save.Execute() + +/datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq) + switch(freq) + if(1459) + msg_common += blackbox_msg + if(1351) + msg_science += blackbox_msg + if(1353) + msg_command += blackbox_msg + if(1355) + msg_medical += blackbox_msg + if(1357) + msg_engineering += blackbox_msg + if(1359) + msg_security += blackbox_msg + if(1441) + msg_deathsquad += blackbox_msg + if(1213) + msg_syndicate += blackbox_msg + if(1349) + msg_service += blackbox_msg + if(1347) + msg_cargo += blackbox_msg + else + msg_other += blackbox_msg + +/datum/controller/subsystem/blackbox/proc/find_feedback_datum(variable) + for(var/datum/feedback_variable/FV in feedback) + if(FV.get_variable() == variable) + return FV + + var/datum/feedback_variable/FV = new(variable) + feedback += FV + return FV + +/datum/controller/subsystem/blackbox/proc/set_val(variable, value) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.set_value(value) + +/datum/controller/subsystem/blackbox/proc/inc(variable, value) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.inc(value) + +/datum/controller/subsystem/blackbox/proc/dec(variable,value) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.dec(value) + +/datum/controller/subsystem/blackbox/proc/set_details(variable,details) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.set_details(details) + +/datum/controller/subsystem/blackbox/proc/add_details(variable,details) + var/datum/feedback_variable/FV = find_feedback_datum(variable) + FV.add_details(details) + +/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L) + if(!SSdbcore.Connect()) + return + if(!L || !L.key || !L.mind) + return + var/turf/T = get_turf(L) + var/area/placeofdeath = get_area(T.loc) + var/sqlname = sanitizeSQL(L.real_name) + var/sqlkey = sanitizeSQL(L.ckey) + var/sqljob = sanitizeSQL(L.mind.assigned_role) + var/sqlspecial = sanitizeSQL(L.mind.special_role) + var/sqlpod = sanitizeSQL(placeofdeath.name) + var/laname + var/lakey + if(L.lastattacker && ismob(L.lastattacker)) + var/mob/LA = L.lastattacker + laname = sanitizeSQL(LA.real_name) + lakey = sanitizeSQL(LA.key) + var/sqlgender = sanitizeSQL(L.gender) + var/sqlbrute = sanitizeSQL(L.getBruteLoss()) + var/sqlfire = sanitizeSQL(L.getFireLoss()) + var/sqlbrain = sanitizeSQL(L.getBrainLoss()) + var/sqloxy = sanitizeSQL(L.getOxyLoss()) + var/sqltox = sanitizeSQL(L.getStaminaLoss()) + var/sqlclone = sanitizeSQL(L.getStaminaLoss()) + var/sqlstamina = sanitizeSQL(L.getStaminaLoss()) + var/coord = sanitizeSQL("[L.x], [L.y], [L.z]") + var/map = sanitizeSQL(SSmapping.config.map_name) + var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')") + query_report_death.Execute() + + +//feedback variable datum, for storing all kinds of data +/datum/feedback_variable + var/variable + var/value + var/details + +/datum/feedback_variable/New(param_variable, param_value = 0) + variable = param_variable + value = param_value + +/datum/feedback_variable/proc/inc(num = 1) + if (isnum(value)) + value += num + else + value = text2num(value) + if (isnum(value)) + value += num + else + value = num + +/datum/feedback_variable/proc/dec(num = 1) + if (isnum(value)) + value -= num + else + value = text2num(value) + if (isnum(value)) + value -= num + else + value = -num + +/datum/feedback_variable/proc/set_value(num) + if (isnum(num)) + value = num + +/datum/feedback_variable/proc/get_value() + if (!isnum(value)) + return 0 + return value + +/datum/feedback_variable/proc/get_variable() + return variable + +/datum/feedback_variable/proc/set_details(text) + if (istext(text)) + details = text + +/datum/feedback_variable/proc/add_details(text) + if (istext(text)) + text = replacetext(text, " ", "_") + if (!details) + details = text + else + details += " [text]" + +/datum/feedback_variable/proc/get_details() + return details + +/datum/feedback_variable/proc/get_parsed() + return list(variable,value,details) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 137bd2a2c10..a3255b73e40 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -483,7 +483,7 @@ SUBSYSTEM_DEF(job) else level4++ //not selected tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-" - feedback_add_details("job_preferences",tmp_str) + SSblackbox.add_details("job_preferences",tmp_str) /datum/controller/subsystem/job/proc/PopcapReached() if(config.hard_popcap || config.extreme_popcap) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 1499bc5029f..d73d417f5f2 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -116,7 +116,7 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [config.map_name]...") TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION) INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!") - feedback_add_details("map_name", config.map_name) + SSblackbox.add_details("map_name", config.map_name) if(config.minetype != "lavaland") INIT_ANNOUNCE("WARNING: A map without lavaland set as it's minetype was loaded! This is being ignored! Update the maploader code!") diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm deleted file mode 100644 index 0829766174d..00000000000 --- a/code/controllers/subsystem/ping.dm +++ /dev/null @@ -1,28 +0,0 @@ -#define PING_BUFFER_TIME 25 - -SUBSYSTEM_DEF(ping) - name = "Ping" - wait = 6 - flags = SS_NO_INIT|SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY - priority = 10 - var/list/currentrun - -/datum/controller/subsystem/ping/fire(resumed = FALSE) - if (!resumed) - src.currentrun = GLOB.clients.Copy() - - var/list/currentrun = src.currentrun - while (length(currentrun)) - var/client/C = currentrun[currentrun.len] - currentrun.len-- - if (!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1)) - if (MC_TICK_CHECK) - return - continue - winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]") - if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check - return - - currentrun = null - -#undef PING_BUFFER_TIME diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 3ef088b328d..be80324fa1f 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -1,17 +1,28 @@ +#define PING_BUFFER_TIME 25 + SUBSYSTEM_DEF(server_maint) name = "Server Tasks" - wait = 6000 - flags = SS_NO_TICK_CHECK + wait = 6 + flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY + priority = 10 + var/list/currentrun /datum/controller/subsystem/server_maint/Initialize(timeofday) if (config.hub) world.visibility = 1 ..() -/datum/controller/subsystem/server_maint/fire() - //handle kicking inactive players - if(config.kick_inactive) - for(var/client/C in GLOB.clients) +/datum/controller/subsystem/server_maint/fire(resumed = FALSE) + if(!resumed) + src.currentrun = GLOB.clients.Copy() + + var/list/currentrun = src.currentrun + var/round_started = Master.round_started + + for(var/I in currentrun) + var/client/C = I + //handle kicking inactive players + if(round_started && config.kick_inactive) if(C.is_afk(config.afk_period)) var/cmob = C.mob if(!(istype(cmob, /mob/dead/observer) || (istype(cmob, /mob/dead) && C.holder))) @@ -19,5 +30,10 @@ SUBSYSTEM_DEF(server_maint) to_chat(C, "You have been inactive for more than [config.afk_period / 600] minutes and have been disconnected.") qdel(C) - if(config.sql_enabled) - sql_poll_population() + if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))) + winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]") + + if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check + return + +#undef PING_BUFFER_TIME diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index f24cb7ab6d5..89fafe5dcca 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -25,7 +25,7 @@ for(var/line in testmerge) if(line) log_world("Test merge active of PR #[line]") - feedback_add_details("testmerged_prs","[line]") + SSblackbox.add_details("testmerged_prs","[line]") log_world("Based off master commit [parentcommit]") else log_world(parentcommit) diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 4d1e06d997d..ab94f94afd2 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -20,7 +20,7 @@ if(round_converted) //So badmin blobs later don't step on the dead natural blobs metaphorical toes ..() if(blobwincount <= GLOB.blobs_legit.len) - feedback_set_details("round_end_result","win - blob took over") + SSblackbox.set_details("round_end_result","win - blob took over") to_chat(world, "The blob has taken over the station!") to_chat(world, "The entire station was eaten by the Blob!") log_game("Blob mode completed with a blob victory.") @@ -28,7 +28,7 @@ SSticker.news_report = BLOB_WIN else if(station_was_nuked) - feedback_set_details("round_end_result","halfwin - nuke") + SSblackbox.set_details("round_end_result","halfwin - nuke") to_chat(world, "Partial Win: The station has been destroyed!") to_chat(world, "Directive 7-12 has been successfully carried out, preventing the Blob from spreading.") log_game("Blob mode completed with a tie (station destroyed).") @@ -36,7 +36,7 @@ SSticker.news_report = BLOB_NUKE else if(!GLOB.blob_cores.len) - feedback_set_details("round_end_result","loss - blob eliminated") + SSblackbox.set_details("round_end_result","loss - blob eliminated") to_chat(world, "The staff has won!") to_chat(world, "The alien organism has been eradicated from the station!") log_game("Blob mode completed with a crew victory.") diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 7228f61eb2f..5e41372f6a6 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -254,19 +254,19 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w for(var/datum/objective/objective in changeling.objectives) if(objective.check_completion()) text += "
      Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("changeling_objective","[objective.type]|SUCCESS") + SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS") else text += "
      Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("changeling_objective","[objective.type]|FAIL") + SSblackbox.add_details("changeling_objective","[objective.type]|FAIL") changelingwin = 0 count++ if(changelingwin) text += "
      The changeling was successful!" - feedback_add_details("changeling_success","SUCCESS") + SSblackbox.add_details("changeling_success","SUCCESS") else text += "
      The changeling has failed." - feedback_add_details("changeling_success","FAIL") + SSblackbox.add_details("changeling_success","FAIL") text += "
      " to_chat(world, text) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index d58e603b420..cdb69516bf4 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -21,7 +21,7 @@ /obj/effect/proc_holder/changeling/proc/on_purchase(mob/user, is_respec) if(!is_respec) - feedback_add_details("changeling_power_purchase",name) + SSblackbox.add_details("changeling_power_purchase",name) /obj/effect/proc_holder/changeling/proc/on_refund(mob/user) return @@ -37,7 +37,7 @@ return var/datum/changeling/c = user.mind.changeling if(sting_action(user, target)) - feedback_add_details("changeling_powers",name) + SSblackbox.add_details("changeling_powers",name) sting_feedback(user, target) take_chemical_cost(c) diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 838210eb586..59ed4ab2e86 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -68,7 +68,7 @@ mind.changeling.purchasedpowers+=S S.on_purchase(src, is_respec) if(is_respec) - feedback_add_details("changeling_power_purchase","Readapt") + SSblackbox.add_details("changeling_power_purchase","Readapt") var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste if(ishuman(C)) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 8668b53713a..de31e575897 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -42,13 +42,13 @@ to_chat(target, "You feel a sharp stabbing pain!") target.take_overall_damage(40) - feedback_add_details("changeling_powers","Absorb DNA|[i]") + SSblackbox.add_details("changeling_powers","Absorb DNA|[i]") if(!do_mob(user, target, 150)) to_chat(user, "Our absorption of [target] has been interrupted!") changeling.isabsorbing = 0 return - feedback_add_details("changeling_powers","Absorb DNA|4") + SSblackbox.add_details("changeling_powers","Absorb DNA|4") user.visible_message("[user] sucks the fluids from [target]!", "We have absorbed [target].") to_chat(target, "You are absorbed by the changeling!") diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index 5a64d551b55..fc4b91b6503 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -56,7 +56,7 @@ to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate!") target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them sleep(1800) - feedback_add_details("changeling_powers","Hivemind Link|[i]") + SSblackbox.add_details("changeling_powers","Hivemind Link|[i]") if(!do_mob(user, target, 20)) to_chat(user, "Our link with [target] has ended!") changeling.islinking = 0 diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 670e08e7a23..deb5ad7e1a1 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -194,7 +194,7 @@ Credit where due: var/datum/game_mode/clockwork_cult/C = SSticker.mode if(C.check_clockwork_victory()) text += "Ratvar's servants have succeeded in fulfilling His goals!" - feedback_set_details("round_end_result", "win - servants completed their objective (summon ratvar)") + SSblackbox.set_details("round_end_result", "win - servants completed their objective (summon ratvar)") else var/half_victory = FALSE var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in GLOB.all_clockwork_objects @@ -203,10 +203,10 @@ Credit where due: if(half_victory) text += "The crew escaped before Ratvar could rise, but the gateway \ was successfully constructed!" - feedback_set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)") + SSblackbox.set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)") else text += "Ratvar's servants have failed!" - feedback_set_details("round_end_result", "loss - servants failed their objective (summon ratvar)") + SSblackbox.set_details("round_end_result", "loss - servants failed their objective (summon ratvar)") text += "
      The servants' objective was:
      [CLOCKCULT_OBJECTIVE]" text += "
      Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches." text += "
      Construction Value(CV) was: [GLOB.clockwork_construction_value]" diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 8e688f30aa6..e8f1e8dbbc2 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -86,7 +86,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or else successful = TRUE if(slab && !slab.no_cost && !GLOB.ratvar_awakens) //if the slab exists and isn't debug and ratvar isn't up, log the scripture as being used - feedback_add_details("clockcult_scripture_recited", name) + SSblackbox.add_details("clockcult_scripture_recited", name) if(slab) slab.busy = null qdel(src) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 65dcb863eb5..f3832a830bc 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -218,12 +218,12 @@ /datum/game_mode/cult/declare_completion() if(!check_cult_victory()) - feedback_set_details("round_end_result","win - cult win") - feedback_set("round_end_result",acolytes_survived) + SSblackbox.set_details("round_end_result","win - cult win") + SSblackbox.set_val("round_end_result",acolytes_survived) to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") else - feedback_set_details("round_end_result","loss - staff stopped the cult") - feedback_set("round_end_result",acolytes_survived) + SSblackbox.set_details("round_end_result","loss - staff stopped the cult") + SSblackbox.set_val("round_end_result",acolytes_survived) to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") var/text = "" @@ -236,31 +236,31 @@ if("survive") if(!check_survive()) explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!" - feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]") + SSblackbox.add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]") SSticker.news_report = CULT_ESCAPE else explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail." - feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]") + SSblackbox.add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]") SSticker.news_report = CULT_FAILURE if("sacrifice") if(sacrifice_target) if(sacrifice_target in GLOB.sacrificed) explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!" - feedback_add_details("cult_objective","cult_sacrifice|SUCCESS") + SSblackbox.add_details("cult_objective","cult_sacrifice|SUCCESS") else if(sacrifice_target && sacrifice_target.current) explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail." - feedback_add_details("cult_objective","cult_sacrifice|FAIL") + SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL") else explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)." - feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") + SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) explanation = "Summon Nar-Sie. Success!" - feedback_add_details("cult_objective","cult_narsie|SUCCESS") + SSblackbox.add_details("cult_objective","cult_narsie|SUCCESS") SSticker.news_report = CULT_SUMMON else explanation = "Summon Nar-Sie. Fail." - feedback_add_details("cult_objective","cult_narsie|FAIL") + SSblackbox.add_details("cult_objective","cult_narsie|FAIL") SSticker.news_report = CULT_FAILURE text += "
      Objective #[obj_count]: [explanation]" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 2ed6840c917..843d16592a9 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -247,7 +247,7 @@ This file contains the arcane tome files. var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword) R.add_mob_blood(user) to_chat(user, "The [lowertext(R.cultist_name)] rune [R.cultist_desc]") - feedback_add_details("cult_runes_scribed", R.cultist_name) + SSblackbox.add_details("cult_runes_scribed", R.cultist_name) /obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user) var/area/A = get_area(T) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 53bd92f6c2d..f1144afc13d 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -80,12 +80,12 @@ report = config.intercept addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME) - feedback_set_details("round_start","[time2text(world.realtime)]") + SSblackbox.set_details("round_start","[time2text(world.realtime)]") if(SSticker && SSticker.mode) - feedback_set_details("game_mode","[SSticker.mode]") + SSblackbox.set_details("game_mode","[SSticker.mode]") if(GLOB.revdata.commit) - feedback_set_details("revision","[GLOB.revdata.commit]") - feedback_set_details("server_ip","[world.internet_address]:[world.port]") + SSblackbox.set_details("revision","[GLOB.revdata.commit]") + SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]") if(report) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() @@ -246,17 +246,17 @@ ghosts++ if(clients > 0) - feedback_set("round_end_clients",clients) + SSblackbox.set_val("round_end_clients",clients) if(ghosts > 0) - feedback_set("round_end_ghosts",ghosts) + SSblackbox.set_val("round_end_ghosts",ghosts) if(surviving_humans > 0) - feedback_set("survived_human",surviving_humans) + SSblackbox.set_val("survived_human",surviving_humans) if(surviving_total > 0) - feedback_set("survived_total",surviving_total) + SSblackbox.set_val("survived_total",surviving_total) if(escaped_humans > 0) - feedback_set("escaped_human",escaped_humans) + SSblackbox.set_val("escaped_human",escaped_humans) if(escaped_total > 0) - feedback_set("escaped_total",escaped_total) + SSblackbox.set_val("escaped_total",escaped_total) send2irc("Server", "Round just ended.") return 0 diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 22ca4b22987..9c31edf55fb 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -260,12 +260,12 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," return if(!winner) to_chat(world, "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
      ") - feedback_set_details("round_end_result","loss - gangs failed takeover") + SSblackbox.set_details("round_end_result","loss - gangs failed takeover") SSticker.news_report = GANG_LOSS else to_chat(world, "The [winner.name] Gang successfully performed a hostile takeover of the station!
      ") - feedback_set_details("round_end_result","win - gang domination complete") + SSblackbox.set_details("round_end_result","win - gang domination complete") SSticker.news_report = GANG_TAKEOVER diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 7897e86a026..d0cd7c05203 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -50,8 +50,8 @@ else to_chat(world, "Nobody survived the meteor storm!") - feedback_set_details("round_end_result","end - evacuation") - feedback_set("round_end_result",survivors) + SSblackbox.set_details("round_end_result","end - evacuation") + SSblackbox.set_val("round_end_result",survivors) ..() return 1 diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index ecb15bc2210..f9ea8dcc2cb 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -107,10 +107,10 @@ /datum/game_mode/monkey/declare_completion() if(check_monkey_victory()) - feedback_set_details("round_end_result","win - monkey win") - feedback_set("round_end_result",escaped_monkeys) + SSblackbox.set_details("round_end_result","win - monkey win") + SSblackbox.set_val("round_end_result",escaped_monkeys) to_chat(world, "The monkeys have overthrown their captors! Eeek eeeek!!") else - feedback_set_details("round_end_result","loss - staff stopped the monkeys") - feedback_set("round_end_result",escaped_monkeys) + SSblackbox.set_details("round_end_result","loss - staff stopped the monkeys") + SSblackbox.set_val("round_end_result",escaped_monkeys) to_chat(world, "The staff managed to contain the monkey infestation!") diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index d4d788e0490..b12dcc3bcc5 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -199,70 +199,70 @@ if(nuke_off_station == NUKE_SYNDICATE_BASE) - feedback_set_details("round_end_result","loss - syndicate nuked - disk secured") + SSblackbox.set_details("round_end_result","loss - syndicate nuked - disk secured") to_chat(world, "Humiliating Syndicate Defeat") to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") SSticker.news_report = NUKE_SYNDICATE_BASE else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - feedback_set_details("round_end_result","win - syndicate nuke") + SSblackbox.set_details("round_end_result","win - syndicate nuke") to_chat(world, "Syndicate Major Victory!") to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") SSticker.news_report = STATION_NUKED else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - feedback_set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") + SSblackbox.set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") to_chat(world, "Total Annihilation") to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") SSticker.news_report = STATION_NUKED else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - feedback_set_details("round_end_result","halfwin - blew wrong station") + SSblackbox.set_details("round_end_result","halfwin - blew wrong station") to_chat(world, "Crew Minor Victory") to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") SSticker.news_report = NUKE_MISS else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - feedback_set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") + SSblackbox.set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") SSticker.news_report = NUKE_MISS else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) - feedback_set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") + SSblackbox.set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") to_chat(world, "Crew Major Victory!") to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") SSticker.news_report = OPERATIVES_KILLED else if (disk_rescued) - feedback_set_details("round_end_result","loss - evacuation - disk secured") + SSblackbox.set_details("round_end_result","loss - evacuation - disk secured") to_chat(world, "Crew Major Victory") to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") SSticker.news_report = OPERATIVES_KILLED else if (!disk_rescued && are_operatives_dead()) - feedback_set_details("round_end_result","halfwin - evacuation - disk not secured") + SSblackbox.set_details("round_end_result","halfwin - evacuation - disk not secured") to_chat(world, "Neutral Victory!") to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") SSticker.news_report = OPERATIVE_SKIRMISH else if (!disk_rescued && crew_evacuated) - feedback_set_details("round_end_result","halfwin - detonation averted") + SSblackbox.set_details("round_end_result","halfwin - detonation averted") to_chat(world, "Syndicate Minor Victory!") to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") SSticker.news_report = OPERATIVE_SKIRMISH else if (!disk_rescued && !crew_evacuated) - feedback_set_details("round_end_result","halfwin - interrupted") + SSblackbox.set_details("round_end_result","halfwin - interrupted") to_chat(world, "Neutral Victory") to_chat(world, "Round was mysteriously interrupted!") diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 3e47aa517de..cad958ee64e 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -57,7 +57,7 @@ U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS U.hidden_uplink.set_gamemode(/datum/game_mode/nuclear) config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY) - feedback_set("nuclear_challenge_mode",1) + SSblackbox.set_val("nuclear_challenge_mode",1) qdel(src) /obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 634c68e89ad..7a31d1f3cdf 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -345,13 +345,13 @@ ////////////////////////////////////////////////////////////////////// /datum/game_mode/revolution/declare_completion() if(finished == 1) - feedback_set_details("round_end_result","win - heads killed") + SSblackbox.set_details("round_end_result","win - heads killed") to_chat(world, "The heads of staff were killed or exiled! The revolutionaries win!") SSticker.news_report = REVS_WIN else if(finished == 2) - feedback_set_details("round_end_result","loss - rev heads killed") + SSblackbox.set_details("round_end_result","loss - rev heads killed") to_chat(world, "The heads of staff managed to stop the revolution!") SSticker.news_report = REVS_LOSE diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 579ca3a7138..196a08ba9f0 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -260,10 +260,10 @@ for(var/datum/objective/objective in traitor.objectives) if(objective.check_completion()) objectives += "
      Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("traitor_objective","[objective.type]|SUCCESS") + SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS") else objectives += "
      Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("traitor_objective","[objective.type]|FAIL") + SSblackbox.add_details("traitor_objective","[objective.type]|FAIL") traitorwin = 0 count++ @@ -283,10 +283,10 @@ if(traitorwin) text += "
      The [special_role_text] was successful!" - feedback_add_details("traitor_success","SUCCESS") + SSblackbox.add_details("traitor_success","SUCCESS") else text += "
      The [special_role_text] has failed!" - feedback_add_details("traitor_success","FAIL") + SSblackbox.add_details("traitor_success","FAIL") text += "
      " diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 01eb8a52c49..1eb51a95b46 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -132,7 +132,7 @@ /datum/game_mode/wizard/raginmages/declare_completion() if(finished) - feedback_set_details("round_end_result","loss - wizard killed") + SSblackbox.set_details("round_end_result","loss - wizard killed") to_chat(world, "The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") ..(1) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 8c40d178bc1..d13671885c7 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -57,10 +57,10 @@ aspell.name = "Instant [aspell.name]" if(aspell.spell_level >= aspell.level_max) to_chat(user, "This spell cannot be strengthened any further.") - feedback_add_details("wizard_spell_improved", "[name]|[aspell.level]") + SSblackbox.add_details("wizard_spell_improved", "[name]|[aspell.level]") return 1 //No same spell found - just learn it - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) user.mind.AddSpell(S) to_chat(user, "You have learned [S.name].") return 1 @@ -266,7 +266,7 @@ /datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) new item_path(get_turf(user)) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) return 1 /datum/spellbook_entry/item/GetInfo() @@ -465,7 +465,7 @@ return TRUE /datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) new /datum/round_event/wizard/ghost() active = TRUE to_chat(user, "You have cast summon ghosts!") @@ -482,7 +482,7 @@ return (SSticker.mode.name != "ragin' mages" && !config.no_summon_guns) /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) rightandwrong(0, user, 25) active = 1 playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1) @@ -499,7 +499,7 @@ return (SSticker.mode.name != "ragin' mages" && !config.no_summon_magic) /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) rightandwrong(1, user, 25) active = 1 playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1) @@ -517,7 +517,7 @@ return (SSticker.mode.name != "ragin' mages" && !config.no_summon_events) /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) - feedback_add_details("wizard_spell_learned", name) + SSblackbox.add_details("wizard_spell_learned", name) summonevents() times++ playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 28921be6727..4ff888fa900 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -176,7 +176,7 @@ /datum/game_mode/wizard/declare_completion() if(finished) - feedback_set_details("round_end_result","loss - wizard killed") + SSblackbox.set_details("round_end_result","loss - wizard killed") to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") SSticker.news_report = WIZARD_KILLED @@ -208,19 +208,19 @@ for(var/datum/objective/objective in wizard.objectives) if(objective.check_completion()) text += "
      Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("wizard_objective","[objective.type]|SUCCESS") + SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS") else text += "
      Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("wizard_objective","[objective.type]|FAIL") + SSblackbox.add_details("wizard_objective","[objective.type]|FAIL") wizardwin = 0 count++ if(wizard.current && wizard.current.stat!=2 && wizardwin) text += "
      The wizard was successful!" - feedback_add_details("wizard_success","SUCCESS") + SSblackbox.add_details("wizard_success","SUCCESS") else text += "
      The wizard has failed!" - feedback_add_details("wizard_success","FAIL") + SSblackbox.add_details("wizard_success","FAIL") if(wizard.spell_list.len>0) text += "
      [wizard.name] used the following spells: " var/i = 1 diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 514cf590aff..643282ab4a6 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -234,7 +234,7 @@ playsound(loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) - feedback_inc("arcade_win_emagged") + SSblackbox.inc("arcade_win_emagged") new /obj/effect/spawner/newbomb/timer/syndicate(loc) new /obj/item/clothing/head/collectable/petehat(loc) message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") @@ -242,7 +242,7 @@ Reset() emagged = 0 else - feedback_inc("arcade_win_normal") + SSblackbox.inc("arcade_win_normal") prizevend() else if (emagged && (turtle >= 4)) @@ -264,10 +264,10 @@ temp = "You have been drained! GAME OVER" playsound(loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) - feedback_inc("arcade_loss_mana_emagged") + SSblackbox.inc("arcade_loss_mana_emagged") usr.gib() else - feedback_inc("arcade_loss_mana_normal") + SSblackbox.inc("arcade_loss_mana_normal") else if ((enemy_hp <= 10) && (enemy_mp > 4)) temp = "[enemy_name] heals for 4 health!" @@ -286,10 +286,10 @@ temp = "You have been crushed! GAME OVER" playsound(loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) - feedback_inc("arcade_loss_hp_emagged") + SSblackbox.inc("arcade_loss_hp_emagged") usr.gib() else - feedback_inc("arcade_loss_hp_normal") + SSblackbox.inc("arcade_loss_hp_normal") blocked = FALSE return diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f4d13c029b8..193d7f8b276 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -115,9 +115,9 @@ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") switch(GLOB.security_level) if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) + SSblackbox.inc("alert_comms_green",1) if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) + SSblackbox.inc("alert_comms_blue",1) tmp_alertlevel = 0 else to_chat(usr, "You are not authorized to do this!") @@ -176,7 +176,7 @@ SSshuttle.points -= S.credit_cost minor_announce("[usr.name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase") message_admins("[key_name_admin(usr)] purchased [S.name].") - feedback_add_details("shuttle_purchase", S.name) + SSblackbox.add_details("shuttle_purchase", S.name) else to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.") else @@ -368,9 +368,9 @@ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") switch(GLOB.security_level) if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) + SSblackbox.inc("alert_comms_green",1) if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) + SSblackbox.inc("alert_comms_blue",1) tmp_alertlevel = 0 src.aistate = STATE_DEFAULT if("ai-changeseclevel") diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index a50a2973fca..7c3251a1bec 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -535,7 +535,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(choice=="Confirm") scan_user(usr) GLOB.news_network.CreateFeedChannel(channel_name, scanned_user, c_locked) - feedback_inc("newscaster_channels",1) + SSblackbox.inc("newscaster_channels",1) screen=5 updateUsrDialog() else if(href_list["set_channel_receiving"]) @@ -558,7 +558,7 @@ GLOBAL_LIST_EMPTY(allCasters) screen=6 else GLOB.news_network.SubmitArticle("[parsepencode(msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, 0, allow_comments) - feedback_inc("newscaster_stories",1) + SSblackbox.inc("newscaster_stories",1) screen=4 msg = "" updateUsrDialog() @@ -850,7 +850,7 @@ GLOBAL_LIST_EMPTY(allCasters) return /obj/machinery/newscaster/proc/print_paper() - feedback_inc("newscaster_newspapers_printed",1) + SSblackbox.inc("newscaster_newspapers_printed",1) var/obj/item/weapon/newspaper/NEWSPAPER = new /obj/item/weapon/newspaper for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels) NEWSPAPER.news_content += FC diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index d6c6cdc151d..6c1fd431e50 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -144,30 +144,7 @@ // --- This following recording is intended for research and feedback in the use of department radio channels --- var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]" - if(istype(GLOB.blackbox)) - switch(freq) - if(1459) - GLOB.blackbox.msg_common += blackbox_msg - if(1351) - GLOB.blackbox.msg_science += blackbox_msg - if(1353) - GLOB.blackbox.msg_command += blackbox_msg - if(1355) - GLOB.blackbox.msg_medical += blackbox_msg - if(1357) - GLOB.blackbox.msg_engineering += blackbox_msg - if(1359) - GLOB.blackbox.msg_security += blackbox_msg - if(1441) - GLOB.blackbox.msg_deathsquad += blackbox_msg - if(1213) - GLOB.blackbox.msg_syndicate += blackbox_msg - if(1349) - GLOB.blackbox.msg_service += blackbox_msg - if(1347) - GLOB.blackbox.msg_cargo += blackbox_msg - else - GLOB.blackbox.messages += blackbox_msg + SSblackbox.LogBroadcast(blackbox_msg, freq) sleep(50) if(!QDELETED(virt)) //It could happen to YOU diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 774e6d9082b..fea3b90390b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -528,7 +528,7 @@ if(icon_vend) //Show the vending animation if needed flick(icon_vend,src) new R.product_path(get_turf(src)) - feedback_add_details("vending_machine_usage","[src.type]|[R.product_path]") + SSblackbox.add_details("vending_machine_usage","[src.type]|[R.product_path]") vend_ready = 1 return diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index def75d510e4..5b67cbf0182 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -277,7 +277,7 @@ /datum/construction/reversible/mecha/ripley/spawn_result() ..() - feedback_inc("mecha_ripley_created",1) + SSblackbox.inc("mecha_ripley_created",1) return @@ -564,7 +564,7 @@ var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) M.CheckParts(holder.contents) qdel(holder) - feedback_inc("mecha_gygax_created",1) + SSblackbox.inc("mecha_gygax_created",1) return /datum/construction/mecha/firefighter_chassis @@ -786,7 +786,7 @@ /datum/construction/reversible/mecha/firefighter/spawn_result() ..() - feedback_inc("mecha_firefighter_created",1) + SSblackbox.inc("mecha_firefighter_created",1) return @@ -864,7 +864,7 @@ /datum/construction/mecha/honker/spawn_result() ..() - feedback_inc("mecha_honker_created",1) + SSblackbox.inc("mecha_honker_created",1) return /datum/construction/mecha/durand_chassis @@ -1149,7 +1149,7 @@ var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) M.CheckParts(holder.contents) qdel(holder) - feedback_inc("mecha_durand_created",1) + SSblackbox.inc("mecha_durand_created",1) return //PHAZON @@ -1481,7 +1481,7 @@ var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) M.CheckParts(holder.contents) qdel(holder) - feedback_inc("mecha_phazon_created",1) + SSblackbox.inc("mecha_phazon_created",1) return //ODYSSEUS @@ -1692,5 +1692,5 @@ /datum/construction/reversible/mecha/odysseus/spawn_result() ..() - feedback_inc("mecha_odysseus_created",1) + SSblackbox.inc("mecha_odysseus_created",1) return diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 41a793df301..0cf73fd9ff6 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -86,7 +86,7 @@ name = "station charter for [station_name()]" desc = "An official document entrusting the governance of \ [station_name()] and surrounding space to Captain [uname]." - feedback_set_details("station_renames","[station_name()]") + SSblackbox.set_details("station_renames","[station_name()]") if(!unlimited_uses) used = TRUE diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 030370dbc84..0b2e81a9da9 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -58,7 +58,7 @@ if(src.l_arm && src.r_arm) if(src.l_leg && src.r_leg) if(src.chest && src.head) - feedback_inc("cyborg_frames_built",1) + SSblackbox.inc("cyborg_frames_built",1) return 1 return 0 @@ -235,7 +235,7 @@ O.mmi = W //and give the real mmi to the borg. O.updatename() - feedback_inc("cyborg_birth",1) + SSblackbox.inc("cyborg_birth",1) forceMove(O) O.robot_suit = src diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index d35ef4c163b..b94658545ed 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -45,7 +45,7 @@ if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore())) apply_cuffs(C,user) to_chat(user, "You handcuff [C].") - feedback_add_details("handcuffs","[type]") + SSblackbox.add_details("handcuffs","[type]") add_logs(user, C, "handcuffed") else @@ -275,7 +275,7 @@ C.legcuffed = src src.loc = C C.update_inv_legcuffed() - feedback_add_details("handcuffs","[type]") + SSblackbox.add_details("handcuffs","[type]") else if(isanimal(L)) var/mob/living/simple_animal/SA = L if(SA.mob_size > MOB_SIZE_TINY) @@ -336,7 +336,7 @@ C.legcuffed = src src.loc = C C.update_inv_legcuffed() - feedback_add_details("handcuffs","[type]") + SSblackbox.add_details("handcuffs","[type]") to_chat(C, "\The [src] ensnares you!") C.Weaken(weaken) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 571aece4c3d..aa720f19795 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -39,7 +39,7 @@ SSreligion.holy_weapon_type = holy_weapon.type - feedback_set_details("chaplain_weapon","[choice]") + SSblackbox.set_details("chaplain_weapon","[choice]") if(holy_weapon) holy_weapon.reskinned = TRUE diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 83805d969a1..7775b3692a4 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", SSreligion.bible_icon_state = B.icon_state SSreligion.bible_item_state = B.item_state - feedback_set_details("religion_book","[biblename]") + SSblackbox.set_details("religion_book","[biblename]") usr << browse(null, "window=editicon") /obj/item/weapon/storage/book/bible/proc/bless(mob/living/carbon/human/H, mob/living/user) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 31676a4f0ab..f3680bc8bd6 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -180,7 +180,7 @@ var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) if(brain.force_replace_ai_name) A.fully_replace_character_name(A.name, brain.replacement_ai_name()) - feedback_inc("cyborg_ais_created",1) + SSblackbox.inc("cyborg_ais_created",1) qdel(src) else state = AI_READY_CORE diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index a17fcf2ca8b..f4a3403ee5b 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -63,7 +63,7 @@ if(istype(src, /turf/open/floor/plating/asteroid)) to_chat(user, "You dig a hole.") gets_dug() - feedback_add_details("pick_used_mining","[W.type]") + SSblackbox.add_details("pick_used_mining","[W.type]") if(istype(W,/obj/item/weapon/storage/bag/ore)) var/obj/item/weapon/storage/bag/ore/S = W diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 5805d75e565..398ff190f2f 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -63,7 +63,7 @@ if(ismineralturf(src)) to_chat(user, "You finish cutting into the rock.") gets_drilled(user) - feedback_add_details("pick_used_mining","[P.type]") + SSblackbox.add_details("pick_used_mining","[P.type]") else return attack_hand(user) @@ -72,7 +72,7 @@ var/i for(i in 1 to mineralAmt) new mineralType(src) - feedback_add_details("ore_mined",mineralType) + SSblackbox.add_details("ore_mined",mineralType) ChangeTurf(turf_type, defer_change) addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 1e5a1826dad..1ff23609233 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -141,7 +141,7 @@ GLOBAL_PROTECT(Banlist) ban_unban_log_save("[key_name(usr)] unbanned [key]") log_admin_private("[key_name(usr)] unbanned [key]") message_admins("[key_name_admin(usr)] unbanned: [key]") - feedback_inc("ban_unban",1) + SSblackbox.inc("ban_unban",1) usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN) for (var/A in GLOB.Banlist.dir) GLOB.Banlist.cd = "/base/[A]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index dc6c7332f0f..e189e081e3e 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -166,7 +166,7 @@ body += "" usr << browse(body, "window=adminplayeropts-\ref[M];size=550x515") - feedback_add_details("admin_verb","Player Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Player Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/access_news_network() //MARKER @@ -419,7 +419,7 @@ return if(confirm == "Yes") SSticker.delay_end = 0 - feedback_add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) /datum/admins/proc/end_round() @@ -434,7 +434,7 @@ return if(confirm == "Yes") SSticker.force_ending = 1 - feedback_add_details("admin_verb","End Round") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","End Round") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/announce() @@ -450,7 +450,7 @@ message = adminscrub(message,500) to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]") log_admin("Announce: [key_name(usr)] : [message]") - feedback_add_details("admin_verb","Announce") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Announce") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/set_admin_notice() set category = "Special Verbs" @@ -471,7 +471,7 @@ message_admins("[key_name(usr)] set the admin notice.") log_admin("[key_name(usr)] set the admin notice:\n[new_admin_notice]") to_chat(world, "Admin Notice:\n \t [new_admin_notice]") - feedback_add_details("admin_verb","Set Admin Notice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set Admin Notice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! GLOB.admin_notice = new_admin_notice return @@ -482,7 +482,7 @@ toggle_ooc() log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled OOC.") - feedback_add_details("admin_toggle","Toggle OOC|[GLOB.ooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle OOC|[GLOB.ooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleoocdead() set category = "Server" @@ -492,7 +492,7 @@ log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.") - feedback_add_details("admin_toggle","Toggle Dead OOC|[GLOB.dooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Dead OOC|[GLOB.dooc_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/startnow() set category = "Server" @@ -507,7 +507,7 @@ started as soon as possible.)" message_admins("\ [usr.key] has started the game.[msg]") - feedback_add_details("admin_verb","Start Now") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Start Now") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else to_chat(usr, "Error: Start Now: Game has already started.") @@ -526,7 +526,7 @@ log_admin("[key_name(usr)] toggled new player game entering.") message_admins("[key_name_admin(usr)] toggled new player game entering.") world.update_status() - feedback_add_details("admin_toggle","Toggle Entering|[GLOB.enter_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Entering|[GLOB.enter_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleAI() set category = "Server" @@ -539,7 +539,7 @@ to_chat(world, "The AI job is chooseable now.") log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() - feedback_add_details("admin_toggle","Toggle AI|[config.allow_ai]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle AI|[config.allow_ai]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleaban() set category = "Server" @@ -553,7 +553,7 @@ message_admins("[key_name_admin(usr)] toggled respawn to [GLOB.abandon_allowed ? "On" : "Off"].") log_admin("[key_name(usr)] toggled respawn to [GLOB.abandon_allowed ? "On" : "Off"].") world.update_status() - feedback_add_details("admin_toggle","Toggle Respawn|[GLOB.abandon_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Respawn|[GLOB.abandon_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/delay() set category = "Server" @@ -572,7 +572,7 @@ to_chat(world, "The game will start in [newtime] seconds.") world << 'sound/ai/attention.ogg' log_admin("[key_name(usr)] set the pre-game delay to [newtime] seconds.") - feedback_add_details("admin_verb","Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/unprison(mob/M in GLOB.mob_list) set category = "Admin" @@ -583,7 +583,7 @@ log_admin("[key_name(usr)] has unprisoned [key_name(M)]") else alert("[M.name] is not prisoned.") - feedback_add_details("admin_verb","Unprison") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Unprison") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS @@ -624,7 +624,7 @@ A.admin_spawned = TRUE log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") - feedback_add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/show_traitor_panel(mob/M in GLOB.mob_list) @@ -640,7 +640,7 @@ return M.mind.edit_memory() - feedback_add_details("admin_verb","Traitor Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Traitor Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggletintedweldhelmets() @@ -654,7 +654,7 @@ to_chat(world, "The tinted_weldhelh has been disabled!") log_admin("[key_name(usr)] toggled tinted_weldhelh.") message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.") - feedback_add_details("admin_toggle","Toggle Tinted Welding Helmets|[GLOB.tinted_weldhelh]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Tinted Welding Helmets|[GLOB.tinted_weldhelh]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleguests() set category = "Server" @@ -667,7 +667,7 @@ to_chat(world, "Guests may now enter the game.") log_admin("[key_name(usr)] toggled guests game entering [GLOB.guests_allowed?"":"dis"]allowed.") message_admins("[key_name_admin(usr)] toggled guests game entering [GLOB.guests_allowed?"":"dis"]allowed.") - feedback_add_details("admin_toggle","Toggle Guests|[GLOB.guests_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Guests|[GLOB.guests_allowed]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/output_ai_laws() var/ai_number = 0 @@ -796,7 +796,7 @@ message_admins("[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].") log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") - feedback_add_details("admin_verb","Ghost Drag Control") + SSblackbox.add_details("admin_verb","Ghost Drag Control") tomob.ckey = frommob.ckey qdel(frommob) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7d6a49afacf..a32a37b046d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -326,7 +326,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) verbs += /client/proc/show_verbs to_chat(src, "Most of your adminverbs have been hidden.") - feedback_add_details("admin_verb","Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/hide_verbs() @@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) verbs += /client/proc/show_verbs to_chat(src, "Almost all of your adminverbs have been hidden.") - feedback_add_details("admin_verb","Hide All Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Hide All Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/show_verbs() @@ -348,7 +348,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) add_admin_verbs() to_chat(src, "All of your adminverbs are now visible.") - feedback_add_details("admin_verb","Show Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -368,7 +368,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) message_admins("[key_name_admin(usr)] re-entered corpse") ghost.can_reenter_corpse = 1 //force re-entering even when otherwise not possible ghost.reenter_corpse() - feedback_add_details("admin_verb","Admin Reenter") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin Reenter") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(isnewplayer(mob)) to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.") else @@ -379,7 +379,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) body.ghostize(1) if(body && !body.key) body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus - feedback_add_details("admin_verb","Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/invisimin() @@ -399,7 +399,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) set category = "Admin" if(holder) holder.player_panel_new() - feedback_add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/check_antagonists() set name = "Check Antagonists" @@ -409,7 +409,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) log_admin("[key_name(usr)] checked antagonists.") //for tsar~ if(!isobserver(usr)) message_admins("[key_name_admin(usr)] checked antagonists.") - feedback_add_details("admin_verb","Check Antagonists") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Antagonists") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/unban_panel() set name = "Unban Panel" @@ -419,21 +419,21 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) holder.unbanpanel() else holder.DB_ban_panel() - feedback_add_details("admin_verb","Unban Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Unban Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/game_panel() set name = "Game Panel" set category = "Admin" if(holder) holder.Game() - feedback_add_details("admin_verb","Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/secrets() set name = "Secrets" set category = "Admin" if (holder) holder.Secrets() - feedback_add_details("admin_verb","Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/findStealthKey(txt) @@ -481,7 +481,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) mob.mouse_opacity = 0 log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") - feedback_add_details("admin_verb","Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_bomb() set category = "Special Verbs" @@ -523,7 +523,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, TRUE, TRUE) message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [epicenter.loc].") log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") - feedback_add_details("admin_verb","Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_dynex_bomb() set category = "Special Verbs" @@ -536,7 +536,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) dyn_explosion(epicenter, ex_power) message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [epicenter.loc].") log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") - feedback_add_details("admin_verb","Drop Dynamic Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Drop Dynamic Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/get_dynex_range() set category = "Debug" @@ -581,7 +581,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) if(!S) return - feedback_add_details("admin_verb","Give Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Give Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].") @@ -603,7 +603,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) T.mind.RemoveSpell(S) log_admin("[key_name(usr)] removed the spell [S] from [key_name(T)].") message_admins("[key_name_admin(usr)] removed the spell [S] from [key_name(T)].") - feedback_add_details("admin_verb","Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease(mob/T in GLOB.mob_list) set category = "Fun" @@ -612,7 +612,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in SSdisease.diseases if(!D) return T.ForceContractDisease(new D) - feedback_add_details("admin_verb","Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") @@ -626,13 +626,13 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) O.say(message) log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say \"[message]\"") message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say \"[message]\"") - feedback_add_details("admin_verb","Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" set category = "Special Verbs" if(src.mob) togglebuildmode(src.mob) - feedback_add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_log_hrefs() set name = "Toggle href logging" @@ -674,7 +674,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) to_chat(src, "You are now a normal player.") log_admin("[src] deadmined themself.") message_admins("[src] deadmined themself.") - feedback_add_details("admin_verb","Deadmin") + SSblackbox.add_details("admin_verb","Deadmin") /client/proc/readmin() set name = "Readmin" @@ -692,7 +692,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) to_chat(src, "You are now an admin.") message_admins("[src] re-adminned themselves.") log_admin("[src] re-adminned themselves.") - feedback_add_details("admin_verb","Readmin") + SSblackbox.add_details("admin_verb","Readmin") /client/proc/populate_world(amount = 50 as num) set name = "Populate World" diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 7f0479eac91..aea7d3521a0 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -198,7 +198,7 @@ if("moveminingshuttle") if(!check_rights(R_ADMIN)) return - feedback_add_details("admin_secrets_fun_used","Send Mining Shuttle") + SSblackbox.add_details("admin_secrets_fun_used","Send Mining Shuttle") if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away")) message_admins("[key_name_admin(usr)] moved mining shuttle") log_admin("[key_name(usr)] moved the mining shuttle") @@ -206,7 +206,7 @@ if("movelaborshuttle") if(!check_rights(R_ADMIN)) return - feedback_add_details("admin_secrets_fun_used","Send Labor Shuttle") + SSblackbox.add_details("admin_secrets_fun_used","Send Labor Shuttle") if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away")) message_admins("[key_name_admin(usr)] moved labor shuttle") log_admin("[key_name(usr)] moved the labor shuttle") @@ -214,7 +214,7 @@ if("moveferry") if(!check_rights(R_ADMIN)) return - feedback_add_details("admin_secrets_fun_used","Send Centcom Ferry") + SSblackbox.add_details("admin_secrets_fun_used","Send Centcom Ferry") if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away")) message_admins("[key_name_admin(usr)] moved the centcom ferry") log_admin("[key_name(usr)] moved the centcom ferry") @@ -226,7 +226,7 @@ if(A) var/new_perma = !A.perma_docked A.perma_docked = new_perma - feedback_add_details("admin_toggle","Permadock Arrivals Shuttle|[new_perma]") + SSblackbox.add_details("admin_toggle","Permadock Arrivals Shuttle|[new_perma]") message_admins("[key_name_admin(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle") log_admin("[key_name(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle") else @@ -276,7 +276,7 @@ if("monkey") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Monkeyize All Humans") + SSblackbox.add_details("admin_secrets_fun_used","Monkeyize All Humans") for(var/mob/living/carbon/human/H in GLOB.mob_list) spawn(0) H.monkeyize() @@ -287,7 +287,7 @@ return var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list if(result) - feedback_add_details("admin_secrets_fun_used","Mass Species Change([result])") + SSblackbox.add_details("admin_secrets_fun_used","Mass Species Change([result])") log_admin("[key_name(usr)] turned all humans into [result]", 1) message_admins("\blue [key_name_admin(usr)] turned all humans into [result]") var/newtype = GLOB.species_list[result] @@ -298,12 +298,12 @@ if(!check_rights(R_FUN)) return usr.client.triple_ai() - feedback_add_details("admin_secrets_fun_used","Triple AI") + SSblackbox.add_details("admin_secrets_fun_used","Triple AI") if("power") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Power All APCs") + SSblackbox.add_details("admin_secrets_fun_used","Power All APCs") log_admin("[key_name(usr)] made all areas powered", 1) message_admins("[key_name_admin(usr)] made all areas powered") power_restore() @@ -311,7 +311,7 @@ if("unpower") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Depower All APCs") + SSblackbox.add_details("admin_secrets_fun_used","Depower All APCs") log_admin("[key_name(usr)] made all areas unpowered", 1) message_admins("[key_name_admin(usr)] made all areas unpowered") power_failure() @@ -319,7 +319,7 @@ if("quickpower") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Power All SMESs") + SSblackbox.add_details("admin_secrets_fun_used","Power All SMESs") log_admin("[key_name(usr)] made all SMESs powered", 1) message_admins("[key_name_admin(usr)] made all SMESs powered") power_restore_quick() @@ -333,7 +333,7 @@ var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN) if(!objective) return - feedback_add_details("admin_secrets_fun_used","Traitor All ([objective])") + SSblackbox.add_details("admin_secrets_fun_used","Traitor All ([objective])") for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !H.client || !H.mind) continue if(is_special_character(H)) continue @@ -365,7 +365,7 @@ if("changebombcap") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Bomb Cap") + SSblackbox.add_details("admin_secrets_fun_used","Bomb Cap") var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", GLOB.MAX_EX_LIGHT_RANGE) as num|null if (newBombCap < 4) @@ -384,7 +384,7 @@ if("blackout") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Break All Lights") + SSblackbox.add_details("admin_secrets_fun_used","Break All Lights") message_admins("[key_name_admin(usr)] broke all lights") for(var/obj/machinery/light/L in GLOB.machines) L.break_light_tube() @@ -400,7 +400,7 @@ if(animetype == "Cancel" || droptype == "Cancel") return - feedback_add_details("admin_secrets_fun_used","Chinese Cartoons") + SSblackbox.add_details("admin_secrets_fun_used","Chinese Cartoons") message_admins("[key_name_admin(usr)] made everything kawaii.") for(var/mob/living/carbon/human/H in GLOB.mob_list) H << sound('sound/AI/animes.ogg') @@ -430,7 +430,7 @@ if("whiteout") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Fix All Lights") + SSblackbox.add_details("admin_secrets_fun_used","Fix All Lights") message_admins("[key_name_admin(usr)] fixed all lights") for(var/obj/machinery/light/L in GLOB.machines) L.fix() @@ -441,7 +441,7 @@ if("virus") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Virus Outbreak") + SSblackbox.add_details("admin_secrets_fun_used","Virus Outbreak") switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose")) if("Make Your Own") AdminCreateVirus(usr.client) @@ -456,7 +456,7 @@ if("retardify") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Mass Braindamage") + SSblackbox.add_details("admin_secrets_fun_used","Mass Braindamage") for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.") H.setBrainLoss(60) @@ -465,7 +465,7 @@ if("eagles")//SCRAW if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Egalitarian Station") + SSblackbox.add_details("admin_secrets_fun_used","Egalitarian Station") for(var/obj/machinery/door/airlock/W in GLOB.machines) if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() @@ -475,7 +475,7 @@ if("guns") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Summon Guns") + SSblackbox.add_details("admin_secrets_fun_used","Summon Guns") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!")) if("Some Antags") @@ -488,7 +488,7 @@ if("magic") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Summon Magic") + SSblackbox.add_details("admin_secrets_fun_used","Summon Magic") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!")) if("Some Antags") @@ -504,22 +504,22 @@ if(!SSevents.wizardmode) if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes") summonevents() - feedback_add_details("admin_secrets_fun_used","Activate Summon Events") + SSblackbox.add_details("admin_secrets_fun_used","Activate Summon Events") else switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing")) if("Intensify Summon Events") summonevents() - feedback_add_details("admin_secrets_fun_used","Intensify Summon Events") + SSblackbox.add_details("admin_secrets_fun_used","Intensify Summon Events") if("Turn Off Summon Events") SSevents.toggleWizardmode() SSevents.resetFrequency() - feedback_add_details("admin_secrets_fun_used","Disable Summon Events") + SSblackbox.add_details("admin_secrets_fun_used","Disable Summon Events") if("dorf") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","Dwarf Beards") + SSblackbox.add_details("admin_secrets_fun_used","Dwarf Beards") for(var/mob/living/carbon/human/B in GLOB.mob_list) B.facial_hair_style = "Dward Beard" B.update_hair() @@ -528,21 +528,21 @@ if("onlyone") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","There Can Be Only One") + SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One") usr.client.only_one() send_to_playing_players('sound/misc/highlander.ogg') if("delayed_onlyone") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","There Can Be Only One") + SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One") usr.client.only_one_delayed() send_to_playing_players('sound/misc/highlander_delayed.ogg') if("onlyme") if(!check_rights(R_FUN)) return - feedback_add_details("admin_secrets_fun_used","There Can Be Only Me") + SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only Me") only_me() if("maint_access_brig") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c59f947c341..e25bc46c32a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -498,7 +498,7 @@ GLOB.Banlist["minutes"] << minutes GLOB.Banlist["bannedby"] << usr.ckey GLOB.Banlist.cd = "/base" - feedback_inc("ban_edit",1) + SSblackbox.inc("ban_edit",1) unbanpanel() /////////////////////////////////////new ban stuff @@ -520,7 +520,7 @@ if("Yes") ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban.") log_admin_private("[key_name(usr)] removed [key_name(M)]'s appearance ban.") - feedback_inc("ban_appearance_unban", 1) + SSblackbox.inc("ban_appearance_unban", 1) DB_ban_unban(M.ckey, BANTYPE_ANY_JOB, "appearance") if(M.client) jobban_buildcache(M.client) @@ -539,7 +539,7 @@ jobban_buildcache(M.client) ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]") log_admin_private("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]") - feedback_inc("ban_appearance",1) + SSblackbox.inc("ban_appearance",1) create_message("note", M.ckey, null, "Appearance banned - [reason]", null, null, 0, 0) message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)].") to_chat(M, "You have been appearance banned by [usr.client.ckey].") @@ -924,8 +924,8 @@ jobban_buildcache(M.client) ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]") log_admin_private("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes.") - feedback_inc("ban_job_tmp",1) - feedback_add_details("ban_job_tmp","- [job]") + SSblackbox.inc("ban_job_tmp",1) + SSblackbox.add_details("ban_job_tmp","- [job]") if(!msg) msg = job else @@ -949,8 +949,8 @@ jobban_buildcache(M.client) ban_unban_log_save("[key_name(usr)] perma-jobbanned [key_name(M)] from [job]. reason: [reason]") log_admin_private("[key_name(usr)] perma-banned [key_name(M)] from [job]") - feedback_inc("ban_job",1) - feedback_add_details("ban_job","- [job]") + SSblackbox.inc("ban_job",1) + SSblackbox.add_details("ban_job","- [job]") if(!msg) msg = job else @@ -980,8 +980,8 @@ DB_ban_unban(M.ckey, BANTYPE_ANY_JOB, job) if(M.client) jobban_buildcache(M.client) - feedback_inc("ban_job_unban",1) - feedback_add_details("ban_job_unban","- [job]") + SSblackbox.inc("ban_job_unban",1) + SSblackbox.add_details("ban_job_unban","- [job]") if(!msg) msg = job else @@ -1116,8 +1116,8 @@ ban_unban_log_save("[key_name(usr)] has banned [key_name(M)]. - Reason: [reason] - This will be removed in [mins] minutes.") to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason]") to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes.") - feedback_inc("ban_tmp",1) - feedback_inc("ban_tmp_mins",mins) + SSblackbox.inc("ban_tmp",1) + SSblackbox.inc("ban_tmp_mins",mins) if(config.banappeals) to_chat(M, "To try to resolve this matter head to [config.banappeals]") else @@ -1156,7 +1156,7 @@ var/datum/admin_help/AH = M.client ? M.client.current_ticket : null if(AH) AH.Resolve() - feedback_inc("ban_perma",1) + SSblackbox.inc("ban_perma",1) qdel(M.client) if("Cancel") return @@ -1687,7 +1687,7 @@ log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].") message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].") - feedback_inc("admin_cookies_spawned",1) + SSblackbox.inc("admin_cookies_spawned",1) to_chat(H, "Your prayers have been answered!! You received the best cookie!") H << 'sound/effects/pray_chaplain.ogg' @@ -1987,7 +1987,7 @@ var/choice = alert("Please confirm Feed channel creation.","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") GLOB.news_network.CreateFeedChannel(src.admincaster_feed_channel.channel_name, src.admin_signature, src.admincaster_feed_channel.locked, 1) - feedback_inc("newscaster_channels",1) + SSblackbox.inc("newscaster_channels",1) log_admin("[key_name(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!") src.admincaster_screen=5 src.access_news_network() @@ -2010,7 +2010,7 @@ src.admincaster_screen = 6 else GLOB.news_network.SubmitArticle(src.admincaster_feed_message.returnBody(-1), src.admin_signature, src.admincaster_feed_channel.channel_name, null, 1) - feedback_inc("newscaster_stories",1) + SSblackbox.inc("newscaster_stories",1) src.admincaster_screen=4 for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 976912ca77d..54abb2844fe 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -264,9 +264,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) GLOB.ahelp_tickets.resolved_tickets -= src switch(state) if(AHELP_CLOSED) - feedback_dec("ahelp_close") + SSblackbox.dec("ahelp_close") if(AHELP_RESOLVED) - feedback_dec("ahelp_resolve") + SSblackbox.dec("ahelp_resolve") state = AHELP_ACTIVE closed_at = null if(initiator) @@ -276,7 +276,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/msg = "Ticket [TicketHref("#[id]")] reopened by [key_name_admin(usr)]." message_admins(msg) log_admin_private(msg) - feedback_inc("ahelp_reopen") + SSblackbox.inc("ahelp_reopen") TicketPanel() //can only be done from here, so refresh it //private @@ -298,7 +298,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) GLOB.ahelp_tickets.ListInsert(src) AddInteraction("Closed by [key_name].") if(!silent) - feedback_inc("ahelp_close") + SSblackbox.inc("ahelp_close") var/msg = "Ticket [TicketHref("#[id]")] closed by [key_name]." message_admins(msg) log_admin_private(msg) @@ -316,7 +316,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) AddInteraction("Resolved by [key_name].") if(!silent) - feedback_inc("ahelp_resolve") + SSblackbox.inc("ahelp_resolve") var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name]" message_admins(msg) log_admin_private(msg) @@ -335,7 +335,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) to_chat(initiator, "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again.") to_chat(initiator, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting.") - feedback_inc("ahelp_reject") + SSblackbox.inc("ahelp_reject") var/msg = "Ticket [TicketHref("#[id]")] rejected by [key_name]" message_admins(msg) log_admin_private(msg) @@ -354,7 +354,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) to_chat(initiator, msg) - feedback_inc("ahelp_icissue") + SSblackbox.inc("ahelp_icissue") msg = "Ticket [TicketHref("#[id]")] marked as IC by [key_name]" message_admins(msg) log_admin_private(msg) @@ -472,7 +472,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(!msg) return - feedback_add_details("admin_verb","Adminhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Adminhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(current_ticket) if(alert(usr, "You already have a ticket open. Is this for the same issue?",,"Yes","No") != "No") if(current_ticket) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index ccc0b15509e..f8f16684541 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -23,7 +23,7 @@ usr.forceMove(T) log_admin("[key_name(usr)] jumped to [A]") message_admins("[key_name_admin(usr)] jumped to [A]") - feedback_add_details("admin_verb","Jump To Area") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Area") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/jumptoturf(turf/T in world) set name = "Jump to Turf" @@ -35,7 +35,7 @@ log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") usr.loc = T - feedback_add_details("admin_verb","Jump To Turf") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Turf") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/jumptomob(mob/M in GLOB.mob_list) @@ -52,7 +52,7 @@ var/mob/A = src.mob var/turf/T = get_turf(M) if(T && isturf(T)) - feedback_add_details("admin_verb","Jump To Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! A.forceMove(M.loc) else to_chat(A, "This mob is not located in the game world.") @@ -70,7 +70,7 @@ A.x = tx A.y = ty A.z = tz - feedback_add_details("admin_verb","Jump To Coordiate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Coordiate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]") /client/proc/jumptokey() @@ -94,7 +94,7 @@ usr.forceMove(M.loc) - feedback_add_details("admin_verb","Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getmob(mob/M in GLOB.mob_list) set category = "Admin" @@ -110,7 +110,7 @@ message_admins(msg) admin_ticket_log(M, msg) M.forceMove(loc) - feedback_add_details("admin_verb","Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getkey() set category = "Admin" @@ -138,7 +138,7 @@ if(M) M.forceMove(get_turf(usr)) usr.loc = M.loc - feedback_add_details("admin_verb","Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/sendmob(mob/M in sortmobs()) set category = "Admin" @@ -156,4 +156,4 @@ admin_ticket_log(M, msg) else to_chat(src, "Failed to move mob to a valid location.") - feedback_add_details("admin_verb","Send Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Send Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 3e16b5785fb..489441ee97a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -11,7 +11,7 @@ if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) - feedback_add_details("admin_verb","Admin PM Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin PM Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm /client/proc/cmd_admin_pm_panel() @@ -33,7 +33,7 @@ targets["(No Mob) - [T]"] = T var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sortList(targets) cmd_admin_pm(targets[target],null) - feedback_add_details("admin_verb","Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_ahelp_reply(whom) if(prefs.muted & MUTE_ADMINHELP) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 3e23bbba1ac..53fb5b206e9 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -18,5 +18,5 @@ msg = "ADMIN: [key_name(usr, 1)]: [msg]" to_chat(GLOB.admins, msg) - feedback_add_details("admin_verb","Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Asay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index bccdb0fb9f9..730cd689870 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -4,7 +4,7 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.") return - feedback_add_details("admin_verb","Check Plumbing") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Plumbing") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //all plumbing - yes, some things might get stated twice, doesn't matter. for (var/obj/machinery/atmospherics/plumbing in GLOB.machines) @@ -27,7 +27,7 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.") return - feedback_add_details("admin_verb","Check Power") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Power") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! for (var/datum/powernet/PN in GLOB.powernets) if (!PN.nodes || !PN.nodes.len) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index f29a04e376e..c8edb35ec91 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -29,4 +29,4 @@ if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above M.show_message(rendered, 2) - feedback_add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file + SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 5b986e971fa..a1634516522 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -13,7 +13,7 @@ message_admins("[key_name(src)] toggled debugging on.") log_admin("[key_name(src)] toggled debugging on.") - feedback_add_details("admin_verb","Toggle Debug Two") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Toggle Debug Two") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -81,7 +81,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that . = get_callproc_returnval(returnval, procname) if(.) to_chat(usr, .) - feedback_add_details("admin_verb","Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! GLOBAL_VAR_INIT(AdminProcCall, null) GLOBAL_PROTECT(AdminProcCall) @@ -130,7 +130,7 @@ GLOBAL_PROTECT(AdminProcCall) var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." message_admins(msg) admin_ticket_log(A, msg) - feedback_add_details("admin_verb","Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc . = get_callproc_returnval(returnval,procname) @@ -201,7 +201,7 @@ GLOBAL_PROTECT(AdminProcCall) t+= "[env_gases[id][GAS_META][META_GAS_NAME]] : [env_gases[id][MOLES]]\n" to_chat(usr, t) - feedback_add_details("admin_verb","Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) set category = "Fun" @@ -283,7 +283,7 @@ GLOBAL_PROTECT(AdminProcCall) for(var/datum/paiCandidate/candidate in SSpai.candidates) if(candidate.key == choice.key) SSpai.candidates.Remove(candidate) - feedback_add_details("admin_verb","Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) set category = "Fun" @@ -296,7 +296,7 @@ GLOBAL_PROTECT(AdminProcCall) log_admin("[key_name(src)] has alienized [M.key].") spawn(0) M:Alienize() - feedback_add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.") else @@ -313,7 +313,7 @@ GLOBAL_PROTECT(AdminProcCall) log_admin("[key_name(src)] has slimeized [M.key].") spawn(0) M:slimeize() - feedback_add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.") else @@ -402,7 +402,7 @@ GLOBAL_PROTECT(AdminProcCall) CHECK_TICK log_admin("[key_name(src)] has deleted all ([counter]) instances of [hsbitem].") message_admins("[key_name_admin(src)] has deleted all ([counter]) instances of [hsbitem].", 0) - feedback_add_details("admin_verb","Delete All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Delete All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_debug_make_powernets() @@ -411,7 +411,7 @@ GLOBAL_PROTECT(AdminProcCall) SSmachines.makepowernets() log_admin("[key_name(src)] has remade the powernet. makepowernets() called.") message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0) - feedback_add_details("admin_verb","Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_grantfullaccess(mob/M in GLOB.mob_list) set category = "Admin" @@ -449,7 +449,7 @@ GLOBAL_PROTECT(AdminProcCall) else alert("Invalid mob") - feedback_add_details("admin_verb","Grant Full Access") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Grant Full Access") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(src)] has granted [M.key] full access.") message_admins("[key_name_admin(usr)] has granted [M.key] full access.") @@ -470,7 +470,7 @@ GLOBAL_PROTECT(AdminProcCall) M.ckey = src.ckey if( isobserver(adminmob) ) qdel(adminmob) - feedback_add_details("admin_verb","Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_areatest() set category = "Mapping" @@ -605,7 +605,7 @@ GLOBAL_PROTECT(AdminProcCall) if(isnull(custom)) return - feedback_add_details("admin_verb","Select Equipment") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Select Equipment") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! for (var/obj/item/I in M.get_equipped_items()) qdel(I) switch(dresscode) @@ -777,7 +777,7 @@ GLOBAL_PROTECT(AdminProcCall) return SSshuttle.clear_transit = TRUE message_admins("[key_name_admin(src)] cleared dynamic transit space.") - feedback_add_details("admin_verb","Clear Dynamic Transit") // If... + SSblackbox.add_details("admin_verb","Clear Dynamic Transit") // If... log_admin("[key_name(src)] cleared dynamic transit space.") @@ -791,7 +791,7 @@ GLOBAL_PROTECT(AdminProcCall) global.medals_enabled = !global.medals_enabled message_admins("[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") - feedback_add_details("admin_verb","Toggle Medal Disable") // If... + SSblackbox.add_details("admin_verb","Toggle Medal Disable") // If... log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") /client/proc/view_runtimes() @@ -814,5 +814,5 @@ GLOBAL_PROTECT(AdminProcCall) SSevents.scheduled = world.time message_admins("[key_name_admin(src)] pumped a random event.") - feedback_add_details("admin_verb","Pump Random Event") + SSblackbox.add_details("admin_verb","Pump Random Event") log_admin("[key_name(src)] pumped a random event.") diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 26bfe6883b4..15b619f6536 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -16,7 +16,7 @@ to_chat(usr, "@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]") for(var/id in GM_gases) to_chat(usr, "[GM_gases[id][GAS_META][META_GAS_NAME]]: [GM_gases[id][MOLES]]") - feedback_add_details("admin_verb","Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/fix_next_move() set category = "Debug" @@ -46,7 +46,7 @@ message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!") message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!") message_admins("world.time = [world.time]") - feedback_add_details("admin_verb","Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/radio_report() @@ -84,7 +84,7 @@ output += "    [device]
      " usr << browse(output,"window=radioreport") - feedback_add_details("admin_verb","Show Radio Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Radio Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/reload_admins() set name = "Reload Admins" @@ -98,5 +98,5 @@ return load_admins() - feedback_add_details("admin_verb","Reload All Admins") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Reload All Admins") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! message_admins("[key_name_admin(usr)] manually reloaded admins") diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm index 5aac2cad39b..bedcd0a6e51 100644 --- a/code/modules/admin/verbs/fps.dm +++ b/code/modules/admin/verbs/fps.dm @@ -19,6 +19,6 @@ var/msg = "[key_name(src)] has modified world.fps to [new_fps]" log_admin(msg, 0) message_admins(msg, 0) - feedback_add_details("admin_toggle","Set Server FPS|[new_fps]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Set Server FPS|[new_fps]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.fps = new_fps diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index fda73e17530..c3438f15564 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -90,7 +90,7 @@ else to_chat(src, "Server log not found, try using .getserverlog.") return - feedback_add_details("admin_verb","Show Server Log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Server Log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return //Shows today's attack log @@ -104,5 +104,5 @@ else to_chat(src, "Server attack log not found, try using .getserverlog.") return - feedback_add_details("admin_verb","Show Server Attack log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Server Attack log") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/machine_upgrade.dm b/code/modules/admin/verbs/machine_upgrade.dm index 340130bb75c..9a22623bfe0 100644 --- a/code/modules/admin/verbs/machine_upgrade.dm +++ b/code/modules/admin/verbs/machine_upgrade.dm @@ -7,4 +7,4 @@ P.rating = new_rating M.RefreshParts() - feedback_add_details("admin_toggle","Machine Upgrade|[new_rating]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Machine Upgrade|[new_rating]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 591ebfa01f3..8a8d18d5fd4 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( seen[T]++ for(var/turf/T in seen) T.maptext = "[seen[T]]" - feedback_add_details("admin_verb","Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( output += "
    " usr << browse(output,"window=airreport;size=1000x500") - feedback_add_details("admin_verb","Show Camera Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Camera Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/intercom_view() set category = "Mapping" @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if (!(F in view(7,I.loc))) qdel(F) - feedback_add_details("admin_verb","Show Intercom Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Intercom Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_show_at_list() set category = "Mapping" @@ -160,7 +160,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( usr << browse(dat, "window=at_list") - feedback_add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/enable_debug_verbs() set category = "Debug" @@ -169,14 +169,14 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( return verbs -= /client/proc/enable_debug_verbs verbs.Add(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping) - feedback_add_details("admin_verb","Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/disable_debug_verbs() set category = "Debug" set name = "Debug verbs - Disable" verbs.Remove(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping) verbs += /client/proc/enable_debug_verbs - feedback_add_details("admin_verb", "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb", "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_on_z_level() set category = "Mapping" @@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( to_chat(world, line)*/ to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level]") - feedback_add_details("admin_verb","Count Objects Zlevel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Count Objects Zlevel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_all() set category = "Mapping" @@ -246,7 +246,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( to_chat(world, line)*/ to_chat(world, "There are [count] objects of type [type_path] in the game world") - feedback_add_details("admin_verb","Count Objects All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Count Objects All") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //This proc is intended to detect lag problems relating to communication procs diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 05f662fb163..e17cbbbf86d 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -12,7 +12,7 @@ method = vv_subtype_prompt(A.type) src.massmodify_variables(A, var_name, method) - feedback_add_details("admin_verb","Mass Edit Variables") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Mass Edit Variables") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/massmodify_variables(datum/O, var_name = "", method = 0) if(!check_rights(R_VAREDIT)) diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm index b0c1aac982c..3da486be78d 100644 --- a/code/modules/admin/verbs/panicbunker.dm +++ b/code/modules/admin/verbs/panicbunker.dm @@ -11,5 +11,5 @@ message_admins("[key_name_admin(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"enabled":"disabled")].") if (config.panic_bunker && (!SSdbcore || !SSdbcore.IsConnected())) message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.") - feedback_add_details("admin_toggle","Toggle Panic Bunker|[config.panic_bunker]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Panic Bunker|[config.panic_bunker]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 56d95289c5c..c49009daabd 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -25,7 +25,7 @@ if(M.client.prefs.toggles & SOUND_MIDI) M << admin_sound - feedback_add_details("admin_verb","Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_local_sound(S as sound) @@ -37,7 +37,7 @@ log_admin("[key_name(src)] played a local sound [S]") message_admins("[key_name_admin(src)] played a local sound [S]") playsound(get_turf(src.mob), S, 50, 0, 0) - feedback_add_details("admin_verb","Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/set_round_end_sound(S as sound) set category = "Fun" @@ -52,7 +52,7 @@ log_admin("[key_name(src)] set the round end sound to [S]") message_admins("[key_name_admin(src)] set the round end sound to [S]") - feedback_add_details("admin_verb","Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/stop_sounds() set category = "Debug" @@ -65,4 +65,4 @@ for(var/mob/M in GLOB.player_list) if(M.client) M << sound(null) - feedback_add_details("admin_verb","Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 0b077427518..e271cdb3a79 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -23,7 +23,7 @@ usr.name = O.name usr.client.eye = O usr.control_object = O - feedback_add_details("admin_verb","Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/release(obj/O in world) set name = "Release Obj" @@ -41,7 +41,7 @@ usr.loc = O.loc usr.client.eye = usr usr.control_object = null - feedback_add_details("admin_verb","Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/givetestverbs(mob/M in GLOB.mob_list) set desc = "Give this guy possess/release verbs" @@ -49,4 +49,4 @@ set name = "Give Possessing Verbs" M.verbs += /proc/possess M.verbs += /proc/release - feedback_add_details("admin_verb","Give Possessing Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Give Possessing Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 2285466b3d3..1a41d9e412f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -43,7 +43,7 @@ C << 'sound/effects/pray.ogg' to_chat(usr, "Your prayers have been received by the gods.") - feedback_add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") /proc/Centcomm_announce(text , mob/Sender) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index afd69e02382..255dcc05f47 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -18,7 +18,7 @@ var/msg = "[key_name_admin(usr)] made [key_name_admin(M)] drop everything!" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) set category = "Special Verbs" @@ -45,7 +45,7 @@ msg = " SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() set category = "Special Verbs" @@ -62,7 +62,7 @@ to_chat(world, "[msg]") log_admin("GlobalNarrate: [key_name(usr)] : [msg]") message_admins("[key_name_admin(usr)] Sent a global narrate") - feedback_add_details("admin_verb","Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(mob/M) set category = "Special Verbs" @@ -88,7 +88,7 @@ msg = " DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
    " message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(atom/A) set category = "Special Verbs" @@ -110,7 +110,7 @@ log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]") message_admins(" LocalNarrate: [key_name_admin(usr)] at ([get_area(A)]): [msg]
    ") - feedback_add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) set category = "Special Verbs" @@ -125,7 +125,7 @@ var/msg = "[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_toggle","Godmode|[M.status_flags & GODMODE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Godmode|[M.status_flags & GODMODE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/cmd_admin_mute(whom, mute_type, automute = 0) @@ -187,7 +187,7 @@ message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(whom)] from [mute_string].") if(C) to_chat(C, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.") - feedback_add_details("admin_toggle","Auto Mute [feedback_string]|1") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Auto Mute [feedback_string]|1") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return if(P.muted & mute_type) @@ -201,7 +201,7 @@ message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(whom)] from [mute_string].") if(C) to_chat(C, "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)].") - feedback_add_details("admin_toggle","Mute [feedback_string]|[P.muted & mute_type]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Mute [feedback_string]|[P.muted & mute_type]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //I use this proc for respawn character too. /N @@ -423,7 +423,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(new_character, "You have been fully respawned. Enjoy the game.") - feedback_add_details("admin_verb","Respawn Character") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Respawn Character") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return new_character /client/proc/cmd_admin_add_freeform_ai_law() @@ -446,7 +446,7 @@ Traitors and the like can also be revived with the previous role mostly intact. ion.announceEvent = announce_ion_laws ion.ionMessage = input - feedback_add_details("admin_verb","Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_rejuvenate(mob/living/M in GLOB.mob_list) set category = "Special Verbs" @@ -465,7 +465,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/msg = "Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!" message_admins(msg) admin_ticket_log(M, msg) - feedback_add_details("admin_verb","Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() set category = "Special Verbs" @@ -490,7 +490,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(src)] has created a command report: [input]") message_admins("[key_name_admin(src)] has created a command report") - feedback_add_details("admin_verb","Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_change_command_name() set category = "Special Verbs" @@ -516,7 +516,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes") log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])") - feedback_add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(isturf(O)) var/turf/T = O T.ChangeTurf(T.baseturf) @@ -531,7 +531,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(src, "Only administrators may use this command.") return holder.manage_free_slots() - feedback_add_details("admin_verb","Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Manage Job Slots") //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) set category = "Special Verbs" @@ -560,7 +560,7 @@ Traitors and the like can also be revived with the previous role mostly intact. explosion(O, devastation, heavy, light, flash, null, null,flames) log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flames]) at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flames]) at ([O.x],[O.y],[O.z])") - feedback_add_details("admin_verb","Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return else return @@ -583,7 +583,7 @@ Traitors and the like can also be revived with the previous role mostly intact. empulse(O, heavy, light) log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[light]) at ([O.x],[O.y],[O.z])") - feedback_add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return else @@ -614,7 +614,7 @@ Traitors and the like can also be revived with the previous role mostly intact. M.gib() else M.gib(1) - feedback_add_details("admin_verb","Gib") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Gib") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_gib_self() set name = "Gibself" @@ -624,7 +624,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(confirm == "Yes") log_admin("[key_name(usr)] used gibself.") message_admins("[key_name_admin(usr)] used gibself.") - feedback_add_details("admin_verb","Gib Self") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Gib Self") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! mob.gib(1, 1, 1) /client/proc/cmd_admin_check_contents(mob/living/M in GLOB.mob_list) @@ -634,7 +634,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/L = M.get_contents() for(var/t in L) to_chat(usr, "[t]") - feedback_add_details("admin_verb","Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() set category = "Special Verbs" @@ -649,7 +649,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] changed their view range to [view].") //message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI - feedback_add_details("admin_toggle","Change View Range|[view]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Change View Range|[view]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_call_shuttle() @@ -668,7 +668,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return SSshuttle.emergency.request() - feedback_add_details("admin_verb","Call Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Call Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.") return @@ -685,7 +685,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return SSshuttle.emergency.cancel() - feedback_add_details("admin_verb","Cancel Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Cancel Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.") @@ -720,7 +720,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") config.force_random_names = 1 - feedback_add_details("admin_verb","Make Everyone Random") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Make Everyone Random") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_random_events() @@ -735,7 +735,7 @@ Traitors and the like can also be revived with the previous role mostly intact. config.allow_random_events = 0 to_chat(usr, "Random events disabled") message_admins("Admin [key_name_admin(usr)] has disabled random events.") - feedback_add_details("admin_toggle","Toggle Random Events|[config.allow_random_events]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Random Events|[config.allow_random_events]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_change_sec_level() @@ -753,7 +753,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] changed the security level to [level]") message_admins("[key_name_admin(usr)] changed the security level to [level]") - feedback_add_details("admin_verb","Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) set name = "Toggle Nuke" @@ -772,7 +772,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z]).") message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_COORDJMP(N)].") - feedback_add_details("admin_toggle","Toggle Nuke|[N.timing]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Nuke|[N.timing]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits @@ -970,7 +970,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].") message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") - feedback_add_details("admin_toggle","Toggle Antag HUD|[adding_hud]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Antag HUD|[adding_hud]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/has_antag_hud() var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR] @@ -1002,7 +1002,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] added a latent zombie infection to all humans.") log_admin("[key_name(usr)] added a latent zombie infection to all humans.") - feedback_add_details("admin_verb","Mass Zombie Infection") + SSblackbox.add_details("admin_verb","Mass Zombie Infection") /client/proc/mass_zombie_cure() set category = "Fun" @@ -1020,7 +1020,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] cured all zombies.") log_admin("[key_name(usr)] cured all zombies.") - feedback_add_details("admin_verb","Mass Zombie Cure") + SSblackbox.add_details("admin_verb","Mass Zombie Cure") /client/proc/polymorph_all() set category = "Fun" @@ -1039,7 +1039,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] started polymorphed all living mobs.") log_admin("[key_name(usr)] polymorphed all living mobs.") - feedback_add_details("admin_verb","Polymorph All") + SSblackbox.add_details("admin_verb","Polymorph All") for(var/mob/living/M in mobs) CHECK_TICK @@ -1080,7 +1080,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits message_admins("[key_name_admin(usr)] sent a tip of the round.") log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") - feedback_add_details("admin_verb","Show Tip") + SSblackbox.add_details("admin_verb","Show Tip") #define ON_PURRBATION(H) (!(H.dna.features["tail_human"] == "None" && H.dna.features["ears"] == "None")) @@ -1157,7 +1157,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if (world.visibility && !world.reachable) message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.") - feedback_add_details("admin_toggle","Toggled Hub Visibility|[world.visibility]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggled Hub Visibility|[world.visibility]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" diff --git a/code/modules/admin/verbs/reestablish_db_connection.dm b/code/modules/admin/verbs/reestablish_db_connection.dm index 3b134eaff03..133a39185e6 100644 --- a/code/modules/admin/verbs/reestablish_db_connection.dm +++ b/code/modules/admin/verbs/reestablish_db_connection.dm @@ -17,11 +17,11 @@ SSdbcore.Disconnect() log_admin("[key_name(usr)] has forced the database to disconnect") message_admins("[key_name_admin(usr)] has forced the database to disconnect!") - feedback_add_details("admin_verb","Force Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Force Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] is attempting to re-established the DB Connection") message_admins("[key_name_admin(usr)] is attempting to re-established the DB Connection") - feedback_add_details("admin_verb","Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Reestablished Database Connection") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! SSdbcore.failed_connections = 0 if(!SSdbcore.Connect()) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 4615629f1a9..8a434a6f81c 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -21,7 +21,7 @@ attach(A2,user) name = "[A.name]-[A2.name] assembly" update_icon() - feedback_add_details("assembly_made","[initial(A.name)]-[initial(A2.name)]") + SSblackbox.add_details("assembly_made","[initial(A.name)]-[initial(A2.name)]") /obj/item/device/assembly_holder/proc/attach(obj/item/device/assembly/A, mob/user) if(!A.remove_item_from_storage(src)) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index dda86e52573..6f81d884e05 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -103,8 +103,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/amount = get_amount(O) total_cost += cost total_amount += amount - feedback_add_details("export_sold_amount","[O.type]|[amount]") - feedback_add_details("export_sold_cost","[O.type]|[cost]") + SSblackbox.add_details("export_sold_amount","[O.type]|[amount]") + SSblackbox.add_details("export_sold_cost","[O.type]|[cost]") // Total printout for the cargo console. // Called before the end of current export cycle. diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index a3231b8d902..22155a02039 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -6,7 +6,7 @@ prefs.chat_toggles ^= CHAT_GHOSTEARS to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Ears|[prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_sight() set name = "Show/Hide GhostSight" @@ -15,7 +15,7 @@ prefs.chat_toggles ^= CHAT_GHOSTSIGHT to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Sight|[prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_whispers() set name = "Show/Hide GhostWhispers" @@ -24,7 +24,7 @@ prefs.chat_toggles ^= CHAT_GHOSTWHISPER to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Whispers|[prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_radio() set name = "Show/Hide GhostRadio" @@ -33,7 +33,7 @@ prefs.chat_toggles ^= CHAT_GHOSTRADIO to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost Radio|[prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 + SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 /client/verb/toggle_ghost_pda() set name = "Show/Hide GhostPDA" @@ -42,7 +42,7 @@ prefs.chat_toggles ^= CHAT_GHOSTPDA to_chat(src, "As a ghost, you will now [(prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Ghost PDA|[prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it /client/verb/toggle_deathrattle() @@ -52,7 +52,7 @@ prefs.toggles ^= DISABLE_DEATHRATTLE prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") - feedback_add_details("preferences_verb", "Toggle Deathrattle|[!(prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. + SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. /client/verb/toggle_arrivalrattle() set name = "Toggle Arrivalrattle" @@ -61,7 +61,7 @@ prefs.toggles ^= DISABLE_ARRIVALRATTLE to_chat(usr, "You will [(prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") prefs.save_preferences() - feedback_add_details("preferences_verb", "Toggle Arrivalrattle|[!(prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. + SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. /client/verb/togglemidroundantag() set name = "Toggle Midround Antagonist" @@ -70,7 +70,7 @@ prefs.toggles ^= MIDROUND_ANTAG prefs.save_preferences() to_chat(src, "You will [(prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") - feedback_add_details("preferences_verb","Toggle Midround Antag|[prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggletitlemusic() set name = "Hear/Silence LobbyMusic" @@ -85,7 +85,7 @@ else to_chat(src, "You will no longer hear music in the game lobby.") mob.stop_sound_channel(CHANNEL_LOBBYMUSIC) - feedback_add_details("preferences_verb","Toggle Lobby Music|[prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglemidis() set name = "Hear/Silence Midis" @@ -98,14 +98,14 @@ else to_chat(src, "You will no longer hear sounds uploaded by admins") mob.stop_sound_channel(CHANNEL_ADMIN) - feedback_add_details("preferences_verb","Toggle Hearing Midis|[prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/stop_client_sounds() set name = "Stop Sounds" set category = "Preferences" set desc = "Kills all currently playing sounds, use if admin taste in midis a shite" src << sound(null) - feedback_add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/listen_ooc() set name = "Show/Hide OOC" @@ -114,7 +114,7 @@ prefs.chat_toggles ^= CHAT_OOC prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - feedback_add_details("preferences_verb","Toggle Seeing OOC|[prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful set name = "Hear/Silence Ambience" @@ -128,7 +128,7 @@ to_chat(src, "You will no longer hear ambient sounds.") src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - feedback_add_details("preferences_verb","Toggle Ambience|[prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Ambience|[prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! // This needs a toggle because you people are awful and spammed terrible music /client/verb/toggle_instruments() @@ -141,7 +141,7 @@ to_chat(src, "You will now hear people playing musical instruments.") else to_chat(src, "You will no longer hear musical instruments.") - feedback_add_details("preferences_verb","Toggle Instruments|[prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Instruments|[prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //Lots of people get headaches from the normal ship ambience, this is to prevent that /client/verb/toggle_ship_ambience() @@ -156,7 +156,7 @@ to_chat(src, "You will no longer hear ship ambience.") src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) src.ambience_playing = 0 - feedback_add_details("preferences_verb", "Toggle Ship Ambience|[prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) + SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ @@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= INTENT_STYLE to_chat(src, "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/setup_character() set name = "Game Preferences" @@ -263,7 +263,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() if(isobserver(mob)) mob.hud_used.show_hud() - feedback_add_details("preferences_verb","Toggle Ghost HUD|[prefs.ghost_hud]") + SSblackbox.add_details("preferences_verb","Toggle Ghost HUD|[prefs.ghost_hud]") /client/verb/toggle_inquisition() // warning: unexpected inquisition set name = "Toggle Inquisitiveness" @@ -276,7 +276,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will now examine everything you click on.") else to_chat(src, "You will no longer examine things you click on.") - feedback_add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]") + SSblackbox.add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]") /client/verb/toggle_announcement_sound() set name = "Hear/Silence Announcements" @@ -285,7 +285,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= SOUND_ANNOUNCEMENTS to_chat(src, "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") prefs.save_preferences() - feedback_add_details("preferences_verb","Toggle Announcement Sound|[prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //Admin Preferences /client/proc/toggleadminhelpsound() @@ -297,7 +297,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= SOUND_ADMINHELP prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") - feedback_add_details("admin_toggle","Toggle Adminhelp Sound|[prefs.toggles & SOUND_ADMINHELP]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Adminhelp Sound|[prefs.toggles & SOUND_ADMINHELP]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleannouncelogin() set name = "Do/Don't Announce Login" @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= ANNOUNCE_LOGIN prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & ANNOUNCE_LOGIN) ? "now" : "no longer"] have an announcement to other admins when you login.") - feedback_add_details("admin_toggle","Toggle Login Announcement|[prefs.toggles & ANNOUNCE_LOGIN]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Login Announcement|[prefs.toggles & ANNOUNCE_LOGIN]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_hear_radio() set name = "Show/Hide Radio Chatter" @@ -318,7 +318,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_RADIO prefs.save_preferences() to_chat(usr, "You will [(prefs.chat_toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from nearby radios or speakers") - feedback_add_details("admin_toggle","Toggle Radio Chatter|[prefs.chat_toggles & CHAT_RADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Radio Chatter|[prefs.chat_toggles & CHAT_RADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/deadchat() set name = "Show/Hide Deadchat" @@ -327,7 +327,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_DEAD prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - feedback_add_details("admin_toggle","Toggle Deadchat Visibility|[prefs.chat_toggles & CHAT_DEAD]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Deadchat Visibility|[prefs.chat_toggles & CHAT_DEAD]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleprayers() set name = "Show/Hide Prayers" @@ -336,7 +336,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_PRAYER prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") - feedback_add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggleprayersounds() set name = "Hear/Silence Prayer Sounds" @@ -348,4 +348,4 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will now hear prayer sounds.") else to_chat(src, "You will no longer prayer sounds.") - feedback_add_details("admin_toggle", "Toggle Prayer Sounds|[prefs.toggles & SOUND_PRAYERS]") + SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[prefs.toggles & SOUND_PRAYERS]") diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 79b21dccee2..97e05ee221d 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -108,7 +108,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) if(new_ooccolor) prefs.ooccolor = sanitize_ooccolor(new_ooccolor) prefs.save_preferences() - feedback_add_details("admin_verb","Set OOC Color") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.add_details("admin_verb","Set OOC Color") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/verb/resetcolorooc() diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 77d1e1d6d9c..a14d301a31e 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -124,7 +124,7 @@ var/atom/movable/I = new R.result (get_turf(user.loc)) I.CheckParts(parts, R) if(send_feedback) - feedback_add_details("object_crafted","[I.type]") + SSblackbox.add_details("object_crafted","[I.type]") return 0 return "." return ", missing tool." diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 4046e7dcb80..4eef1c06a31 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -78,13 +78,13 @@ triggering = FALSE message_admins("[key_name_admin(usr)] cancelled event [name].") log_admin_private("[key_name(usr)] cancelled event [name].") - feedback_add_details("event_admin_cancelled","[typepath]") + SSblackbox.add_details("event_admin_cancelled","[typepath]") /datum/round_event_control/proc/runEvent(random) var/datum/round_event/E = new typepath() E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) E.control = src - feedback_add_details("event_ran","[E]") + SSblackbox.add_details("event_ran","[E]") occurrences++ testing("[time2text(world.time, "hh:mm:ss")] [E.type]") diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index d50c80567a5..148541922ff 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -170,7 +170,7 @@ if(istype(A, B)) continue contents_loop qdel(A) - feedback_add_details("food_made","[type]") + SSblackbox.add_details("food_made","[type]") if(bonus_reagents && bonus_reagents.len) for(var/r_id in bonus_reagents) @@ -262,7 +262,7 @@ initialize_cooked_food(S, M.efficiency) else initialize_cooked_food(S, 1) - feedback_add_details("food_made","[type]") + SSblackbox.add_details("food_made","[type]") else new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src) if(M && M.dirty < 100) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 6274716f0d9..4a2f0948d9a 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -142,7 +142,7 @@ return for(var/i in 1 to (C+processor.rating_amount-1)) new S.coretype(loc) - feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") + SSblackbox.add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() /datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 7c2d58d8a80..4b83485fa55 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -150,7 +150,7 @@ t_amount++ product_name = t_prod.name if(getYield() >= 1) - feedback_add_details("food_harvested","[product_name]|[getYield()]") + SSblackbox.add_details("food_harvested","[product_name]|[getYield()]") parent.update_tray() return result diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index f796da92005..0633e6486d3 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -82,8 +82,8 @@ Chaplain H.equip_to_slot_or_del(B, slot_in_backpack) - feedback_set_details("religion_name","[new_religion]") - feedback_set_details("religion_deity","[new_deity]") + SSblackbox.set_details("religion_name","[new_religion]") + SSblackbox.set_details("religion_deity","[new_deity]") /datum/outfit/job/chaplain name = "Chaplain" diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index b98a3cfd98f..8c2d1ca2818 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -131,7 +131,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also /obj/machinery/computer/auxillary_base/onShuttleMove(turf/T1, rotation) ..() if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery - feedback_add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! + SSblackbox.add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! /obj/machinery/computer/auxillary_base/proc/set_mining_mode() if(z == ZLEVEL_MINING) //The console switches to controlling the mining shuttle once landed. diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm index 36c30531431..dd8766bdc9a 100644 --- a/code/modules/mining/equipment.dm +++ b/code/modules/mining/equipment.dm @@ -68,7 +68,7 @@ /obj/item/device/wormhole_jaunter/attack_self(mob/user) user.visible_message("[user.name] activates the [src.name]!") - feedback_add_details("jaunter", "User") // user activated + SSblackbox.add_details("jaunter", "User") // user activated activate(user) /obj/item/device/wormhole_jaunter/proc/turf_check(mob/user) @@ -124,13 +124,13 @@ if(triggered) usr.visible_message("The [src] overloads and activates!") - feedback_add_details("jaunter","EMP") // EMP accidental activation + SSblackbox.add_details("jaunter","EMP") // EMP accidental activation activate(usr) /obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user) if(user.get_item_by_slot(slot_belt) == src) to_chat(user, "Your [src] activates, saving you from the chasm!") - feedback_add_details("jaunter","Chasm") // chasm automatic activation + SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation activate(user) else to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.") @@ -320,7 +320,7 @@ H.attack_same = 0 loaded = 0 user.visible_message("[user] injects [M] with [src], reviving it.") - feedback_add_details("lazarus_injector", "[M.type]") + SSblackbox.add_details("lazarus_injector", "[M.type]") playsound(src,'sound/effects/refill.ogg',50,1) icon_state = "lazarus_empty" return diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 95f8d2d9bdc..6b1179a5851 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -86,7 +86,7 @@ user.sight |= SEE_MOBS icon_state = "lantern" wisp.orbit(user, 20) - feedback_add_details("wisp_lantern","Freed") + SSblackbox.add_details("wisp_lantern","Freed") else to_chat(user, "You return the wisp to the lantern.") @@ -101,7 +101,7 @@ wisp.stop_orbit() wisp.loc = src icon_state = "lantern-blue" - feedback_add_details("wisp_lantern","Returned") + SSblackbox.add_details("wisp_lantern","Returned") /obj/item/device/wisp_lantern/Initialize() ..() @@ -140,7 +140,7 @@ return new /obj/effect/particle_effect/smoke(user.loc) user.forceMove(get_turf(linked)) - feedback_add_details("warp_cube","[src.type]") + SSblackbox.add_details("warp_cube","[src.type]") new /obj/effect/particle_effect/smoke(user.loc) /obj/item/device/warp_cube/red @@ -228,7 +228,7 @@ /obj/item/device/immortality_talisman/attack_self(mob/user) if(cooldown < world.time) - feedback_add_details("immortality_talisman","Activated") // usage + SSblackbox.add_details("immortality_talisman","Activated") // usage cooldown = world.time + 600 user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!") var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc)) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index dc6bc87d189..0d651518b75 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -136,7 +136,7 @@ else inserted_id.mining_points -= prize.cost new prize.equipment_path(src.loc) - feedback_add_details("mining_equipment_bought", + SSblackbox.add_details("mining_equipment_bought", "[src.type]|[prize.equipment_path]") // Add src.type to keep track of free golem purchases // seperately. @@ -189,7 +189,7 @@ if("Mining Conscription Kit") new /obj/item/weapon/storage/backpack/dufflebag/mining_conscript(loc) - feedback_add_details("mining_voucher_redeemed", selection) + SSblackbox.add_details("mining_voucher_redeemed", selection) qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 397824d8301..62470837479 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -73,7 +73,7 @@ name = "Man-Machine Interface: [brainmob.real_name]" update_icon() - feedback_inc("cyborg_mmis_filled",1) + SSblackbox.inc("cyborg_mmis_filled",1) else if(brainmob) O.attack(brainmob, user) //Oh noooeeeee diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 68b48c81d73..5df1d9296ae 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -33,7 +33,7 @@ dna.species.spec_death(gibbed, src) if(SSticker && SSticker.mode) - sql_report_death(src) + SSblackbox.ReportDeath(src) if(mind && mind.devilinfo) INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3b5a14441d5..3a350bb31b6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -177,8 +177,8 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(user.zone_selected)) //what we're actually ending up trying to hit. var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target - feedback_add_details("item_used_for_combat","[I.type]|[I.force]") - feedback_add_details("zone_targeted","[target_area]") + SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]") + SSblackbox.add_details("zone_targeted","[target_area]") // the attacked_by code varies among species return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 3d88433dec2..4df0c54d1a1 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -32,4 +32,4 @@ unbuckle_all_mobs(TRUE) - sql_report_death(src) + SSblackbox.ReportDeath(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 257bf11163c..1891e2a5520 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -222,7 +222,7 @@ if(R.hud_used) R.hud_used.update_robot_modules_display() if(feedback_key && !did_feedback) - feedback_inc(feedback_key, 1) + SSblackbox.inc(feedback_key, 1) /obj/item/weapon/robot_module/standard name = "Standard" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 8af5c76f5be..0a0ff6bdd3a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -53,7 +53,7 @@ return else if(!admin_spawned) - feedback_set_details("megafauna_kills","[initial(name)]") + SSblackbox.set_details("megafauna_kills","[initial(name)]") if(!elimination) //used so the achievment only occurs for the last legion to die. grant_achievement(medal_type,score_type) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index ca0ef6a7ea7..a68ccc48840 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -48,7 +48,7 @@ ..() /mob/living/simple_animal/hostile/asteroid/death(gibbed) - feedback_add_details("mobs_killed_mining","[src.type]") + SSblackbox.add_details("mobs_killed_mining","[src.type]") ..(gibbed) /mob/living/simple_animal/hostile/asteroid/basilisk @@ -266,15 +266,15 @@ update_icon() if(implanted) - feedback_add_details("hivelord_core", "[type]|implanted") + SSblackbox.add_details("hivelord_core", "[type]|implanted") else - feedback_add_details("hivelord_core", "[type]|stabilizer") + SSblackbox.add_details("hivelord_core", "[type]|stabilizer") /obj/item/organ/hivelord_core/proc/go_inert() inert = TRUE desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." - feedback_add_details("hivelord_core", "[src.type]|inert") + SSblackbox.add_details("hivelord_core", "[src.type]|inert") update_icon() /obj/item/organ/hivelord_core/ui_action_click() @@ -298,10 +298,10 @@ return if(H != user) H.visible_message("[user] forces [H] to apply [src]... [H.p_they()] quickly regenerate all injuries!") - feedback_add_details("hivelord_core","[src.type]|used|other") + SSblackbox.add_details("hivelord_core","[src.type]|used|other") else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - feedback_add_details("hivelord_core","[src.type]|used|self") + SSblackbox.add_details("hivelord_core","[src.type]|used|self") H.revive(full_heal = 1) qdel(src) ..() diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index aec971fb37f..dab6b717a41 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -166,7 +166,7 @@ M.Friends = Friends.Copy() babies += M M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) - feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") + SSblackbox.add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") var/mob/living/simple_animal/slime/new_slime = pick(babies) new_slime.a_intent = INTENT_HARM diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 985fceec23f..350eb534e65 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -69,7 +69,7 @@ return 0 charge = (charge - amount) if(!istype(loc, /obj/machinery/power/apc)) - feedback_add_details("cell_used","[src.type]") + SSblackbox.add_details("cell_used","[src.type]") return 1 // recharge the cell diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index bc3d6f86691..9e6f2fdb967 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -32,7 +32,7 @@ if(energy > 0) if(energy >= 200) var/turf/T = get_turf(src) - feedback_add_details("engine_started","[src.type]") + SSblackbox.add_details("engine_started","[src.type]") var/obj/singularity/S = new creation_type(T, 50) transfer_fingerprints_to(S) qdel(src) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f69d4cc23f0..2dffe0a567e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -265,7 +265,7 @@ if(user) user.update_inv_hands() - feedback_add_details("gun_fired","[src.type]") + SSblackbox.add_details("gun_fired","[src.type]") return 1 /obj/item/weapon/gun/attack(mob/M as mob, mob/user) diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index da4346109a3..32646ee1e8f 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -55,7 +55,7 @@ current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical) INVOKE_ASYNC(current_beam, /datum/beam.proc/Start) - feedback_add_details("gun_fired","[src.type]") + SSblackbox.add_details("gun_fired","[src.type]") /obj/item/weapon/gun/medbeam/process() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index dbbb0b80b98..2c8ef5e065f 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -396,7 +396,7 @@ remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) for(var/P in C.results) - feedback_add_details("chemical_reaction", "[P]|[cached_results[P]*multiplier]") + SSblackbox.add_details("chemical_reaction", "[P]|[cached_results[P]*multiplier]") multiplier = max(multiplier, 1) //this shouldnt happen ... add_reagent(P, cached_results[P]*multiplier, null, chem_temp) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 52205b24973..a1c4a74795f 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -3,7 +3,7 @@ var/deletes_extract = TRUE /datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") + SSblackbox.add_details("slime_cores_used","[type]") if(deletes_extract) delete_extract(holder) diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 5013d9d8799..296978c9018 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -391,7 +391,7 @@ if(contents.len) if(full_pressure) spawn(0) - feedback_inc("disposal_auto_flush",1) + SSblackbox.inc("disposal_auto_flush",1) flush() flush_count = 0 diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index f2bdd738c46..b77cee861cc 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -309,13 +309,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/T in temp_tech) var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels - feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get + SSblackbox.add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get files.UpdateTech(T, temp_tech[T]) if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. for(var/material in linked_destroy.loaded_item.materials) linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) - feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.type]") + SSblackbox.add_details("item_deconstructed","[linked_destroy.loaded_item.type]") linked_destroy.loaded_item = null for(var/obj/I in linked_destroy.contents) for(var/mob/M in I.contents) @@ -452,7 +452,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, new_item.materials = efficient_mats.Copy() new_item.loc = linked_lathe.loc if(!already_logged) - feedback_add_details("item_printed","[new_item.type]|[amount]") + SSblackbox.add_details("item_printed","[new_item.type]|[amount]") already_logged = 1 screen = old_screen linked_lathe.busy = 0 @@ -519,7 +519,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/obj/item/new_item = new P(src) new_item.loc = linked_imprinter.loc new_item.materials = efficient_mats.Copy() - feedback_add_details("circuit_printed","[new_item.type]") + SSblackbox.add_details("circuit_printed","[new_item.type]") screen = old_screen linked_imprinter.busy = 0 else diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index e7c115e1004..a7d97ec63a3 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -95,10 +95,10 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) switch(event) if("Red Alert") set_security_level(SEC_LEVEL_RED) - feedback_inc("alert_keycard_auth_red",1) + SSblackbox.inc("alert_keycard_auth_red",1) if("Emergency Maintenance Access") make_maint_all_access() - feedback_inc("alert_keycard_auth_maint",1) + SSblackbox.inc("alert_keycard_auth_maint",1) GLOBAL_VAR_INIT(emergency_access, FALSE) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index ccb8f6b0914..852a7bc2fca 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -187,5 +187,5 @@ /obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value) switch(var_name) if("perma_docked") - feedback_add_details("admin_secrets_fun_used","ShA[var_value ? "s" : "g"]") + SSblackbox.add_details("admin_secrets_fun_used","ShA[var_value ? "s" : "g"]") return ..() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 553210a5f72..f13e29273ec 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -290,7 +290,7 @@ setTimer(SSshuttle.emergencyDockTime) send2irc("Server", "The Emergency Shuttle has docked with the station.") priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - feedback_add_details("emergency_shuttle", src.name) + SSblackbox.add_details("emergency_shuttle", src.name) // Gangs only have one attempt left if the shuttle has // docked with the station to prevent suffering from diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index 594a6855da0..d9d4eb7a712 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -155,7 +155,7 @@ message_admins("[key_name_admin(usr)] fast travelled \ [M]") log_admin("[key_name(usr)] fast travelled [M]") - feedback_add_details("shuttle_fasttravel", M.name) + SSblackbox.add_details("shuttle_fasttravel", M.name) break if("preview") @@ -182,7 +182,7 @@ with the shuttle manipulator.") log_admin("[key_name(usr)] loaded [mdp] with the \ shuttle manipulator.") - feedback_add_details("shuttle_manipulator", mdp.name) + SSblackbox.add_details("shuttle_manipulator", mdp.name) update_icon() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index f214d018b40..eda3c3e6c62 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -583,9 +583,9 @@ "You feel an immense \ crushing pressure as the space around you ripples.") if(M.key || M.get_ghost(TRUE)) - feedback_add_details("shuttle_gib", "[type]") + SSblackbox.add_details("shuttle_gib", "[type]") else - feedback_add_details("shuttle_gib_unintelligent", "[type]") + SSblackbox.add_details("shuttle_gib_unintelligent", "[type]") M.gib() else //non-living mobs shouldn't be affected by shuttles, which is why this is an else diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 1e3b9906beb..82d5db8b209 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( SSshuttle.orderhistory += SO SO.generate(pick_n_take(empty_turfs)) - feedback_add_details("cargo_imports", + SSblackbox.add_details("cargo_imports", "[SO.pack.type]|[SO.pack.name]|[SO.pack.cost]") investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]) has shipped.", "cargo") if(SO.pack.dangerous) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index d1f56978cb8..03beacf27b3 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -54,7 +54,7 @@ return new step_type /datum/surgery/proc/complete() - feedback_add_details("surgeries_completed", "[type]") + SSblackbox.add_details("surgeries_completed", "[type]") qdel(src) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 9ed0565ee77..62d0a032d95 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/proc/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) - feedback_add_details("traitor_uplink_items_bought", "[name]|[cost]") + SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return new item(loc) /datum/uplink_item/proc/buy(mob/user, obj/item/device/uplink/U) @@ -1158,7 +1158,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) if(istype(item, /obj/item/organ)) - feedback_add_details("traitor_uplink_items_bought", "[item]|[cost]") + SSblackbox.add_details("traitor_uplink_items_bought", "[item]|[cost]") return new /obj/item/weapon/storage/box/cyber_implants(loc, item) else return ..() @@ -1326,7 +1326,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. new I.item(C) U.purchase_log += "\icon[I.item]" - feedback_add_details("traitor_uplink_items_bought", "[name]|[cost]") + SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return C /datum/uplink_item/badass/random @@ -1352,6 +1352,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. var/datum/uplink_item/I = pick(possible_items) U.telecrystals -= I.cost U.spent_telecrystals += I.cost - feedback_add_details("traitor_uplink_items_bought","[name]|[I.cost]") - feedback_add_details("traitor_random_uplink_items_gotten","[I.name]") + SSblackbox.add_details("traitor_uplink_items_bought","[name]|[I.cost]") + SSblackbox.add_details("traitor_random_uplink_items_gotten","[I.name]") return new I.item(loc) diff --git a/code/world.dm b/code/world.dm index 75470585e43..94ae1ce165a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -208,11 +208,9 @@ #undef WORLD_REBOOT /world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent) - feedback_set_details("[feedback_c]","[feedback_r]") + SSblackbox.set_details("[feedback_c]","[feedback_r]") log_game("Rebooting World. [reason]") - feedback_set("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len) - if(GLOB.blackbox) - GLOB.blackbox.save_all_data_to_sql() + SSblackbox.set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len) Master.Shutdown() //run SS shutdowns RoundEndAnimation(round_end_sound_sent) kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) //second parameter ensures only afk clients are kicked diff --git a/tgstation.dme b/tgstation.dme index 6785056c1ac..4336e73df60 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -160,6 +160,7 @@ #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" +#include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\disease.dm" @@ -180,7 +181,6 @@ #include "code\controllers\subsystem\pai.dm" #include "code\controllers\subsystem\parallax.dm" #include "code\controllers\subsystem\persistence.dm" -#include "code\controllers\subsystem\ping.dm" #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\religion.dm" #include "code\controllers\subsystem\server_maint.dm" @@ -2088,7 +2088,6 @@ #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" -#include "code\orphaned_procs\statistics.dm" #include "interface\interface.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" From 6c6fc719ec6741a3745c9616a44f87ddb9d657f1 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 18:05:41 -0400 Subject: [PATCH 74/97] Refactors roundstart checks slightly (#26131) * Refactors roundstart checks slightly * Fix --- code/__HELPERS/game.dm | 2 +- code/controllers/master.dm | 10 +++++----- code/controllers/subsystem/ticker.dm | 10 +++++----- code/datums/helper_datums/getrev.dm | 2 +- code/game/gamemodes/objective.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/modules/admin/admin.dm | 2 +- code/modules/admin/player_panel.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/awaymissions/capture_the_flag.dm | 2 +- code/modules/awaymissions/corpse.dm | 2 +- code/modules/client/client_procs.dm | 2 +- code/modules/mob/dead/new_player/new_player.dm | 2 +- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- code/modules/power/smes.dm | 2 +- code/world.dm | 3 +++ 18 files changed, 28 insertions(+), 25 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 6ebb70746f3..abfaec29a73 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -513,7 +513,7 @@ winset(C, "mainwindow", "flash=5") /proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) - if(SSticker.current_state != GAME_STATE_PLAYING || !character) + if(!SSticker.IsRoundInProgress() || !character) return var/area/A = get_area(character) var/message = "\ diff --git a/code/controllers/master.dm b/code/controllers/master.dm index ab4ff43b047..01d0ac34470 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -48,7 +48,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) var/initializations_finished_with_no_players_logged_in //I wonder what this could be? // Has round started? (So we know what subsystems to run) - var/round_started = 0 + var/local_round_started = FALSE //Don't read this var, use SSticker.HasRoundStarted() instead // The type of the last subsystem to be process()'d. var/last_type_processed @@ -189,7 +189,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) // Notify the MC that the round has started. /datum/controller/master/proc/RoundStart() - round_started = 1 + local_round_started = TRUE var/timer = world.time for (var/datum/controller/subsystem/SS in subsystems) if (SS.flags & SS_FIRE_IN_LOBBY || SS.flags & SS_TICKER) @@ -222,7 +222,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) // local vars rock // Schedule the first run of the Subsystems. - round_started = world.has_round_started() + local_round_started = world.has_round_started() //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) var/list/tickersubsystems = list() var/list/normalsubsystems = list() @@ -245,7 +245,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) lobbysubsystems += SS timer += world.tick_lag * rand(1, 5) SS.next_fire = timer - else if (round_started) + else if (local_round_started) timer += world.tick_lag * rand(1, 5) SS.next_fire = timer normalsubsystems += SS @@ -296,7 +296,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time)) new/datum/controller/failsafe() // (re)Start the failsafe. if (!queue_head || !(iteration % 3)) - if (round_started) + if (local_round_started) subsystems_to_check = normalsubsystems else subsystems_to_check = lobbysubsystems diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e23edfae658..868d7d27e89 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -238,7 +238,7 @@ SUBSYSTEM_DEF(ticker) send2irc("Server", "Round of [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]") /datum/controller/subsystem/ticker/proc/OnRoundstart(datum/callback/cb) - if(current_state < GAME_STATE_PLAYING) + if(!HasRoundStarted()) LAZYADD(round_start_events, cb) else cb.InvokeAsync() @@ -651,11 +651,11 @@ SUBSYSTEM_DEF(ticker) return INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate) +/datum/controller/subsystem/ticker/proc/HasRoundStarted() + return current_state >= GAME_STATE_PLAYING -/world/proc/has_round_started() - if (SSticker && SSticker.current_state >= GAME_STATE_PLAYING) - return TRUE - return FALSE +/datum/controller/subsystem/ticker/proc/IsRoundInProgress() + return current_state == GAME_STATE_PLAYING /datum/controller/subsystem/ticker/Recover() current_state = SSticker.current_state diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 89fafe5dcca..f542aea4561 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -89,7 +89,7 @@ to_chat(src, "Enforce Continuous Rounds: [config.continuous.len] of [config.modes.len] roundtypes") to_chat(src, "Allow Midround Antagonists: [config.midround_antag.len] of [config.modes.len] roundtypes") if(config.show_game_type_odds) - if(SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker.IsRoundInProgress()) var/prob_sum = 0 var/current_odds_differ = FALSE var/list/probs = list() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index c082a482247..6ac0ab8c7c6 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -654,7 +654,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) for(var/mob/dead/new_player/P in GLOB.player_list) if(P.client && P.ready && P.mind!=owner) n_p ++ - else if (SSticker.current_state == GAME_STATE_PLAYING) + else if (SSticker.IsRoundInProgress()) for(var/mob/living/carbon/human/P in GLOB.player_list) if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) n_p ++ diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 1c2d65355ea..4c29d87dfa8 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -398,7 +398,7 @@ /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) + if(!SSticker.HasRoundStarted()) add_blueprints(AM) /turf/proc/empty(turf_type=/turf/open/space) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e189e081e3e..e8803868fef 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -804,7 +804,7 @@ return 1 /client/proc/adminGreet(logout) - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker.HasRoundStarted()) var/string if(logout && config && config.announce_admin_logout) string = pick( diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 1edaea3e728..396d7d93fa0 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -310,7 +310,7 @@ usr << browse(dat, "window=players;size=600x480") /datum/admins/proc/check_antagonists() - if (SSticker && SSticker.current_state >= GAME_STATE_PLAYING) + if (SSticker.HasRoundStarted()) var/dat = "Round Status

    Round Status

    " if(SSticker.mode.replacementmode) dat += "Former Game Mode: [SSticker.mode.name]
    " diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index e25bc46c32a..6b77a705457 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2161,7 +2161,7 @@ else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker.IsRoundInProgress()) var/afkonly = text2num(href_list["afkonly"]) if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes") to_chat(usr, "Kick clients from lobby aborted") diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 996b4a700b0..93b9b6b3f96 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -206,7 +206,7 @@ toggle_all_ctf(user) return - if(SSticker.current_state < GAME_STATE_PLAYING) + if(!SSticker.HasRoundStarted()) return if(user.ckey in team_members) if(user.ckey in recently_dead_ckeys) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index d9663f97c95..96c0bc35deb 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -22,7 +22,7 @@ anchored = 1 /obj/effect/mob_spawn/attack_ghost(mob/user) - if(SSticker.current_state != GAME_STATE_PLAYING || !loc) + if(!SSticker.HasRoundStarted() || !loc) return if(!uses) to_chat(user, "This spawner is out of charges!") diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f1e0f73afc2..b2be9a1b219 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -341,7 +341,7 @@ GLOBAL_LIST(external_rsc_urls) holder.owner = null GLOB.admins -= src - if (!GLOB.admins.len && SSticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing. + if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. if(!GLOB.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. var/cheesy_message = pick( "I have no admins online!",\ diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index a5f5b2e1768..aa948343089 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -149,7 +149,7 @@ return 1 if(href_list["late_join"]) - if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || !SSticker.IsRoundInProgress()) to_chat(usr, "The round is either not ready, or has already finished...") return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d87573edd3f..1211370b945 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -337,7 +337,7 @@ . = 1 /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 - if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || SSticker.current_state != GAME_STATE_PLAYING) + if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) return next_scan_time = world.time + 400 var/alone = 1 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 4f8cd308752..17682376c56 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -304,7 +304,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Sound the alert if gravity was just enabled or disabled. var/alert = 0 var/area/area = get_area(src) - if(on && SSticker && SSticker.current_state == GAME_STATE_PLAYING) // If we turned on and the game is live. + if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live. if(gravity_in_level() == 0) alert = 1 investigate_log("was brought online and is now producing gravity for this level.", "gravity") diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 02953a70242..9d10624093a 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -96,7 +96,7 @@ sparks.set_up(5, TRUE, src) /obj/machinery/power/emitter/Destroy() - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.IsRoundInProgress()) message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo") diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fdb4699ae5d..1e1737661e4 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -191,7 +191,7 @@ cell.charge = (charge / capacity) * cell.maxcharge /obj/machinery/power/smes/Destroy() - if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.IsRoundInProgress()) var/area/area = get_area(src) message_admins("SMES deleted at ([area.name])") log_game("SMES deleted at ([area.name])") diff --git a/code/world.dm b/code/world.dm index 94ae1ce165a..5602e62aff7 100644 --- a/code/world.dm +++ b/code/world.dm @@ -313,3 +313,6 @@ s += ": [jointext(features, ", ")]" status = s + +/world/proc/has_round_started() + return SSticker.HasRoundStarted() \ No newline at end of file From c086dab047f8a6c45f827d2fe2cfbfca9e25757b Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 18:34:04 -0400 Subject: [PATCH 75/97] Fixes master --- code/controllers/subsystem/server_maint.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index be80324fa1f..c248ca0a98e 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(server_maint) src.currentrun = GLOB.clients.Copy() var/list/currentrun = src.currentrun - var/round_started = Master.round_started + var/round_started = SSticker.HasRoundStarted() for(var/I in currentrun) var/client/C = I From ce0f892a136ab4227cc7654696557e55c67ee380 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 26 Apr 2017 15:43:49 -0700 Subject: [PATCH 76/97] Automatic changelog generation for PR #26570 [ci skip] --- html/changelogs/AutoChangeLog-pr-26570.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26570.yml diff --git a/html/changelogs/AutoChangeLog-pr-26570.yml b/html/changelogs/AutoChangeLog-pr-26570.yml new file mode 100644 index 00000000000..0cf240b1217 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26570.yml @@ -0,0 +1,4 @@ +author: "MrStonedOne" +delete-after: True +changes: + - tweak: "Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted." From 0a698c5907a3221513ff369b9c8101789fb26448 Mon Sep 17 00:00:00 2001 From: c0 Date: Thu, 27 Apr 2017 02:59:26 +0300 Subject: [PATCH 77/97] Abductor fixes --- .../miniantags/abduction/abduction_gear.dm | 75 ++++++++++++++----- .../miniantags/abduction/abduction_outfits.dm | 12 +-- .../miniantags/abduction/machinery/console.dm | 72 ++++++++++-------- .../abduction/machinery/dispenser.dm | 4 +- 4 files changed, 105 insertions(+), 58 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index e6365d5e651..d7ab46cb9cd 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -14,6 +14,13 @@ origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70) actions_types = list(/datum/action/item_action/hands_free/activate) + allowed = list( + /obj/item/device/abductor, + /obj/item/weapon/abductor_baton, + /obj/item/weapon/melee/baton, + /obj/item/weapon/gun/energy, + /obj/item/weapon/restraints/handcuffs + ) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -21,6 +28,11 @@ var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70) var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50, fire = 90, acid = 90) +/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() + flags ^= NODROP + if(ismob(loc)) + to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].") + /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() switch(mode) if(VEST_STEALTH) @@ -107,6 +119,18 @@ if(combat_cooldown==initial(combat_cooldown)) STOP_PROCESSING(SSobj, src) +/obj/item/clothing/suit/armor/abductor/Destroy() + STOP_PROCESSING(SSobj, src) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.vest == src) + C.vest = null + break + . = ..() + + +/obj/item/device/abductor + icon = 'icons/obj/abductor.dmi' + /obj/item/device/abductor/proc/AbductorCheck(user) if(isabductor(user)) return TRUE @@ -114,14 +138,19 @@ return FALSE /obj/item/device/abductor/proc/ScientistCheck(user) + if(!AbductorCheck(user)) + return FALSE + var/mob/living/carbon/human/H = user var/datum/species/abductor/S = H.dna.species - return S.scientist + if(S.scientist) + return TRUE + to_chat(user, "You're not trained to use this!") + return FALSE /obj/item/device/abductor/gizmo name = "science tool" desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." - icon = 'icons/obj/abductor.dmi' icon_state = "gizmo_scan" item_state = "silencer" origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3" @@ -130,11 +159,12 @@ var/obj/machinery/abductor/console/console /obj/item/device/abductor/gizmo/attack_self(mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this!") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + if(mode == GIZMO_SCAN) mode = GIZMO_MARK icon_state = "gizmo_mark" @@ -144,11 +174,12 @@ to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE") /obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(M, user) @@ -159,11 +190,12 @@ /obj/item/device/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) if(flag) return - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(target, user) @@ -172,9 +204,8 @@ /obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) - if(console!=null) - console.AddSnapshot(target) - to_chat(user, "You scan [target] and add them to the database.") + console.AddSnapshot(target) + to_chat(user, "You scan [target] and add them to the database.") /obj/item/device/abductor/gizmo/proc/mark(atom/target, mob/living/user) if(marked == target) @@ -198,11 +229,15 @@ marked = target to_chat(user, "You finish preparing [target] for transport.") +/obj/item/device/abductor/gizmo/Destroy() + if(console) + console.gizmo = null + . = ..() + /obj/item/device/abductor/silencer name = "abductor silencer" desc = "A compact device used to shut down communications equipment." - icon = 'icons/obj/abductor.dmi' icon_state = "silencer" item_state = "gizmo" origin_tech = "materials=4;programming=7;abductor=3" @@ -419,10 +454,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C) C.update_handcuffed() - to_chat(user, "You handcuff [C].") + to_chat(user, "You restrain [C].") add_logs(user, C, "handcuffed") else - to_chat(user, "You fail to handcuff [C].") + to_chat(user, "You fail to restrain [C].") else to_chat(user, "[C] doesn't have two hands...") @@ -471,11 +506,11 @@ Congratulations! You are now trained for invasive xenobiology research!"} ..() switch(mode) if(BATON_STUN) - user <<"The baton is in stun mode." + to_chat(user, "The baton is in stun mode.") if(BATON_SLEEP) - user <<"The baton is in sleep inducement mode." + to_chat(user, "The baton is in sleep inducement mode.") if(BATON_CUFF) - user <<"The baton is in restraining mode." + to_chat(user, "The baton is in restraining mode.") if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm index 100c4852632..c92fdddf26a 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -22,13 +22,13 @@ if(console) var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H if(V) - console.vest = V + console.AddVest(V) V.flags |= NODROP - var/obj/item/device/abductor/gizmo/G = locate() in H.getBackSlot() - if(G) - console.gizmo = G - G.console = console + var/obj/item/weapon/storage/backpack/B = locate() in H + if(B) + for(var/obj/item/device/abductor/gizmo/G in B.contents) + console.AddGizmo(G) /datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() @@ -40,10 +40,10 @@ name = "Abductor Agent" head = /obj/item/clothing/head/helmet/abductor suit = /obj/item/clothing/suit/armor/abductor/vest + suit_store = /obj/item/weapon/abductor_baton belt = /obj/item/weapon/storage/belt/military/abductor/full backpack_contents = list( - /obj/item/weapon/abductor_baton = 1, /obj/item/weapon/gun/energy/alien = 1, /obj/item/device/abductor/silencer = 1 ) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 27a358081d2..8ad8cc84747 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -7,7 +7,7 @@ //Console /obj/machinery/abductor/console - name = "Abductor console" + name = "abductor console" desc = "Ship command center." icon = 'icons/obj/abductor.dmi' icon_state = "console" @@ -32,7 +32,7 @@ var/dat = "" dat += "

    Abductsoft 3000

    " - if(experiment != null) + if(experiment) var/points = experiment.points var/credits = experiment.credits dat += "Collected Samples : [points]
    " @@ -46,18 +46,18 @@ else dat += "NO EXPERIMENT MACHINE DETECTED
    " - if(pad!=null) + if(pad) dat += "Emergency Teleporter System." dat += "Consider using primary observation console first." dat += "Activate Teleporter
    " - if(gizmo!=null && gizmo.marked!=null) + if(gizmo && gizmo.marked) dat += "Retrieve Mark
    " else dat += "Retrieve Mark
    " else dat += "NO TELEPAD DETECTED
    " - if(vest!=null) + if(vest) dat += "

    Agent Vest Mode


    " var/mode = vest.mode if(mode == VEST_STEALTH) @@ -88,7 +88,8 @@ else if(href_list["flip_vest"]) FlipVest() else if(href_list["toggle_vest"]) - toggle_vest() + if(vest) + vest.toggle_nodrop() else if(href_list["select_disguise"]) SelectDisguise() else if(href_list["dispense"]) @@ -105,23 +106,22 @@ Dispense(/obj/item/clothing/suit/armor/abductor/vest) updateUsrDialog() - /obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(gizmo!=null && pad!=null && gizmo.marked) + if(pad && gizmo && gizmo.marked) pad.Retrieve(gizmo.marked) /obj/machinery/abductor/console/proc/TeleporterSend() - if(pad!=null) + if(pad) pad.Send() /obj/machinery/abductor/console/proc/FlipVest() - if(vest!=null) + if(vest) vest.flip_mode() /obj/machinery/abductor/console/proc/SelectDisguise(remote = 0) var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises var/datum/icon_snapshot/chosen = disguises[entry_name] - if(chosen && (remote || in_range(usr,src))) + if(chosen && vest && (remote || in_range(usr,src))) vest.SetDisguise(chosen) /obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user) @@ -169,36 +169,48 @@ return disguises[entry.name] = entry +/obj/machinery/abductor/console/proc/AddGizmo(obj/item/device/abductor/gizmo/G) + if(G == gizmo && G.console == src) + return FALSE + + if(G.console) + G.console.gizmo = null + + gizmo = G + G.console = src + return TRUE + +/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V) + if(vest == V) + return FALSE + + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.vest == V) + C.vest = null + break + + vest = V + return TRUE + /obj/machinery/abductor/console/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/device/abductor/gizmo)) - var/obj/item/device/abductor/gizmo/G = O + if(istype(O, /obj/item/device/abductor/gizmo) && AddGizmo(O)) to_chat(user, "You link the tool to the console.") - gizmo = G - G.console = src - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest)) - var/obj/item/clothing/suit/armor/abductor/vest/V = O + else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) to_chat(user, "You link the vest to the console.") - if(istype(vest)) - if(vest.flags & NODROP) - toggle_vest() - vest = V else return ..() + + /obj/machinery/abductor/console/proc/Dispense(item,cost=1) if(experiment && experiment.credits >= cost) experiment.credits -=cost say("Incoming supply!") + var/drop_location = loc if(pad) flick("alien-pad", pad) - new item(pad.loc) - else - new item(loc) + drop_location = pad.loc + new item(drop_location) + else say("Insufficent data!") - -/obj/machinery/abductor/console/proc/toggle_vest() - vest.flags ^= NODROP - var/mob/M = vest.loc - if(istype(M)) - to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].") diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index d006ba0f687..8cf9acac0ba 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -1,5 +1,5 @@ /obj/machinery/abductor/gland_dispenser - name = "Replacement Organ Storage" + name = "replacement organ storage" desc = "A tank filled with replacement organs." icon = 'icons/obj/abductor.dmi' icon_state = "dispenser" @@ -49,7 +49,7 @@ var/g_color = gland_colors[i] var/amount = amounts[i] dat += "[amount]" - if(item_count == 3) // Three boxes per line + if(item_count == 4) // Four boxes per line dat +="

    " item_count = 0 var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) From 76d01f7920a970ebf30050256e4d83de63b387a8 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 26 Apr 2017 20:27:59 -0400 Subject: [PATCH 78/97] Fixes a bad proc definition (#26615) --- code/__HELPERS/icons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 1dfb1e2922d..4300d7ad262 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -991,7 +991,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) SET_SECONDARY_FLAG(src, FROZEN) //Assumes already frozed -obj/proc/make_unfrozen() +/obj/proc/make_unfrozen() icon = initial(icon) name = replacetext(name, "frozen ", "") CLEAR_SECONDARY_FLAG(src, FROZEN) From 1af347feb4696994279659429f09882feeaa9c0b Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 26 Apr 2017 17:29:30 -0700 Subject: [PATCH 79/97] Automatic changelog generation for PR #26589 [ci skip] --- html/changelogs/AutoChangeLog-pr-26589.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26589.yml diff --git a/html/changelogs/AutoChangeLog-pr-26589.yml b/html/changelogs/AutoChangeLog-pr-26589.yml new file mode 100644 index 00000000000..254298e1109 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26589.yml @@ -0,0 +1,9 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Anomalous crystals can be examined by ghosts to determine their +function and activation method." + - rscdel: "Lightbringers can understand Slime and Galactic Common, and can +only speak Slime, as before." + - rscadd: "The helper anomalous crystal is in the orbit list after it has been +activated." From c0bf134af8dbaf64a7f810de32793297dbae6ccf Mon Sep 17 00:00:00 2001 From: bagil Date: Thu, 27 Apr 2017 01:15:45 +0000 Subject: [PATCH 80/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 41 +++++++--------------- html/changelogs/.all_changelog.yml | 10 ++++++ html/changelogs/AutoChangeLog-pr-26570.yml | 4 --- html/changelogs/AutoChangeLog-pr-26589.yml | 9 ----- 4 files changed, 22 insertions(+), 42 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26570.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26589.yml diff --git a/html/changelog.html b/html/changelog.html index e8fc9c22b2b..6d5c4f64805 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,18 @@ -->
    +

    27 April 2017

    +

    MrStonedOne updated:

    +
      +
    • Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted.
    • +
    +

    coiax updated:

    +
      +
    • Anomalous crystals can be examined by ghosts to determine their function and activation method.
    • +
    • Lightbringers can understand Slime and Galactic Common, and can only speak Slime, as before.
    • +
    • The helper anomalous crystal is in the orbit list after it has been activated.
    • +
    +

    26 April 2017

    CoreOverload updated:

      @@ -1237,35 +1249,6 @@
    • Dumping/mass pickup/mass transfer of items is now lag checked
    • Dumping/mass pickup/mass transfer of items has a progress bar
    - -

    23 February 2017

    -

    Cyberboss updated:

    -
      -
    • Fixed a bug where the fire overlay wasn't getting removed from objects
    • -
    • The graphical delays with characters at roundstart are gone
    • -
    • The crew manifest is working again
    • -
    • Admins can now asay with ":p" and dsay with ":d"
    • -
    -

    Dannno updated:

    -
      -
    • Robust Softdrinks LLC. has sent out new vendies to the stendy.
    • -
    -

    Joan updated:

    -
      -
    • Off-station and carded AIs no longer prevent Judgement scripture from unlocking.
    • -
    -

    Nienhaus updated:

    -
      -
    • Updates ammo sprites to the new perspective.
    • -
    -

    Tofa01 updated:

    -
      -
    • Disables sound/frequency variance on cryo tube alert sound
    • -
    -

    coiax updated:

    -
      -
    • Nanotrasen reminds its employees that they have ALWAYS been able to taste. Anyone claiming that they've recently only just gained the ability to taste are probably Syndicate agents.
    • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 8683e015756..aa69c93cd89 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10696,3 +10696,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - balance: The wizard spell Rod Form now costs 3 points, up from 2. flashdim: - bugfix: Omega Station had two APCs not wired properly. (#26526) +2017-04-27: + MrStonedOne: + - tweak: Tweaked how things were deleted to cut down on lag from consecutive deletes + and provide better logging for things that cause lag when hard-deleted. + coiax: + - rscadd: Anomalous crystals can be examined by ghosts to determine their function + and activation method. + - rscdel: Lightbringers can understand Slime and Galactic Common, and can only speak + Slime, as before. + - rscadd: The helper anomalous crystal is in the orbit list after it has been activated. diff --git a/html/changelogs/AutoChangeLog-pr-26570.yml b/html/changelogs/AutoChangeLog-pr-26570.yml deleted file mode 100644 index 0cf240b1217..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26570.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MrStonedOne" -delete-after: True -changes: - - tweak: "Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted." diff --git a/html/changelogs/AutoChangeLog-pr-26589.yml b/html/changelogs/AutoChangeLog-pr-26589.yml deleted file mode 100644 index 254298e1109..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26589.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Anomalous crystals can be examined by ghosts to determine their -function and activation method." - - rscdel: "Lightbringers can understand Slime and Galactic Common, and can -only speak Slime, as before." - - rscadd: "The helper anomalous crystal is in the orbit list after it has been -activated." From ee049b38de1b6a5de31762b55d6dd22758c9b5eb Mon Sep 17 00:00:00 2001 From: c0 Date: Thu, 27 Apr 2017 04:20:26 +0300 Subject: [PATCH 81/97] Changes some << to to_chat --- code/datums/helper_datums/getrev.dm | 4 ++-- code/datums/martial.dm | 2 +- code/datums/mind.dm | 2 +- code/game/atoms_movable.dm | 4 ++-- .../gamemodes/malfunction/Malf_Modules.dm | 2 +- .../miniantags/abduction/abduction_gear.dm | 6 ++--- code/game/gamemodes/miniantags/borer/borer.dm | 4 ++-- .../miniantags/slaughter/slaughter.dm | 2 +- code/game/machinery/computer/apc_control.dm | 2 +- code/game/machinery/computer/card.dm | 2 +- .../objects/items/weapons/holosign_creator.dm | 4 ++-- code/game/objects/items/weapons/stunbaton.dm | 4 ++-- code/game/objects/structures/fireaxe.dm | 6 ++--- .../atmospherics/machinery/airalarm.dm | 2 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 ++-- .../projectiles/guns/energy/special.dm | 2 +- .../research/xenobiology/xenobiology.dm | 22 +++++++++---------- code/modules/shuttle/arrivals.dm | 2 +- .../spells/spell_types/area_teleport.dm | 2 +- code/modules/spells/spell_types/charge.dm | 4 ++-- code/modules/spells/spell_types/devil.dm | 2 +- interface/interface.dm | 10 ++++----- 23 files changed, 48 insertions(+), 48 deletions(-) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index f542aea4561..96796c54356 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -105,13 +105,13 @@ probs[ctag] = 1 prob_sum += config.probabilities[ctag] if(current_odds_differ) - src <<"Game Mode Odds for current round:" + to_chat(src, "Game Mode Odds for current round:") for(var/ctag in probs) if(config.probabilities[ctag] > 0) var/percentage = round(config.probabilities[ctag] / prob_sum * 100, 0.1) to_chat(src, "[ctag] [percentage]%") - src <<"All Game Mode Odds:" + to_chat(src, "All Game Mode Odds:") var/sum = 0 for(var/ctag in config.probabilities) sum += config.probabilities[ctag] diff --git a/code/datums/martial.dm b/code/datums/martial.dm index cc6fa4f2c87..b20bf556d52 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -657,7 +657,7 @@ /obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user) if(!istype(user) || !user) return - user <<"You remember the basics of CQC." + to_chat(user, "You remember the basics of CQC.") var/datum/martial_art/cqc/D = new(null) D.teach(user) user.drop_item() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index e78d996f643..8d2b7cf0c5f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1143,7 +1143,7 @@ log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.") return if(!ishuman(current) && !iscyborg(current)) - usr << "This only works on humans and cyborgs!" + to_chat(usr, "This only works on humans and cyborgs!") return SSticker.mode.devils += src special_role = "devil" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 3b82020c608..d694d2477ca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -562,7 +562,7 @@ return else var/turf/currentturf = get_turf(src) - get(src, /mob) << "You can't help but feel that you just lost something back there..." + to_chat(get(src, /mob), "You can't help but feel that you just lost something back there...") var/turf/targetturf = relocate() log_game("[src] has been moved out of bounds in [COORD(currentturf)]. Moving it to [COORD(targetturf)].") if(HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)) @@ -628,4 +628,4 @@ /atom/movable/proc/ConveyorMove(movedir) set waitfor = FALSE if(!anchored && has_gravity()) - step(src, movedir) + step(src, movedir) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index a7c466e746b..4f09f2e3621 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -556,7 +556,7 @@ var/mob/living/silicon/ai/A = usr if(A.stat == DEAD) - A <<"You are already dead!" //Omae Wa Mou Shindeiru + to_chat(A, "You are already dead!") //Omae Wa Mou Shindeiru return for(var/datum/AI_Module/AM in possible_modules) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index e6365d5e651..2c28109f5f0 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -471,11 +471,11 @@ Congratulations! You are now trained for invasive xenobiology research!"} ..() switch(mode) if(BATON_STUN) - user <<"The baton is in stun mode." + to_chat(user, "The baton is in stun mode.") if(BATON_SLEEP) - user <<"The baton is in sleep inducement mode." + to_chat(user, "The baton is in sleep inducement mode.") if(BATON_CUFF) - user <<"The baton is in restraining mode." + to_chat(user, "The baton is in restraining mode.") if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index c6e6534667b..dbc12094d38 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -623,7 +623,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) chemicals -= 250 to_chat(src, "You send a jolt of energy to your host, reviving them!") victim.grab_ghost(force = TRUE) //brings the host back, no eggscape - victim <<"You bolt upright, gasping for breath!" + to_chat(victim, "You bolt upright, gasping for breath!") /mob/living/simple_animal/borer/verb/bond_brain() set category = "Borer" @@ -667,7 +667,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) if(!bonding) return if(docile) - src <<"You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return if(is_servant_of_ratvar(victim) || iscultist(victim) || victim.isloyal()) to_chat(src, "[victim]'s mind seems to be blocked by some unknown force!") diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index c3d06bfe2c5..53e92c639d6 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -92,7 +92,7 @@ playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - user <<"...and you don't feel any different." + to_chat(user, "...and you don't feel any different.") qdel(src) return user.visible_message("[user]'s eyes flare a deep crimson!", \ diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 753cd42a4f7..0c1b870771b 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -108,7 +108,7 @@ if(!authenticated) //Check for emags var/obj/item/weapon/card/emag/E = usr.get_active_held_item() if(E && istype(E) && usr.Adjacent(src)) - usr << "You bypass [src]'s access requirements using your emag." + to_chat(usr, "You bypass [src]'s access requirements using your emag.") authenticated = TRUE log_activity("logged in") //Auth ID doesn't change, hinting that it was illicit if(href_list["log_out"]) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 5f0299be0ea..a65c30a4e6a 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -532,7 +532,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else SSjob.prioritized_jobs += j prioritycount++ - usr << "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request." + to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) if ("print") diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm index fb68e33f458..3b611883e68 100644 --- a/code/game/objects/items/weapons/holosign_creator.dm +++ b/code/game/objects/items/weapons/holosign_creator.dm @@ -87,7 +87,7 @@ var/mob/living/silicon/robot/R = user if(shock) - user <<"You clear all active holograms, and reset your projector to normal." + to_chat(user, "You clear all active holograms, and reset your projector to normal.") holosign_type = /obj/structure/holosign/barrier/cyborg creation_time = 5 if(signs.len) @@ -96,7 +96,7 @@ shock = 0 return else if(R.emagged&&!shock) - user <<"You clear all active holograms, and overload your energy projector!" + to_chat(user, "You clear all active holograms, and overload your energy projector!") holosign_type = /obj/structure/holosign/barrier/cyborg/hacked creation_time = 30 if(signs.len) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 078cb97025f..1a3b4ff4faf 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -60,9 +60,9 @@ /obj/item/weapon/melee/baton/examine(mob/user) ..() if(bcell) - user <<"The baton is [round(bcell.percent())]% charged." + to_chat(user, "The baton is [round(bcell.percent())]% charged.") else - user <<"The baton does not have a power source installed." + to_chat(user, "The baton does not have a power source installed.") /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index e2331e13dc7..8d9c6685428 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -115,7 +115,7 @@ update_icon() return if(locked) - user <<" The [name] won't budge!" + to_chat(user, "The [name] won't budge!") return else open = !open @@ -131,7 +131,7 @@ /obj/structure/fireaxecabinet/attack_tk(mob/user) if(locked) - user <<" The [name] won't budge!" + to_chat(user, "The [name] won't budge!") return else open = !open @@ -177,7 +177,7 @@ set src in oview(1) if(locked) - usr <<" The [name] won't budge!" + to_chat(usr, "The [name] won't budge!") return else open = !open diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 5c197332d12..a8a998e3495 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -662,7 +662,7 @@ playsound(src.loc, W.usesound, 50, 1) if (do_after(user, 20*W.toolspeed, target = src)) if (buildstage == 1) - user <<"You remove the air alarm electronics." + to_chat(user, "You remove the air alarm electronics.") new /obj/item/weapon/electronics/airalarm( src.loc ) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) buildstage = 0 diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index bd59d31cc76..42d978e5dec 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -224,5 +224,5 @@ to_chat(user, "The rune can only be used on battlemage armour!") return W.current_charges += 8 - user <<"You charge \the [W]. It can now absorb [W.current_charges] hits." + to_chat(user, "You charge \the [W]. It can now absorb [W.current_charges] hits.") qdel(src) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0047089cbf2..422acf49f9a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -238,7 +238,7 @@ else if(icontype == "Angel") icon_state = "ai-angel" //else - //usr <<"You can only change your display once!" + //to_chat(usr, "You can only change your display once!") //return /mob/living/silicon/ai/Stat() @@ -351,7 +351,7 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = src if(AI.control_disabled) - src << "Wireless control is disabled!" + to_chat(src, "Wireless control is disabled!") return SSshuttle.cancelEvac(src) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index e6fa3e9cfdf..90c3b4a72ab 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -138,7 +138,7 @@ /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) ..() if(power_supply) - user <<"[src] is [round(power_supply.percent())]% charged." + to_chat(user, "[src] is [round(power_supply.percent())]% charged.") /obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index c6685956996..28e3cbb760f 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -20,7 +20,7 @@ if(Uses >= 5) to_chat(user, "You cannot enhance this extract further!") return ..() - user <<"You apply the enhancer to the slime extract. It may now be reused one more time." + to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") Uses++ qdel(O) ..() @@ -146,8 +146,8 @@ M.docile = 1 M.nutrition = 700 - M <<"You absorb the potion and feel your intense desire to feed melt away." - user <<"You feed the slime the potion, removing its hunger and calming it." + to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") + to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN) if (!newname) @@ -261,10 +261,10 @@ to_chat(user, "The slime is dead!") return ..() if(M.cores >= 5) - user <<"The slime already has the maximum amount of extract!" + to_chat(user, "The slime already has the maximum amount of extract!") return ..() - user <<"You feed the slime the steroid. It will now produce one more extract." + to_chat(user, "You feed the slime the steroid. It will now produce one more extract.") M.cores++ qdel(src) @@ -288,10 +288,10 @@ to_chat(user, "The slime is dead!") return ..() if(M.mutation_chance == 0) - user <<"The slime already has no chance of mutating!" + to_chat(user, "The slime already has no chance of mutating!") return ..() - user <<"You feed the slime the stabilizer. It is now less likely to mutate." + to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") M.mutation_chance = Clamp(M.mutation_chance-15,0,100) qdel(src) @@ -312,10 +312,10 @@ to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!") return ..() if(M.mutation_chance == 100) - user <<"The slime is already guaranteed to mutate!" + to_chat(user, "The slime is already guaranteed to mutate!") return ..() - user <<"You feed the slime the mutator. It is now more likely to mutate." + to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") M.mutation_chance = Clamp(M.mutation_chance+12,0,100) M.mutator_used = TRUE qdel(src) @@ -348,7 +348,7 @@ return ..() R.vehicle_move_delay = 0 - user <<"You slather the red gunk over the [C], making it faster." + to_chat(user, "You slather the red gunk over the [C], making it faster.") C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) qdel(src) @@ -373,7 +373,7 @@ if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) to_chat(user, "The [C] is already fireproof!") return ..() - user <<"You slather the blue gunk over the [C], fireproofing it." + to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") C.name = "fireproofed [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index 852a7bc2fca..cd501432237 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -174,7 +174,7 @@ Launch(TRUE) - user << "Calling your shuttle. One moment..." + to_chat(user, "Calling your shuttle. One moment...") while(mode != SHUTTLE_CALL && !damaged) stoplag() diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm index 2da4b5aa10b..5a06351f885 100644 --- a/code/modules/spells/spell_types/area_teleport.dm +++ b/code/modules/spells/spell_types/area_teleport.dm @@ -47,7 +47,7 @@ L+=T if(!L.len) - usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." + to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") return if(target && target.buckled) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index 32bdf54a311..c37166a2446 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -26,9 +26,9 @@ if(M.mind) for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) S.charge_counter = S.charge_max - M <<"You feel raw magic flowing through you. It feels good!" + to_chat(M, "You feel raw magic flowing through you. It feels good!") else - M <<"you feel very strange for a moment, but then it passes." + to_chat(M, "You feel very strange for a moment, but then it passes.") burnt_out = 1 charged_item = M break diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index c9ff8929100..8e8968fb528 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -234,7 +234,7 @@ else var/list/funky_turfs = RANGE_TURFS(1, user) for(var/turf/closed/solid in funky_turfs) - user << "You're too close to a wall." + to_chat(user, "You're too close to a wall.") return dancefloor_exists = TRUE var/i = 1 diff --git a/interface/interface.dm b/interface/interface.dm index fde1c0ea140..16d6d733acf 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -78,7 +78,7 @@ Admin: mob.hotkey_help() if(holder) - src << adminhotkeys + to_chat(src, adminhotkeys) /client/verb/changelog() set name = "Changelog" @@ -165,8 +165,8 @@ Any-Mode: (hotkey doesn't need to be on) \tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth)
    "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) /mob/living/silicon/robot/hotkey_help() //h = talk-wheel has a nonsense tag in it because \th is an escape sequence in BYOND. @@ -217,8 +217,8 @@ Any-Mode: (hotkey doesn't need to be on) \tPGDN = activate held object "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) // Needed to circumvent a bug where .winset does not work when used on the window.on-size event in skins. // Used by /datum/html_interface/nanotrasen (code/modules/html_interface/nanotrasen/nanotrasen.dm) From 8cd5605e284d64dda78927dd9a76edfce1f84590 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 27 Apr 2017 00:32:25 -0700 Subject: [PATCH 82/97] Automatic changelog generation for PR #26601 [ci skip] --- html/changelogs/AutoChangeLog-pr-26601.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26601.yml diff --git a/html/changelogs/AutoChangeLog-pr-26601.yml b/html/changelogs/AutoChangeLog-pr-26601.yml new file mode 100644 index 00000000000..1cb814895a9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26601.yml @@ -0,0 +1,4 @@ +author: "bgobandit" +delete-after: True +changes: + - tweak: "When jumpsuits take severe damage, their suit sensors break. They can be fixed by applying a cable coil." From ba87a69edf2437e4ff140f3ce44add04b4753547 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 27 Apr 2017 04:36:18 -0700 Subject: [PATCH 83/97] Automatic changelog generation for PR #26551 [ci skip] --- html/changelogs/AutoChangeLog-pr-26551.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26551.yml diff --git a/html/changelogs/AutoChangeLog-pr-26551.yml b/html/changelogs/AutoChangeLog-pr-26551.yml new file mode 100644 index 00000000000..7eb15d662c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26551.yml @@ -0,0 +1,4 @@ +author: "Shadowlight213" +delete-after: True +changes: + - tweak: "Heads of staff may now download the ID card modification program from NTNet." From 6ef65f5d2b27b383a6fb160f42d61bd08a4a9538 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Thu, 27 Apr 2017 10:16:43 -0400 Subject: [PATCH 84/97] Adds crayon grinding (#26605) * Enables crayon grinding * Adds color to red crayon powder and powder to black and white crayons. * Lets you color stuff with crayon powder --- code/game/objects/items/crayons.dm | 2 + .../chemistry/machinery/reagentgrinder.dm | 14 ++++++- .../chemistry/reagents/other_reagents.dm | 40 ++++++++++++++----- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 039237c63c7..af8b9341f94 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -465,11 +465,13 @@ icon_state = "crayonblack" paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black. item_color = "black" + reagent_contents = list("nutriment" = 1, "blackcrayonpowder" = 1) /obj/item/toy/crayon/white icon_state = "crayonwhite" paint_color = "#FFFFFF" item_color = "white" + reagent_contents = list("nutriment" = 1, "whitecrayonpowder" = 1) /obj/item/toy/crayon/mime icon_state = "crayonmime" diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 9f5073075fa..2dbc0ff1c23 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -54,7 +54,9 @@ /obj/item/slime_extract = list(), /obj/item/weapon/reagent_containers/pill = list(), /obj/item/weapon/reagent_containers/food = list(), - /obj/item/weapon/reagent_containers/honeycomb = list() + /obj/item/weapon/reagent_containers/honeycomb = list(), + /obj/item/toy/crayon = list() + ) var/list/juice_items = list ( @@ -455,3 +457,13 @@ O.reagents.trans_to(beaker, amount) if(!O.reagents.total_volume) remove_object(O) + + for (var/obj/item/toy/crayon/O in holdingitems) + if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + for (var/r_id in O.reagent_contents) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + if (space == 0) + break + beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space)) + remove_object(O) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index cf956227ba1..c25a1d050d4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1128,7 +1128,7 @@ //For colouring in /proc/mix_color_from_reagents -/datum/reagent/crayonpowder +/datum/reagent/colorful_reagent/crayonpowder name = "Crayon Powder" id = "crayon powder" var/colorname = "none" @@ -1137,50 +1137,72 @@ color = "#FFFFFF" // rgb: 207, 54, 0 taste_description = "the back of class" -/datum/reagent/crayonpowder/New() +/datum/reagent/colorful_reagent/crayonpowder/New() description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents." -/datum/reagent/crayonpowder/red +/datum/reagent/colorful_reagent/crayonpowder/red name = "Red Crayon Powder" id = "redcrayonpowder" colorname = "red" + color = "#DA0000" // red + random_color_list = list("#DA0000") -/datum/reagent/crayonpowder/orange +/datum/reagent/colorful_reagent/crayonpowder/orange name = "Orange Crayon Powder" id = "orangecrayonpowder" colorname = "orange" color = "#FF9300" // orange + random_color_list = list("#FF9300") -/datum/reagent/crayonpowder/yellow +/datum/reagent/colorful_reagent/crayonpowder/yellow name = "Yellow Crayon Powder" id = "yellowcrayonpowder" colorname = "yellow" color = "#FFF200" // yellow + random_color_list = list("#FFF200") -/datum/reagent/crayonpowder/green +/datum/reagent/colorful_reagent/crayonpowder/green name = "Green Crayon Powder" id = "greencrayonpowder" colorname = "green" color = "#A8E61D" // green + random_color_list = list("#A8E61D") -/datum/reagent/crayonpowder/blue +/datum/reagent/colorful_reagent/crayonpowder/blue name = "Blue Crayon Powder" id = "bluecrayonpowder" colorname = "blue" color = "#00B7EF" // blue + random_color_list = list("#00B7EF") -/datum/reagent/crayonpowder/purple +/datum/reagent/colorful_reagent/crayonpowder/purple name = "Purple Crayon Powder" id = "purplecrayonpowder" colorname = "purple" color = "#DA00FF" // purple + random_color_list = list("#DA00FF") -/datum/reagent/crayonpowder/invisible +/datum/reagent/colorful_reagent/crayonpowder/invisible name = "Invisible Crayon Powder" id = "invisiblecrayonpowder" colorname = "invisible" color = "#FFFFFF00" // white + no alpha + random_color_list = list(null) //because using the powder color turns things invisible + +/datum/reagent/colorful_reagent/crayonpowder/black + name = "Black Crayon Powder" + id = "blackcrayonpowder" + colorname = "black" + color = "#1C1C1C" // not quite black + random_color_list = list("#404040") + +/datum/reagent/colorful_reagent/crayonpowder/white + name = "White Crayon Powder" + id = "whitecrayonpowder" + colorname = "white" + color = "#FFFFFF" // white + random_color_list = list("#FFFFFF") //doesn't actually change appearance at all From 7507f7fc02c02be0691ab86f1c02356220d9f06a Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 27 Apr 2017 07:16:45 -0700 Subject: [PATCH 85/97] Automatic changelog generation for PR #26605 [ci skip] --- html/changelogs/AutoChangeLog-pr-26605.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26605.yml diff --git a/html/changelogs/AutoChangeLog-pr-26605.yml b/html/changelogs/AutoChangeLog-pr-26605.yml new file mode 100644 index 00000000000..dae86d18bf1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26605.yml @@ -0,0 +1,5 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Crayons can be ground" + - rscadd: "Crayon powder can be used to color stuff" From 3f602025efcfd30f7fa7cbcf95ae656d8237024c Mon Sep 17 00:00:00 2001 From: QualityVan Date: Thu, 27 Apr 2017 10:25:45 -0400 Subject: [PATCH 86/97] Fixes being unable to empty an emagged cloning pod via manual ejection. (#26373) * Fixes being unable to empty an emag'd cloning pod via manual ejection. * No longer keeps the brain, prevents people from getting back into a body which doesn't exist any more, lets people suffer in an emagged cloner a little longer * Better prevention of re-entering body --- code/game/machinery/cloning.dm | 8 +++++--- code/modules/mob/living/carbon/death.dm | 6 +++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 175fccac77d..2eb3f18af81 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -314,7 +314,7 @@ return else connected_message("Authorized Ejection") - SPEAK("An authorized ejection of [occupant.real_name] has occurred.") + SPEAK("An authorized ejection of [clonemind.name] has occurred.") to_chat(user, "You force an emergency ejection. ") go_out() else @@ -367,6 +367,8 @@ SPEAK("Critical error! Please contact a Thinktronic Systems \ technician, as your warranty may be affected.") mess = TRUE + for(var/obj/item/O in unattached_flesh) + qdel(O) icon_state = "pod_g" if(occupant.mind != clonemind) clonemind.transfer_to(occupant) @@ -382,9 +384,9 @@ go_out() /obj/machinery/clonepod/emp_act(severity) - if(prob(100/(severity*efficiency))) + if((occupant || mess) && prob(100/(severity*efficiency))) connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) - SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [occupant.real_name] prematurely." ,0)) + SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0)) go_out() ..() diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 59c04c9841f..c6c7196755c 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -24,7 +24,8 @@ if(!no_bodyparts) if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop. for(var/X in internal_organs) - qdel(X) + if(no_brain || !istype(X, /obj/item/organ/brain)) + qdel(X) else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it. for(var/X in internal_organs) var/obj/item/organ/O = X @@ -42,6 +43,9 @@ if(no_brain && istype(I, /obj/item/organ/brain)) qdel(I) continue + if(no_organs && !istype(I, /obj/item/organ/brain)) + qdel(I) + continue I.Remove(src) I.forceMove(get_turf(src)) I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) From 0342140f3a50eb8d290e44ef1b2832cad79c5fd4 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 27 Apr 2017 07:25:46 -0700 Subject: [PATCH 87/97] Automatic changelog generation for PR #26373 [ci skip] --- html/changelogs/AutoChangeLog-pr-26373.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26373.yml diff --git a/html/changelogs/AutoChangeLog-pr-26373.yml b/html/changelogs/AutoChangeLog-pr-26373.yml new file mode 100644 index 00000000000..77630400ef1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26373.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - bugfix: "You can hit emagged cloning pods with a medical ID to empty them" From c9686983f0a370627a74d109cdc3420990b4f4a5 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 27 Apr 2017 10:35:51 -0400 Subject: [PATCH 88/97] Small fix (#26581) --- code/controllers/subsystem/npcpool.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index abdeb0e9d35..77838e6509f 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(npcpool) /datum/controller/subsystem/npcpool/stat_entry() ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) +/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/I) processing -= I currentrun -= I needsDelegate -= I From 218e9fff79ad21aa855f0c34c2de4079d4ef9bb8 Mon Sep 17 00:00:00 2001 From: bagil Date: Thu, 27 Apr 2017 16:47:13 +0000 Subject: [PATCH 89/97] Automatic changelog compile, [ci skip] --- html/changelog.html | 14 ++++++++++++++ html/changelogs/.all_changelog.yml | 9 +++++++++ html/changelogs/AutoChangeLog-pr-26373.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26551.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26601.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26605.yml | 5 ----- 6 files changed, 23 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26373.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26551.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26601.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26605.yml diff --git a/html/changelog.html b/html/changelog.html index 6d5c4f64805..1c0d1f58116 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -60,6 +60,20 @@
    • Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted.
    +

    QualityVan updated:

    +
      +
    • You can hit emagged cloning pods with a medical ID to empty them
    • +
    • Crayons can be ground
    • +
    • Crayon powder can be used to color stuff
    • +
    +

    Shadowlight213 updated:

    +
      +
    • Heads of staff may now download the ID card modification program from NTNet.
    • +
    +

    bgobandit updated:

    +
      +
    • When jumpsuits take severe damage, their suit sensors break. They can be fixed by applying a cable coil.
    • +

    coiax updated:

    • Anomalous crystals can be examined by ghosts to determine their function and activation method.
    • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index aa69c93cd89..19fda59a81a 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10700,6 +10700,15 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. MrStonedOne: - tweak: Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted. + QualityVan: + - bugfix: You can hit emagged cloning pods with a medical ID to empty them + - rscadd: Crayons can be ground + - rscadd: Crayon powder can be used to color stuff + Shadowlight213: + - tweak: Heads of staff may now download the ID card modification program from NTNet. + bgobandit: + - tweak: When jumpsuits take severe damage, their suit sensors break. They can be + fixed by applying a cable coil. coiax: - rscadd: Anomalous crystals can be examined by ghosts to determine their function and activation method. diff --git a/html/changelogs/AutoChangeLog-pr-26373.yml b/html/changelogs/AutoChangeLog-pr-26373.yml deleted file mode 100644 index 77630400ef1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26373.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - bugfix: "You can hit emagged cloning pods with a medical ID to empty them" diff --git a/html/changelogs/AutoChangeLog-pr-26551.yml b/html/changelogs/AutoChangeLog-pr-26551.yml deleted file mode 100644 index 7eb15d662c8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26551.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadowlight213" -delete-after: True -changes: - - tweak: "Heads of staff may now download the ID card modification program from NTNet." diff --git a/html/changelogs/AutoChangeLog-pr-26601.yml b/html/changelogs/AutoChangeLog-pr-26601.yml deleted file mode 100644 index 1cb814895a9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26601.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "bgobandit" -delete-after: True -changes: - - tweak: "When jumpsuits take severe damage, their suit sensors break. They can be fixed by applying a cable coil." diff --git a/html/changelogs/AutoChangeLog-pr-26605.yml b/html/changelogs/AutoChangeLog-pr-26605.yml deleted file mode 100644 index dae86d18bf1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26605.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - rscadd: "Crayons can be ground" - - rscadd: "Crayon powder can be used to color stuff" From c97aa6a6656bf481220956321c0ac632f7057a6e Mon Sep 17 00:00:00 2001 From: GunHog Date: Thu, 27 Apr 2017 16:25:49 -0500 Subject: [PATCH 90/97] TGUI GPS (#26561) Ported the GPS system to TGUI. GPS signals may now be updated automatically or manually, based on a new toggle. The GPS now has the option to scan only the same Z-level, or all of them. Toggling GPS power may now be done from the interface as well as the alt-click. The user's own GPS unit is no longer displayed in the signal list, and is now its own section for quick and easy self-location. Signals on the same z-level now have distance and direction information added to aid with hunting and exploration. The scanning range and auto-update buttons have tooltips to explain how they work. --- code/game/objects/items/devices/gps.dm | 108 ++++++++++++++++++------- tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 32 ++++---- tgui/src/interfaces/gps.ract | 30 +++++++ 4 files changed, 127 insertions(+), 45 deletions(-) create mode 100644 tgui/src/interfaces/gps.ract diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index b35697d802a..669438f7ee9 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -11,6 +11,9 @@ GLOBAL_LIST_EMPTY(GPS_list) var/emped = FALSE var/turf/locked_location var/tracking = TRUE + var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. + var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown + /obj/item/device/gps/Initialize() ..() @@ -27,6 +30,7 @@ GLOBAL_LIST_EMPTY(GPS_list) cut_overlay("working") add_overlay("emp") addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early + SStgui.close_uis(src) //Close the UI control if it is open. /obj/item/device/gps/proc/reboot() emped = FALSE @@ -34,6 +38,9 @@ GLOBAL_LIST_EMPTY(GPS_list) add_overlay("working") /obj/item/device/gps/AltClick(mob/user) + toggletracking(user) + +/obj/item/device/gps/proc/toggletracking(mob/user) if(!user.canUseTopic(src, be_close=TRUE)) return //user not valid to use gps if(emped) @@ -48,36 +55,81 @@ GLOBAL_LIST_EMPTY(GPS_list) to_chat(user, "[src] is now tracking, and visible to other GPS devices.") tracking = TRUE -/obj/item/device/gps/attack_self(mob/user) - if(!tracking) - to_chat(user, "[src] is turned off. Use alt+click to toggle it back on.") - return - var/obj/item/device/gps/t = "" - var/gps_window_height = 110 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show +/obj/item/device/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. if(emped) - t += "ERROR" - else - t += "
      Set Tag " - t += "
      Tag: [gpstag]" - if(locked_location && locked_location.loc) - t += "
      Bluespace coordinates saved: [locked_location.loc]" - gps_window_height += 20 + to_chat(user, "[src] fizzles weakly.") + return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/gps_window_height = 300 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show + ui = new(user, src, ui_key, "gps", "Global Positioning System", 600, gps_window_height, master_ui, state) //width, height + ui.open() - for(var/obj/item/device/gps/G in GLOB.GPS_list) - var/turf/pos = get_turf(G) - var/area/gps_area = get_area(G) - var/tracked_gpstag = G.gpstag - if(G.emped == 1) - t += "
      [tracked_gpstag]: ERROR" - else if(G.tracking) - t += "
      [tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" - else - continue - var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800)) - popup.set_content(t) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() + ui.set_autoupdate(state = updating) + + +/obj/item/device/gps/ui_data(mob/user) + var/list/data = list() + data["power"] = tracking + data["tag"] = gpstag + data["updating"] = updating + data["globalmode"] = global_mode + if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed + return data + + var/turf/curr = get_turf(src) + data["current"] = "[get_area_name(curr)] ([curr.x], [curr.y], [curr.z])" + + var/list/signals = list() + data["signals"] = list() + + for(var/gps in GLOB.GPS_list) + var/obj/item/device/gps/G = gps + if(G.emped || !G.tracking || G == src) + continue + var/turf/pos = get_turf(G) + if(!global_mode && pos.z != curr.z) + continue + var/area/gps_area = get_area_name(G) + var/list/signal = list() + signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS + signal["area"] = format_text(gps_area) + signal["coord"] = "[pos.x], [pos.y], [pos.z]" + if(pos.z == curr.z) //Distance/Direction calculations for same z-level only + signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs + signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision. + var/direction = uppertext(dir2text(get_dir(curr, pos))) //Direction text (East, etc). Not as precise, but still helpful. + if(!direction) + direction = "CENTER" + signal["degrees"] = "N/A" + signal["direction"] = direction + + signals += list(signal) //Add this signal to the list of signals + data["signals"] = signals + return data + + + +/obj/item/device/gps/ui_act(action, params) + if(..()) + return + switch(action) + if("rename") + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + gpstag = a + name = "global positioning system ([gpstag])" + . = TRUE + if("power") + toggletracking(usr) + . = TRUE + if("updating") + updating = !updating + . = TRUE + if("globalmode") + global_mode = !global_mode + . = TRUE /obj/item/device/gps/Topic(href, href_list) ..() @@ -157,4 +209,4 @@ GLOBAL_LIST_EMPTY(GPS_list) clear() tagged = null STOP_PROCESSING(SSfastprocess, src) - . = ..() + . = ..() \ No newline at end of file diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index d52500b9d64..531fb00530b 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb18b25',endColorstr='#ff5f380e',GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-right:after{-webkit-transform:translateX(-8px) translateY(-50%);-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-webkit-transform:translateX(8px) translateY(-50%);-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index d2ccdeaee1c..7f024a02be8 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,16 +1,16 @@ -require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),E}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},E}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(190),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{190:190}],3:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],4:[function(t,e,n){var a=t(84)("unscopables"),r=Array.prototype;void 0==r[a]&&t(32)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{32:32,84:84}],5:[function(t,e,n){var a=t(39);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{39:39}],6:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments,c=u.length>2?u[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-p,o-s),f=1;for(s>p&&p+l>s&&(f=-1,p+=l-1,s+=l-1);l-- >0;)p in n?n[s]=n[p]:delete n[s],s+=f,p+=f;return n}},{77:77,80:80,81:81}],7:[function(t,e,n){"use strict";var a=t(81),r=t(77),i=t(80);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,p=r(s>1?o[1]:void 0,n),u=s>2?o[2]:void 0,c=void 0===u?n:r(u,n);c>p;)e[p++]=t;return e}},{77:77,80:80,81:81}],8:[function(t,e,n){var a=t(79),r=t(80),i=t(77);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,e,n){var a=t(18),r=t(35),i=t(81),o=t(80),s=t(10);e.exports=function(t){var e=1==t,n=2==t,p=3==t,u=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(u)return!1;return c?-1:p||u?u:w}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,e,n){var a=t(39),r=t(37),i=t(84)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{37:37,39:39,84:84}],11:[function(t,e,n){var a=t(12),r=t(84)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{12:12,84:84}],12:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],13:[function(t,e,n){"use strict";var a=t(47),r=t(32),i=t(61),o=t(18),s=t(70),p=t(19),u=t(28),c=t(43),l=t(45),f=t(83)("id"),d=t(31),h=t(39),m=t(66),v=t(20),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&u(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return p(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{18:18,19:19,20:20,28:28,31:31,32:32,39:39,43:43,45:45,47:47,61:61,66:66,70:70,83:83}],14:[function(t,e,n){var a=t(28),r=t(11);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{11:11,28:28}],15:[function(t,e,n){"use strict";var a=t(32),r=t(61),i=t(5),o=t(39),s=t(70),p=t(28),u=t(9),c=t(31),l=t(83)("weak"),f=Object.isExtensible||o,d=u(5),h=u(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&p(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{28:28,31:31,32:32,39:39,5:5,61:61,70:70,83:83,9:9}],16:[function(t,e,n){"use strict";var a=t(30),r=t(23),i=t(62),o=t(61),s=t(28),p=t(70),u=t(39),c=t(25),l=t(44),f=t(67);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!u(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!u(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,P=k[b](m?{}:-0,1)!=k,C=c(function(){k.has(1)}),E=l(function(t){new g(t)});E||(g=e(function(e,n){p(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(C||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{23:23,25:25,28:28,30:30,39:39,44:44,61:61,62:62,67:67,70:70}],17:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],18:[function(t,e,n){var a=t(3);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{3:3}],19:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],20:[function(t,e,n){e.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],21:[function(t,e,n){var a=t(39),r=t(30).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{30:30,39:39}],22:[function(t,e,n){var a=t(47);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{47:47}],23:[function(t,e,n){var a=t(30),r=t(17),i=t(32),o=t(62),s=t(18),p="prototype",u=function(t,e,n){var c,l,f,d,h=t&u.F,m=t&u.G,v=t&u.S,g=t&u.P,b=t&u.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,e.exports=u},{17:17,18:18,30:30,32:32,62:62}],24:[function(t,e,n){var a=t(84)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{84:84}],25:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],26:[function(t,e,n){"use strict";var a=t(32),r=t(62),i=t(25),o=t(19),s=t(84);e.exports=function(t,e,n){var p=s(t),u=""[t];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,p,u)),a(RegExp.prototype,p,2==e?function(t,e){return u.call(t,this,e)}:function(t){return u.call(t,this)}))}},{19:19,25:25,32:32,62:62,84:84}],27:[function(t,e,n){"use strict";var a=t(5);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{5:5}],28:[function(t,e,n){var a=t(18),r=t(41),i=t(36),o=t(5),s=t(80),p=t(85);e.exports=function(t,e,n,u){var c,l,f,d=p(t),h=a(n,u,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,e,n){var a=t(79),r=t(47).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{47:47,79:79}],30:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],31:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],32:[function(t,e,n){var a=t(47),r=t(60);e.exports=t(20)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{20:20,47:47,60:60}],33:[function(t,e,n){e.exports=t(30).document&&document.documentElement},{30:30}],34:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],35:[function(t,e,n){var a=t(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,e,n){var a=t(46),r=t(84)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{46:46,84:84}],37:[function(t,e,n){var a=t(12);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{12:12}],38:[function(t,e,n){var a=t(39),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{39:39}],39:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,e,n){var a=t(39),r=t(12),i=t(84)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{12:12,39:39,84:84}],41:[function(t,e,n){var a=t(5);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{5:5}],42:[function(t,e,n){"use strict";var a=t(47),r=t(60),i=t(67),o={};t(32)(o,t(84)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{32:32,47:47,60:60,67:67,84:84}],43:[function(t,e,n){"use strict";var a=t(49),r=t(23),i=t(62),o=t(32),s=t(31),p=t(46),u=t(42),c=t(67),l=t(47).getProto,f=t(84)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){u(n,e,b);var w,k,P=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},C=e+" Iterator",E=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,C,!0),!a&&s(A,h)&&o(M,f,g),E&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),p[e]=T,p[C]=g,y)if(w={values:E?T:P(v),keys:_?T:P(m),entries:E?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{23:23,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,e,n){var a=t(84)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){n=!0},i[a]=function(){return o},t(i)}catch(s){}return n}},{84:84}],45:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],46:[function(t,e,n){e.exports={}},{}],47:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],48:[function(t,e,n){var a=t(47),r=t(79);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,p=0;s>p;)if(i[n=o[p++]]===e)return n}},{47:47,79:79}],49:[function(t,e,n){e.exports=!1},{}],50:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],51:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],52:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,e,n){var a,r,i,o=t(30),s=t(76).set,p=o.MutationObserver||o.WebKitMutationObserver,u=o.process,c=o.Promise,l="process"==t(12)(u),f=function(){var t,e,n;for(l&&(t=u.domain)&&(u.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){u.nextTick(f)};else if(p){var d=1,h=document.createTextNode("");new p(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&u.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{12:12,30:30,76:76}],54:[function(t,e,n){var a=t(47),r=t(81),i=t(35);e.exports=t(25)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,p=1,u=a.getKeys,c=a.getSymbols,l=a.isEnum;s>p;)for(var f,d=i(o[p++]),h=c?u(d).concat(c(d)):u(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{25:25,35:35,47:47,81:81}],55:[function(t,e,n){var a=t(23),r=t(17),i=t(25);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{17:17,23:23,25:25}],56:[function(t,e,n){var a=t(47),r=t(79),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{47:47,79:79}],57:[function(t,e,n){var a=t(47),r=t(5),i=t(30).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{30:30,47:47,5:5}],58:[function(t,e,n){"use strict";var a=t(59),r=t(34),i=t(3);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,p=!1;e>o;)(n[o]=arguments[o++])===s&&(p=!0);return function(){var a,i=this,o=arguments,u=o.length,c=0,l=0;if(!p&&!u)return r(t,n,i);if(a=n.slice(),p)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;u>l;)a.push(o[l++]);return r(t,a,i)}}},{3:3,34:34,59:59}],59:[function(t,e,n){e.exports=t(30)},{30:30}],60:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],61:[function(t,e,n){var a=t(62);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{62:62}],62:[function(t,e,n){var a=t(30),r=t(32),i=t(83)("src"),o="toString",s=Function[o],p=(""+s).split(o);t(17).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:p.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{17:17,30:30,32:32,83:83}],63:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],64:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],65:[function(t,e,n){var a=t(47).getDesc,r=t(39),i=t(5),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(18)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{18:18,39:39,47:47,5:5}],66:[function(t,e,n){"use strict";var a=t(30),r=t(47),i=t(20),o=t(84)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{20:20,30:30,47:47,84:84}],67:[function(t,e,n){var a=t(47).setDesc,r=t(31),i=t(84)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{31:31,47:47,84:84}],68:[function(t,e,n){var a=t(30),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{30:30}],69:[function(t,e,n){var a=t(5),r=t(3),i=t(84)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{3:3,5:5,84:84}],70:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],71:[function(t,e,n){var a=t(78),r=t(19);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{19:19,78:78}],72:[function(t,e,n){var a=t(40),r=t(19);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{19:19,40:40}],73:[function(t,e,n){var a=t(80),r=t(74),i=t(19);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c)return s;""==u&&(u=" ");var l=c-p,f=r.call(u,Math.ceil(l/u.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{19:19,74:74,80:80}],74:[function(t,e,n){"use strict";var a=t(78),r=t(19);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{19:19,78:78}],75:[function(t,e,n){var a=t(23),r=t(19),i=t(25),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",p="​…",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||p[t]()!=p}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{19:19,23:23,25:25}],76:[function(t,e,n){var a,r,i,o=t(18),s=t(34),p=t(33),u=t(21),c=t(30),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(12)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in u("script")?function(t){p.appendChild(u("script"))[g]=function(){p.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{12:12,18:18,21:21,30:30,33:33,34:34}],77:[function(t,e,n){var a=t(78),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{78:78}],78:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],79:[function(t,e,n){var a=t(35),r=t(19);e.exports=function(t){return a(r(t))}},{19:19,35:35}],80:[function(t,e,n){var a=t(78),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{78:78}],81:[function(t,e,n){var a=t(19);e.exports=function(t){return Object(a(t))}},{19:19}],82:[function(t,e,n){var a=t(39);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{39:39}],83:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],84:[function(t,e,n){var a=t(68)("wks"),r=t(83),i=t(30).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,e,n){var a=t(11),r=t(84)("iterator"),i=t(46);e.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,e,n){"use strict";var a,r=t(47),i=t(23),o=t(20),s=t(60),p=t(33),u=t(21),c=t(31),l=t(12),f=t(34),d=t(25),h=t(5),m=t(3),v=t(39),g=t(81),b=t(79),y=t(78),_=t(77),x=t(80),w=t(35),k=t(83)("__proto__"),P=t(9),C=t(8)(!1),E=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(u("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!E.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=u("iframe"),n=D,a=">";for(e.style.display="none",p.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("