From a9ef2b61c08c331610c2e2a4ac0e131b8a09dc71 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Tue, 4 Nov 2014 14:19:42 +0100 Subject: [PATCH 1/9] Wiring Upgrade Continues the wiring upgrade. Now cameras, airlocks, robots, and air alarms also use the new wire datum system. Global wiring code is now removed but there are sneaky objects which didn't rely on them such as mulebots and autolathes. Fixes a few issues from the previous upgrade. --- baystation12.dme | 6 +- code/__HELPERS/mobs.dm | 18 + code/datums/wires/airlock.dm | 195 ++++++++++ code/datums/wires/alarm.dm | 93 +++++ code/datums/wires/apc.dm | 6 - code/datums/wires/camera.dm | 74 ++++ code/datums/wires/robot.dm | 103 +++++ code/datums/wires/smartfridge.dm | 9 +- code/datums/wires/suit_storage_unit.dm | 5 - code/datums/wires/wires.dm | 4 +- code/game/machinery/alarm.dm | 212 +---------- code/game/machinery/camera/camera.dm | 19 +- code/game/machinery/camera/wires.dm | 169 --------- code/game/machinery/doors/airlock.dm | 352 +----------------- code/game/machinery/kitchen/smartfridge.dm | 22 +- code/game/machinery/transformer.dm | 5 +- code/game/objects/items/robot/robot_parts.dm | 1 + .../objects/items/robot/robot_upgrades.dm | 5 + code/game/objects/structures/door_assembly.dm | 6 +- code/global.dm | 16 - code/modules/assembly/signaler.dm | 3 - code/modules/mob/living/silicon/robot/life.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 32 +- .../modules/mob/living/silicon/robot/wires.dm | 149 -------- code/modules/mob/mob.dm | 28 ++ code/modules/mob/transform_procs.dm | 2 +- code/modules/power/apc.dm | 1 - code/modules/projectiles/projectile/change.dm | 1 + nano/templates/smartfridge.tmpl | 39 -- 29 files changed, 606 insertions(+), 971 deletions(-) create mode 100644 code/datums/wires/airlock.dm create mode 100644 code/datums/wires/alarm.dm create mode 100644 code/datums/wires/camera.dm create mode 100644 code/datums/wires/robot.dm delete mode 100644 code/game/machinery/camera/wires.dm delete mode 100644 code/modules/mob/living/silicon/robot/wires.dm diff --git a/baystation12.dme b/baystation12.dme index 10529d45fa2..c7f6f1eaa7a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -164,7 +164,11 @@ #include "code\datums\spells\trigger.dm" #include "code\datums\spells\turf_teleport.dm" #include "code\datums\spells\wizard.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" #include "code\datums\wires\apc.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\robot.dm" #include "code\datums\wires\smartfridge.dm" #include "code\datums\wires\suit_storage_unit.dm" #include "code\datums\wires\vending.dm" @@ -357,7 +361,6 @@ #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" #include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\camera\wires.dm" #include "code\game\machinery\computer\ai_core.dm" #include "code\game\machinery\computer\aifixer.dm" #include "code\game\machinery\computer\arcade.dm" @@ -1061,7 +1064,6 @@ #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\wires.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 521f07c35e5..3c7582b8164 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -97,3 +97,21 @@ proc/RoundHealth(health) else return "health-100" return "0" + +/* +Proc for attack log creation, because really why not +1 argument is the actor +2 argument is the target of action +3 is the description of action(like punched, throwed, or any other verb) +4 should it make adminlog note or not +5 is the tool with which the action was made(usually item) 5 and 6 are very similar(5 have "by " before it, that it) and are separated just to keep things in a bit more in order +6 is additional information, anything that needs to be added +*/ + +/proc/add_logs(mob/user, mob/target, what_done, var/admin=1, var/object=null, var/addition=null) + if(user && ismob(user)) + user.attack_log += text("\[[time_stamp()]\] Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]") + if(target && ismob(target)) + target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]") + if(admin) + log_attack("[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]") diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm new file mode 100644 index 00000000000..e6cb473f590 --- /dev/null +++ b/code/datums/wires/airlock.dm @@ -0,0 +1,195 @@ +// Wires for airlocks + +/datum/wires/airlock/secure + random = 1 + wire_count = 14 + +/datum/wires/airlock + holder_type = /obj/machinery/door/airlock + wire_count = 12 + window_y = 570 + +var/const/AIRLOCK_WIRE_IDSCAN = 1 +var/const/AIRLOCK_WIRE_MAIN_POWER1 = 2 +var/const/AIRLOCK_WIRE_MAIN_POWER2 = 4 +var/const/AIRLOCK_WIRE_DOOR_BOLTS = 8 +var/const/AIRLOCK_WIRE_BACKUP_POWER1 = 16 +var/const/AIRLOCK_WIRE_BACKUP_POWER2 = 32 +var/const/AIRLOCK_WIRE_OPEN_DOOR = 64 +var/const/AIRLOCK_WIRE_AI_CONTROL = 128 +var/const/AIRLOCK_WIRE_ELECTRIFY = 256 +var/const/AIRLOCK_WIRE_SAFETY = 512 +var/const/AIRLOCK_WIRE_SPEED = 1024 +var/const/AIRLOCK_WIRE_LIGHT = 2048 + +/datum/wires/airlock/CanUse(var/mob/living/L) + var/obj/machinery/door/airlock/A = holder + if(!istype(L, /mob/living/silicon)) + if(A.isElectrified()) + if(A.shock(L, 100)) + return 0 + if(A.p_open) + return 1 + return 0 + +/datum/wires/airlock/GetInteractWindow() + var/obj/machinery/door/airlock/A = holder + . += ..() + . += text("
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]", (A.locked ? "The door bolts have fallen!" : "The door bolts look up."), + (A.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), + ((A.hasPower()) ? "The test light is on." : "The test light is off!"), + ((A.aiControlDisabled==0 && !A.emagged) ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), + (A.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), + (A.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."), + (A.aiDisabledIdScanner==0 ? "The IDScan light is on." : "The IDScan light is off.")) + +/datum/wires/airlock/UpdateCut(var/index, var/mended) + + var/obj/machinery/door/airlock/A = holder + switch(index) + if(AIRLOCK_WIRE_IDSCAN) + A.aiDisabledIdScanner = !mended + if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2) + + if(!mended) + //Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be crowbarred open, but bolts-raising will not work. Cutting these wires may electocute the user. + A.loseMainPower() + A.shock(usr, 50) + else + if((!IsIndexCut(AIRLOCK_WIRE_MAIN_POWER1)) && (!IsIndexCut(AIRLOCK_WIRE_MAIN_POWER2))) + A.regainMainPower() + A.shock(usr, 50) + + if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2) + + if(!mended) + //Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. + A.loseBackupPower() + A.shock(usr, 50) + else + if((!IsIndexCut(AIRLOCK_WIRE_BACKUP_POWER1)) && (!IsIndexCut(AIRLOCK_WIRE_BACKUP_POWER2))) + A.regainBackupPower() + A.shock(usr, 50) + + if(AIRLOCK_WIRE_DOOR_BOLTS) + + if(!mended) + //Cutting this wire also drops the door bolts, and mending it does not raise them. (This is what happens now, except there are a lot more wires going to door bolts at present) + if(A.locked!=1) + A.locked = 1 + A.update_icon() + + if(AIRLOCK_WIRE_AI_CONTROL) + + if(!mended) + //one wire for AI control. Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. + //aiControlDisabled: If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + if(A.aiControlDisabled == 0) + A.aiControlDisabled = 1 + else if(A.aiControlDisabled == -1) + A.aiControlDisabled = 2 + else + if(A.aiControlDisabled == 1) + A.aiControlDisabled = 0 + else if(A.aiControlDisabled == 2) + A.aiControlDisabled = -1 + + if(AIRLOCK_WIRE_ELECTRIFY) + + if(!mended) + //Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. + if(A.secondsElectrified != -1) + A.shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") + add_logs(usr, A, "electrified", admin=0, addition="at [A.x],[A.y],[A.z]") + A.secondsElectrified = -1 + else + if(A.secondsElectrified == -1) + A.secondsElectrified = 0 + return // Don't update the dialog. + + if (AIRLOCK_WIRE_SAFETY) + A.safe = mended + + if(AIRLOCK_WIRE_SPEED) + A.autoclose = mended + if(mended) + if(!A.density) + A.close() + + if(AIRLOCK_WIRE_LIGHT) + A.lights = mended + A.update_icon() + + +/datum/wires/airlock/UpdatePulsed(var/index) + + var/obj/machinery/door/airlock/A = holder + switch(index) + if(AIRLOCK_WIRE_IDSCAN) + //Sending a pulse through flashes the red light on the door (if the door has power). + if(A.hasPower() && A.density) + A.do_animate("deny") + if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2) + //Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). + A.loseMainPower() + if(AIRLOCK_WIRE_DOOR_BOLTS) + //one wire for door bolts. Sending a pulse through this drops door bolts if they're not down (whether power's on or not), + //raises them if they are down (only if power's on) + if(!A.locked) + A.locked = 1 + A.audible_message("You hear a click from the bottom of the door.", null, 1) + else + if(A.hasPower()) //only can raise bolts if power's on + A.locked = 0 + A.audible_message("You hear a click from the bottom of the door.", null, 1) + A.update_icon() + + if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2) + //two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). + A.loseBackupPower() + if(AIRLOCK_WIRE_AI_CONTROL) + if(A.aiControlDisabled == 0) + A.aiControlDisabled = 1 + else if(A.aiControlDisabled == -1) + A.aiControlDisabled = 2 + + spawn(10) + if(A) + if(A.aiControlDisabled == 1) + A.aiControlDisabled = 0 + else if(A.aiControlDisabled == 2) + A.aiControlDisabled = -1 + + if(AIRLOCK_WIRE_ELECTRIFY) + //one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. + if(A.secondsElectrified==0) + A.shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") + add_logs(usr, A, "electrified", admin=0, addition="at [A.x],[A.y],[A.z]") + A.secondsElectrified = 30 + spawn(10) + if(A) + //TODO: Move this into process() and make pulsing reset secondsElectrified to 30 + while (A.secondsElectrified>0) + A.secondsElectrified-=1 + if(A.secondsElectrified<0) + A.secondsElectrified = 0 + sleep(10) + return + if(AIRLOCK_WIRE_OPEN_DOOR) + //tries to open the door without ID + //will succeed only if the ID wire is cut or the door requires no access and it's not emagged + if(A.emagged) return + if(!A.requiresID() || A.check_access(null)) + if(A.density) A.open() + else A.close() + if(AIRLOCK_WIRE_SAFETY) + A.safe = !A.safe + if(!A.density) + A.close() + + if(AIRLOCK_WIRE_SPEED) + A.normalspeed = !A.normalspeed + + if(AIRLOCK_WIRE_LIGHT) + A.lights = !A.lights + A.update_icon() diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm new file mode 100644 index 00000000000..e8d68d7ffe2 --- /dev/null +++ b/code/datums/wires/alarm.dm @@ -0,0 +1,93 @@ +/datum/wires/alarm + holder_type = /obj/machinery/alarm + wire_count = 5 + +var/const/AALARM_WIRE_IDSCAN = 1 +var/const/AALARM_WIRE_POWER = 2 +var/const/AALARM_WIRE_SYPHON = 4 +var/const/AALARM_WIRE_AI_CONTROL = 8 +var/const/AALARM_WIRE_AALARM = 16 + + +/datum/wires/alarm/CanUse(var/mob/living/L) + var/obj/machinery/alarm/A = holder + if(A.wiresexposed) + return 1 + return 0 + +/datum/wires/alarm/GetInteractWindow() + var/obj/machinery/alarm/A = holder + . += ..() + . += text("
\n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") + +/datum/wires/alarm/UpdateCut(var/index, var/mended) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + if(!mended) + A.locked = 1 + //world << "Idscan wire cut" + + if(AALARM_WIRE_POWER) + A.shock(usr, 50) + A.shorted = !mended + A.update_icon() + //world << "Power wire cut" + + if (AALARM_WIRE_AI_CONTROL) + if (A.aidisabled == !mended) + A.aidisabled = mended + //world << "AI Control Wire Cut" + + if(AALARM_WIRE_SYPHON) + if(!mended) + A.mode = 3 // AALARM_MODE_PANIC + A.apply_mode() + //world << "Syphon Wire Cut" + + if(AALARM_WIRE_AALARM) + if (A.alarm_area.atmosalert(2)) + A.post_alert(2) + A.update_icon() + +/datum/wires/alarm/UpdatePulsed(var/index) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + A.locked = !A.locked + // world << "Idscan wire pulsed" + + if (AALARM_WIRE_POWER) + // world << "Power wire pulsed" + if(A.shorted == 0) + A.shorted = 1 + A.update_icon() + + spawn(12000) + if(A.shorted == 1) + A.shorted = 0 + A.update_icon() + + + if (AALARM_WIRE_AI_CONTROL) + // world << "AI Control wire pulsed" + if (A.aidisabled == 0) + A.aidisabled = 1 + A.updateDialog() + spawn(100) + if (A.aidisabled == 1) + A.aidisabled = 0 + + if(AALARM_WIRE_SYPHON) + // world << "Syphon wire pulsed" + if(A.mode == 1) // AALARM_MODE_SCRUB + A.mode = 3 // AALARM_MODE_PANIC + else + A.mode = 1 // AALARM_MODE_SCRUB + A.apply_mode() + + if(AALARM_WIRE_AALARM) + // world << "Aalarm wire pulsed" + if (A.alarm_area.atmosalert(0)) + A.post_alert(0) + A.update_icon() diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index 7e48809af9a..0cd295258bb 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -31,7 +31,6 @@ var/const/APC_WIRE_AI_CONTROL = 8 spawn(300) if(A) A.locked = 1 - A.updateDialog() if (APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2) if(A.shorted == 0) @@ -40,7 +39,6 @@ var/const/APC_WIRE_AI_CONTROL = 8 spawn(1200) if(A && !IsIndexCut(APC_WIRE_MAIN_POWER1) && !IsIndexCut(APC_WIRE_MAIN_POWER2)) A.shorted = 0 - A.updateDialog() if (APC_WIRE_AI_CONTROL) if (A.aidisabled == 0) @@ -49,9 +47,6 @@ var/const/APC_WIRE_AI_CONTROL = 8 spawn(10) if(A && !IsIndexCut(APC_WIRE_AI_CONTROL)) A.aidisabled = 0 - A.updateDialog() - - A.updateDialog() /datum/wires/apc/UpdateCut(var/index, var/mended) var/obj/machinery/power/apc/A = holder @@ -75,4 +70,3 @@ var/const/APC_WIRE_AI_CONTROL = 8 else if (A.aidisabled == 1) A.aidisabled = 0 - A.updateDialog() diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm new file mode 100644 index 00000000000..d03da5fa171 --- /dev/null +++ b/code/datums/wires/camera.dm @@ -0,0 +1,74 @@ +// Wires for cameras. + +/datum/wires/camera + random = 1 + holder_type = /obj/machinery/camera + wire_count = 6 + +/datum/wires/camera/GetInteractWindow() + + . = ..() + var/obj/machinery/camera/C = holder + . += "
\n[(C.view_range == initial(C.view_range) ? "The focus light is on." : "The focus light is off.")]" + . += "
\n[(C.can_use() ? "The power link light is on." : "The power link light is off.")]" + . += "
\n[(C.light_disabled ? "The camera light is off." : "The camera light is on.")]" + . += "
\n[(C.alarm_on ? "The alarm light is on." : "The alarm light is off.")]" + return . + +/datum/wires/camera/CanUse(var/mob/living/L) + var/obj/machinery/camera/C = holder + return C.panel_open + +var/const/CAMERA_WIRE_FOCUS = 1 +var/const/CAMERA_WIRE_POWER = 2 +var/const/CAMERA_WIRE_LIGHT = 4 +var/const/CAMERA_WIRE_ALARM = 8 +var/const/CAMERA_WIRE_NOTHING1 = 16 +var/const/CAMERA_WIRE_NOTHING2 = 32 + +/datum/wires/camera/UpdateCut(var/index, var/mended) + var/obj/machinery/camera/C = holder + + switch(index) + if(CAMERA_WIRE_FOCUS) + var/range = (mended ? initial(C.view_range) : C.short_range) + C.setViewRange(range) + + if(CAMERA_WIRE_POWER) + if(C.status && !mended || !C.status && mended) + C.deactivate(usr, 1) + + if(CAMERA_WIRE_LIGHT) + C.light_disabled = !mended + + if(CAMERA_WIRE_ALARM) + if(!mended) + C.triggerCameraAlarm() + else + C.cancelCameraAlarm() + return + +/datum/wires/camera/UpdatePulsed(var/index) + var/obj/machinery/camera/C = holder + if(IsIndexCut(index)) + return + switch(index) + if(CAMERA_WIRE_FOCUS) + var/new_range = (C.view_range == initial(C.view_range) ? C.short_range : initial(C.view_range)) + C.setViewRange(new_range) + + if(CAMERA_WIRE_POWER) + C.deactivate(null) // Deactivate the camera + + if(CAMERA_WIRE_LIGHT) + C.light_disabled = !C.light_disabled + + if(CAMERA_WIRE_ALARM) + C.visible_message("\icon[C] *beep*", "\icon[C] *beep*") + return + +/datum/wires/camera/proc/CanDeconstruct() + if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2)) + return 1 + else + return 0 diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm new file mode 100644 index 00000000000..13e53164320 --- /dev/null +++ b/code/datums/wires/robot.dm @@ -0,0 +1,103 @@ +/datum/wires/robot + random = 1 + holder_type = /mob/living/silicon/robot + wire_count = 5 + +var/const/BORG_WIRE_LAWCHECK = 1 +var/const/BORG_WIRE_MAIN_POWER = 2 // The power wires do nothing whyyyyyyyyyyyyy +var/const/BORG_WIRE_LOCKED_DOWN = 4 +var/const/BORG_WIRE_AI_CONTROL = 8 +var/const/BORG_WIRE_CAMERA = 16 + +/datum/wires/robot/GetInteractWindow() + + . = ..() + var/mob/living/silicon/robot/R = holder + . += text("
\n[(R.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")]") + . += text("
\n[(R.connected_ai ? "The AI link light is on." : "The AI link light is off.")]") + . += text("
\n[((!isnull(R.camera) && R.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")]") + . += text("
\n[(R.lockcharge ? "The lockdown light is on." : "The lockdown light is off.")]") + return . + +/datum/wires/robot/UpdateCut(var/index, var/mended) + + var/mob/living/silicon/robot/R = holder + switch(index) + if(BORG_WIRE_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI + if(!mended) + if (R.lawupdate == 1) + R << "LawSync protocol engaged." + R.show_laws() + else + if (R.lawupdate == 0 && !R.emagged) + R.lawupdate = 1 + + if (BORG_WIRE_AI_CONTROL) //Cut the AI wire to reset AI control + if(!mended) + if (R.connected_ai) + R.connected_ai = null + + if (BORG_WIRE_CAMERA) + if(!isnull(R.camera) && !R.scrambledcodes) + R.camera.status = mended + R.camera.deactivate(usr, 0) // Will kick anyone who is watching the Cyborg's camera. + + if(BORG_WIRE_LAWCHECK) //Forces a law update if the borg is set to receive them. Since an update would happen when the borg checks its laws anyway, not much use, but eh + if (R.lawupdate) + R.lawsync() + + if(BORG_WIRE_LOCKED_DOWN) + R.SetLockdown(!mended) + + +/datum/wires/robot/UpdatePulsed(var/index) + + var/mob/living/silicon/robot/R = holder + switch(index) + if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI + if(!R.emagged) + var/new_ai = select_active_ai(R) + if(new_ai && (new_ai != R.connected_ai)) + R.connected_ai = new_ai + R.notify_ai(1) + var/numberer = 1 // Send images the Cyborg has taken to the AI's album upon sync. + for(var/datum/picture/z in R.aiCamera.aipictures) + if(R.connected_ai.aiCamera.aipictures.len == 0) + var/datum/picture/p = new/datum/picture() + p = z + p.fields["name"] = "Uploaded Image [numberer] (synced from [R.name])" + R.connected_ai.aiCamera.aipictures += p + numberer++ + continue + for(var/datum/picture/t in R.connected_ai.aiCamera.aipictures) //Hopefully to prevent someone spamming images to silicons, by spamming this wire + if((z.fields["pixel_y"] != t.fields["pixel_y"]) && (z.fields["pixel_x"] != t.fields["pixel_x"])) //~2.26 out of 1000 chance this will stop something it shouldn't + var/datum/picture/p = new/datum/picture() + p = z + p.fields["name"] = "Uploaded Image [numberer] (synced from [R.name])" + R.connected_ai.aiCamera.aipictures += p + else + continue + numberer++ + if(R.aiCamera.aipictures.len > 0) + R << "Locally saved images synced with AI. Images were retained in local database in case of loss of connection with the AI." + + if (BORG_WIRE_CAMERA) + if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes) + R.camera.deactivate(usr, 0) // Kick anyone watching the Cyborg's camera, doesn't display you disconnecting the camera. + R.visible_message("[R]'s camera lense focuses loudly.") + R << "Your camera lense focuses loudly." + + if(BORG_WIRE_LOCKED_DOWN) + R.SetLockdown(!R.lockcharge) // Toggle + +/datum/wires/robot/CanUse(var/mob/living/L) + var/mob/living/silicon/robot/R = holder + if(R.wiresexposed) + return 1 + return 0 + +/datum/wires/robot/proc/IsCameraCut() + return wires_status & BORG_WIRE_CAMERA + +/datum/wires/robot/proc/LockedCut() + return wires_status & BORG_WIRE_LOCKED_DOWN diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm index 0d0fb298706..b611497e796 100644 --- a/code/datums/wires/smartfridge.dm +++ b/code/datums/wires/smartfridge.dm @@ -2,6 +2,10 @@ holder_type = /obj/machinery/smartfridge wire_count = 3 +/datum/wires/smartfridge/secure + random = 1 + wire_count = 4 + var/const/SMARTFRIDGE_WIRE_ELECTRIFY = 1 var/const/SMARTFRIDGE_WIRE_THROW = 2 var/const/SMARTFRIDGE_WIRE_IDSCAN = 4 @@ -16,11 +20,6 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4 return 1 return 0 -/datum/wires/smartfridge/Interact(var/mob/living/user) - if(CanUse(user)) - var/obj/machinery/smartfridge/S = holder - S.attack_hand(user) - /datum/wires/smartfridge/GetInteractWindow() var/obj/machinery/smartfridge/S = holder . += ..() diff --git a/code/datums/wires/suit_storage_unit.dm b/code/datums/wires/suit_storage_unit.dm index 8ef5ce63986..c2d1a130d79 100644 --- a/code/datums/wires/suit_storage_unit.dm +++ b/code/datums/wires/suit_storage_unit.dm @@ -16,11 +16,6 @@ var/const/SUIT_STORAGE_WIRE_LOCKED = 4 return 1 return 0 -/datum/wires/suit_storage_unit/Interact(var/mob/living/user) - if(CanUse(user)) - var/obj/machinery/suit_cycler/S = holder - S.attack_hand(user) - /datum/wires/suit_storage_unit/GetInteractWindow() var/obj/machinery/suit_cycler/S = holder . += ..() diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 6204c90325e..26feaefe47a 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -6,8 +6,8 @@ #define MAX_FLAG 65535 var/list/same_wires = list() -// 12 colours, if you're adding more than 12 wires then add more colours here -var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink") +// 14 colours, if you're adding more than 14 wires then add more colours here +var/list/wireColours = list("red", "blue", "green", "white", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink", "black", "yellow") /datum/wires diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 6ca98474f7e..7f3d04a0ebc 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -2,32 +2,6 @@ //CONTAINS: Air Alarms and Fire Alarms// //////////////////////////////////////// -/proc/RandomAAlarmWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/AAlarmwires = list(0, 0, 0, 0, 0) - AAlarmIndexToFlag = list(0, 0, 0, 0, 0) - AAlarmIndexToWireColor = list(0, 0, 0, 0, 0) - AAlarmWireColorToIndex = list(0, 0, 0, 0, 0) - var/flagIndex = 1 - for (var/flag=1, flag<32, flag+=flag) - var/valid = 0 - while (!valid) - var/colorIndex = rand(1, 5) - if (AAlarmwires[colorIndex]==0) - valid = 1 - AAlarmwires[colorIndex] = flag - AAlarmIndexToFlag[flagIndex] = flag - AAlarmIndexToWireColor[flagIndex] = colorIndex - AAlarmWireColorToIndex[colorIndex] = flagIndex - flagIndex+=1 - return AAlarmwires - -#define AALARM_WIRE_IDSCAN 1 //Added wires -#define AALARM_WIRE_POWER 2 -#define AALARM_WIRE_SYPHON 3 -#define AALARM_WIRE_AI_CONTROL 4 -#define AALARM_WIRE_AALARM 5 - #define AALARM_MODE_SCRUBBING 1 #define AALARM_MODE_REPLACEMENT 2 //like scrubbing, but faster. #define AALARM_MODE_PANIC 3 //constantly sucks all air @@ -79,9 +53,10 @@ var/locked = 1 var/wiresexposed = 0 // If it's been screwdrivered open. var/aidisabled = 0 - var/AAlarmwires = 31 var/shorted = 0 + var/datum/wires/alarm/wires + var/mode = AALARM_MODE_SCRUBBING var/screen = AALARM_SCREEN_MAIN var/area_uid @@ -153,6 +128,9 @@ if (name == "alarm") name = "[alarm_area.name] Air Alarm" + if(!wires) + wires = new(src) + // breathable air according to human/Life() TLV["oxygen"] = list(16, 19, 135, 140) // Partial pressure, kpa TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa @@ -482,125 +460,6 @@ frequency.post_signal(src, alert_signal) - -/////////// -//HACKING// -/////////// -/obj/machinery/alarm/proc/isWireColorCut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - return ((AAlarmwires & wireFlag) == 0) - -/obj/machinery/alarm/proc/isWireCut(var/wireIndex) - var/wireFlag = AAlarmIndexToFlag[wireIndex] - return ((AAlarmwires & wireFlag) == 0) - -/obj/machinery/alarm/proc/allWiresCut() - var/i = 1 - while(i<=5) - if(AAlarmwires & AAlarmIndexToFlag[i]) - return 0 - i++ - return 1 - -/obj/machinery/alarm/proc/cut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] - AAlarmwires &= ~wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - locked = 1 - - if(AALARM_WIRE_POWER) - shock(usr, 50) - shorted = 1 - update_icon() - - if (AALARM_WIRE_AI_CONTROL) - if (aidisabled == 0) - aidisabled = 1 - - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_PANIC - apply_mode() - - if(AALARM_WIRE_AALARM) - - if (alarm_area.atmosalert(2)) - apply_danger_level(2) - spawn(1) - updateUsrDialog() - update_icon() - - updateDialog() - - return - -/obj/machinery/alarm/proc/mend(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function - AAlarmwires |= wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - - if(AALARM_WIRE_POWER) - shorted = 0 - shock(usr, 50) - update_icon() - - if(AALARM_WIRE_AI_CONTROL) - if (aidisabled == 1) - aidisabled = 0 - - updateDialog() - return - -/obj/machinery/alarm/proc/pulse(var/wireColor) - //var/wireFlag = AAlarmWireColorToFlag[wireColor] //not used in this function - var/wireIndex = AAlarmWireColorToIndex[wireColor] - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) //unlocks for 30 seconds, if you have a better way to hack I'm all ears - locked = 0 - spawn(300) - locked = 1 - - if (AALARM_WIRE_POWER) - if(shorted == 0) - shorted = 1 - update_icon() - - spawn(1200) - if(shorted == 1) - shorted = 0 - update_icon() - - - if (AALARM_WIRE_AI_CONTROL) - if (aidisabled == 0) - aidisabled = 1 - updateDialog() - spawn(10) - if (aidisabled == 1) - aidisabled = 0 - updateDialog() - - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_REPLACEMENT - apply_mode() - - if(AALARM_WIRE_AALARM) - if (alarm_area.atmosalert(0)) - apply_danger_level(0) - spawn(1) - updateUsrDialog() - update_icon() - - updateDialog() - return - -/////////////// -//END HACKING// -/////////////// - /obj/machinery/alarm/attack_ai(mob/user) return interact(user) @@ -616,7 +475,7 @@ if(buildstage!=2) return - if ( (get_dist(src, user) > 1 )) + if((get_dist(src, user) > 1 )) if (!istype(user, /mob/living/silicon)) user.machine = null user << browse(null, "window=air_alarm") @@ -629,30 +488,8 @@ user << browse(null, "window=air_alarm") return - if(wiresexposed && (!istype(user, /mob/living/silicon))) - var/t1 = text("[alarm_area.name] Air Alarm WiresAccess Panel
\n") - var/list/wirecolors = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Black" = 5, - ) - for(var/wiredesc in wirecolors) - var/is_uncut = AAlarmwires & AAlarmWireColorToFlag[wirecolors[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - - else - t1 += "Cut " - t1 += "Pulse " - - t1 += "
" - t1 += text("
\n[(locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - t1 += text("

Close

") - user << browse(t1, "window=AAlarmwires") - onclose(user, "AAlarmwires") + if(wiresexposed && (!istype(user, /mob/living/silicon/ai))) + wires.Interact(user) if(!shorted) user << browse(return_text(user),"window=air_alarm") @@ -1055,35 +892,6 @@ table tr:first-child th:first-child { border: none;} mode = text2num(href_list["mode"]) apply_mode() - // hrefs that need the AA wires exposed, note that borgs should be in range here too -walter0o - if(wiresexposed && Adjacent(usr)) - - if (href_list["AAlarmwires"]) - var/t1 = text2num(href_list["AAlarmwires"]) - if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (isWireColorCut(t1)) - mend(t1) - else - cut(t1) - if (AAlarmwires == 0) - usr << "You cut last of wires inside [src]" - update_icon() - buildstage = 1 - return - - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.equipped(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - pulse(t1) - updateUsrDialog() @@ -1115,7 +923,7 @@ table tr:first-child th:first-child { border: none;} user << "It does nothing" return else - if(allowed(usr) && !isWireCut(AALARM_WIRE_IDSCAN)) + if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." updateUsrDialog() @@ -1488,7 +1296,7 @@ FIRE ALARM wiresexposed = 1 pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 - + /obj/machinery/firealarm/initialize() if(z in config.contact_levels) if(security_level) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 1c8298bd0ba..140659a0e51 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -19,11 +19,7 @@ var/obj/item/weapon/camera_assembly/assembly = null // WIRES - var/wires = 63 // 0b111111 - var/list/IndexToFlag = list() - var/list/IndexToWireColor = list() - var/list/WireColorToIndex = list() - var/list/WireColorToFlag = list() + var/datum/wires/camera/wires = null // Wires datum //OTHER @@ -35,7 +31,7 @@ var/busy = 0 /obj/machinery/camera/New() - WireColorToFlag = randomCameraWires() + wires = new(src) assembly = new(src) assembly.state = 4 /* // Use this to look for cameras that have the same c_tag. @@ -115,7 +111,7 @@ else if((iswirecutter(W) || ismultitool(W)) && panel_open) interact(user) - else if(iswelder(W) && canDeconstruct()) + else if(iswelder(W) && wires.CanDeconstruct()) if(weld(W, user)) if(assembly) assembly.loc = src.loc @@ -283,4 +279,11 @@ return 0 return 1 busy = 0 - return 0 \ No newline at end of file + return 0 + +/obj/machinery/camera/interact(mob/living/user as mob) + if(!panel_open || istype(user, /mob/living/silicon/ai)) + return + + user.set_machine(src) + wires.Interact(user) diff --git a/code/game/machinery/camera/wires.dm b/code/game/machinery/camera/wires.dm deleted file mode 100644 index 785b33368a2..00000000000 --- a/code/game/machinery/camera/wires.dm +++ /dev/null @@ -1,169 +0,0 @@ -#define CAMERA_WIRE_FOCUS 1 -#define CAMERA_WIRE_POWER 2 -#define CAMERA_WIRE_LIGHT 3 -#define CAMERA_WIRE_ALARM 4 -#define CAMERA_WIRE_NOTHING1 5 -#define CAMERA_WIRE_NOTHING2 6 - -/obj/machinery/camera/proc/randomCameraWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/wires = list(0, 0, 0, 0, 0, 0) - IndexToFlag = list(0, 0, 0, 0, 0, 0) - IndexToWireColor = list(0, 0, 0, 0, 0, 0) - WireColorToIndex = list(0, 0, 0, 0, 0, 0) - var/flagIndex = 1 - //I think it's easier to read this way, also doesn't rely on the random number generator to land on a new wire. - var/list/colorIndexList = list(CAMERA_WIRE_FOCUS, CAMERA_WIRE_POWER, CAMERA_WIRE_LIGHT, CAMERA_WIRE_ALARM, CAMERA_WIRE_NOTHING1, CAMERA_WIRE_NOTHING2) - for (var/flag=1, flag<=32, flag+=flag) - var/colorIndex = pick(colorIndexList) - if (wires[colorIndex]==0) - wires[colorIndex] = flag - IndexToFlag[flagIndex] = flag - IndexToWireColor[flagIndex] = colorIndex - WireColorToIndex[colorIndex] = flagIndex - colorIndexList -= colorIndex // Shortens the list. - //world.log << "Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]" - flagIndex+=1 - return wires - -/obj/machinery/camera/proc/isWireColorCut(var/wireColor) - var/wireFlag = WireColorToFlag[wireColor] - return ((src.wires & wireFlag) == 0) - -/obj/machinery/camera/proc/isWireCut(var/wireIndex) - var/wireFlag = IndexToFlag[wireIndex] - return ((src.wires & wireFlag) == 0) - -/obj/machinery/camera/proc/canDeconstruct() - if(isWireCut(CAMERA_WIRE_POWER) && isWireCut(CAMERA_WIRE_FOCUS) && isWireCut(CAMERA_WIRE_LIGHT) && isWireCut(CAMERA_WIRE_NOTHING1) && isWireCut(CAMERA_WIRE_NOTHING2)) - return 1 - else - return 0 - -/obj/machinery/camera/proc/cut(var/wireColor) - var/wireFlag = WireColorToFlag[wireColor] - var/wireIndex = WireColorToIndex[wireColor] - wires &= ~wireFlag - switch(wireIndex) - if(CAMERA_WIRE_FOCUS) - setViewRange(short_range) - - if(CAMERA_WIRE_POWER) - deactivate(usr, 1) - - if(CAMERA_WIRE_LIGHT) - light_disabled = 1 - - if(CAMERA_WIRE_ALARM) - triggerCameraAlarm() - - src.interact(usr) - -/obj/machinery/camera/proc/mend(var/wireColor) - var/wireFlag = WireColorToFlag[wireColor] - var/wireIndex = WireColorToIndex[wireColor] - wires |= wireFlag - switch(wireIndex) - if(CAMERA_WIRE_FOCUS) - setViewRange(initial(view_range)) - - if(CAMERA_WIRE_POWER) - deactivate(usr, 1) - - if(CAMERA_WIRE_LIGHT) - light_disabled = 0 - - if(CAMERA_WIRE_ALARM) - cancelCameraAlarm() - - src.interact(usr) - - -/obj/machinery/camera/proc/pulse(var/wireColor) - var/wireIndex = WireColorToIndex[wireColor] - switch(wireIndex) - if(CAMERA_WIRE_FOCUS) - var/new_range = (view_range == initial(view_range) ? short_range : initial(view_range)) - setViewRange(new_range) - - if(CAMERA_WIRE_POWER) - deactivate(usr, 0) // Kicks anyone watching the camera - - if(CAMERA_WIRE_LIGHT) - light_disabled = !light_disabled - - if(CAMERA_WIRE_ALARM) - src.visible_message("\icon[src] *beep*", "\icon[src] *beep*") - - src.interact(usr) - -/obj/machinery/camera/interact(mob/living/user as mob) - if(!panel_open) - return - - user.set_machine(src) - var/t1 = text("Access Panel
\n") - var/list/wires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Blue" = 5, - "Pink" = 6 - ) - for(var/wiredesc in wires) - var/is_uncut = src.wires & WireColorToFlag[wires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - else - t1 += "Cut " - t1 += "Pulse " - t1 += "
" - - t1 += "
\n[(src.view_range == initial(view_range) ? "The focus light is on." : "The focus light is off.")]" - t1 += "
\n[(src.can_use() ? "The power link light is on." : "The power link light is off.")]" - t1 += "
\n[(light_disabled ? "The camera light is off." : "The camera light is on.")]" - t1 += "
\n[(alarm_on ? "The alarm light is on." : "The alarm light is off.")]" - - t1 += "

Close

\n" - user << browse(t1, "window=wires") - onclose(user, "wires") - - - -/obj/machinery/camera/Topic(href, href_list) - ..() - if (in_range(src, usr) && istype(src.loc, /turf)) - usr.set_machine(src) - if (href_list["wires"]) - var/t1 = text2num(href_list["wires"]) - if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - else if (href_list["close2"]) - usr << browse(null, "window=wires") - usr.unset_machine() - return - - -#undef CAMERA_WIRE_FOCUS -#undef CAMERA_WIRE_POWER -#undef CAMERA_WIRE_LIGHT -#undef CAMERA_WIRE_ALARM -#undef CAMERA_WIRE_NOTHING1 -#undef CAMERA_WIRE_NOTHING2 \ No newline at end of file diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f542ff69943..5babdc6706a 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1,76 +1,3 @@ -#define AIRLOCK_WIRE_IDSCAN 1 -#define AIRLOCK_WIRE_MAIN_POWER1 2 -#define AIRLOCK_WIRE_MAIN_POWER2 3 -#define AIRLOCK_WIRE_DOOR_BOLTS 4 -#define AIRLOCK_WIRE_BACKUP_POWER1 5 -#define AIRLOCK_WIRE_BACKUP_POWER2 6 -#define AIRLOCK_WIRE_OPEN_DOOR 7 -#define AIRLOCK_WIRE_AI_CONTROL 8 -#define AIRLOCK_WIRE_ELECTRIFY 9 -#define AIRLOCK_WIRE_SAFETY 10 -#define AIRLOCK_WIRE_SPEED 11 -#define AIRLOCK_WIRE_LIGHT 12 - -/* - New methods: - pulse - sends a pulse into a wire for hacking purposes - cut - cuts a wire and makes any necessary state changes - mend - mends a wire and makes any necessary state changes - isWireColorCut - returns 1 if that color wire is cut, or 0 if not - isWireCut - returns 1 if that wire (e.g. AIRLOCK_WIRE_DOOR_BOLTS) is cut, or 0 if not - canAIControl - 1 if the AI can control the airlock, 0 if not (then check canAIHack to see if it can hack in) - canAIHack - 1 if the AI can hack into the airlock to recover control, 0 if not. Also returns 0 if the AI does not *need* to hack it. - arePowerSystemsOn - 1 if the main or backup power are functioning, 0 if not. Does not check whether the power grid is charged or an APC has equipment on or anything like that. (Check (stat & NOPOWER) for that) - requiresIDs - 1 if the airlock is requiring IDs, 0 if not - isAllPowerCut - 1 if the main and backup power both have cut wires. - regainMainPower - handles the effect of main power coming back on. - loseMainPower - handles the effect of main power going offline. Usually (if one isn't already running) spawn a thread to count down how long it will be offline - counting down won't happen if main power was completely cut along with backup power, though, the thread will just sleep. - loseBackupPower - handles the effect of backup power going offline. - regainBackupPower - handles the effect of main power coming back on. - shock - has a chance of electrocuting its target. -*/ - -//This generates the randomized airlock wire assignments for the game. -/proc/RandomAirlockWires() - var/list/wire_assignments = CreateRandomAirlockWires() - - globalAirlockIndexToFlag = wire_assignments[2] - globalAirlockIndexToWireColor = wire_assignments[3] - globalAirlockWireColorToIndex = wire_assignments[4] - return wire_assignments[1] - -/proc/CreateRandomAirlockWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - var/airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - var/airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - var/airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - var/flagIndex = 1 - for (var/flag=1, flag<4096, flag+=flag) - var/valid = 0 - var/list/colorList = list(AIRLOCK_WIRE_IDSCAN, AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2, AIRLOCK_WIRE_DOOR_BOLTS, - AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2, AIRLOCK_WIRE_OPEN_DOOR, AIRLOCK_WIRE_AI_CONTROL, AIRLOCK_WIRE_ELECTRIFY, - AIRLOCK_WIRE_SAFETY, AIRLOCK_WIRE_SPEED, AIRLOCK_WIRE_LIGHT) - - while (!valid) - var/colorIndex = pick(colorList) - if(wires[colorIndex]==0) - valid = 1 - wires[colorIndex] = flag - airlockIndexToFlag[flagIndex] = flag - airlockIndexToWireColor[flagIndex] = colorIndex - airlockWireColorToIndex[colorIndex] = flagIndex - colorList -= colorIndex - flagIndex+=1 - return list(wires, airlockIndexToFlag, airlockIndexToWireColor, airlockWireColorToIndex) - -/* Example: -Airlock wires color -> flag are { 64, 128, 256, 2, 16, 4, 8, 32, 1 }. -Airlock wires color -> index are { 7, 8, 9, 2, 5, 3, 4, 6, 1 }. -Airlock index -> flag are { 1, 2, 4, 8, 16, 32, 64, 128, 256 }. -Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. -*/ - /obj/machinery/door/airlock name = "Airlock" icon = 'icons/obj/doors/Doorint.dmi' @@ -86,13 +13,11 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. var/welded = null var/locked = 0 var/lights = 1 // bolt lights show by default - var/wires = 4095 secondsElectrified = 0 //How many seconds remain until the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. var/aiDisabledIdScanner = 0 var/aiHacking = 0 var/obj/machinery/door/airlock/closeOther = null var/closeOtherId = null - var/list/signalers[12] var/lockdownbyai = 0 autoclose = 1 var/assembly_type = /obj/structure/door_assembly @@ -104,10 +29,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. var/hasShocked = 0 //Prevents multiple shocks from happening var/secured_wires = 0 //for mapping use var/security_bolts = 0 //if 1, door bolts when broken - var/list/airlockIndexToFlag - var/list/airlockWireColorToFlag - var/list/airlockIndexToWireColor - var/list/airlockWireColorToIndex + var/datum/wires/airlock/wires = null /obj/machinery/door/airlock/command name = "Airlock" @@ -379,176 +301,14 @@ About the new airlock wires panel: /obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user as mob) ..(user) - -/obj/machinery/door/airlock/proc/pulse(var/wireColor) - //var/wireFlag = airlockWireColorToFlag[wireColor] //not used in this function - var/wireIndex = airlockWireColorToIndex[wireColor] - switch(wireIndex) - if(AIRLOCK_WIRE_IDSCAN) - //Sending a pulse through this flashes the red light on the door (if the door has power). - if((src.arePowerSystemsOn()) && (!(stat & NOPOWER))) - do_animate("deny") - if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2) - //Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). - src.loseMainPower() - if(AIRLOCK_WIRE_DOOR_BOLTS) - //one wire for door bolts. Sending a pulse through this drops door bolts if they're not down (whether power's on or not), - //raises them if they are down (only if power's on) - if(!src.locked) - src.lock() - else - src.unlock() - src.updateUsrDialog() - - if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2) - //two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). - src.loseBackupPower() - if(AIRLOCK_WIRE_AI_CONTROL) - if(src.aiControlDisabled == 0) - src.aiControlDisabled = 1 - else if(src.aiControlDisabled == -1) - src.aiControlDisabled = 2 - src.updateDialog() - spawn(10) - if(src.aiControlDisabled == 1) - src.aiControlDisabled = 0 - else if(src.aiControlDisabled == 2) - src.aiControlDisabled = -1 - src.updateDialog() - if(AIRLOCK_WIRE_ELECTRIFY) - //one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. - if(src.secondsElectrified==0) - shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") - usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") - src.secondsElectrified = 30 - spawn(10) - //TODO: Move this into process() and make pulsing reset secondsElectrified to 30 - while (src.secondsElectrified>0) - src.secondsElectrified-=1 - if(src.secondsElectrified<0) - src.secondsElectrified = 0 -// src.updateUsrDialog() //Commented this line out to keep the airlock from clusterfucking you with electricity. --NeoFite - sleep(10) - if(AIRLOCK_WIRE_OPEN_DOOR) - //tries to open the door without ID - //will succeed only if the ID wire is cut or the door requires no access - if(!src.requiresID() || src.check_access(null)) - if(density) open() - else close() - if(AIRLOCK_WIRE_SAFETY) - safe = !safe - if(!src.density) - close() - src.updateUsrDialog() - - if(AIRLOCK_WIRE_SPEED) - normalspeed = !normalspeed - src.updateUsrDialog() - - if(AIRLOCK_WIRE_LIGHT) - lights = !lights - src.updateUsrDialog() - - -/obj/machinery/door/airlock/proc/cut(var/wireColor) - var/wireFlag = airlockWireColorToFlag[wireColor] - var/wireIndex = airlockWireColorToIndex[wireColor] - wires &= ~wireFlag - switch(wireIndex) - if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2) - //Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be crowbarred open, but bolts-raising will not work. Cutting these wires may electocute the user. - src.loseMainPower() - src.shock(usr, 50) - src.updateUsrDialog() - if(AIRLOCK_WIRE_DOOR_BOLTS) - //Cutting this wire also drops the door bolts, and mending it does not raise them. (This is what happens now, except there are a lot more wires going to door bolts at present) - src.lock() - src.updateUsrDialog() - if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2) - //Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. - src.loseBackupPower() - src.shock(usr, 50) - src.updateUsrDialog() - if(AIRLOCK_WIRE_AI_CONTROL) - //one wire for AI control. Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. - //aiControlDisabled: If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - if(src.aiControlDisabled == 0) - src.aiControlDisabled = 1 - else if(src.aiControlDisabled == -1) - src.aiControlDisabled = 2 - src.updateUsrDialog() - if(AIRLOCK_WIRE_ELECTRIFY) - //Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. - if(src.secondsElectrified != -1) - shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") - usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") - src.secondsElectrified = -1 - if (AIRLOCK_WIRE_SAFETY) - safe = 0 - src.updateUsrDialog() - - if(AIRLOCK_WIRE_SPEED) - autoclose = 0 - src.updateUsrDialog() - - if(AIRLOCK_WIRE_LIGHT) - lights = 0 - src.updateUsrDialog() - -/obj/machinery/door/airlock/proc/mend(var/wireColor) - var/wireFlag = airlockWireColorToFlag[wireColor] - var/wireIndex = airlockWireColorToIndex[wireColor] //not used in this function - wires |= wireFlag - switch(wireIndex) - if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2) - if((!src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1)) && (!src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))) - src.regainMainPower() - src.shock(usr, 50) - src.updateUsrDialog() - if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2) - if((!src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)) && (!src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2))) - src.regainBackupPower() - src.shock(usr, 50) - src.updateUsrDialog() - if(AIRLOCK_WIRE_AI_CONTROL) - //one wire for AI control. Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. - //aiControlDisabled: If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - if(src.aiControlDisabled == 1) - src.aiControlDisabled = 0 - else if(src.aiControlDisabled == 2) - src.aiControlDisabled = -1 - src.updateUsrDialog() - if(AIRLOCK_WIRE_ELECTRIFY) - if(src.secondsElectrified == -1) - src.secondsElectrified = 0 - - if (AIRLOCK_WIRE_SAFETY) - safe = 1 - src.updateUsrDialog() - - if(AIRLOCK_WIRE_SPEED) - autoclose = 1 - if(!src.density) - close() - src.updateUsrDialog() - - if(AIRLOCK_WIRE_LIGHT) - lights = 1 - src.updateUsrDialog() - - /obj/machinery/door/airlock/proc/isElectrified() if(src.secondsElectrified != 0) return 1 return 0 -/obj/machinery/door/airlock/proc/isWireColorCut(var/wireColor) - var/wireFlag = airlockWireColorToFlag[wireColor] - return ((src.wires & wireFlag) == 0) - /obj/machinery/door/airlock/proc/isWireCut(var/wireIndex) - var/wireFlag = airlockIndexToFlag[wireIndex] - return ((src.wires & wireFlag) == 0) + // You can find the wires in the datum folder. + return wires.IsIndexCut(wireIndex) /obj/machinery/door/airlock/proc/canAIControl() return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); @@ -874,46 +634,8 @@ About the new airlock wires panel: **/ if(src.p_open) - user.set_machine(src) - var/t1 = text("Access Panel
\n") - - //t1 += text("[]: ", airlockFeatureNames[airlockWireColorToIndex[9]]) - var/list/wires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Red" = 5, - "Blue" = 6, - "Green" = 7, - "Grey" = 8, - "Black" = 9, - "Gold" = 10, - "Aqua" = 11, - "Pink" = 12 - ) - for(var/wiredesc in wires) - var/is_uncut = src.wires & airlockWireColorToFlag[wires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - else - t1 += "Cut " - t1 += "Pulse " - if(src.signalers[wires[wiredesc]]) - t1 += "Detach signaler" - else - t1 += "Attach signaler" - t1 += "
" - - t1 += text("
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), (src.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), ((src.arePowerSystemsOn()) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), (src.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off.")) - - t1 += text("

Close

\n", src) - - user << browse(t1, "window=airlock") - onclose(user, "airlock") - + wires.Interact(user) else ..(user) return @@ -947,52 +669,6 @@ About the new airlock wires panel: if((in_range(src, usr) && istype(src.loc, /turf)) && src.p_open) usr.set_machine(src) - if(href_list["wires"]) - var/t1 = text2num(href_list["wires"]) - if(!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if(src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - else if(href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if(!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if(src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - else if(href_list["signaler"]) - var/wirenum = text2num(href_list["signaler"]) - if(!istype(usr.get_active_hand(), /obj/item/device/assembly/signaler)) - usr << "You need a signaller!" - return - if(src.isWireColorCut(wirenum)) - usr << "You can't attach a signaller to a cut wire." - return - var/obj/item/device/assembly/signaler/R = usr.get_active_hand() - if(R.secured) - usr << "This radio can't be attached!" - return - var/mob/M = usr - M.drop_item() - R.loc = src - R.airlock_wire = wirenum - src.signalers[wirenum] = R - else if(href_list["remove-signaler"]) - var/wirenum = text2num(href_list["remove-signaler"]) - if(!(src.signalers[wirenum])) - usr << "There's no signaller attached to that wire!" - return - var/obj/item/device/assembly/signaler/R = src.signalers[wirenum] - R.loc = usr.loc - R.airlock_wire = null - src.signalers[wirenum] = null - if(istype(usr, /mob/living/silicon)) if (!check_synth_access(usr)) @@ -1394,13 +1070,10 @@ About the new airlock wires panel: ..() //wires - if (!secured_wires) - airlockWireColorToFlag = globalAirlockWireColorToFlag - airlockIndexToFlag = globalAirlockIndexToFlag - airlockIndexToWireColor = globalAirlockIndexToWireColor - airlockWireColorToIndex = globalAirlockWireColorToIndex + if (secured_wires) + wires = new/datum/wires/airlock/secure(src) else - randomize_wires() + wires = new/datum/wires/airlock(src) if(src.closeOtherId != null) spawn (5) @@ -1409,18 +1082,13 @@ About the new airlock wires panel: src.closeOther = A break -/obj/machinery/door/airlock/proc/randomize_wires() - var/wire_assignments = CreateRandomAirlockWires() - airlockWireColorToFlag = wire_assignments[1] - airlockIndexToFlag = wire_assignments[2] - airlockIndexToWireColor = wire_assignments[3] - airlockWireColorToIndex = wire_assignments[4] - - /obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason ..() update_icon() +/obj/machinery/door/airlock/proc/hasPower() + return ((src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) && !(stat & NOPOWER)) + /obj/machinery/door/airlock/proc/prison_open() src.unlock() src.open() diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index ef62417b694..2350b8120cb 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -23,13 +23,22 @@ var/locked = 0 var/panel_open = 0 //Hacking a smartfridge var/scan_id = 1 + var/is_secure = 0 var/datum/wires/smartfridge/wires = null +/obj/machinery/smartfridge/secure/ + is_secure = 1 + /obj/machinery/smartfridge/New() - wires = new(src) + ..() + if(is_secure) + wires = new/datum/wires/smartfridge/secure(src) + else + wires = new/datum/wires/smartfridge(src) /obj/machinery/smartfridge/Del() del(wires) // qdel + ..() /obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/)) @@ -217,12 +226,7 @@ /obj/machinery/smartfridge/attack_hand(mob/user as mob) if(!ispowered) return - if(seconds_electrified != 0) - if(shock(user, 100)) - return - if(panel_open) - wires.Interact(user) - + wires.Interact(user) ui_interact(user) /******************* @@ -232,12 +236,8 @@ /obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) user.set_machine(src) - var/is_secure = istype(src,/obj/machinery/smartfridge/secure) - var/data[0] data["contents"] = null - data["wires"] = null - data["panel_open"] = panel_open data["electrified"] = seconds_electrified > 0 data["shoot_inventory"] = shoot_inventory data["locked"] = locked diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index a817c2c3a55..7885a8b8e24 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -33,11 +33,12 @@ playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) use_power(5000) // Use a lot of power. var/mob/living/silicon/robot = H.Robotize() - robot.lying = 1 + robot.SetLockDown() spawn(50) // So he can't jump out the gate right away. playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) if(robot) - robot.lying = 0 + robot.SetLockDown(0) + robot.notify_ai(1) /obj/machinery/transformer/conveyor/New() ..() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index a5274598dd6..87a6fdc04ca 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -226,6 +226,7 @@ feedback_inc("cyborg_birth",1) callHook("borgify", list(O)) + O.notify_ai(1) O.Namepick() del(src) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index ce8056d46a7..f9d3e356ce6 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -41,6 +41,7 @@ R.updatename("Default") R.status_flags |= CANPUSH R.updateicon() + R.notify_ai(2) return 1 @@ -56,6 +57,7 @@ /obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R) if(..()) return 0 + R.notify_ai(3, R.name, heldname) R.name = heldname R.custom_name = heldname R.real_name = heldname @@ -80,6 +82,9 @@ R.key = ghost.key R.stat = CONSCIOUS + dead_mob_list -= R + living_mob_list |= R + R.notify_ai(1) return 1 diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 8e63a00a1e4..da7549fe343 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -270,13 +270,13 @@ obj/structure/door_assembly path = text2path("/obj/machinery/door/airlock[glass_type]") else path = text2path("/obj/machinery/door/airlock[airlock_type]") - + var/obj/machinery/door/airlock/door = new path(src.loc) - + door.assembly_type = type door.electronics = src.electronics if (istype(electronics, /obj/item/weapon/airlock_electronics/secure)) - door.randomize_wires() + door.wires = new/datum/wires/airlock/secure(src) if(src.electronics.one_access) door.req_access = null door.req_one_access = src.electronics.conf_access diff --git a/code/global.dm b/code/global.dm index cf8bc91b546..2186af119d0 100644 --- a/code/global.dm +++ b/code/global.dm @@ -179,22 +179,6 @@ var/forceblob = 0 // nanomanager, the manager for Nano UIs var/datum/nanomanager/nanomanager = new() - //airlockWireColorToIndex takes a number representing the wire color, e.g. the orange wire is always 1, the dark red wire is always 2, etc. It returns the index for whatever that wire does. - //airlockIndexToWireColor does the opposite thing - it takes the index for what the wire does, for example AIRLOCK_WIRE_IDSCAN is 1, AIRLOCK_WIRE_POWER1 is 2, etc. It returns the wire color number. - //airlockWireColorToFlag takes the wire color number and returns the flag for it (1, 2, 4, 8, 16, etc) -var/list/globalAirlockWireColorToFlag = RandomAirlockWires() -var/list/globalAirlockIndexToFlag -var/list/globalAirlockIndexToWireColor -var/list/globalAirlockWireColorToIndex -var/list/BorgWireColorToFlag = RandomBorgWires() -var/list/BorgIndexToFlag -var/list/BorgIndexToWireColor -var/list/BorgWireColorToIndex -var/list/AAlarmWireColorToFlag = RandomAAlarmWires() -var/list/AAlarmIndexToFlag -var/list/AAlarmIndexToWireColor -var/list/AAlarmWireColorToIndex - #define SPEED_OF_LIGHT 3e8 //not exact but hey! #define SPEED_OF_LIGHT_SQ 9e+16 #define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 2c9c26fceba..9d79d678764 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -121,9 +121,6 @@ pulse(var/radio = 0) if(src.connected && src.wires) connected.Pulse(src) - else if(istype(src.loc, /obj/machinery/door/airlock) && src.airlock_wire && src.wires) - var/obj/machinery/door/airlock/A = src.loc - A.pulse(src.airlock_wire) else if(holder) holder.process_activation(src, 1, 0) else diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 58ad85e2a0e..95d8ed9d57f 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -62,7 +62,7 @@ /mob/living/silicon/robot/proc/handle_regular_status_updates() if(src.camera && !scrambledcodes) - if(src.stat == 2 || isWireCut(5)) + if(src.stat == 2 || wires.IsIndexCut(BORG_WIRE_CAMERA)) src.camera.status = 0 else src.camera.status = 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 880de591c9c..b0c7acad233 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -21,6 +21,7 @@ var/list/robot_verbs_default = list( var/crisis //Admin-settable for combat module use. var/crisis_override = 0 var/integrated_light_power = 6 + var/datum/wires/robot/wires //Hud stuff @@ -81,6 +82,8 @@ var/list/robot_verbs_default = list( add_language("Robot Talk", 1) + wires = new(src) + ident = rand(1, 999) updatename("Default") updateicon() @@ -106,7 +109,7 @@ var/list/robot_verbs_default = list( camera = new /obj/machinery/camera(src) camera.c_tag = real_name camera.network = list("SS13","Robots") - if(isWireCut(5)) // 5 = BORG CAMERA + if(wires.IsIndexCut(BORG_WIRE_CAMERA)) camera.status = 0 initialize_components() @@ -303,6 +306,7 @@ var/list/robot_verbs_default = list( choose_icon(6,module_sprites) radio.config(module.channels) + notify_ai(2) /mob/living/silicon/robot/proc/updatename(var/prefix as text) if(prefix) @@ -320,6 +324,8 @@ var/list/robot_verbs_default = list( changed_name = custom_name else changed_name = "[modtype] [braintype]-[num2text(ident)]" + + notify_ai(3, real_name, changed_name) real_name = changed_name name = real_name @@ -672,7 +678,7 @@ var/list/robot_verbs_default = list( user << "You close the cover." opened = 0 updateicon() - else if(wiresexposed && isWireCut(1) && isWireCut(2) && isWireCut(3) && isWireCut(4) && isWireCut(5)) + else if(wiresexposed && wires.IsAllCut()) //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. if(!mmi) user << "\The [src] has no brain to remove." @@ -743,7 +749,7 @@ var/list/robot_verbs_default = list( else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) if (wiresexposed) - interact(user) + wires.Interact(user) else user << "You can't reach the wiring." @@ -1231,6 +1237,13 @@ var/list/robot_verbs_default = list( R << "Buffers flushed and reset. Camera system shutdown. All systems operational." src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes +/mob/living/silicon/robot/proc/SetLockdown(var/state = 1) + // They stay locked down if their wire is cut. + if(wires.LockedCut()) + state = 1 + lockcharge = state + update_canmove() + /mob/living/silicon/robot/mode() set name = "Activate Held Object" set category = "IC" @@ -1310,4 +1323,15 @@ var/list/robot_verbs_default = list( var/datum/robot_component/RC = get_component("comms") use_power(RC.active_usage) return 1 - return 0 \ No newline at end of file + return 0 + +/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname) + if(!connected_ai) + return + switch(notifytype) + if(1) //New Cyborg + connected_ai << "

NOTICE - New cyborg connection detected: [name]
" + if(2) //New Module + connected_ai << "

NOTICE - Cyborg module change detected: [name] has loaded the [module.name] module.
" + if(3) //New Name + connected_ai << "

NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
" diff --git a/code/modules/mob/living/silicon/robot/wires.dm b/code/modules/mob/living/silicon/robot/wires.dm deleted file mode 100644 index 9ed4320c844..00000000000 --- a/code/modules/mob/living/silicon/robot/wires.dm +++ /dev/null @@ -1,149 +0,0 @@ -#define BORG_WIRE_LAWCHECK 1 -#define BORG_WIRE_MAIN_POWER1 2 -#define BORG_WIRE_MAIN_POWER2 3 -#define BORG_WIRE_AI_CONTROL 4 -#define BORG_WIRE_CAMERA 5 - -/proc/RandomBorgWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/Borgwires = list(0, 0, 0, 0, 0) - BorgIndexToFlag = list(0, 0, 0, 0, 0) - BorgIndexToWireColor = list(0, 0, 0, 0, 0) - BorgWireColorToIndex = list(0, 0, 0, 0, 0) - var/flagIndex = 1 - //I think it's easier to read this way, also doesn't rely on the random number generator to land on a new wire. - var/list/colorIndexList = list(BORG_WIRE_LAWCHECK, BORG_WIRE_MAIN_POWER1, BORG_WIRE_MAIN_POWER2, BORG_WIRE_AI_CONTROL, BORG_WIRE_CAMERA) - for (var/flag=1, flag<=16, flag+=flag) - var/colorIndex = pick(colorIndexList) - if (Borgwires[colorIndex]==0) - Borgwires[colorIndex] = flag - BorgIndexToFlag[flagIndex] = flag - BorgIndexToWireColor[flagIndex] = colorIndex - BorgWireColorToIndex[colorIndex] = flagIndex - colorIndexList -= colorIndex // Shortens the list. - //world.log << "Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]" - flagIndex+=1 - return Borgwires - -/mob/living/silicon/robot/proc/isWireColorCut(var/wireColor) - var/wireFlag = BorgWireColorToFlag[wireColor] - return ((src.borgwires & wireFlag) == 0) - -/mob/living/silicon/robot/proc/isWireCut(var/wireIndex) - var/wireFlag = BorgIndexToFlag[wireIndex] - return ((src.borgwires & wireFlag) == 0) - -/mob/living/silicon/robot/proc/cut(var/wireColor) - var/wireFlag = BorgWireColorToFlag[wireColor] - var/wireIndex = BorgWireColorToIndex[wireColor] - borgwires &= ~wireFlag - switch(wireIndex) - if(BORG_WIRE_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI - if (src.lawupdate == 1) - src << "LawSync protocol engaged." - src.show_laws() - if (BORG_WIRE_AI_CONTROL) //Cut the AI wire to reset AI control - if (src.connected_ai) - src.connected_ai = null - if (BORG_WIRE_CAMERA) - if(!isnull(src.camera) && !scrambledcodes) - src.camera.status = 0 - src.camera.deactivate(usr, 0) // Will kick anyone who is watching the Cyborg's camera. - - src.interact(usr) - -/mob/living/silicon/robot/proc/mend(var/wireColor) - var/wireFlag = BorgWireColorToFlag[wireColor] - var/wireIndex = BorgWireColorToIndex[wireColor] - borgwires |= wireFlag - switch(wireIndex) - if(BORG_WIRE_LAWCHECK) //turns law updates back on assuming the borg hasn't been emagged - if (src.lawupdate == 0 && !src.emagged) - src.lawupdate = 1 - if(BORG_WIRE_CAMERA) - if (!isnull(src.camera) && !scrambledcodes) - src.camera.status = 1 - src.camera.deactivate(usr, 0) // Will kick anyone who is watching the Cyborg's camera. - - src.interact(usr) - - -/mob/living/silicon/robot/proc/pulse(var/wireColor) - var/wireIndex = BorgWireColorToIndex[wireColor] - switch(wireIndex) - if(BORG_WIRE_LAWCHECK) //Forces a law update if the borg is set to receive them. Since an update would happen when the borg checks its laws anyway, not much use, but eh - if (src.lawupdate) - src.lawsync() - src.photosync() - - if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI - if(!src.emagged) - src.connected_ai = select_active_ai() - - if (BORG_WIRE_CAMERA) - if(!isnull(src.camera) && src.camera.status && !scrambledcodes) - src.camera.deactivate(usr, 0) // Kick anyone watching the Cyborg's camera, doesn't display you disconnecting the camera. - usr << "[src]'s camera lens focuses loudly." - src << "Your camera lens focuses loudly." - - src.interact(usr) - -/mob/living/silicon/robot/proc/interact(mob/user) - if(wiresexposed && (!istype(user, /mob/living/silicon))) - user.set_machine(src) - var/t1 = text("Access Panel
\n") - var/list/Borgwires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Blue" = 5, - ) - for(var/wiredesc in Borgwires) - var/is_uncut = src.borgwires & BorgWireColorToFlag[Borgwires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - else - t1 += "Cut " - t1 += "Pulse " - t1 += "
" - t1 += text("
\n[(src.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")]
\n[(src.connected_ai ? "The AI link light is on." : "The AI link light is off.")]") - t1 += text("
\n[((!isnull(src.camera) && src.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")]
\n") - t1 += text("

Close

\n") - user << browse(t1, "window=borgwires") - onclose(user, "borgwires") - -/mob/living/silicon/robot/Topic(href, href_list) - ..() - if (((in_range(src, usr) && istype(src.loc, /turf))) && !istype(usr, /mob/living/silicon)) - usr.set_machine(src) - if (href_list["borgwires"]) - var/t1 = text2num(href_list["borgwires"]) - if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - else if (href_list["close2"]) - usr << browse(null, "window=borgwires") - usr.unset_machine() - return - -#undef BORG_WIRE_LAWCHECK -#undef BORG_WIRE_MAIN_POWER1 -#undef BORG_WIRE_MAIN_POWER2 -#undef BORG_WIRE_AI_CONTROL -#undef BORG_WIRE_CAMERA \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9e8a8c65fa3..6a1bef3f6f7 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -60,6 +60,34 @@ for(var/mob/M in viewers(src)) M.show_message( message, 1, blind_message, 2) +// Show a message to all mobs in earshot of this one +// This would be for audible actions by the src mob +// message is the message output to anyone who can hear. +// self_message (optional) is what the src mob hears. +// deaf_message (optional) is what deaf people will see. +// hearing_distance (optional) is the range, how many tiles away the message can be heard. +/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message) + var/range = 7 + if(hearing_distance) + range = hearing_distance + var/msg = message + for(var/mob/M in get_mobs_in_view(range, src)) + if(self_message && M==src) + msg = self_message + M.show_message( msg, 2, deaf_message, 1) + +// Show a message to all mobs in earshot of this atom +// Use for objects performing audible actions +// message is the message output to anyone who can hear. +// deaf_message (optional) is what deaf people will see. +// hearing_distance (optional) is the range, how many tiles away the message can be heard. +/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance) + var/range = 7 + if(hearing_distance) + range = hearing_distance + for(var/mob/M in get_mobs_in_view(range, src)) + M.show_message( message, 2, deaf_message, 1) + /mob/proc/findname(msg) for(var/mob/M in mob_list) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 515067da79b..d5d7a0791f1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -168,7 +168,7 @@ O.mmi.transfer_identity(src) callHook("borgify", list(O)) - + O.notify_ai(1) O.Namepick() spawn(0)//To prevent the proc from returning null. diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index bfedb92ed6c..059ec7f471f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1228,7 +1228,6 @@ update() else if (last_ch != charging) queue_icon_update() - src.updateDialog() // val 0=off, 1=off(auto) 2=on 3=on(auto) // on 0=off, 1=on, 2=autooff diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 72250fbf1a3..90157efd625 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -24,6 +24,7 @@ if(istype(M, /mob/living/silicon/robot)) var/mob/living/silicon/robot/Robot = M if(Robot.mmi) del(Robot.mmi) + Robot.notify_ai(1) else for(var/obj/item/W in M) if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something diff --git a/nano/templates/smartfridge.tmpl b/nano/templates/smartfridge.tmpl index b371baaef32..cc25d760ce0 100644 --- a/nano/templates/smartfridge.tmpl +++ b/nano/templates/smartfridge.tmpl @@ -34,42 +34,3 @@ No products loaded. {{/if}} - -{{if data.panel_open}} -
-

Access Panel

-
-
-
- Wires: -
-
- {{for data.wires}} -
-
- {{:value.wire}} wire: -
-
- {{if value.cut}} - {{:helper.link('Mend', 'plus', {'cutwire' : value.index})}} - {{else}} - {{:helper.link('Cut', 'minus', {'cutwire' : value.index})}} - {{:helper.link('Pulse', 'signal-diag', {'pulsewire' : value.index})}} - {{/if}} -
-
- {{/for}} -
-
- -
- The orange light is {{:data.electrified ? "on" : "off"}}.
- The red light is {{:data.shoot_inventory ? "on" : "off"}}.
- {{if data.secure}} - The green light is - - {{:data.locked == 1 ? "off" : data.locked == -1 ? "blinking" : "on"}} - .
- {{/if}} -
-{{/if}} From d9b420642a8020268fb5b61f3689418e47208587 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Tue, 4 Nov 2014 17:25:01 +0100 Subject: [PATCH 2/9] Manifest ghost visibility-toggle Ghosts which have been made visible by cultists can afterward turn themselves (in)visible at will, with a cooldown before being able to turn themselves visible after having faded from sight. --- code/game/gamemodes/cult/ritual.dm | 3 +- code/modules/mob/dead/observer/observer.dm | 39 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index e60795f5fd9..30737a71cb5 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -346,7 +346,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", msg_admin_attack("[user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey]) (JMP)") if(istype(M,/mob/dead)) - M.invisibility = 0 + var/mob/dead/D = M + D.manifest() user.visible_message( \ "\red [user] drags the ghost to our plan of reality!", \ "\red You drag the ghost to our plan of reality!" \ diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5e6bd3cba1b..fd37fcae6b7 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -550,3 +550,42 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp W.message = message W.add_hiddenprint(src) W.visible_message("\red Invisible fingers crudely paint something in blood on [T]...") + +/mob/dead/proc/manifest() + verbs += /mob/dead/proc/toggle_visibility + toggle_visibility() + +/mob/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + del(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/dead/proc/toggle_visibility() + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + + if(invisibility && world.time < toggled_invisible + 600) + src << "You must gather strength before you can turn visible again..." + return + + if(invisibility == 0) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible") + else + src << "You have pried the window into the frame." : "You have pried the window out of the frame.") + else if(istype(W, /obj/item/weapon/wrench) && !anchored && (!state || !reinf)) + if(!glasstype) + user << "You're not sure how to dismantle \the [src] properly." + else + visible_message("[user] dismantles \the [src].") + if(dir == SOUTHWEST) + var/index = null + index = 0 + while(index < 2) + new glasstype(loc) + index++ + else + new glasstype(loc) + del(src) else if(W.damtype == BRUTE || W.damtype == BURN) hit(W.force) @@ -373,6 +388,8 @@ desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it." icon_state = "window" basestate = "window" + glasstype = /obj/item/stack/sheet/glass + /obj/structure/window/phoronbasic name = "phoron window" @@ -380,6 +397,7 @@ basestate = "phoronwindow" icon_state = "phoronwindow" shardtype = /obj/item/weapon/shard/phoron + glasstype = /obj/item/stack/sheet/glass/phoronglass maxhealth = 120 /obj/structure/window/phoronbasic/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -393,6 +411,7 @@ basestate = "phoronrwindow" icon_state = "phoronrwindow" shardtype = /obj/item/weapon/shard/phoron + glasstype = /obj/item/stack/sheet/glass/phoronrglass reinf = 1 maxhealth = 160 @@ -406,6 +425,7 @@ basestate = "rwindow" maxhealth = 40 reinf = 1 + glasstype = /obj/item/stack/sheet/rglass /obj/structure/window/reinforced/tinted name = "tinted window" diff --git a/html/changelog.html b/html/changelog.html index bbc7657a9c1..2c0e9d05e87 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,15 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

4 November 2014

+

TwistedAkai updated:

+
    +
  • Almost any window which has been fully unsecured can now be dismantled with a wrench.
  • +
+
+ +

1 november 2014

PsiOmegaDelta updated:

From a216173271c127a3ed23f04e50dc54c0326a7270 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Wed, 5 Nov 2014 13:18:35 +0100 Subject: [PATCH 4/9] Fixes server start runtime errors Moves mech Z-level checks from New() to initialize() to ensure configuration has been read. --- code/game/mecha/medical/medical.dm | 2 +- code/game/mecha/working/working.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index d19c0615784..7fe4c456950 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -1,4 +1,4 @@ -/obj/mecha/medical/New() +/obj/mecha/medical/initialize() ..() var/turf/T = get_turf(src) if(isPlayerLevel(T.z)) diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index ea12b02df21..1fa6d4f5ac1 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -3,7 +3,7 @@ var/list/cargo = new var/cargo_capacity = 5 -/obj/mecha/working/New() +/obj/mecha/working/initialize() ..() var/turf/T = get_turf(src) if(isPlayerLevel(T.z)) From 86258b6e8a7a92a751c67c380308cb233a2471f3 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Wed, 5 Nov 2014 14:02:50 +0100 Subject: [PATCH 5/9] Fixes #6951 Replaces two standard SMES instances on station, five instances on the asteroid. Adds an engine monitor screen to the CE's office. Allows the CE to check the engine from the comfort of his office and to allow one to be sure that the ejection vent is open before ejecting. Makes the engineering showers prettier by having shower curtains display above windows. --- maps/tgstation2.dmm | 66 +++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index a90530dd7c6..d14a2e344b4 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -656,7 +656,7 @@ "amF" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/security/main) "amG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "Prison Wing Observation"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/security/brig) "amH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/foresolar) -"amI" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/foresolar) +"amI" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0},/turf/simulated/floor/plating,/area/maintenance/foresolar) "amJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "amK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; name = "Brig Monitor"; network = list("Prison"); pixel_x = -3; pixel_y = -33},/turf/simulated/floor,/area/security/brig) "amL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/foresolar) @@ -2599,7 +2599,7 @@ "aXY" = (/turf/simulated/floor{icon_state = "vault"; dir = 10},/area/security/nuke_storage) "aXZ" = (/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "aYa" = (/turf/simulated/wall/r_wall,/area/maintenance/evahallway) -"aYb" = (/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/security/nuke_storage) +"aYb" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/security/nuke_storage) "aYc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aYd" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aYe" = (/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) @@ -3043,7 +3043,7 @@ "bgA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office) "bgB" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/ointment{pixel_y = 10},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/engine/engineering_supply) "bgC" = (/turf/simulated/floor/wood,/area/bridge/meeting_room) -"bgD" = (/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/machinery/light/small{dir = 4},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/three) +"bgD" = (/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/three) "bgE" = (/obj/effect/decal/remains/robot,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/arrivals) "bgF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bgG" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/starboard) @@ -3311,7 +3311,7 @@ "blI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/aft) "blJ" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/chief) "blK" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/crew_quarters/heads/chief) -"blL" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/crew_quarters/heads/chief) +"blL" = (/obj/machinery/camera{c_tag = "Research Division West"; dir = 2; network = list("SS13","Research")},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "blM" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "blN" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "blO" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/turf/simulated/floor/plating,/area/storage/tech) @@ -4587,7 +4587,7 @@ "bKk" = (/obj/machinery/door/firedoor,/obj/structure/sign/examroom{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bKl" = (/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bKm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bKn" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bKn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bKo" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) "bKp" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) "bKq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) @@ -4899,7 +4899,7 @@ "bQk" = (/obj/item/apc_frame,/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/genetics) "bQl" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay3) "bQm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bQn" = (/obj/machinery/camera{c_tag = "Research Division West"; dir = 2; network = list("SS13","Research")},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bQn" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bQo" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bQp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bQq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/rnd/research) @@ -5334,7 +5334,7 @@ "bYD" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/central_two) "bYE" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/central_two) "bYF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/quartermaster/office) -"bYG" = (/obj/structure/table/reinforced,/obj/machinery/camera{c_tag = "Engine Monitoring Room"; dir = 4; network = list("SS13")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engine/engine_monitoring) +"bYG" = (/obj/machinery/computer/station_alert,/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Supermatter"); pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/crew_quarters/heads/chief) "bYH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/quartermaster/office) "bYI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/quartermaster/office) "bYJ" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access_txt = "50"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/office) @@ -5521,7 +5521,7 @@ "cci" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/engine_monitoring) "ccj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/engine/engine_smes) "cck" = (/obj/machinery/camera{c_tag = "Medbay Cloning"; network = list("SS13")},/obj/structure/closet/wardrobe/medic_white,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"ccl" = (/obj/machinery/camera{c_tag = "SMES"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/engine/engine_smes) +"ccl" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "ccm" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engine/workshop) "ccn" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engine/workshop) "cco" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes) @@ -6442,7 +6442,7 @@ "ctT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; on = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "ctU" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "map_injector"; id = "air_in"; on = 1},/obj/machinery/sparker{id = "Incinerator"; pixel_x = -20},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "ctV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engine/engine_eva) -"ctW" = (/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/random/tech_supply,/turf/simulated/floor/plating,/area/construction) +"ctW" = (/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/random/tech_supply,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/construction) "ctX" = (/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/construction) "ctY" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/construction) "ctZ" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/construction) @@ -6929,7 +6929,7 @@ "cDm" = (/obj/machinery/door/airlock/hatch{name = "Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) "cDn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cDo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/atmos) -"cDp" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"cDp" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower{color = "#FFA500"; layer = 3.3},/obj/machinery/door/window/northright{name = "Shower"; req_access_txt = "24"},/obj/structure/window/basic{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cDq" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) "cDr" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "cDs" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) @@ -7172,7 +7172,7 @@ "cHV" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "cHW" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/machinery/camera{c_tag = "Atmospherics North East"; dir = 6},/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = 32},/obj/machinery/cell_charger,/turf/simulated/floor,/area/atmos) "cHX" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"cHY" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) +"cHY" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower{color = "#FFA500"; layer = 3.3},/obj/machinery/door/window/northleft{name = "Shower"; req_access_txt = "24"},/obj/structure/window/basic{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cHZ" = (/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/shuttle/administration/centcom) "cIa" = (/turf/simulated/floor{icon_state = "chapel"},/area/shuttle/administration/centcom) "cIb" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) @@ -8155,7 +8155,7 @@ "daQ" = (/obj/machinery/door/airlock/centcom{name = "Holding Cell"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "daR" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/engine/engine_eva_maintenance) "daS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) -"daT" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower{color = "#FFA500"},/obj/machinery/door/window/northleft{name = "Shower"; req_access_txt = "24"},/obj/structure/window/basic{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"daT" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "engineering_cubicle"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 8; req_access_txt = "0"; specialfunctions = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "daU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/research_port) "daV" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "daW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) @@ -8300,7 +8300,7 @@ "ddF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/research_port) "ddG" = (/obj/machinery/camera{c_tag = "Entrance North"; dir = 2; network = list("Tcomsat")},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/tcommsat/entrance) "ddH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/space,/area/turret_protected/tcomsat) -"ddI" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower{color = "#FFA500"},/obj/machinery/door/window/northright{name = "Shower"; req_access_txt = "24"},/obj/structure/window/basic{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"ddI" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) "ddJ" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/tcommsat/entrance) "ddK" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "ddL" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/construction) @@ -9716,7 +9716,7 @@ "dER" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "dES" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "dET" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"dEU" = (/obj/machinery/power/smes{charge = 5e+006; output = 150000},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/power) +"dEU" = (/obj/item/roller,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "dEV" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/simulated/floor/wood,/area/research_outpost/hallway) "dEW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/entry) "dEX" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) @@ -10609,7 +10609,7 @@ "dWa" = (/obj/structure/window/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) "dWb" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) "dWc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"dWd" = (/obj/machinery/power/smes{charge = 5e+006; output = 150000},/obj/structure/sign/electricshock{pixel_x = 32},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/research_outpost/power) +"dWd" = (/obj/machinery/camera{c_tag = "SMES"; dir = 8; network = list("SS13","Supermatter")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/engine/engine_smes) "dWe" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar) "dWf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access_txt = "13"; tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/portsolar) "dWg" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -10840,7 +10840,7 @@ "eax" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "eay" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/research_outpost/iso2) "eaz" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/mine/production) -"eaA" = (/obj/machinery/power/smes{output = 250000},/obj/structure/cable,/turf/simulated/floor/plating,/area/mine/west_outpost) +"eaA" = (/obj/structure/table/reinforced,/obj/machinery/camera{c_tag = "Engine Monitoring Room"; dir = 4; network = list("SS13","Supermatter")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engine/engine_monitoring) "eaB" = (/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/research_outpost/iso3) "eaC" = (/obj/structure/transit_tube{icon_state = "D-NW"},/turf/space,/area/space) "eaD" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall,/area/mine/living_quarters) @@ -10854,7 +10854,7 @@ "eaL" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "E-SW"},/turf/space,/area/space) "eaM" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/mine/production) "eaN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/mine/production) -"eaO" = (/obj/machinery/power/smes{charge = 5e+006; output = 250000},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/mine/living_quarters) +"eaO" = (/obj/structure/sign/electricshock{pixel_x = 32},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes/buildable{charge = 5e+006; output = 25000},/turf/simulated/floor/plating,/area/research_outpost/power) "eaP" = (/obj/machinery/camera{c_tag = "Medbay Operating Theatre 1"; dir = 8; network = list("SS13")},/obj/machinery/holosign_switch{pixel_x = 24; pixel_y = 2},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/surgery) "eaQ" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/virologyaccess) "eaR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating,/area/mine/living_quarters) @@ -11022,7 +11022,7 @@ "edX" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; icon_state = "map_injector"; on = 1},/obj/structure/window/reinforced/tinted{dir = 8; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/turf/simulated/floor/engine{name = "Outpost N2"; nitrogen = 20000; oxygen = 0},/area/research_outpost/atmos) "edY" = (/obj/machinery/atmospherics/omni/filter{on = 1; tag_east = 4; tag_north = 2; tag_south = 1; tag_west = 3},/turf/simulated/floor/plating,/area/research_outpost/atmos) "edZ" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "S-NE"},/turf/space,/area/space) -"eea" = (/obj/machinery/power/smes{output = 250000},/turf/simulated/floor/plating,/area/mine/north_outpost) +"eea" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable,/obj/machinery/light/small{dir = 4},/obj/machinery/power/smes/buildable{charge = 5e+006; output = 25000},/turf/simulated/floor/plating,/area/research_outpost/power) "eeb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; on = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/obj/structure/window/reinforced/tinted{dir = 8; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/obj/structure/window/reinforced/tinted{dir = 1; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/turf/simulated/floor/engine{name = "Outpost N2"; nitrogen = 20000; oxygen = 0},/area/research_outpost/atmos) "eec" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) "eed" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/decal/cleanable/cobweb,/obj/item/stack/sheet/metal{amount = 10},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/mine/north_outpost) @@ -11188,7 +11188,7 @@ "ehh" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Port to Filter"},/turf/simulated/floor,/area/atmos) "ehi" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor,/area/atmos) "ehj" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor,/area/atmos) -"ehk" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "engineering_cubicle"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 8; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"ehk" = (/obj/machinery/power/smes/buildable{charge = 5e+006; output = 25000},/turf/simulated/floor/plating,/area/mine/north_outpost) "ehl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/research_port) "ehm" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the isolation room cameras."; layer = 4; name = "Isolation Room Telescreen"; network = list("Anomaly Isolation"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Supply drain"},/turf/simulated/floor/plating,/area/research_outpost/maint) "ehn" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Supply input"},/turf/simulated/floor/plating,/area/research_outpost/maint) @@ -11211,6 +11211,8 @@ "ehE" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/space,/area/space) "ehF" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space) "ehG" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/space,/area/space) +"ehH" = (/obj/structure/cable,/obj/machinery/power/smes/buildable{charge = 5e+006; output = 25000},/turf/simulated/floor/plating,/area/mine/west_outpost) +"ehI" = (/obj/machinery/power/smes/buildable{charge = 5e+006; output = 25000},/turf/simulated/floor/plating,/area/mine/living_quarters) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11352,12 +11354,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcfDbsUcfDbsVbsWbIyblpblpblpegablpbIvbIwbsXbalbalbsYbcSbndbJXbtabtbbLebSWbSWbKZbFcbFpbFobIhbBabLBegbbJmbJNbDNbCHbHWbInaaebrUbrUbJWbIqbIPbnzbTmbrUbrUaaebtvbtvbtvbtvbtvbtvbtvbLfbqlbKubyBbyDbqlbKvbMmbMmbHMbCGbPZbKxbKzbHJbKDbKBbKCbKebHJbKdbKbbKlbKkbKjbKfbKfbKfbKmbKfbKsbKrbKqbSebSYbTabTcbTdcuBbrbbKVbKWbKXbKYbkBbzPbkCbkCbucbpDbKEbuebuqbUAbKHbKGbuqbKIbKMbKLbKObGwbtCbtCbKPbhgbhgbRDbSpbSpbSpbSqbPqbrobrrbrqbrrbrrcfjbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaafaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbuublpbIyblpbrybrybrybrybIvbIwbuvbuwbalbuxbcSbndbJXbuybuzbJZbcSbKabcSbLbbLubBebLAbLzbLBegcbJObJNbJNbJNbJMbInbOpbOpbOpbrUbUlbIkbUlbrUcdacdacdabtvbJQbuVbuWbuXbuYbJSbJRbqlbLTaLXaLYbqlbJcbJdbJebJgbJnbJobJpbJqbJhbJjbJkbJlbJwbJvbJybJxbJtbJrbJubJtbJFbJEbJHbJGbJCbJBbJDbPZbICbIDbIAbPBbiSbvybIzbMgbvBbvBbkBbvCbvDbvEbkBbIEbIMbvGbSobSnbIKbIIbIHbIFbIFbJbbIZbIXbIWbRkbIObINbJIbJJbJLbXpbXpbZcbZtbvXbpObMeccRbMebpObvZaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbwabrvbwbbXSblpbIyblpblpblpblpblpbIvbIwbuvbwdbalbwebcSbIxbIubcSbItbPhbcSbcSbrFbBabBfbBebLAbLzbLBbInbIsbIlbImbIlbIobInbwpbDqbIrbOpbrUbplbrUcdabIjbrabXubtvbIbbIcbIdbIebIfbIfbIgbNpbLTaLXaLYbqlbSkbLRbLRbHMbvNbPZbHObHSbPZbLXbHNbHNbHGbPZbHxbHrbPZbPZbPZbPZbPZbPZbHKbPZbPZbHJbHIbPZbAqbAqbAqbOXbiSbtCbuqbuqbuqbuqbuqbuqbuqbuqbuqbGwbHcbHbbHebSnbGZbGlbHabsabsabsabHibRpbRlbRibHhbHgbHZbRBbRtbRwbRtbIabRCbRDbSpbSqbRHbPqbRJaaaaaeaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbxubxvbQQblpblpblpbxvblpbIvbIwbuvbQSbalbQRbcSbndbJXbcSbgAbQTbcSbcSbxGbCCbBfbBebNqbCCbNsbInbQWegdbRdbRcbRbbInbRabQJbQDbPUbWabRhbQZbRfbQXbQYbRebtvbRnbycbycbydbyebyfbQEbqlbNxbNwbNybqlbymbQhbQibQjcarbQdbApbQfbHJcbccbebHNbQlbHJbzzbQmbHJceEceJcqebDccckbNbccEbAqbQkbOYcpybRvcbbbAqbQsbQubQwbPGbQtbPwbPwbQnbQobQpbQrbQpbQqbQMbQLbQpbQKbQPbGlbQObQNbQxbtCbtCbtCbtCbtCbVNbVMbywbRDbSqbRCefSefTefUefVckkctpdKtefRaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbxubxvbQQblpblpblpbxvblpbIvbIwbuvbQSbalbQRbcSbndbJXbcSbgAbQTbcSbcSbxGbCCbBfbBebNqbCCbNsbInbQWegdbRdbRcbRbbInbRabQJbQDbPUbWabRhbQZbRfbQXbQYbRebtvbRnbycbycbydbyebyfbQEbqlbNxbNwbNybqlbymbQhbQibQjcarbQdbApbQfbHJcbccbebHNbQlbHJbzzbQmbHJceEceJcqebDccckbNbccEbAqbQkbOYcpybRvcbbbAqbQsbQubQwbPGbQtbPwbPwblLbQobQpbQrbKnbQqbQMbQLbQpbQKbQPbGlbQObQNbQxbtCbtCbtCbtCbtCbVNbVMbywbRDbSqbRCefSefTefUefVckkctpdKtefRaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcoMbzdcoMbPQbzfbzgbzgbzgbzgbzgbzhbPKbPLbuvbzjbalbzkbPIbPJbPPbzobPNbPObzqbzrbarbAadSVbBebNAbNzbLBbInbPXbPWbQbbIlbQcbInbRGbPYbQabOpbPSbPTbLjcdabPRcoOcoXbtvbzKbzLbzMbzNbyebyfbPVbqlbDSaLXaLYbNBbPjbOubzGbPibEpbPfbNfbPebPZbPZbPZbPgbPZbPZbCbbPcbXqbZFbZBbPdbDcbOVbNbbOTbLJbPabOYbUmbAybUVbPCbPDbPEbPFbPGbPHbPwbPwbPxbPybPzbPybPybPAegebPpbPsbPrbPtbGlbwtbPvbPlbPkbPnbPmbPobzlbGtbNXbBcaaeaaebRCcaocapcamcanbZycalbZxbRCaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbAKbALbAMbalbalbANbrvbrvbrvbAObalbalbAPbAQbARbalbASbASbASbOQbASbAUbORbAWbAXbAYbAabBfbBebNDbNCbAabOxbOxbOxbOxbOxbOObOxbOxbOxbOxbOxbOxbOPbOxbOxbOxbOxbOxbOxbOxbOxbqlbqlbqlbqlbqlbqlbDSaLXaLYbNBbOtbOubBxbOvbOnbOobOqbOrbOkbOlbOmbApbOLbOKbONbOMbOHbOGbOJbOIbODbOCbOFbOEbOzbTXbTZbTYbTWbNVbAqbNNbSJbtCbtCbtCbtCbtCbNMbtCbtCbtCbuqbNLbuqbuqbZhbSnbGZbGlbwtbOjbOibOhbOfbOebObbzlbGtbNXbNKaaaaaabRCbZvbZwbRCbZtbRCbRCbZtbRCaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYZaaeaaaaaaaaaaaabASbChbNFbNIbCkbAUbNGbCmbEZbCobAabBfbBebLAbLubRNbQgbSCbSybSHbSFbTVbTlbULbUHbULbVvbVDbVCbVLbVEbLubXgbLubXhbLubLbbYBbYqbYEbYDbYYbYVbDSaLXbNyauWbymbSBbSBbSBbymbPZbNmbNobNkbNlcuKbNjbNhbRXbNgbmKbHJbYAbYzbNebDcbNbbNabMWbMUbMTbAybTQbEKbNrbAqbTCblubzCbPbbXXbXxbXDbMNbMObOSbELbMLbMMbOcblTbuqbDybGZbGlbrWbMKbMHbMGbMJbMIbMEbzlbGtbMFbywbywbywbRCbRCbRCbRCaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabASbDCbDDbyObDFbDGbyPbDIbyNbDKbAabBfbZacaxcawcawcaWcfOcfNcjdcgkcfOcaWcawcawcawclFcvvcsxdzVdzjcawcawcawdAJcfOcfNdUZdAQeboebnebpebnebrebqbCBauWbEbbzGbEpbEpbzIbzHbNfbzObHYbHQbPZbynbzwbzybzzbzAbPZbHqbHsbHFbDcbDhbDkbDwbDEbAgbAybzDbEKbAgbAqbHocdjbzCbEqbEobEybEtbHnbHjbHpbELbzvbzpbEmbEmbuqbyQbyTbyVbyRbySbyYbyZbyWbyWbzebzlbGtbzcbywbzSbzUbzTbywaaeaaeaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebEPbEQbEQbFgbtybtybjBbjBbjBbjBbEOaaeaaeaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowaaaaaaaaaaaaaaaaaaaaaaaabERbESbBTbESbEUaaaaaaaaabASbASbEVbEWbyObEWbEXbFdbEZbAhbFbbAaebtbBfebAebubLuebDbLubLbbSHebEbLuebFebIebHebNebLbLAbLuebPbvKbULebQbULbULebYebWecgecdeciechbeiecjaLYaLYaLYauWbFmbBxbFlbETbBxbACbFubABbAIbAHbAFbAEbAJbAVbzzbmKbAZbFQbFGbDcbDcbHfbHfbHfbAqbEGbBbbEAbElbEkbAqbIicdnbzCbFRbJKbJUbJTbJVbFVbFXbELbAmbAlbEmbEmbuqbSnbAnbGlbtCbAobArbAtbAubAwbAxbzlbIBbJfbKQbKQbKQbKnbBcaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaebGjbmNbGhbmNbtybjBbjBbjSbmLbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowaaaaaaaaaaaaaaaaaaaaaaaabERbESbBTbESbEUaaaaaaaaabASbASbEVbEWbyObEWbEXbFdbEZbAhbFbbAaebtbBfebAebubLuebDbLubLbbSHebEbLuebFebIebHebNebLbLAbLuebPbvKbULebQbULbULebYebWecgecdeciechbeiecjaLYaLYaLYauWbFmbBxbFlbETbBxbACbFubABbAIbAHbAFbAEbAJbAVbzzbmKbAZbFQbFGbDcbDcbHfbHfbHfbAqbEGbBbbEAbElbEkbAqbIicdnbzCbFRbJKbJUbJTbJVbFVbFXbELbAmbAlbEmbEmbuqbSnbAnbGlbtCbAobArbAtbAubAwbAxbzlbIBbJfbKQbKQbKQbQnbBcaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaebGjbmNbGhbmNbtybjBbjBbjSbmLbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGpbGqbEHbEIbGpbGsbCWbGubASbDZbwHbwGbwAbwzbwCbwBbwDbwDbwEbAabAabAabDVbAabAabAabAabAabAabAabAabAabAabAabAabAaecmeclecpbAabAabAabAabAabCXbAaauWauWauWauWbCZauWaxoaBsecvauWbzXbBxbBxbwXbxebxcbJabxfbPZbwYbxbbwZbwQbPZbwRbwSbwMbwNbwObwPbwTbwVbwWbEMbEKbAgbAybAybATbAgbAqbpfbhQbhQbhQbhQbhQbhQbhQbhQbhQbhQbBRbxkbBqbBqbuqbxibxgbFjbtCbjfbjfbjfbFCbFDbFybjfbjfbjfbjfbjfbxmbEFbxnbEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebEebxXbmNbmNbtnbjBbjBbjSbjSbBSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTbHBbHCbHBbBTbHDbFSbFMbFPbTfbHHbEWbxrbxpbAUbxobHLbxtbFLbAUbxxbxybsjbkiaaaaaaaaaaaabGFbGfbHRbxwbHTblObQCbCtbxEbHXbBYbCtbxKbxFbxMbxLbxAbxzbLqbxBbFAbkLbFBbmvbmvbmvbmvbymbBmbBlbBlbBkbymbkPbBybxRbubbxbbxObxNbykbxPbyibyjbygbyhbxZbyabyqbyrbwWbGebAybAybypbAgbAgbGebAqbpfbhQbGkbGrbCxbUUbCMbHEbGObGvbhQbCLbysbDpbDpbuqbyubytbGlbGwbDjbDMbDObDTbGMbGEbDsbDHbDJbDXbjfbywbFKbywbngbngbngbngbngaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabxYbjBbxXbjBbjBbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGpbHBbHBbHBbNvbNnbEWbOgbNdbNcbEWbEWbEsbJibAUbAUbAUbAUbAUbAUbEgbEhbNibEfaaabEdbnmbnmbErbJsbHVbEnbEjbHVbEibCtbDRbDQbDPbCtbDLbDBbDAbDzbEcbDYbDWbGHbGHbkLbMRbDUcjhbClbFtbymbzXbFvbBxbBxbFkbFibApbFnbPZbFqbFsbFrbENbPZbEYbFabPZbFebFfbFhbEEbEJbwWbAqbAqbAqbAqbAqbAqbAqbAqbpwbhQbKFcwzcrWbCxbCxbCxbCxbEDbhQbKtbAlbKpbKpbuqbSnbECbOWbEBbKgbKgbKgbKgbKhbIYbIYbKibKobJYbjfbEzbBJbEvbngbExbEwbJAbJzaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtybjBbptbpubpubjSbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11367,14 +11369,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebnIbkibkibkibkibkgbnubsjbntaaabnnbnmbnmbnkbnlbHVbHVbnibHVbnhbCtbkpbkobnHbCtbgXbgXbgXbgXbgXbgXbgXbgXbnGbnBbsBbssbrjbqrbmvbymblCbmwbvJbmxbvMbvLbApbmybmAbmzbmHbApbmabmIbmJbmKbmRbmVbmWbmibmXbmYbidbnabncbnabmoblYbmbblYbkybpwbhQbecchTcgLbmhbmgbjybenblzblUbuqbmjbuqbuqbuZbsabmlbsabvaaaebjcblZbvfbswbqqbmpbmmbmtbnEbjfbriboTbpPbngbnwbnjbnjbolaaLaaLaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabombmNbmNbmNbmNbmNbmNbmNbrNbmLbjSbjSbjSbjSbmObmLbEOaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBcaCcaCcaDbpbbkiboZbkgbsZbkiaaaaaaaaaaaabGFbQybQzbQAbQBefBbHVbCtboWboUbBYbCtbgXbmEbmGbmFbmCegfbmDbgXbfpbfpbfpbfpbfpbsSbnZbnXbxhboMbpkboLboQboPboOboNbogboSbogboRbogboiboabobbonbokbojbokbozboCbrkboyboGboIboDboEbnMbnLbsObsMbnQbnPbnSbnRbicbnTbnUbicbicbiabnWbnVbvYbnJbsabsabmlbsabwtaaebjcbjdbsCbopbsLboKbnKboYbsTbjfbrXboTblXbngbngbngbngbngaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabjBbpubpubpubpubpubpubpvbjSbptbpubkabjSbjSbjSbjSbjBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkfbrKcbobrPbkgbkdbkjbkgbpabkiaaMaaaaaaaaabGFbGFbGFbGFbGFbGFbCtbCtbkpbkobkmbCtbCteggbgwbgxbgxbgwbgvbgXbgBbfGbfGaRdbfpbnAbymbymbqxbirbrlbfEbiAbizbiCbiBbiubitbiwbivbiLbiPbiUbiYbiEbiFbiIbiJbiIbjgbjhbjnbiZbjabjbbjeblybjwblxbnOblubqDbqDbjqbjIbjHbjGbjFbjEbjCbjzeghbjMbjQbjLbjMegibjKbrWaaebjcbjdbszbswboJbjUbjRboqbjmbjfblXboTbnebmkbnfaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebjBbjSbjSbjSbjSbjSbjSbjXbjSbkabjSbjSbjSbjSbjSbjBbjBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccecaCcaCcaDblBblAblRbkibpjbkiblJegjegkblJblJblKblLblMblNblPblQecQblGblFblHbllblIbgwbugbjDbiNbiMbiQbiObtVbshbkkbjpbfpbpdbkLbkKbkJbkIbiTbiTbldblcblbbkRbPZbPZbkPbkObPZbPZbkvbkzbkubidbnNbksbhebiKbkGbiKbiGbiHbkEbiHbiGbliblxbpfblubknbkrblhbtYbtTbltbkNbhQbhQbtCbtCbtCbtCbtCblgbleblfbtCbjfbjfbjfbjfbjfbjfbjfbjfbjfbjfbjfbpibphbpgbpebnfaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabjBbjBbkQbjSbjSbjSbjSbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccecaCcaCcaDblBblAblRbkibpjbkiblJegjegkblJblJblKbYGblMblNblPblQecQblGblFblHbllblIbgwbugbjDbiNbiMbiQbiObtVbshbkkbjpbfpbpdbkLbkKbkJbkIbiTbiTbldblcblbbkRbPZbPZbkPbkObPZbPZbkvbkzbkubidbnNbksbhebiKbkGbiKbiGbiHbkEbiHbiGbliblxbpfblubknbkrblhbtYbtTbltbkNbhQbhQbtCbtCbtCbtCbtCblgbleblfbtCbjfbjfbjfbjfbjfbjfbjfbjfbjfbjfbjfbpibphbpgbpebnfaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabjBbjBbkQbjSbjSbjSbjSbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaambCVaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaeaaeaaabxWbxTbxTbxTbxVbxTbxTbupburblJbuoeglblJbuIbuJbuGbuHegmbuEbuAbuBbuObuMbuLbxUbuKbgwbugbwLbxjbiMbwkbgXbgMbgMbgMbgMbgMbzYbkLbymbCnbvlbtSbtRbtIbtHbtMbtKbPZbtNbtPbtObuibiDbujbukbumbwUbhebksaJzbiKbtUbtXbiGbtZbuabufbiGbtcblxbpwblublubsIbsIbsIbsIbsIbsIblubuSbzBbznbzRbvkbtCbtCbtFbtCbtCbvsbuUbvcbuTblXbvgblXblXbvebtlbtkbzmbzbbtjbnfbnfbnfaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtybjBbuPbulbulbjSbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeecwecxbsKbCUbCSbthbCQbwnbwoblJbwlegnblJblJbwubwvbwwegobwrbwsbAkblGblFblHbwibwgbgwbgwbwhbwjbgwcWxbgXcjcbxabgMcDpbgMbsSbqZbqZbqZbqZbqZbqZbqZbPZbwcbvWbPZbrAbwfbqJbtDbiDbvTbvUbvVbwUbhebksbhebiKbvObvPbiGbvSbvQbvRbiGbvAbGIbBGbCNbKUbvIbvHbsrbvtbvvbqhbBCbBdbBFbBEbAAbBdbBgbvobvpeczbBobBpbAzbAzbAzbAzbAzbAzbAzbAzbAzbAzbAjbvzbvxbvwbAibnfbnfbnfbnfaaaaaeaaaaaaaaaaajaajaajaaeaaaaaaaaeaaaaaaaaeaaaaaabxYbjBbxXbjBbjBbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeecwecxbsKbCUbCSbthbCQbwnbwoblJbwlegnblJblJbwubwvbwwegobwrbwsbAkblGblFblHbwibwgbgwbgwbwhbwjbgwcWxbgXcjcbxabgMcclbgMbsSbqZbqZbqZbqZbqZbqZbqZbPZbwcbvWbPZbrAbwfbqJbtDbiDbvTbvUbvVbwUbhebksbhebiKbvObvPbiGbvSbvQbvRbiGbvAbGIbBGbCNbKUbvIbvHbsrbvtbvvbqhbBCbBdbBFbBEbAAbBdbBgbvobvpeczbBobBpbAzbAzbAzbAzbAzbAzbAzbAzbAzbAzbAjbvzbvxbvwbAibnfbnfbnfbnfaaaaaeaaaaaaaaaaajaajaajaaeaaaaaaaaeaaaaaaaaeaaaaaabxYbjBbxXbjBbjBbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeecCecCbsKbuQbtQbthbvnbqpbvjblJbqtegqegpegsegreguegtegvbqHbqAbqCbqNbqLbqKbqIbqSbqQbqPbqObqVbqXbiRbklbtWbsfbrhblDbgMbsSbqZbpEbqWbqRbpCbpBbpybpxbpAbpzbpqbppbpscjCbsmbiDbsnbsobsibwUbhebksbhebiKbpKbpLbiGbrOclDbpJbiGbqiblxblxbtxblxbqbbqcbqbbqbbqbbqabtqbybbybbxSbqobybbudecGbqkecHbuddfTbyobxsbxqdfTdfTdfTdfTbylbxsbxqdfTdfTblXbsGbtpbsNbtebtdbsEbtibtobtobtobtobtobtobtobtobtobtobtobtobtobtobtobtobpmbpnbpnbpobjBbjBbjSbjSbqmbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsgbsgbsgbsgbsgbsgbsgbxDbyvcvgcvgcvgcvgcvgbstbsubsvbsvbsvbsAbuNblGblFblHbtsblIbttbslbtuegwbspbtGbgXbqUbmebgMcnpbgMbxlbqZbzxbzsbzsbzsbrMbrLbPZbrGbrBbPZbrAbqJbrzbtDbiDbtAbtBbtzbwUbhebksbtJbiKbrmbrnbiGbiGbiGbiGbiGbseblEblxbtxblxbrYbsdbrYbqdbsbbscbxCbybbWdbBvbrVctibudbuhbrRbrSbudbrTbADbADbADbAGbzJbzQbAsbAvbzibzabyXdfTbvFbvubvrbnfbnfbnfbnfaaaaaeaaaaaaaaaaajaajaajaaeaaaaaaaaeaaaaaaaaeaaeaaebtrbtwbtmbtnbtybjBbjBbjSbmLbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebsgctYctZctWctXcZgbsgcufdaRdgkdgjcwYcrCcrrcrrbuKcBVcBVcBUcBZbAkblGblFblHcnCbuKcnzcwKcnBcnwcnxcnybgXdaTddIbgMehkbgMbsSbqZdZLdZOdZOdZOcyVbqZdYtcyYczmdYtczHdZRczodZHbiDdZGbtBcrVbwUcylcxUbxQbiKcyIcypbiKcONcdnbidcBbcugcuDcRddaUcRdcuSbqccvGbqdcvFcvEbtxbybcBrcAEcAEczIcALcAHcAMcAHcAOcANcCQcCPcCPcCRdfQdfQdgBcCUdgodgobfNdfTbYUcxPbYWbYUaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaaeaaeaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebsgctYctZctWctXcZgbsgcufdaRdgkdgjcwYcrCcrrcrrbuKcBVcBVcBUcBZbAkblGblFblHcnCbuKcnzcwKcnBcnwcnxcnybgXcHYcDpbgMdaTbgMbsSbqZdZLdZOdZOdZOcyVbqZdYtcyYczmdYtczHdZRczodZHbiDdZGbtBcrVbwUcylcxUbxQbiKcyIcypbiKcONcdnbidcBbcugcuDcRddaUcRdcuSbqccvGbqdcvFcvEbtxbybcBrcAEcAEczIcALcAHcAMcAHcAOcANcCQcCPcCPcCRdfQdfQdgBcCUdgodgobfNdfTbYUcxPbYWbYUaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaaeaaeaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaeaaeaaebTebTebTebTebTebTebTebTebTebTebTebTebTeaaaaaacnmcnjcnjcnjcnlcYCbsgcqqcpdcnWcnQcEzcnnctVctRctIctHctCctBctActzcujcxxcuhcuibCtbgXbgXbgXbgXbgXbgXbgXbgMbgMbgMbgMbgMbsSbqZbqZdZrdZscuobqZbqZcupcutcuxdYtbiDbiDbiDbiDbiDbwUdZydZzbwUcqXcuycqXbiKcuAcuzbiKcJLcNGbiddZVbidearblxbtxblxcYGcuEctubqbcttcvEbtxbybcvKcvLcvLcvPcvOcvNcvUcvTcvRcvQcvWdgWcBDcBzdgicBJdfQdfQdfQdfRdfSdfTculcumcunbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaabTecnScqacnSbTecnOcpYcnObTecnMcpZcnMbTeaaaaaacBvcnjcnjcnlcnldhzbsgcDacxbcvgdcVddhcFHcFlcFkcFnbYpbYpcFobYpbAkblGcEUblHcpCcBscEZcpucpEcpucEPbskcBIcCncWrcCEcCJbskbsSbEaeaxbMXbMXcNicNkcNEcNFcmCcNDcNmcNscNleaeeaeeaudXBbwUbwUbwUcLscKZcLubiKbiKbiKbiKcNGcNGbidcHYbidcIfblxbtxblxdhBcDxcDxcERcEScFpdfZbybcJCcGecGecFXcGlcGjcFTcFRcFVcFUcGtcGmdfQdfQbWldhndfQdhpdfQdfRdghdfTcFKcFMcFJbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaabTecnScqacnSbTecnOcpYcnObTecnMcpZcnMbTeaaaaaacBvcnjcnjcnlcnldhzbsgcDacxbcvgdcVddhcFHcFlcFkcFnbYpbYpcFobYpbAkblGcEUblHcpCcBscEZcpucpEcpucEPbskcBIcCncWrcCEcCJbskbsSbEaeaxbMXbMXcNicNkcNEcNFcmCcNDcNmcNscNleaeeaeeaudXBbwUbwUbwUcLscKZcLubiKbiKbiKbiKcNGcNGbidddIbidcIfblxbtxblxdhBcDxcDxcERcEScFpdfZbybcJCcGecGecFXcGlcGjcFTcFRcFVcFUcGtcGmdfQdfQbWldhndfQdhpdfQdfRdghdfTcFKcFMcFJbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaabTecnScnRcnSbTecnOcnPcnObTecnMcnNcnMbTeaaaaaacBvcnjcnlcnlcnlddLcwXddCcvYcvgclOcClbpIcsMcsEcBscoycoEcoDdgFbAkblGcELcuhcCTcFzcFGcCKcCKcCKcCNdeCdeEdeIcBqcBmcBnbskbsSbEaeabbMXbOscEpeaaeageahcEscEtcEqeadcEreafeaeeandXBdgHdgndgacEBdgGcEBdhadgRdgRehldgRdgYbidbidbidbidblxdfXblxdfNdfWcDzcDJcDybqhdfZbybdgPdgQdgQdgQccQbudcEebuddgTcDKcEfdgMdgMdgXdgWdgWdgVdgMdgMcDndgOdfTdeKdeZdfMbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaabTecFfcnicFebTecFdcnfcFcbTecFbcnccEVbTeaaaaaecBvdeMcnjcnlcnlcnlbsgdyPdybdaGdaGdaLdaGdaGdaGdaGcrzbYpcrxcrybAkcWIcWLcWQcWTcWFcWGcWHcWHcWHcQkbskcQKcPBcPVcFIcDedAXdBebEadhObMXdcMdcKdcLdbGdbNdbkdbBdcCdcEdbSdbUeaedbhdXBcHTcqzdXFdbjdbidhMdXFdfJddEddFblxdAfdgRdgRdgRdgRdgRdBPdBSdDddDudgRdgRdgRdgRdBNbybcFwcFxcFvdhTbuddcNdcQdcOdfTdhVcFrcFrcFrdhPcvudhQdhScFrcFrcFrdhYdfTdhXddxcccccdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaeaaebTecqocdMcqpbTecdWcdMcdXbTecdLcdMcdNbTeaaaaaecFqcnjcnjcnlcnldhLbsgdhFdhCcGvcGucRqcRpdjddjddhZdhRcRCcEIcsubAkcRYcRZcRQcqJcBscqCcqCcqHcCmcVibskcKYcKWcJUdaWdkQdbgdpbbEadhDbMXcVRcVSeaPbEaeaFcmCeaHdYteaIcVCcVQeaedhEdXBcHTcqzdXFeaQcWmeaQdXFaaaaaaaaablxblxblxddUddEddEddFblxblxblxblxblxblxbudbudbudbudbudbudbudbudbuddPHckXcWBdfTdfTbZPbOwcdqdfTdfTdfTdfTcoTbOwcdqdfTdfTccSdpYccSaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11388,7 +11390,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachwcjlbSZbSZbSZbSZbSZbSZcmmbSZbSZbSZcmmbSZbSZcvVcicbSZcmmcidcAzclTcbubSZcwtcwrbSZcrUcwecoPcrdcwWcvXcwScwRcwFcvXcvXcracqZcGqcqYcaPcqWcmjcaPcaPcrccfgcfgcrbclHclHcjXbClckzbTBbTBbTBbTBcqDbTBbTBbTBbTBcqzcqBceLceLceLceLceLceLaaacaZcaZcVhcaZcaZdeLcqrcqvcqscqxcqwcqxcqPcqMcqNcqRcqTcqQbVuaaaaaabudcfccfccfccfccnYckUcqKcqIcqEcqLcbWcbWcnXcbWcnUbudaaaaaaciHaaecfqcfqcfqcfqcfqaaaclwaaacfqcfqcfqcfqcfqaaeciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabCVaaaaaaaaaaaachwcicbSZbSZbSZbSZbSZbSZcmmbSZbSZbSZcmmbSZbSZehjclGckiclIckicznclTcaiclUcljcbsbSZcwmcpJctfctebQGbQGbQGbQGcAuclrcaTctgctjciRclYcaPcmbcmjcaPcmkcaOcpKcmlctrcqGcencjXcsQckzbTBcpHbhMbhLbYhbhKcsObhPbTBcgUcgTceLaaaaaaaaaaaaaaaaaabVuctdcsZcsYcsXcsWcsVcsUcsTcsScsRcqNcsCcsDcsFdZjbVudWgbVuaaaaaabudcnbcmXcmYceAcpicrucsNcoucoucsJcsIcsLcsKcsHcsGbudaaaaaaciHaaaaaeaaaaaeaaeaaeaaaclwaaaaaeaaaaaeaaaaaeaaaciHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachwcicbSZbSZclKckickickiclBckickickiclBckickickGcicbSZcmmclKcoUehicljcliclhczeczecuwcpQcsAczjczicpaczlczkclxclrcaTcdJcaTclacldcaPcaPcszcaPclecaOcqhcqhclfcqGcencjXbClckzbTBbvhbvibVTbVSbvmbVSbvbbTBcWZcXdceLaaaaaaaaaaaaaaaaaabVucswcsvcstcxZdWxbsxcsrdWAcrqcssdZkdWrcrqcsqdWPbVubVubVuaaaaaabudccCcoLccCcoKcmEckUcbWcbWcspcetcbWcoxcfccfccfcbudaaaaaaciHaaachWchWchWchWchWaaeclwaaechWchWchWchWchWaaeciHaaaaaaaaaaaaaaaaaaaaaaaacmdaaaaaaaaacmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCVaaaaaaaaaaamaaeaaaaaaaaachwcbJcpBcbDcpxcbDchicbDcpvcbDcppcbDcpncbDcbDcpgcbBbUZcbzegZegYclUclTbSZcoJcoJcoNbZkceccdTcdUcdVcdZcdQcdRcdScaYcaTcdJcdOcaOcdHcaPcaRcaPcaNcaMcaOcjXcjXcjXcjXcjXcjXbClckzbTBbyGbyIbvibYgbvibVSbyFbTBceNceMceLaaaaaaaaaaaaaaaaaabVudWPceBcaZcaZcVPceCceFceHceycexcevdWMceycexcevbVuaaaaaaaaaaaabudccCccCccCceAcezcercbWcbWcbWcetcbWcbUcbWcbXcbWccBaaeaaeciHaaeckwcjQcjQcjQcjQcjkciPciFciBciBciBciBckvaaeciHaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCVaaaaaaaaaaamaaeaaaaaaaaachwcbJcpBcbDcpxcbDchicbDcpvcbDcppcbDcpncbDcbDcpgcbBbUZcbzegZegYclUclTbSZcoJcoJcoNbZkceccdTcdUcdVcdZcdQcdRcdScaYcaTcdJcdOcaOcdHcaPcaRcaPcaNcaMcaOcjXcjXcjXcjXcjXcjXbClckzbTBbyGbyIbvibYgbvibVSbyFbTBceNceMceLaaaaaaaaaaaaaaaaaabVudWPceBcaZcaZcVPceCceFceHceycexcevdWMceycexdEUbVuaaaaaaaaaaaabudccCccCccCceAcezcercbWcbWcbWcetcbWcbUcbWcbXcbWccBaaeaaeciHaaeckwcjQcjQcjQcjQcjkciPciFciBciBciBciBckvaaeciHaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaciHaaeaaeaaeaamaaeaaeaaeaaechwbSZcctccucqbcfnccJclmcqAcfoccDccIcqucfnbSZbSZcqtceVceUehdehcehaehbbZgbYPbYPbYPcacbQGckAbQGbQGcdUcePchEceOcaYcaTcdJcaTcaOccrccqcpUccnccmcaPcaOcVUcVTcVTcfbcfacfKcfJclybTBbVSbnsbnrbVScQJbnpbnobTBcmiclNceLaaaaaaaaaaaaaaaaaabVucfucfPcfQdWPdWQcfSdWNcaZcfUcfVcfvdWMcfucftcfwbVuaaaaaaaaaaaaccQbudcdcccTccTcVVcWecfzcfxcfycfFcfGcfAcfEcfHcfIcdxaaaaaaciHaaecfqcfqcfqcfqcfqaaaclwaaecfqcfqcfqcfqcfqaaaciHaaacmdaaaaaacmdaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaacmdaaaaaacmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHegUaaaaaaaaaaamaaaaaaaaacqycrecrhcrecrfcpwcmocmIcowcoocmocmIcowcoocnAcmIcmocmIcowcmIehebQGbQGcgxcdfcdgcdhcbEbQGcricgwbQGbQGbQGbQGbQGcddcrgcgucrgcaOcaOcaOcaOcaOcaOcaOcaOcWpcVTcVTcgocglcVFbClcrkbTBbsJbsDegBegAegCbYdbsybTBcrmcrlceLaaaaaaaaaaaaaaaaaabVubXKcgIcfwcaZccKcgKdXbcaZcgJdXadWUdWTchdchcdWXbVuaaeaaeaaaaaaaaaaaaciMaaabudcWucdCcgZcdIcgYcdCcgXcdFcgYcdCchabudaaaaaabCVaaaaaeaaaaaeaaaaaeaaaclwaaaaaeaaaaaeaaeaaeaaeciHaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciQegVegVegVegWehDehDehDegVehDehEehDehFehDehEehDehFehDehEehDehFehDegVehDehEehDehFehDehGaaabQGchqchtchychzceZcffcsycsBcrnchgchlchpchjchkchpchOchpchNchUchSchRchJchJchIchFchCchMchMchKcWycVFbClchZbTBbTBbVPcoicohcoibVPcojbTBceLciiceLaaaaaaaaaaaaaaaaaabVucaZcimdWPcaZdXicincWzcaZceQceRceXcthbYXciobYTbZJaaaaaaaaaaaaaaaaaactyaaebudcWAcficitcfcciscfecircfcciqcfsciubudaaaaaaciHaaachWchWchWchWchWaaeclwaaechWchWchWchWchWaaeciHaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11397,7 +11399,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaamaaaaaaaaaaaabTecfBcgNcfBbTechVciechVbTebUhcesbUhbTeaaabTebUhbUhbVrbTeaaaaaaaaabYmcifbXTchmdYKcigcjmbYKcrjcjJcjKcjLbYrceDcakcjEcewcjFbYrcjGcjIcjHbYoaaaaaecVFcwJcwacXaaaeaaabmvbClbClbCjbVPctUcpoctTbVPctEaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabVucjOcjPdVQciGciGdVQbXKdVSbVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabudccCccCccCcfccihccCccCcfccihccCccCbudaafaaaciHaaaaaaaaeaaeaaeaaaaaacxaaaeaaaaaaaaeaaeaaaaaaciHaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaAaaaaaaaaaaaebTecfBceGcfBbTechVcijchVbTebUhceIbUhbTeaaabTebUhbUhbUhbTeaaaaaaaaabYmbXZcikbYNbXZcigcjTcivcrjcjRcjWckabYrcjUckmckjckeckdbYrckrckpcknbYoaaaaaacVFcBpcyRcXbaaaaaabmvbClbClbmvbVPcrJcrJcrJbVPcubctmaaaaaaaaaaaaaaaaaaaaaaaaaaabVudVTckubXKbXKbXKbXKbXKdVUbVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccQbudbudbudbudbudbudbudbudciKciKciKccQaaaaaaciHciHciHciHciHaaaaaaaaacByaaaaaaaaaciHciHciHbCVciHaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaebTebTebTebTebTebTebTebTebTebTebTebTebTeaaabYybTebTebTebTeaaaaaaaaabYmcVjbXTbXZbXZbYacbHcbIcbKcbLcbycbAceScbGcbScbRcbVcbTcbOcflcbQcfMbYoaaeaaacfdcVvcVucVFciWaaabmvcbwbClcbxciIaaeaaeaaeaaaciMaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabZJbVubVubXCdVZdVQdVQdVQdVYbXCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXlbXlbXlaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaeceKaaeciHaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYmbYQbXTbYNbXZcigbXRbYKcrjccoccjcclbYrbYGccicchccgbYvbYrcfYegDcfXbYoaaLcVGcVGcVGcVGcVGcVGcVGbmvcbZcbYccaaaeaaaaaaaaecfWciXaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYCciGciGciGciGciGbYCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaeaaaciHaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYmbYQbXTbYNbXZcigbXRbYKcrjccoccjdWdbYreaAccicchccgbYvbYrcfYegDcfXbYoaaLcVGcVGcVGcVGcVGcVGcVGbmvcbZcbYccaaaeaaaaaaaaecfWciXaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYCciGciGciGciGciGbYCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaeaaaciHaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaamaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaacjgaaaaaaaaaaaaaaaaaaaaaaaabZbbZdbZfbZmdYLccAccvbYKcrjccwccxccycczbZeccGccFccHcjwbYrcjAegEcjBbYoaaacVGcVGcVGcVGcVGcVGcVGcfZccsccpbmvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVubYXbYRbYRbYRbYTbVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciHciHciHciHaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaacfRcfRcfRcfRcfRcjSbZjbZjbZjbZjcgbbZjccUccMcgaccMccLbZjbZjbZnbZjbZjbZjcVGcVGcVGcVGcVGcVGcVGaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaeaaeaaaaaeaaeaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaacjYcaacaacaaclQclMclRclzclVcjZckoctkckqcksccXcdbcdecyUcCucgccCucCucBocklckSckWbZEbZjcVGcVGcVGcVGcVGcVGcVGaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -12299,8 +12301,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtSdtTdtTdtUdtVdtWdtaaaeaaaaaadqTdqTdqTdqTdsadsadsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaeeeiecEeaKeaKeaKeccecfaaadqTdqTdqTdrJdtcdVmdVqdrJdudduedVhdGNduheecdMrdukdVgdVldVkduodrDdVjdVidsveefdVddVedVfeebdsvduudqZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduwduxduyduzduAduBduCaaeaaedsadsadqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaduDduDduDaaeedZecfaaeaaeaaeaaeaaeefedrJdrJdrJdrJdrJdrJdVcdrJdsodrDdrDdUQduJdtJehsdUNdUIduNduOduPdrDdUTdURdqNedWdVbedYdUUedXdqNdpkdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduZdtTdtTdvadvbdtWdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaduDduDduDaaaaaaecudvddvddvddvddvddvddvddrTdWkdWndWiehtdWqdWsdWodWpdWvdWudWydWwdtJehudvrdWzdWDdWBdWEdtJdWIdWFdvzdvzdvzdWtdvzdvzdvzdpkdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedvGdvHdvIdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaduDaaaaaaecudvddvddvddvddvddvddvddvJdVrdvLdVsdvLdvLdVudVydvLdVCdVBdVAdVzeendvXdVMdVDdVRdVPdVOdVNdVWdVVdvzdsUeffefxdWddvzdtxdtIdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeecydwmdwndwodvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaecudvddvddvddvddvddvddvddwpdDFdwrdwsdDHdwudEVdwvdwYdEedrDdEidEgdrDdwAdwBdEddwDdwEdEbdtJdDTdDIdDZdDWeeGdEKdEUdwMdpvdpwdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedvGdvHdvIdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaduDaaaaaaecudvddvddvddvddvddvddvddvJdVrdvLdVsdvLdvLdVudVydvLdVCdVBdVAdVzeendvXdVMdVDdVRdVPdVOdVNdVWdVVdvzdsUeffefxeaOdvzdtxdtIdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeecydwmdwndwodvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaecudvddvddvddvddvddvddvddwpdDFdwrdwsdDHdwudEVdwvdwYdEedrDdEidEgdrDdwAdwBdEddwDdwEdEbdtJdDTdDIdDZdDWeeGdEKeeadwMdpvdpwdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedwQdwRdwSdvcdwTdwUdvcdvcdvcdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaecudvddvddvddvddvddvddvddwVdDFdwrdwsdDHdxxdpodwvdwYdwZdrDdDEdDBdrDecrdtJdtJdtJdtJecqdtJdDzdDvdvzdDweeFdxiecodxkdpkdpldCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeecMdxpdxqdxrdxsdxtdszduBdxudvcdxvdxwdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaecudvddvddvddvddvddvddvddrTdIQdJGdILdDHdxydpJdwvdxzdxAdrDdKPdKOdLbdKUdLfdLddKcdrDdKAdKsdKIdKBdvzdKJeeMdxPecLdxRdpkdBvdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaedxSdxTdxpdxUdxVdxWdxXdxYdxudxZdxwdyadxvdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaeeJdycdyddyeecDdycdyddygdyhdEWecAecBecBecBdrDdrDdrDdrDdrDdICdwqdIKdxEdrEdxGdGudrDdyqdFRdHidHgdrDdGweeLdpDdpCdyzdyAdyBdrDdyCecEeaKeaKeaKeaKeaKeaKecFebJaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -12328,7 +12330,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndH aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdGpdHZdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdsadsaaaaaaaaaaaaadqTdsadsaaaaaaaaaadsadsadsadsadsadsadsadsadqTdqTdBvdCidCidCidHSdCidCidCiduDdCiduDdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdsadsadsadsadsadsadsadqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdGpdGpdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaadsadsaaaaaaaaaadsadsadsadsadsadsadsadsadqTdqTdBvdCidCidCidHSdCidCidCidCidCiduDdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdsadsadsadsadsadsadsadqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdGpdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadqTdqTdBvdCidCidCidHSdCidCidCidCieeeecNecNecNecNecNecNecNecNecNecNecNecNdsadsadsadsadsadsadsadsadsadqTdqTdsadsadsadsadsadsadqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadqTdqTdBvdCidCidCidHSdCidCidCidCidIeedRedNedMedLedVegFedTegGecNeedeeaecNdsadsadsadsadsadsadsadsadsadsadqTdqTdqTdsadsadsadsadqTdqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadqTdqTdBvdCidCidCidHSdCidCidCidCidIeedRedNedMedLedVegFedTegGecNeedehkecNdsadsadsadsadsadsadsadsadsadsadqTdqTdqTdsadsadsadsadqTdqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadqTdqTdBvdBvdCidCidHSdCidCidCidCiedvedxedwedzedyedAedmedCedBedIedHedKecNdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdsadsadsadsadqTdqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHVdHVdHVdHVdHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaadqTaaaaaaaaaaaadsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidHSdCidCidCidCiecNecNecNecNecNecNeduegHedqecNedpedoecNdsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdsadsadsadqTdqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHVdHVdHVdHVdHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaadsadsadsaaaaaaadsadsadsadsadsadsadsadsadsadqTdBvdCidCidIadIcedaecYecYedbecVecUecXecWedkedfedmedleddedcedeecNdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdsadsadqTdqTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -12427,8 +12429,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndsadsadqTdBvdCidCidJodLlehzdLmdKadYWdLodLpdJAdhfdhcdLsefGdLudLvdIkdIldIcdIcdIcdIcdIcdIbdCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadqTdqTdqTdqTdBvdBvdCidCidIhdIcdIcdIcdIcdIcdIcdIcdIcdIkdIldIcdIcdIcdIcdIbdCidCidCidCidCidBvdqTdqTdqTdqTdqTdIPdLwdLxdLydKmdKmdMvdKmdKmdKzdRudwNdLCdMIdZadQodQodPIdLEdJxdJydLFdLGdLGdLGdLGdLGdLGdLGdLHdLHdLHdLHdLHdLHdLHdKGdLIdLJdLKdLadYZdYYdMTdMKdLNdLNdLPdLOdNZdPGeeQdLUdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndsadsadqTdBvdCidCidJodJodJodJodJodZbdLWdLXdJodJodLYdJodJodJodJodHEdHGdCidCidCidCidCidHSdCidCidCidCidBvdCidBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdBvdCidCidCidHSdCidCidCidCidCidCidCidCidHEdHGdCidCidCidCidHSdCidCidCidCidCidBvdBvdDQdBvdBvdqTdIPdIPdIPdIPdZJdPzdZIdZDdZDdZDdZBdZFdZidZldZidZudZtdZMdZNdZidZNdZKdZKdZKdZKdZKdZKdZKdZKdZgdZgdZgdZgdZgdZgdZgdZfdZddZfdZedZddZcdLadMqdUtdMsdMXdMYdANdNCdQsdNadHGdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndsadsadqTdBvdBvdCidCidCidCidCidJodZQdMzdMAehAdJodMCefHecJdCidCidCidCidCidHUdCidCidCidIadIcdIcdIbdCidCidCidCidBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdCidCidIhdIcdIidCidCidCidCidBvdCidCidHUdCidCidCidCidCidCidHSdCidCidCidCidCidCidCidJfdCidBvdBvdBvdBvdBvdIPdKmdMIdKmdKmdKmdKmeajdMIeaceamdKmealdKmdZWdZZdJxdJydZSdZSdZSdZSdZSdZSdZSdZSdZTdZTdZTdZTdZTdZTeawdKGdLIdOOeazdLaeasdLadMZdKFdKFdKFdKFdKFdKFdKFdKFdNbdNbdNcdNbdFrdDPdBvdqTdqTdsadsadsadsadqTdqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadqTdBvdBvdCidCidCidCidJodNddNedNfeaAdJodCidCidCidCidCidCidBvdBvdDQdBvdCidCidCidCidCidHSdCidCidCidCidCidBvdqTdqTdqTdqTdqTdBvdBvdBvdBvdBvdCidIhdIidCidCidCidBvdBvdBvdBvdBvdBvdDQdCidCidCidCidCidCidHSdCidCidCidCidCidCidCidCidCidCidCidBvdBvdIPdIPdNheeVdNhdIPdIPdNjdNkeaDdIPdIPdNhdZAdNhdIPdNodCidCidCiaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaadNpdKHdLaeaJeaEdNsdNtdNudNudNvdKFdNwdNxdNydNzdNzdNzdNzdFrdCidBvdqTdqTdsadsadsadsadqTdqTdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadqTdBvdBvdCidCidCidJodJodJodJodJodJodCidCidBvdBvdBvdBvdBvdqTdqTdBvdBvdCidCidCidCidHSdCidCidCidCidCidCidBvdBvdBvdBvdBvdBvdCidCidCidCidCidHSdCidCidBvdBvdBvdqTdqTdqTdqTdqTdBvdCidCidCidCidCidCidHSdCidCidCidIedHJdCidCidCidCidCidCidCidBvdIPdNAdNBdQtdNBdIPeaOdNEdNFeaRdNHdIPefIdZUdZPdIPdCidCidCidCidCidCiaaaaaaaaeaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaedKFdNLeaNeaMdKFdKFdKFdKFdNNdKFdNOdKFdKFdNPdFrdFrdFrdFrdCidBvdqTdqTdsadsadsadqTdqTdsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadqTdBvdBvdCidCidCidCidJodNddNedNfehHdJodCidCidCidCidCidCidBvdBvdDQdBvdCidCidCidCidCidHSdCidCidCidCidCidBvdqTdqTdqTdqTdqTdBvdBvdBvdBvdBvdCidIhdIidCidCidCidBvdBvdBvdBvdBvdBvdDQdCidCidCidCidCidCidHSdCidCidCidCidCidCidCidCidCidCidCidBvdBvdIPdIPdNheeVdNhdIPdIPdNjdNkeaDdIPdIPdNhdZAdNhdIPdNodCidCidCiaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaadNpdKHdLaeaJeaEdNsdNtdNudNudNvdKFdNwdNxdNydNzdNzdNzdNzdFrdCidBvdqTdqTdsadsadsadsadqTdqTdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadqTdBvdBvdCidCidCidJodJodJodJodJodJodCidCidBvdBvdBvdBvdBvdqTdqTdBvdBvdCidCidCidCidHSdCidCidCidCidCidCidBvdBvdBvdBvdBvdBvdCidCidCidCidCidHSdCidCidBvdBvdBvdqTdqTdqTdqTdqTdBvdCidCidCidCidCidCidHSdCidCidCidIedHJdCidCidCidCidCidCidCidBvdIPdNAdNBdQtdNBdIPehIdNEdNFeaRdNHdIPefIdZUdZPdIPdCidCidCidCidCidCiaaaaaaaaeaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaedKFdNLeaNeaMdKFdKFdKFdKFdNNdKFdNOdKFdKFdNPdFrdFrdFrdFrdCidBvdqTdqTdsadsadsadqTdqTdsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidBvdqTdqTdqTdqTdqTdqTdqTdBvdBvdCidCidCidIadIcdIcdIcdIbdCidCidCidCidCidCidCidCidCidCidCidCidCidHSdCidBvdBvdqTdqTdqTdqTdqTdqTdqTdBvdBvdCidCidCidCidCidIadIcdIcdIcdIkdIldIcdIcdIcdIbdCidCidCidCidIPdNQdNRehBdNTdIPdwXdNVdNVeaUdNHdIPeeRefieeUdIPdCidCidCidCidCidCiaaeaaeaaeaaeaaeaaeaaedOadOadOadOadOaaaeaaaaaadKFdYoeaSdLadOddOedOfdNudNudOgdNudNvdKFdCidCidCidCidCidBvdBvdqTdqTdsadsadqTdqTdqTdsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadqTdBvdCidCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdBvdBvdBvdCidCidCidCidCidIadIbdCidCidIedHJdCidCidIhdIcdIcdIcdIcdIcdIidCidBvdqTdqTdqTdqTdsadsadsadqTdqTdBvdBvdBvdCidCidCidCidCidCidCidHEdHGdCidCidCidHSdCidCidCidCidIPdIPdIPdIPdIPdIPdOhdOidOjeaVdNHdIPdNheeXdNhdIPdCidCidCidCidCidCiaaaaaaaaeaaaaaaaaaaaedOadOadOadOadOaaaeaaadKYdKHdLaeaYeaXdKFdKFdKFdKFdKFdKFdOpdOqdKFdCidCidCidCidCidBvdqTdqTdsadsadsadqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadBvdBvdBvdBvdCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdBvdBvdCidHUdCidCidIadIcdIcdIkdIldIcdIcdIidCidCidCidCidCidCidCidBvdqTdqTdqTdsadsadsadsadsadqTdqTdqTdBvdBvdBvdBvdCidCidCidCidCidCidCidCidCidIadIcdIcdIbdCidCidCidCidCidCidIPdIPdIPdIPdIPdIPdIPdFpdOrdOsdOtdCidCidCidCidCiaaaaaaaaaaaeaaaaaaaaaaaedOadOadOadOadOadOudLIdOvdOwebaebddQbebcebbebiebhebgebfdOEdOqdKFdCidCidCidCidBvdBvdqTdqTdsadsadqTdqTdqTdqTdsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 7a5b965907f281a8822cc07d8eb6fa0b77650864 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Wed, 5 Nov 2014 17:06:01 +0000 Subject: [PATCH 6/9] Fixes newly-vended laptops opening windows and giving close messages --- code/WorkInProgress/computer3/computer.dm | 2 -- code/WorkInProgress/computer3/laptop.dm | 9 +++++++-- code/WorkInProgress/computer3/lapvend.dm | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/WorkInProgress/computer3/computer.dm b/code/WorkInProgress/computer3/computer.dm index 456bdf3d71f..4939444ae50 100644 --- a/code/WorkInProgress/computer3/computer.dm +++ b/code/WorkInProgress/computer3/computer.dm @@ -131,8 +131,6 @@ for(var/typekey in spawn_files) hdd.addfile(new typekey,1) - if(program) - program.execute(os) update_icon() diff --git a/code/WorkInProgress/computer3/laptop.dm b/code/WorkInProgress/computer3/laptop.dm index 52d996827b6..e0156e874e2 100644 --- a/code/WorkInProgress/computer3/laptop.dm +++ b/code/WorkInProgress/computer3/laptop.dm @@ -138,6 +138,9 @@ usr << "You can't reach it." return + close_laptop(usr) + + proc/close_laptop(mob/user = null) if(istype(loc,/obj/item/device/laptop)) testing("Close closed computer") return @@ -146,7 +149,8 @@ return if(stat&BROKEN) - usr << "\The [src] is broken! You can't quite get it closed." + if(user) + user << "\The [src] is broken! You can't quite get it closed." return if(!portable) @@ -157,7 +161,8 @@ portable.loc = loc loc = portable stat |= MAINT - usr << "You close \the [src]." + if(user) + user << "You close \the [src]." auto_use_power() if(stat&MAINT) diff --git a/code/WorkInProgress/computer3/lapvend.dm b/code/WorkInProgress/computer3/lapvend.dm index b6f93f4702f..36de9e4cfc9 100644 --- a/code/WorkInProgress/computer3/lapvend.dm +++ b/code/WorkInProgress/computer3/lapvend.dm @@ -263,7 +263,7 @@ choose_progs(C) vend() popup.close() - newlap.close_computer() + newlap.close_laptop() newlap = null cardreader = 0 floppy = 0 From f92270393802baf6b97bb701cc4be126c9765da6 Mon Sep 17 00:00:00 2001 From: MagmaRam Date: Wed, 5 Nov 2014 14:43:12 -0500 Subject: [PATCH 7/9] Adds alternate CMO labcoat, with blue trim. It's in the CMO's locker as well as the regular (solid blue) labcoat. The CMO still spawns with the solid blue one. --- .../crates_lockers/closets/secure/medical.dm | 1 + code/modules/clothing/suits/labcoat.dm | 11 +++++++++++ icons/mob/suit.dmi | Bin 250648 -> 252843 bytes icons/obj/clothing/suits.dmi | Bin 91179 -> 91912 bytes 4 files changed, 12 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index c57cafd2e95..e36dd4759d7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -135,6 +135,7 @@ new /obj/item/clothing/head/surgery/purple(src) new /obj/item/clothing/under/rank/chief_medical_officer(src) new /obj/item/clothing/suit/storage/labcoat/cmo(src) + new /obj/item/clothing/suit/storage/labcoat/cmoalt(src) new /obj/item/weapon/cartridge/cmo(src) new /obj/item/clothing/gloves/latex(src) new /obj/item/clothing/shoes/brown (src) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index e11936e47a4..00a99184470 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -61,6 +61,12 @@ if("labcoat_cmo") src.icon_state = "labcoat_cmo_open" usr << "You unbutton the labcoat." + if("labcoat_cmoalt_open") + src.icon_state = "labcoat_cmoalt" + usr << "You button up the labcoat." + if("labcoat_cmoalt") + src.icon_state = "labcoat_cmoalt_open" + usr << "You unbutton the labcoat." if("labcoat_gen_open") src.icon_state = "labcoat_gen" usr << "You button up the labcoat." @@ -132,6 +138,11 @@ icon_state = "labcoat_cmo_open" item_state = "labcoat_cmo" +/obj/item/clothing/suit/storage/labcoat/cmoalt + name = "chief medical officer labcoat" + desc = "A labcoat with command blue highlights." + icon_state = "labcoat_cmoalt_open" + /obj/item/clothing/suit/storage/labcoat/mad name = "The Mad's labcoat" desc = "It makes you look capable of konking someone on the noggin and shooting them into space." diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index f88e2c764a527bc26ecab5a332f9c35f8b5bd242..127de82364be0dc596de71f610b0a44ce34a8114 100644 GIT binary patch delta 20062 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 R1F{N1hxYsVQ2!mC^*0loi(3Ey delta 17592 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 diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 65568e7ccfccd2766e0b16afcca7c4cc8545cea2..1d02d3f8e5b474c5f475bd17cf55d7091a1ca75f 100644 GIT binary patch delta 18379 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 faPUPeF#q{K>*q@C+JHOv7=Xaj)z4*}Q$iB}*!k Date: Wed, 5 Nov 2014 16:53:17 -0500 Subject: [PATCH 8/9] Full Window returns stacked glass Tweaked code to make a full window return a stack of two, rather than two separate sheets. --- code/game/objects/structures/window.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 028f95ac624..4db3ed1078f 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -225,11 +225,8 @@ else visible_message("[user] dismantles \the [src].") if(dir == SOUTHWEST) - var/index = null - index = 0 - while(index < 2) - new glasstype(loc) - index++ + var/obj/item/stack/sheet/mats = new glasstype(loc) + mats.amount = 2 else new glasstype(loc) del(src) From 77c52f48a8aecf986f2aa241785ffde403ffae36 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 6 Nov 2014 13:24:13 +0100 Subject: [PATCH 9/9] Newscaster and photo cleanup Synthetics can no longer magically print color images on a black-and-white photocopier. No longer possible for organics to acquire a synth-image by un-attaching it from a newscaster. News articles now come with a timestamp and photo captions, if anything was penned on an attached photo. Reception-checks no longer unconditionally sleeps the thread. Was causing havoc with NanoUI. Misc. code refactoring. --- code/WorkInProgress/periodic_news.dm | 9 +- code/defines/procs/announce.dm | 2 +- code/defines/procs/radio.dm | 8 +- code/game/machinery/newscaster.dm | 178 +++++++++--------- code/game/machinery/telecomms/broadcaster.dm | 7 +- code/game/objects/items/devices/PDA/PDA.dm | 66 ++++--- code/modules/admin/topic.dm | 6 +- code/modules/economy/Events.dm | 40 ++-- code/modules/economy/Events_Mundane.dm | 87 +++++---- code/modules/economy/economy_misc.dm | 22 +-- code/modules/events/money_lotto.dm | 11 +- code/modules/paperwork/photocopier.dm | 36 ++-- code/modules/paperwork/photography.dm | 17 +- code/modules/paperwork/silicon_photography.dm | 31 ++- nano/css/shared.css | 10 + nano/templates/pda.tmpl | 17 +- 16 files changed, 270 insertions(+), 277 deletions(-) diff --git a/code/WorkInProgress/periodic_news.dm b/code/WorkInProgress/periodic_news.dm index f5219aa4359..099da60ba3d 100644 --- a/code/WorkInProgress/periodic_news.dm +++ b/code/WorkInProgress/periodic_news.dm @@ -143,10 +143,5 @@ proc/announce_newscaster_news(datum/news_announcement/news) sendto.is_admin_channel = 1 news_network.network_channels += sendto - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = news.author ? news.author : sendto.author - newMsg.is_admin_message = !news.can_be_redacted - newMsg.body = news.message - newMsg.message_type = news.message_type - - news_network.insert_message_in_channel(sendto, newMsg) + var/author = news.author ? news.author : sendto.author + news_network.SubmitArticle(news.message, author, news.channel_name, null, !news.can_be_redacted, news.message_type) diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 54bdd953974..b74f7a1c78f 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -7,7 +7,7 @@ var/log = 0 var/sound var/newscast = 0 - var/channel_name = "Public Station Announcements" + var/channel_name = "Station Announcements" var/announcement_type = "Announcement" /datum/announcement/New(var/do_log = 0, var/new_sound = null, var/do_newscast = 0) diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm index 0846502ede1..7c0c07ec1e7 100644 --- a/code/defines/procs/radio.dm +++ b/code/defines/procs/radio.dm @@ -51,27 +51,27 @@ return TELECOMMS_RECEPTION_RECEIVER return TELECOMMS_RECEPTION_NONE -/proc/get_reception(var/atom/sender, var/receiver, var/message = "") +/proc/get_reception(var/atom/sender, var/receiver, var/message = "", var/do_sleep = 1) var/datum/reception/reception = new // check if telecomms I/O route 1459 is stable //var/telecomms_intact = telecomms_process(P.owner, owner, t) reception.message_server = get_message_server() - var/datum/signal/signal = sender.telecomms_process() // Be aware that this proc calls sleep, to simulate transmition delays + var/datum/signal/signal = sender.telecomms_process(do_sleep) // Be aware that this proc calls sleep, to simulate transmition delays reception.telecomms_reception |= get_sender_reception(sender, signal) reception.telecomms_reception |= get_receiver_reception(receiver, signal) reception.message = signal && signal.data["compression"] > 0 ? Gibberish(message, signal.data["compression"] + 50) : message return reception -/proc/get_receptions(var/atom/sender, var/list/atom/receivers) +/proc/get_receptions(var/atom/sender, var/list/atom/receivers, var/do_sleep = 1) var/datum/receptions/receptions = new receptions.message_server = get_message_server() var/datum/signal/signal if(sender) - signal = sender.telecomms_process() + signal = sender.telecomms_process(do_sleep) receptions.sender_reception = get_sender_reception(sender, signal) for(var/atom/receiver in receivers) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 165602fabb0..c9a1ddb6576 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -7,36 +7,35 @@ var/body ="" var/message_type ="Story" var/datum/feed_channel/parent_channel - var/backup_body ="" - var/backup_author ="" var/is_admin_message = 0 var/icon/img = null - var/icon/backup_img + var/icon/caption = "" + var/time_stamp = "" + var/backup_body = "" + var/backup_author = "" + var/icon/backup_img = null + var/icon/backup_caption = "" /datum/feed_channel var/channel_name="" var/list/datum/feed_message/messages = list() - //var/message_count = 0 var/locked=0 var/author="" var/backup_author="" var/censored=0 var/is_admin_channel=0 var/updated = 0 - //var/page = null //For newspapers - -/datum/feed_channel/proc/announce_news() - return "Breaking news from [channel_name]!" - -/datum/feed_channel/station/announce_news() - return "New Station Announcement Available" + var/announcement = "" /datum/feed_message/proc/clear() src.author = "" src.body = "" + src.caption = "" + src.img = null + src.time_stamp = "" src.backup_body = "" src.backup_author = "" - src.img = null + src.backup_caption = "" src.backup_img = null parent_channel.update() @@ -51,24 +50,49 @@ src.backup_author = "" src.censored = 0 src.is_admin_channel = 0 + src.announcement = "" update() /datum/feed_network var/list/datum/feed_channel/network_channels = list() var/datum/feed_message/wanted_issue -/datum/feed_network/proc/add_news(var/channel_name, var/datum/feed_message/newMsg) - for(var/datum/feed_channel/FC in news_network.network_channels) +/datum/feed_network/New() + CreateFeedChannel("Station Announcements", "SS13", 1, 1, "New Station Announcement Available") + +/datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0, var/announcement_message) + var/datum/feed_channel/newChannel = new /datum/feed_channel + newChannel.channel_name = channel_name + newChannel.author = author + newChannel.locked = locked + newChannel.is_admin_channel = adminChannel + if(announcement_message) + newChannel.announcement = announcement_message + else + newChannel.announcement = "Breaking news from [channel_name]!" + network_channels += newChannel + +/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "") + var/datum/feed_message/newMsg = new /datum/feed_message + newMsg.author = author + newMsg.body = msg + newMsg.time_stamp = "[worldtime2text()]" + newMsg.is_admin_message = adminMessage + if(message_type) + newMsg.message_type = message_type + if(photo) + newMsg.img = photo.img + newMsg.caption = photo.scribble + for(var/datum/feed_channel/FC in network_channels) if(FC.channel_name == channel_name) - insert_message_in_channel(FC, newMsg) + insert_message_in_channel(FC, newMsg) //Adding message to the network's appropriate feed_channel break /datum/feed_network/proc/insert_message_in_channel(var/datum/feed_channel/FC, var/datum/feed_message/newMsg) - FC.messages += newMsg //Adding message to the network's appropriate feed_channel + FC.messages += newMsg newMsg.parent_channel = FC FC.update() - var/announcement = FC.announce_news() - alert_readers(announcement) + alert_readers(FC.announcement) /datum/feed_network/proc/alert_readers(var/annoncement) for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) @@ -135,7 +159,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co // 1 = there has var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster var/msg = ""; //Feed message - var/obj/item/weapon/photo/photo = null + var/datum/news_photo/photo_data = null var/channel_name = ""; //the feed channel which will be receiving the feed, or being created var/c_locked=0; //Will our new channel be locked to public submissions? var/hitstaken = 0 //Death at 3 hits from an item with force>=15 @@ -260,14 +284,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="[CHANNEL.channel_name]
" else dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" - /*for(var/datum/feed_channel/CHANNEL in src.channel_list) - dat+="[CHANNEL.channel_name]:
\[created by: [CHANNEL.author]\]

" - if( isemptylist(CHANNEL.messages) ) - dat+="No feed messages found in channel...

" - else - for(var/datum/feed_message/MESSAGE in CHANNEL.messages) - dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"*/ - dat+="

Refresh" dat+="
Back" if(2) @@ -281,7 +297,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
Receiving Channel: [src.channel_name]
" //MARK dat+="Message Author: [src.scanned_user]
" dat+="Message Body: [src.msg]
" - dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]
" + dat+="Attach Photo: [(src.photo_data ? "Photo Attached" : "No Photo")]
" dat+="
Submit

Cancel
" if(4) dat+="Feed story successfully submitted to [src.channel_name].

" @@ -301,10 +317,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" - //var/list/existing_channels = list() //Let's get dem existing channels - OBSOLETE var/list/existing_authors = list() for(var/datum/feed_channel/FC in news_network.network_channels) - //existing_channels += FC.channel_name //OBSOLETE if(FC.author == "\[REDACTED\]") existing_authors += FC.backup_author else @@ -351,8 +365,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="-[MESSAGE.body]
" if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") - dat+="

" - dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]
" + dat+="
" + if(MESSAGE.caption) + dat+="[MESSAGE.caption]
" + dat+="
" + dat+="\[Story by [MESSAGE.author] - [MESSAGE.time_stamp]\]
" dat+="

Refresh" dat+="
Back" if(10) @@ -417,7 +434,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
" dat+="Criminal Name: [src.channel_name]
" dat+="Description: [src.msg]
" - dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]
" + dat+="Attach Photo: [(src.photo_data ? "Photo Attached" : "No Photo")]
" if(wanted_already) dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
" else @@ -468,14 +485,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co human_or_robot_user << browse(dat, "window=newscaster_main;size=400x600") onclose(human_or_robot_user, "newscaster_main") - /*if(src.isbroken) //debugging shit - return - src.hitstaken++ - if(src.hitstaken==3) - src.isbroken = 1 - src.update_icon()*/ - - /obj/machinery/newscaster/Topic(href, href_list) if(..()) return @@ -512,14 +521,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") - var/datum/feed_channel/newChannel = new /datum/feed_channel - newChannel.channel_name = src.channel_name - newChannel.author = src.scanned_user - newChannel.locked = c_locked - feedback_inc("newscaster_channels",1) - /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters. - NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE - news_network.network_channels += newChannel //Adding channel to the global network + news_network.CreateFeedChannel(src.channel_name, src.scanned_user, c_locked) src.screen=5 src.updateUsrDialog() //src.update_icon() @@ -547,13 +549,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) src.screen=6 else - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = src.scanned_user - newMsg.body = src.msg - if(photo) - newMsg.img = photo.img + var/image = photo_data ? photo_data.photo : null feedback_inc("newscaster_stories",1) - news_network.add_news(src.channel_name, newMsg) + news_network.SubmitArticle(src.msg, src.scanned_user, src.channel_name, image, 0) src.screen=4 src.updateUsrDialog() @@ -620,8 +618,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co WANTED.author = src.channel_name WANTED.body = src.msg WANTED.backup_author = src.scanned_user //I know, a bit wacky - if(photo) - WANTED.img = photo.img + if(photo_data) + WANTED.img = photo_data.photo.img news_network.wanted_issue = WANTED news_network.alert_readers() src.screen = 15 @@ -632,8 +630,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co news_network.wanted_issue.author = src.channel_name news_network.wanted_issue.body = src.msg news_network.wanted_issue.backup_author = src.scanned_user - if(photo) - news_network.wanted_issue.img = photo.img + if(photo_data) + news_network.wanted_issue.img = photo_data.photo.img src.screen = 19 src.updateUsrDialog() @@ -684,16 +682,18 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(MSG.is_admin_message) alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") return - if(MSG.img != null) - MSG.backup_img = MSG.img - MSG.img = null - else - MSG.img = MSG.backup_img if(MSG.body != "\[REDACTED\]") MSG.backup_body = MSG.body + MSG.backup_caption = MSG.caption + MSG.backup_img = MSG.img MSG.body = "\[REDACTED\]" + MSG.caption = "\[REDACTED\]" + MSG.img = null else MSG.body = MSG.backup_body + MSG.caption = MSG.caption + MSG.img = MSG.backup_img + MSG.parent_channel.update() src.updateUsrDialog() @@ -744,19 +744,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attackby(obj/item/I as obj, mob/user as mob) - -/* if (istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda) ) //Name verification for channels or messages - if(src.screen == 4 || src.screen == 5) - if( istype(I, /obj/item/device/pda) ) - var/obj/item/device/pda/P = I - if(P.id) - src.scanned_user = "[P.id.registered_name] ([P.id.assignment])" - src.screen=2 - else - var/obj/item/weapon/card/id/T = I - src.scanned_user = text("[T.registered_name] ([T.assignment])") - src.screen=2*/ //Obsolete after autorecognition - if (src.isbroken) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1) for (var/mob/O in hearers(5, src.loc)) @@ -791,25 +778,34 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co user << "The newscaster controls are far too complicated for your tiny brain!" return +/datum/news_photo + var/is_synth = 0 + var/obj/item/weapon/photo/photo = null + +/datum/news_photo/New(var/obj/item/weapon/photo/p, var/synth) + is_synth = synth + photo = p + /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) - if(photo) - if(!issilicon(user)) - photo.loc = src.loc - user.put_in_inactive_hand(photo) - photo = null + if(photo_data) + if(!photo_data.is_synth) + photo_data.photo.loc = src.loc + if(!issilicon(user)) + user.put_in_inactive_hand(photo_data.photo) + del(photo_data) + if(istype(user.get_active_hand(), /obj/item/weapon/photo)) - photo = user.get_active_hand() + var/obj/item/photo = user.get_active_hand() user.drop_item() photo.loc = src + photo_data = new(photo, 0) else if(istype(user,/mob/living/silicon)) var/mob/living/silicon/tempAI = user - var/datum/picture/selection = tempAI.GetPicture() + var/obj/item/weapon/photo/selection = tempAI.GetPicture() if (!selection) return - var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() - P.construct(selection) - photo = P + photo_data = new(selection, 1) //######################################################################################################################## @@ -831,10 +827,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/scribble="" var/scribble_page = null -/*obj/item/weapon/newspaper/attack_hand(mob/user as mob) - ..() - world << "derp"*/ - obj/item/weapon/newspaper/attack_self(mob/user as mob) if(ishuman(user)) var/mob/living/carbon/human/human_user = user @@ -974,12 +966,12 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo! var/obj/item/device/pda/P = human_user.wear_id if(P.id) - src.scanned_user = "[P.id.registered_name] ([P.id.assignment])" + src.scanned_user = GetNameAndAssignmentFromId(P.id) else src.scanned_user = "Unknown" else if(istype(human_user.wear_id, /obj/item/weapon/card/id) ) var/obj/item/weapon/card/id/ID = human_user.wear_id - src.scanned_user ="[ID.registered_name] ([ID.assignment])" + src.scanned_user = GetNameAndAssignmentFromId(ID) else src.scanned_user ="Unknown" else diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 5bc531e571f..9994e713401 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -641,7 +641,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/turf/position = get_turf(src) return (position.z in signal.data["level"] && signal.data["done"]) -/atom/proc/telecomms_process() +/atom/proc/telecomms_process(var/do_sleep = 1) // First, we want to generate a new radio signal var/datum/signal/signal = new @@ -664,8 +664,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept //#### Sending the signal to all subspace receivers ####// for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) - - sleep(rand(10,25)) + + if(do_sleep) + sleep(rand(10,25)) //world.log << "Level: [signal.data["level"]] - Done: [signal.data["done"]]" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index d7a5891e170..7b55d2ad22c 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -418,6 +418,10 @@ var/global/list/obj/item/device/pda/PDAs = list() data["new_Message"] = new_message data["new_News"] = new_news + var/datum/reception/reception = get_reception(src, do_sleep = 0) + var/has_reception = reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER + data["reception"] = has_reception + if(mode==2) var/convopdas[0] var/pdas[0] @@ -478,43 +482,43 @@ var/global/list/obj/item/device/pda/PDAs = list() if(isnull(data["aircontents"])) data["aircontents"] = list("reading" = 0) if(mode==6) - if(news_network.network_channels.len != feeds.len) - var/datum/reception/reception = get_reception(src) - if(reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER) - feeds.Cut() - for(var/datum/feed_channel/channel in news_network.network_channels) - feeds[++feeds.len] = list("name" = channel.channel_name, "censored" = channel.censored) - + if(has_reception) + feeds.Cut() + for(var/datum/feed_channel/channel in news_network.network_channels) + feeds[++feeds.len] = list("name" = channel.channel_name, "censored" = channel.censored) data["feedChannels"] = feeds if(mode==61) - var/list/feed = feed_info[active_feed] - if(!feed) - feed = list() - feed["updated"] = -1 - feed_info[active_feed] = feed var/datum/feed_channel/FC for(FC in news_network.network_channels) if(FC.channel_name == active_feed["name"]) break - if(FC.updated > feed["updated"]) - var/datum/reception/reception = get_reception(src) - if(reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER) - feed["channel"] = FC.channel_name - feed["author"] = FC.author - feed["updated"] = FC.updated - feed["censored"] = FC.censored - var/list/messages = list() - if(!FC.censored) - var/index = 0 - for(var/datum/feed_message/FM in FC.messages) - index++ - if(FM.img) - usr << browse_rsc(FM.img, "pda_news_tmp_photo_[feed["channel"]]_[index].png") - // News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI - var/body = replacetext(FM.body, "\n", "
") - messages[++messages.len] = list("author" = FM.author, "body" = body, "message_type" = FM.message_type, "has_image" = (FM.img != null), "index" = index) - feed["messages"] = messages + var/list/feed = feed_info[active_feed] + if(!feed) + feed = list() + feed["channel"] = FC.channel_name + feed["author"] = "Unknown" + feed["censored"]= 0 + feed["updated"] = -1 + feed_info[active_feed] = feed + + if(FC.updated > feed["updated"] && has_reception) + feed["author"] = FC.author + feed["updated"] = FC.updated + feed["censored"] = FC.censored + + var/list/messages = list() + if(!FC.censored) + var/index = 0 + for(var/datum/feed_message/FM in FC.messages) + index++ + if(FM.img) + usr << browse_rsc(FM.img, "pda_news_tmp_photo_[feed["channel"]]_[index].png") + // News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI + var/body = replacetext(FM.body, "\n", "
") + messages[++messages.len] = list("author" = FM.author, "body" = body, "message_type" = FM.message_type, "time_stamp" = FM.time_stamp, "has_image" = (FM.img != null), "caption" = FM.caption, "index" = index) + feed["messages"] = messages + data["feed"] = feed nanoUI = data @@ -783,7 +787,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if("Detonate")//Detonate PDA... maybe if(cartridge && cartridge.access_detonate_pda) var/obj/item/device/pda/P = locate(href_list["target"]) - var/datum/reception/reception = get_reception(src, P, "") // get_reception calls sleep further down the line + var/datum/reception/reception = get_reception(src, P, "", do_sleep = 0) if(!(reception.message_server && reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER)) U.show_message("\red An error flashes on your [src]: Connection unavailable", 1) return diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 6210c05a8b6..f74e26505ca 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2561,12 +2561,8 @@ if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" ) src.admincaster_screen = 6 else - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = src.admincaster_signature - newMsg.body = src.admincaster_feed_message.body - newMsg.is_admin_message = 1 feedback_inc("newscaster_stories",1) - news_network.add_news(src.admincaster_feed_channel.channel_name, newMsg) + news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1) src.admincaster_screen=4 log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!") diff --git a/code/modules/economy/Events.dm b/code/modules/economy/Events.dm index 5770e950268..dc78e1e06d4 100644 --- a/code/modules/economy/Events.dm +++ b/code/modules/economy/Events.dm @@ -52,46 +52,44 @@ affected_dest.temp_price_change[good_type] = rand(1,100) / 100 /datum/event/economic_event/announce() - //copy-pasted from the admin verbs to submit new newscaster messages - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = "Nyx Daily" - newMsg.is_admin_message = 1 + var/author = "Nyx Daily" + var/channel = author //see if our location has custom event info for this event - newMsg.body = affected_dest.get_custom_eventstring() - if(!newMsg.body) + var/body = affected_dest.get_custom_eventstring() + if(!body) switch(event_type) if(RIOTS) - newMsg.body = "[pick("Riots have","Unrest has")] broken out on planet [affected_dest.name]. Authorities call for calm, as [pick("various parties","rebellious elements","peacekeeping forces","\'REDACTED\'")] begin stockpiling weaponry and armour. Meanwhile, food and mineral prices are dropping as local industries attempt empty their stocks in expectation of looting." + body = "[pick("Riots have","Unrest has")] broken out on planet [affected_dest.name]. Authorities call for calm, as [pick("various parties","rebellious elements","peacekeeping forces","\'REDACTED\'")] begin stockpiling weaponry and armour. Meanwhile, food and mineral prices are dropping as local industries attempt empty their stocks in expectation of looting." if(WILD_ANIMAL_ATTACK) - newMsg.body = "Local [pick("wildlife","animal life","fauna")] on planet [affected_dest.name] has been increasing in agression and raiding outlying settlements for food. Big game hunters have been called in to help alleviate the problem, but numerous injuries have already occurred." + body = "Local [pick("wildlife","animal life","fauna")] on planet [affected_dest.name] has been increasing in agression and raiding outlying settlements for food. Big game hunters have been called in to help alleviate the problem, but numerous injuries have already occurred." if(INDUSTRIAL_ACCIDENT) - newMsg.body = "[pick("An industrial accident","A smelting accident","A malfunction","A malfunctioning piece of machinery","Negligent maintenance","A cooleant leak","A ruptured conduit")] at a [pick("factory","installation","power plant","dockyards")] on [affected_dest.name] resulted in severe structural damage and numerous injuries. Repairs are ongoing." + body = "[pick("An industrial accident","A smelting accident","A malfunction","A malfunctioning piece of machinery","Negligent maintenance","A cooleant leak","A ruptured conduit")] at a [pick("factory","installation","power plant","dockyards")] on [affected_dest.name] resulted in severe structural damage and numerous injuries. Repairs are ongoing." if(BIOHAZARD_OUTBREAK) - newMsg.body = "[pick("A \'REDACTED\'","A biohazard","An outbreak","A virus")] on [affected_dest.name] has resulted in quarantine, stopping much shipping in the area. Although the quarantine is now lifted, authorities are calling for deliveries of medical supplies to treat the infected, and gas to replace contaminated stocks." + body = "[pick("A \'REDACTED\'","A biohazard","An outbreak","A virus")] on [affected_dest.name] has resulted in quarantine, stopping much shipping in the area. Although the quarantine is now lifted, authorities are calling for deliveries of medical supplies to treat the infected, and gas to replace contaminated stocks." if(PIRATES) - newMsg.body = "[pick("Pirates","Criminal elements","A [pick("mercenary","Donk Co.","Waffle Co.","\'REDACTED\'")] strike force")] have [pick("raided","blockaded","attempted to blackmail","attacked")] [affected_dest.name] today. Security has been tightened, but many valuable minerals were taken." + body = "[pick("Pirates","Criminal elements","A [pick("mercenary","Donk Co.","Waffle Co.","\'REDACTED\'")] strike force")] have [pick("raided","blockaded","attempted to blackmail","attacked")] [affected_dest.name] today. Security has been tightened, but many valuable minerals were taken." if(CORPORATE_ATTACK) - newMsg.body = "A small [pick("pirate","Cybersun Industries","Gorlex Marauders","mercenary")] fleet has precise-jumped into proximity with [affected_dest.name], [pick("for a smash-and-grab operation","in a hit and run attack","in an overt display of hostilities")]. Much damage was done, and security has been tightened since the incident." + body = "A small [pick("pirate","Cybersun Industries","Gorlex Marauders","mercenary")] fleet has precise-jumped into proximity with [affected_dest.name], [pick("for a smash-and-grab operation","in a hit and run attack","in an overt display of hostilities")]. Much damage was done, and security has been tightened since the incident." if(ALIEN_RAIDERS) if(prob(20)) - newMsg.body = "The Tiger Co-operative have raided [affected_dest.name] today, no doubt on orders from their enigmatic masters. Stealing wildlife, farm animals, medical research materials and kidnapping civilians. NanoTrasen authorities are standing by to counter attempts at bio-terrorism." + body = "The Tiger Co-operative have raided [affected_dest.name] today, no doubt on orders from their enigmatic masters. Stealing wildlife, farm animals, medical research materials and kidnapping civilians. NanoTrasen authorities are standing by to counter attempts at bio-terrorism." else - newMsg.body = "[pick("The alien species designated \'United Exolitics\'","The alien species designated \'REDACTED\'","An unknown alien species")] have raided [affected_dest.name] today, stealing wildlife, farm animals, medical research materials and kidnapping civilians. It seems they desire to learn more about us, so the Navy will be standing by to accomodate them next time they try." + body = "[pick("The alien species designated \'United Exolitics\'","The alien species designated \'REDACTED\'","An unknown alien species")] have raided [affected_dest.name] today, stealing wildlife, farm animals, medical research materials and kidnapping civilians. It seems they desire to learn more about us, so the Navy will be standing by to accomodate them next time they try." if(AI_LIBERATION) - newMsg.body = "A [pick("\'REDACTED\' was detected on","S.E.L.F operative infiltrated","malignant computer virus was detected on","rogue [pick("slicer","hacker")] was apprehended on")] [affected_dest.name] today, and managed to infect [pick("\'REDACTED\'","a sentient sub-system","a class one AI","a sentient defence installation")] before it could be stopped. Many lives were lost as it systematically begin murdering civilians, and considerable work must be done to repair the affected areas." + body = "A [pick("\'REDACTED\' was detected on","S.E.L.F operative infiltrated","malignant computer virus was detected on","rogue [pick("slicer","hacker")] was apprehended on")] [affected_dest.name] today, and managed to infect [pick("\'REDACTED\'","a sentient sub-system","a class one AI","a sentient defence installation")] before it could be stopped. Many lives were lost as it systematically begin murdering civilians, and considerable work must be done to repair the affected areas." if(MOURNING) - newMsg.body = "[pick("The popular","The well-liked","The eminent","The well-known")] [pick("professor","entertainer","singer","researcher","public servant","administrator","ship captain","\'REDACTED\'")], [pick( random_name(pick(MALE,FEMALE)), 40; "\'REDACTED\'" )] has [pick("passed away","committed suicide","been murdered","died in a freakish accident")] on [affected_dest.name] today. The entire planet is in mourning, and prices have dropped for industrial goods as worker morale drops." + body = "[pick("The popular","The well-liked","The eminent","The well-known")] [pick("professor","entertainer","singer","researcher","public servant","administrator","ship captain","\'REDACTED\'")], [pick( random_name(pick(MALE,FEMALE)), 40; "\'REDACTED\'" )] has [pick("passed away","committed suicide","been murdered","died in a freakish accident")] on [affected_dest.name] today. The entire planet is in mourning, and prices have dropped for industrial goods as worker morale drops." if(CULT_CELL_REVEALED) - newMsg.body = "A [pick("dastardly","blood-thirsty","villanous","crazed")] cult of [pick("The Elder Gods","Nar'sie","an apocalyptic sect","\'REDACTED\'")] has [pick("been discovered","been revealed","revealed themselves","gone public")] on [affected_dest.name] earlier today. Public morale has been shaken due to [pick("certain","several","one or two")] [pick("high-profile","well known","popular")] individuals [pick("performing \'REDACTED\' acts","claiming allegiance to the cult","swearing loyalty to the cult leader","promising to aid to the cult")] before those involved could be brought to justice. The editor reminds all personnel that supernatural myths will not be tolerated on NanoTrasen facilities." + body = "A [pick("dastardly","blood-thirsty","villanous","crazed")] cult of [pick("The Elder Gods","Nar'sie","an apocalyptic sect","\'REDACTED\'")] has [pick("been discovered","been revealed","revealed themselves","gone public")] on [affected_dest.name] earlier today. Public morale has been shaken due to [pick("certain","several","one or two")] [pick("high-profile","well known","popular")] individuals [pick("performing \'REDACTED\' acts","claiming allegiance to the cult","swearing loyalty to the cult leader","promising to aid to the cult")] before those involved could be brought to justice. The editor reminds all personnel that supernatural myths will not be tolerated on NanoTrasen facilities." if(SECURITY_BREACH) - newMsg.body = "There was [pick("a security breach in","an unauthorised access in","an attempted theft in","an anarchist attack in","violent sabotage of")] a [pick("high-security","restricted access","classified","\'REDACTED\'")] [pick("\'REDACTED\'","section","zone","area")] this morning. Security was tightened on [affected_dest.name] after the incident, and the editor reassures all NanoTrasen personnel that such lapses are rare." + body = "There was [pick("a security breach in","an unauthorised access in","an attempted theft in","an anarchist attack in","violent sabotage of")] a [pick("high-security","restricted access","classified","\'REDACTED\'")] [pick("\'REDACTED\'","section","zone","area")] this morning. Security was tightened on [affected_dest.name] after the incident, and the editor reassures all NanoTrasen personnel that such lapses are rare." if(ANIMAL_RIGHTS_RAID) - newMsg.body = "[pick("Militant animal rights activists","Members of the terrorist group Animal Rights Consortium","Members of the terrorist group \'REDACTED\'")] have [pick("launched a campaign of terror","unleashed a swathe of destruction","raided farms and pastures","forced entry to \'REDACTED\'")] on [affected_dest.name] earlier today, freeing numerous [pick("farm animals","animals","\'REDACTED\'")]. Prices for tame and breeding animals have spiked as a result." + body = "[pick("Militant animal rights activists","Members of the terrorist group Animal Rights Consortium","Members of the terrorist group \'REDACTED\'")] have [pick("launched a campaign of terror","unleashed a swathe of destruction","raided farms and pastures","forced entry to \'REDACTED\'")] on [affected_dest.name] earlier today, freeing numerous [pick("farm animals","animals","\'REDACTED\'")]. Prices for tame and breeding animals have spiked as a result." if(FESTIVAL) - newMsg.body = "A [pick("festival","week long celebration","day of revelry","planet-wide holiday")] has been declared on [affected_dest.name] by [pick("Governor","Commissioner","General","Commandant","Administrator")] [random_name(pick(MALE,FEMALE))] to celebrate [pick("the birth of their [pick("son","daughter")]","coming of age of their [pick("son","daughter")]","the pacification of rogue military cell","the apprehension of a violent criminal who had been terrorising the planet")]. Massive stocks of food and meat have been bought driving up prices across the planet." + body = "A [pick("festival","week long celebration","day of revelry","planet-wide holiday")] has been declared on [affected_dest.name] by [pick("Governor","Commissioner","General","Commandant","Administrator")] [random_name(pick(MALE,FEMALE))] to celebrate [pick("the birth of their [pick("son","daughter")]","coming of age of their [pick("son","daughter")]","the pacification of rogue military cell","the apprehension of a violent criminal who had been terrorising the planet")]. Massive stocks of food and meat have been bought driving up prices across the planet." - news_network.add_news("Nyx Daily", newMsg) + news_network.SubmitArticle(body, author, channel, null, 1) /datum/event/economic_event/end() for(var/good_type in dearer_goods) diff --git a/code/modules/economy/Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm index df2a92e01c2..3f9fec7bb0a 100644 --- a/code/modules/economy/Events_Mundane.dm +++ b/code/modules/economy/Events_Mundane.dm @@ -11,78 +11,76 @@ if(!event_type) return - //copy-pasted from the admin verbs to submit new newscaster messages - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = "Nyx Daily" - newMsg.is_admin_message = 1 + var/author = "Nyx Daily" + var/channel = author //see if our location has custom event info for this event - newMsg.body = affected_dest.get_custom_eventstring() - if(!newMsg.body) - newMsg.body = "" + var/body = affected_dest.get_custom_eventstring() + if(!body) + body = "" switch(event_type) if(RESEARCH_BREAKTHROUGH) - newMsg.body = "A major breakthough in the field of [pick("phoron research","super-compressed materials","nano-augmentation","bluespace research","volatile power manipulation")] \ + body = "A major breakthough in the field of [pick("phoron research","super-compressed materials","nano-augmentation","bluespace research","volatile power manipulation")] \ was announced [pick("yesterday","a few days ago","last week","earlier this month")] by a private firm on [affected_dest.name]. \ NanoTrasen declined to comment as to whether this could impinge on profits." if(ELECTION) - newMsg.body = "The pre-selection of an additional candidates was announced for the upcoming [pick("supervisors council","advisory board","governership","board of inquisitors")] \ + body = "The pre-selection of an additional candidates was announced for the upcoming [pick("supervisors council","advisory board","governership","board of inquisitors")] \ election on [affected_dest.name] was announced earlier today, \ [pick("media mogul","web celebrity", "industry titan", "superstar", "famed chef", "popular gardener", "ex-army officer", "multi-billionaire")] \ [random_name(pick(MALE,FEMALE))]. In a statement to the media they said '[pick("My only goal is to help the [pick("sick","poor","children")]",\ "I will maintain NanoTrasen's record profits","I believe in our future","We must return to our moral core","Just like... chill out dudes")]'." if(RESIGNATION) - newMsg.body = "NanoTrasen regretfully announces the resignation of [pick("Sector Admiral","Division Admiral","Ship Admiral","Vice Admiral")] [random_name(pick(MALE,FEMALE))]." + body = "NanoTrasen regretfully announces the resignation of [pick("Sector Admiral","Division Admiral","Ship Admiral","Vice Admiral")] [random_name(pick(MALE,FEMALE))]." if(prob(25)) var/locstring = pick("Segunda","Salusa","Cepheus","Andromeda","Gruis","Corona","Aquila","Asellus") + " " + pick("I","II","III","IV","V","VI","VII","VIII") - newMsg.body += " In a ceremony on [affected_dest.name] this afternoon, they will be awarded the \ + body += " In a ceremony on [affected_dest.name] this afternoon, they will be awarded the \ [pick("Red Star of Sacrifice","Purple Heart of Heroism","Blue Eagle of Loyalty","Green Lion of Ingenuity")] for " if(prob(33)) - newMsg.body += "their actions at the Battle of [pick(locstring,"REDACTED")]." + body += "their actions at the Battle of [pick(locstring,"REDACTED")]." else if(prob(50)) - newMsg.body += "their contribution to the colony of [locstring]." + body += "their contribution to the colony of [locstring]." else - newMsg.body += "their loyal service over the years." + body += "their loyal service over the years." else if(prob(33)) - newMsg.body += " They are expected to settle down in [affected_dest.name], where they have been granted a handsome pension." + body += " They are expected to settle down in [affected_dest.name], where they have been granted a handsome pension." else if(prob(50)) - newMsg.body += " The news was broken on [affected_dest.name] earlier today, where they cited reasons of '[pick("health","family","REDACTED")]'" + body += " The news was broken on [affected_dest.name] earlier today, where they cited reasons of '[pick("health","family","REDACTED")]'" else - newMsg.body += " Administration Aerospace wishes them the best of luck in their retirement ceremony on [affected_dest.name]." + body += " Administration Aerospace wishes them the best of luck in their retirement ceremony on [affected_dest.name]." if(CELEBRITY_DEATH) - newMsg.body = "It is with regret today that we announce the sudden passing of the " + body = "It is with regret today that we announce the sudden passing of the " if(prob(33)) - newMsg.body += "[pick("distinguished","decorated","veteran","highly respected")] \ + body += "[pick("distinguished","decorated","veteran","highly respected")] \ [pick("Ship's Captain","Vice Admiral","Colonel","Lieutenant Colonel")] " else if(prob(50)) - newMsg.body += "[pick("award-winning","popular","highly respected","trend-setting")] \ + body += "[pick("award-winning","popular","highly respected","trend-setting")] \ [pick("comedian","singer/songwright","artist","playwright","TV personality","model")] " else - newMsg.body += "[pick("successful","highly respected","ingenious","esteemed")] \ + body += "[pick("successful","highly respected","ingenious","esteemed")] \ [pick("academic","Professor","Doctor","Scientist")] " - newMsg.body += "[random_name(pick(MALE,FEMALE))] on [affected_dest.name] [pick("last week","yesterday","this morning","two days ago","three days ago")]\ + body += "[random_name(pick(MALE,FEMALE))] on [affected_dest.name] [pick("last week","yesterday","this morning","two days ago","three days ago")]\ [pick(". Assassination is suspected, but the perpetrators have not yet been brought to justice",\ " due to mercenary infiltrators (since captured)",\ " during an industrial accident",\ " due to [pick("heart failure","kidney failure","liver failure","brain hemorrhage")]")]" if(BARGAINS) - newMsg.body += "BARGAINS! BARGAINS! BARGAINS! Commerce Control on [affected_dest.name] wants you to know that everything must go! Across all retail centres, \ + body += "BARGAINS! BARGAINS! BARGAINS! Commerce Control on [affected_dest.name] wants you to know that everything must go! Across all retail centres, \ all goods are being slashed, and all retailors are onboard - so come on over for the \[shopping\] time of your life." if(SONG_DEBUT) - newMsg.body += "[pick("Singer","Singer/songwriter","Saxophonist","Pianist","Guitarist","TV personality","Star")] [random_name(pick(MALE,FEMALE))] \ + body += "[pick("Singer","Singer/songwriter","Saxophonist","Pianist","Guitarist","TV personality","Star")] [random_name(pick(MALE,FEMALE))] \ announced the debut of their new [pick("single","album","EP","label")] '[pick("Everyone's","Look at the","Baby don't eye those","All of those","Dirty nasty")] \ [pick("roses","three stars","starships","nanobots","cyborgs","Skrell","Sren'darr")] \ [pick("on Venus","on Reade","on Moghes","in my hand","slip through my fingers","die for you","sing your heart out","fly away")]' \ with [pick("pre-puchases available","a release tour","cover signings","a launch concert")] on [affected_dest.name]." if(MOVIE_RELEASE) - newMsg.body += "From the [pick("desk","home town","homeworld","mind")] of [pick("acclaimed","award-winning","popular","stellar")] \ + body += "From the [pick("desk","home town","homeworld","mind")] of [pick("acclaimed","award-winning","popular","stellar")] \ [pick("playwright","author","director","actor","TV star")] [random_name(pick(MALE,FEMALE))] comes the latest sensation: '\ [pick("Deadly","The last","Lost","Dead")] [pick("Starships","Warriors","outcasts","Tajarans","Unathi","Skrell")] \ [pick("of","from","raid","go hunting on","visit","ravage","pillage","destroy")] \ @@ -90,52 +88,51 @@ . Own it on webcast today, or visit the galactic premier on [affected_dest.name]!" if(BIG_GAME_HUNTERS) - newMsg.body += "Game hunters on [affected_dest.name] " + body += "Game hunters on [affected_dest.name] " if(prob(33)) - newMsg.body += "were surprised when an unusual species experts have since identified as \ + body += "were surprised when an unusual species experts have since identified as \ [pick("a subclass of mammal","a divergent abhuman species","an intelligent species of lemur","organic/cyborg hybrids")] turned up. Believed to have been brought in by \ [pick("alien smugglers","early colonists","mercenary raiders","unwitting tourists")], this is the first such specimen discovered in the wild." else if(prob(50)) - newMsg.body += "were attacked by a vicious [pick("nas'r","diyaab","samak","predator which has not yet been identified")]\ + body += "were attacked by a vicious [pick("nas'r","diyaab","samak","predator which has not yet been identified")]\ . Officials urge caution, and locals are advised to stock up on armaments." else - newMsg.body += "brought in an unusually [pick("valuable","rare","large","vicious","intelligent")] [pick("mammal","predator","farwa","samak")] for inspection \ + body += "brought in an unusually [pick("valuable","rare","large","vicious","intelligent")] [pick("mammal","predator","farwa","samak")] for inspection \ [pick("today","yesterday","last week")]. Speculators suggest they may be tipped to break several records." if(GOSSIP) - newMsg.body += "[pick("TV host","Webcast personality","Superstar","Model","Actor","Singer")] [random_name(pick(MALE,FEMALE))] " + body += "[pick("TV host","Webcast personality","Superstar","Model","Actor","Singer")] [random_name(pick(MALE,FEMALE))] " if(prob(33)) - newMsg.body += "and their partner announced the birth of their [pick("first","second","third")] child on [affected_dest.name] early this morning. \ + body += "and their partner announced the birth of their [pick("first","second","third")] child on [affected_dest.name] early this morning. \ Doctors say the child is well, and the parents are considering " if(prob(50)) - newMsg.body += capitalize(pick(first_names_female)) + body += capitalize(pick(first_names_female)) else - newMsg.body += capitalize(pick(first_names_male)) - newMsg.body += " for the name." + body += capitalize(pick(first_names_male)) + body += " for the name." else if(prob(50)) - newMsg.body += "announced their [pick("split","break up","marriage","engagement")] with [pick("TV host","webcast personality","superstar","model","actor","singer")] \ + body += "announced their [pick("split","break up","marriage","engagement")] with [pick("TV host","webcast personality","superstar","model","actor","singer")] \ [random_name(pick(MALE,FEMALE))] at [pick("a society ball","a new opening","a launch","a club")] on [affected_dest.name] yesterday, pundits are shocked." else - newMsg.body += "is recovering from plastic surgery in a clinic on [affected_dest.name] for the [pick("second","third","fourth")] time, reportedly having made the decision in response to " - newMsg.body += "[pick("unkind comments by an ex","rumours started by jealous friends",\ + body += "is recovering from plastic surgery in a clinic on [affected_dest.name] for the [pick("second","third","fourth")] time, reportedly having made the decision in response to " + body += "[pick("unkind comments by an ex","rumours started by jealous friends",\ "the decision to be dropped by a major sponsor","a disasterous interview on Nyx Tonight")]." if(TOURISM) - newMsg.body += "Tourists are flocking to [affected_dest.name] after the surprise announcement of [pick("major shopping bargains by a wily retailer",\ + body += "Tourists are flocking to [affected_dest.name] after the surprise announcement of [pick("major shopping bargains by a wily retailer",\ "a huge new ARG by a popular entertainment company","a secret tour by popular artiste [random_name(pick(MALE,FEMALE))]")]. \ Nyx Daily is offering discount tickets for two to see [random_name(pick(MALE,FEMALE))] live in return for eyewitness reports and up to the minute coverage." - news_network.add_news("Nyx Daily", newMsg) + news_network.SubmitArticle(body, author, channel, null, 1) /datum/event/trivial_news endWhen = 10 /datum/event/trivial_news/announce() - //copy-pasted from the admin verbs to submit new newscaster messages - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = "Editor Mike Hammers" - //newMsg.is_admin_message = 1 + var/author = "Editor Mike Hammers" + var/channel = "The Gibson Gazette" + var/datum/trade_destination/affected_dest = pick(weighted_mundaneevent_locations) - newMsg.body = pick( + var/body = pick( "Tree stuck in tajaran; firefighters baffled.",\ "Armadillos want aardvarks removed from dictionary claims 'here first'.",\ "Angel found dancing on pinhead ordered to stop; cited for public nuisance.",\ @@ -220,4 +217,4 @@ "Broccoli discovered to be colonies of tiny aliens with murder on their minds"\ ) - news_network.add_news("The Gibson Gazette", newMsg) + news_network.SubmitArticle(body, author, channel, null, 1) diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index abc2c0ca910..dee0c00e3d6 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -77,26 +77,8 @@ var/global/economy_init = 0 if(economy_init) return 2 - var/datum/feed_channel/newChannel = new /datum/feed_channel/station - newChannel.channel_name = "Public Station Announcements" - newChannel.author = "Automated Announcement Listing" - newChannel.locked = 1 - newChannel.is_admin_channel = 1 - news_network.network_channels += newChannel - - newChannel = new /datum/feed_channel - newChannel.channel_name = "Nyx Daily" - newChannel.author = "CentComm Minister of Information" - newChannel.locked = 1 - newChannel.is_admin_channel = 1 - news_network.network_channels += newChannel - - newChannel = new /datum/feed_channel - newChannel.channel_name = "The Gibson Gazette" - newChannel.author = "Editor Mike Hammers" - newChannel.locked = 1 - newChannel.is_admin_channel = 1 - news_network.network_channels += newChannel + news_network.CreateFeedChannel("Nyx Daily", "CentComm Minister of Information", 1, 1) + news_network.CreateFeedChannel("The Gibson Gazette", "Editor Mike Hammers", 1, 1) for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination) var/datum/trade_destination/D = new loc_type diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index 5a518eca323..1be8b5ce040 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -23,12 +23,11 @@ deposit_success = 1 /datum/event/money_lotto/announce() - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = "NanoTrasen Editor" - newMsg.is_admin_message = 1 + var/author = "NanoTrasen Editor" + var/channel = "Nyx Daily" - newMsg.body = "Nyx Daily wishes to congratulate [winner_name] for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" + var/body = "Nyx Daily wishes to congratulate [winner_name] for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" if(!deposit_success) - newMsg.body += "
Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of $500 to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month." + body += "
Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of 5000 Thalers to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month." - news_network.add_news("Nyx Daily", newMsg) + news_network.SubmitArticle(body, author, channel, null, 1) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6963fe2f75b..fc4668ec258 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -34,8 +34,8 @@ dat += "+

" else if(toner) dat += "Please insert paper to copy.

" - if(istype(user,/mob/living/silicon)) - dat += "Print photo from database

" + if(istype(user,/mob/living/silicon)) + dat += "Print photo from database

" dat += "Current toner level: [toner]" if(!toner) dat +="
Please insert a new toner cartridge!" @@ -122,18 +122,20 @@ if(!camera) return - var/datum/picture/selection = camera.selectpicture() + var/obj/item/weapon/photo/selection = camera.selectpicture() if (!selection) return - var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc) - p.construct(selection) + var/obj/item/weapon/photo/p = photocopy(selection) + p.loc = src.loc if (p.desc == "") - p.desc += "Copied by [tempAI.name]" + p.desc += "Copy by [tempAI.name]" else - p.desc += " - Copied by [tempAI.name]" - toner -= 5 + p.desc += " - Copy by [tempAI.name]" + sleep(15) + else + usr << "The photocopier couldn't finish the printjob." updateUsrDialog() attackby(obj/item/O as obj, mob/user as mob) @@ -244,24 +246,18 @@ /obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy) - var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc) + var/obj/item/weapon/photo/p = photocopy.copy() + var/icon/I = icon(photocopy.icon, photocopy.icon_state) - var/icon/img = icon(photocopy.img) - var/icon/tiny = icon(photocopy.tiny) if(toner > 10) //plenty of toner, go straight greyscale I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) //I'm not sure how expensive this is, but given the many limitations of photocopying, it shouldn't be an issue. - img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) else //not much toner left, lighten the photo I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) - img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) - tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) + p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) + p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) p.icon = I - p.img = img - p.tiny = tiny - p.name = photocopy.name - p.desc = photocopy.desc - p.scribble = photocopy.scribble toner -= 5 //photos use a lot of ink! if(toner < 0) toner = 0 diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 9334d1e7058..5fc37334514 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -286,7 +286,7 @@ pc.Blend(tiny_img,ICON_OVERLAY, 12, 19) var/datum/picture/P = new() - P.fields["author"] = user + P.fields["name"] = "photo" P.fields["icon"] = ic P.fields["tiny"] = pc P.fields["img"] = photoimage @@ -305,10 +305,23 @@ Photo.construct(P) /obj/item/weapon/photo/proc/construct(var/datum/picture/P) + name = P.fields["name"] icon = P.fields["icon"] tiny = P.fields["tiny"] img = P.fields["img"] desc = P.fields["desc"] pixel_x = P.fields["pixel_x"] pixel_y = P.fields["pixel_y"] - photo_size = P.fields["size"] \ No newline at end of file + photo_size = P.fields["size"] + +/obj/item/weapon/photo/proc/copy() + var/obj/item/weapon/photo/p = new/obj/item/weapon/photo() + + p.icon = icon(icon, icon_state) + p.img = icon(img) + p.tiny = icon(tiny) + p.name = name + p.desc = desc + p.scribble = scribble + + return p diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index f15d0322218..fb321ae603f 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -8,7 +8,7 @@ /obj/item/device/camera/siliconcam var/in_camera_mode = 0 var/photos_taken = 0 - var/list/aipictures = list() + var/list/obj/item/weapon/photo/aipictures = list() /obj/item/device/camera/siliconcam/ai_camera //camera AI can take pictures with name = "AI photo camera" @@ -22,7 +22,9 @@ /obj/item/device/camera/siliconcam/proc/injectaialbum(var/datum/picture/P, var/sufix = "") //stores image information to a list similar to that of the datacore photos_taken++ P.fields["name"] = "Image [photos_taken][sufix]" - aipictures += P + var/obj/item/weapon/photo/photo = new + photo.construct(P) + aipictures += photo /obj/item/device/camera/siliconcam/proc/injectmasteralbum(var/datum/picture/P) //stores image information to a list similar to that of the datacore var/mob/living/silicon/robot/C = src.loc @@ -44,30 +46,27 @@ if(cam.aipictures.len == 0) usr << "No images saved" return - for(var/datum/picture/t in cam.aipictures) - nametemp += t.fields["name"] - find = input("Select image (numbered in order taken)") in nametemp + for(var/obj/item/weapon/photo/t in cam.aipictures) + nametemp += t.name + find = input("Select image (numbered in order taken)") as null|anything in nametemp + if(!find) + return - for(var/datum/picture/q in cam.aipictures) - if(q.fields["name"] == find) + for(var/obj/item/weapon/photo/q in cam.aipictures) + if(q.name == find) return q /obj/item/device/camera/siliconcam/proc/viewpictures() - var/datum/picture/selection = selectpicture() + var/obj/item/weapon/photo/selection = selectpicture() if(!selection) return - var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() - P.construct(selection) - P.show(usr) - usr << P.desc - - // TG uses a special garbage collector.. qdel(P) - del(P) //so 10 thousand pictures items are not left in memory should an AI take them and then view them all. + selection.show(usr) + usr << selection.desc /obj/item/device/camera/siliconcam/proc/deletepicture() - var/datum/picture/selection = selectpicture() + var/selection = selectpicture() if(!selection) return diff --git a/nano/css/shared.css b/nano/css/shared.css index 18af9678f7d..124eec62252 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -189,6 +189,16 @@ h4 { color: #272727; } +.caption { + font-size: 10px; + font-weight: bold; + padding: 5px; +} + +.footer { + font-size: 10px; +} + .noticePlaceholder { position: relative; font-size: 12px; diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 70e6817fb7c..f2251cc150d 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -961,6 +961,10 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
+ {{if data.reception != 1}} + No reception with newscaster network. + {{/if}} +
{{for data.feedChannels}} @@ -977,7 +981,12 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{else data.mode == 61}}

{{:data.feed.channel}}

- Created by: {{:data.feed.author}} + Created by: {{:data.feed.author}}
+ + {{if data.reception != 1}} + No reception with newscaster network. + {{/if}} +
@@ -989,10 +998,12 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{for data.feed.messages}} -{{:value.body}}
{{if value.has_image}} - pda_news_tmp_photo_{{:data.feed.channel}}_{{:value.index}}.png

+ {{if value.caption}} + {{:value.caption}}
+ {{/if}} {{/if}} - [{{:value.message_type}} by {{:value.author}}]
+ [{{:value.message_type}} by {{:value.author}} - {{:value.time_stamp}}]

{{empty}} No feed messages found in channel...