From b1dd8f50f3152b98bb6b9f399a004377f284342c Mon Sep 17 00:00:00 2001 From: GauHelldragon Date: Wed, 2 Jan 2013 02:54:48 -0800 Subject: [PATCH 1/7] Seedbags! Added seedbags to hydroponic lockers and the nutri-vendor They function similarly to plantbags, but obviously hold seeds. The interface for taking seeds out is identical to the smartfridge, however. --- code/defines/obj/vending.dm | 4 +- .../game/objects/items/weapons/hydroponics.dm | 104 ++++++++++++++++++ .../closets/secure/hydroponics.dm | 1 + icons/obj/hydroponics.dmi | Bin 140938 -> 141399 bytes 4 files changed, 107 insertions(+), 2 deletions(-) diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm index e25bb71be95..307eb3e0679 100755 --- a/code/defines/obj/vending.dm +++ b/code/defines/obj/vending.dm @@ -214,8 +214,8 @@ desc = "A plant nutrients vendor" icon_state = "nutri" icon_deny = "nutri-deny" - product_paths = "/obj/item/nutrient/ez;/obj/item/nutrient/l4z;/obj/item/nutrient/rh;/obj/item/weapon/pestspray;/obj/item/weapon/reagent_containers/syringe;/obj/item/weapon/plantbag" - product_amounts = "35;25;15;20;5;5" + product_paths = "/obj/item/nutrient/ez;/obj/item/nutrient/l4z;/obj/item/nutrient/rh;/obj/item/weapon/pestspray;/obj/item/weapon/reagent_containers/syringe;/obj/item/weapon/plantbag;/obj/item/weapon/seedbag" + product_amounts = "35;25;15;20;5;5;5" product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" product_hidden = "/obj/item/weapon/reagent_containers/glass/bottle/ammonia;/obj/item/weapon/reagent_containers/glass/bottle/diethylamine" product_hideamt = "10;5" diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 150b4e76d5e..e7a9278bdd7 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -38,6 +38,110 @@ if(0) usr << "The bag now picks up one plant at a time." +/* + * SeedBag + */ + +/obj/item/weapon/seedbag + icon = 'icons/obj/hydroponics.dmi' + icon_state = "seedbag" + name = "Seed Bag" + desc = "A small satchel made for organizing seeds." + var/mode = 1; //0 = pick one at a time, 1 = pick all on tile + var/capacity = 500; //the number of seeds it can carry. + flags = FPRINT | TABLEPASS + slot_flags = SLOT_BELT + w_class = 1 + var/item_quants = list() + +/obj/item/weapon/seedbag/attack_self(mob/user as mob) + user.machine = src + interact(user) + + +/obj/item/weapon/seedbag/verb/toggle_mode() + set name = "Switch Bagging Method" + set category = "Object" + + mode = !mode + switch (mode) + if(1) + usr << "The bag now picks up all seeds in a tile at once." + if(0) + usr << "The bag now picks up one seed pouch at a time." + +/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob) + ..() + if (istype(O, /obj/item/weapon/seedbag)) + var/obj/item/weapon/seedbag/S = O + if (S.mode == 1) + for (var/obj/item/seeds/G in locate(src.x,src.y,src.z)) + if (S.contents.len < S.capacity) + S.contents += G; + if(S.item_quants[G.name]) + S.item_quants[G.name]++ + else + S.item_quants[G.name] = 1 + else + user << "\blue The seed bag is full." + S.updateUsrDialog() + return + user << "\blue You pick up all the seeds." + else + if (S.contents.len < S.capacity) + S.contents += src; + if(S.item_quants[name]) + S.item_quants[name]++ + else + S.item_quants[name] = 1 + else + user << "\blue The seed bag is full." + S.updateUsrDialog() + return + +/obj/item/weapon/seedbag/proc/interact(mob/user as mob) + + var/dat = "Select an item:
" + + if (contents.len == 0) + dat += "No seeds loaded!" + else + for (var/O in item_quants) + if(item_quants[O] > 0) + var/N = item_quants[O] + dat += "[capitalize(O)]:" + dat += " [N] " + dat += "Vend" + dat += "
" + + dat += "
" + user << browse("Seedbag Supplies[dat]", "window=seedbag") + onclose(user, "seedbag") + return +/obj/item/weapon/seedbag/Topic(href, href_list) + if(..()) + return + + usr.machine = src + + var/N = href_list["vend"] + + if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. + return + + item_quants[N] -= 1 + for(var/obj/O in contents) + if(O.name == N) + O.loc = get_turf(src) + break + src.updateUsrDialog() + return + +/obj/item/weapon/seedbag/updateUsrDialog() + var/list/nearby = range(1, src) + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + src.attack_self(M) /* * Sunflower diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index f96c0bdce34..b9c963ab0f8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -17,6 +17,7 @@ new /obj/item/clothing/suit/apron(src) if(2) new /obj/item/clothing/suit/apron/overalls(src) + new /obj/item/weapon/seedbag(src) new /obj/item/weapon/plantbag(src) new /obj/item/clothing/under/rank/hydroponics(src) new /obj/item/device/analyzer/plant_analyzer(src) diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi index e45d28d3c2c317b571778a87e9e0d1f4ad231bf8..03a8c72bc023b8a97587fcc4489f1fbb7925a3eb 100644 GIT binary patch delta 20093 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 Date: Wed, 2 Jan 2013 11:27:51 -0800 Subject: [PATCH 2/7] Seedbags now put their ouputing seeds into your hand Added "Unload All" button to interface --- .../game/objects/items/weapons/hydroponics.dm | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index e7a9278bdd7..1b880050962 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -52,7 +52,7 @@ flags = FPRINT | TABLEPASS slot_flags = SLOT_BELT w_class = 1 - var/item_quants = list() + var/list/item_quants = list() /obj/item/weapon/seedbag/attack_self(mob/user as mob) user.machine = src @@ -114,6 +114,7 @@ dat += "Vend" dat += "
" + dat += "
Unload All" dat += "" user << browse("Seedbag Supplies[dat]", "window=seedbag") onclose(user, "seedbag") @@ -123,17 +124,24 @@ return usr.machine = src + if ( href_list["vend"] ) + var/N = href_list["vend"] - var/N = href_list["vend"] + if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. + return - if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. - return + item_quants[N] -= 1 + for(var/obj/O in contents) + if(O.name == N) + O.loc = get_turf(src) + usr.put_in_hands(O) + break - item_quants[N] -= 1 - for(var/obj/O in contents) - if(O.name == N) + else if ( href_list["unload"] ) + item_quants.Cut() + for(var/obj/O in contents ) O.loc = get_turf(src) - break + src.updateUsrDialog() return From fb6df3a6984e4dae0301ccc576378bf4cfb21ba5 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Tue, 27 Nov 2012 22:57:37 -0700 Subject: [PATCH 3/7] Made air alarms non-retarded again. If you readd the Central Atmos Control thing again, it should work instantly. Also made firedoors deploy during atmos alarms, and made it so people need to actually answer a dialog box to open if they are powered and the area is locked down. --- baystation12.dme | 1 - code/game/area/Space Station 13 areas.dm | 2 + code/game/area/areas.dm | 66 +- code/game/machinery/alarm.dm | 1832 +++++++++++----------- code/game/machinery/doors/firedoor.dm | 147 +- code/game/machinery/doors/unpowered.dm | 3 +- 6 files changed, 1072 insertions(+), 979 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index cc0918516d7..9962101e104 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -324,7 +324,6 @@ #include "code\game\machinery\turrets.dm" #include "code\game\machinery\vending.dm" #include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\atmoalter\area_atmos_computer.dm" #include "code\game\machinery\atmoalter\canister.dm" #include "code\game\machinery\atmoalter\meter.dm" diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 8bb76ec226f..6d41985202e 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -49,6 +49,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station // (original area before splitting due to sd_DAL) var/list/related // the other areas of the same type as this // var/list/lights // list of all lights on this area + var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area + var/air_doors_activated = 0 /*Adding a wizard area teleport list because motherfucking lag -- Urist*/ /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index e0e15c0ecd3..3d59d9016da 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -10,7 +10,7 @@ /area/New() icon_state = "" layer = 10 - master = src //moved outside the spawn(1) to avoid runtimes in lighting.dm when it references src.loc.loc.master ~Carn + master = src //moved outside the spawn(1) to avoid runtimes in lighting.dm when it references loc.loc.master ~Carn uid = ++global_uid related = list(src) @@ -62,44 +62,44 @@ return /area/proc/atmosalert(danger_level) -// if(src.type==/area) //No atmos alarms in space +// if(type==/area) //No atmos alarms in space // return 0 //redudant - if(danger_level != src.atmosalm) - //src.updateicon() - //src.mouse_opacity = 0 + if(danger_level != atmosalm) + //updateicon() + //mouse_opacity = 0 if (danger_level==2) var/list/cameras = list() - for(var/area/RA in src.related) - //src.updateicon() + for(var/area/RA in related) + //updateicon() for(var/obj/machinery/camera/C in RA) cameras += C for(var/mob/living/silicon/aiPlayer in player_list) aiPlayer.triggerAlarm("Atmosphere", src, cameras, src) for(var/obj/machinery/computer/station_alert/a in world) a.triggerAlarm("Atmosphere", src, cameras, src) - else if (src.atmosalm == 2) + else if (atmosalm == 2) for(var/mob/living/silicon/aiPlayer in player_list) aiPlayer.cancelAlarm("Atmosphere", src, src) for(var/obj/machinery/computer/station_alert/a in world) a.cancelAlarm("Atmosphere", src, src) - src.atmosalm = danger_level + atmosalm = danger_level return 1 return 0 /area/proc/firealert() - if(src.name == "Space") //no fire alarms in space + if(name == "Space") //no fire alarms in space return - if (!( src.fire )) - src.fire = 1 - src.updateicon() - src.mouse_opacity = 0 - for(var/obj/machinery/door/firedoor/D in src) + if( !fire ) + fire = 1 + updateicon() + mouse_opacity = 0 + for(var/obj/machinery/door/firedoor/D in all_doors) if(!D.blocked) if(D.operating) D.nextstate = CLOSED else if(!D.density) - spawn(0) - D.close() + spawn() + D.close() var/list/cameras = list() for (var/obj/machinery/camera/C in src) cameras += C @@ -107,14 +107,13 @@ aiPlayer.triggerAlarm("Fire", src, cameras, src) for (var/obj/machinery/computer/station_alert/a in world) a.triggerAlarm("Fire", src, cameras, src) - return /area/proc/firereset() - if (src.fire) - src.fire = 0 - src.mouse_opacity = 0 - src.updateicon() - for(var/obj/machinery/door/firedoor/D in src) + if (fire) + fire = 0 + mouse_opacity = 0 + updateicon() + for(var/obj/machinery/door/firedoor/D in all_doors) if(!D.blocked) if(D.operating) D.nextstate = OPEN @@ -125,7 +124,6 @@ aiPlayer.cancelAlarm("Fire", src, src) for (var/obj/machinery/computer/station_alert/a in world) a.cancelAlarm("Fire", src, src) - return /area/proc/readyalert() if(name == "Space") @@ -142,19 +140,19 @@ return /area/proc/partyalert() - if(src.name == "Space") //no parties in space!!! + if(name == "Space") //no parties in space!!! return - if (!( src.party )) - src.party = 1 - src.updateicon() - src.mouse_opacity = 0 + if (!( party )) + party = 1 + updateicon() + mouse_opacity = 0 return /area/proc/partyreset() - if (src.party) - src.party = 0 - src.mouse_opacity = 0 - src.updateicon() + if (party) + party = 0 + mouse_opacity = 0 + updateicon() for(var/obj/machinery/door/firedoor/D in src) if(!D.blocked) if(D.operating) @@ -273,7 +271,7 @@ A:client:ambience_playing = 1 A << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2) - switch(src.name) + switch(name) if ("Chapel") sound = pick('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg') if ("Morgue") sound = pick('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/music/title2.ogg') if ("Space") sound = pick('sound/ambience/ambispace.ogg','sound/music/title2.ogg',) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 2f586ef0e99..efac9a4b4a2 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1,5 +1,6 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - +//////////////////////////////////////// +//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). @@ -21,120 +22,31 @@ 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 +#define AALARM_MODE_CYCLE 4 //sucks off all air, then refill and swithes to scrubbing +#define AALARM_MODE_FILL 5 //emergency fill -// A datum for dealing with threshold limit values -// used in /obj/machinery/alarm -/datum/tlv - var/min2 - var/min1 - var/max1 - var/max2 - New(_min2 as num, _min1 as num, _max1 as num, _max2 as num) - min2 = _min2 - min1 = _min1 - max1 = _max1 - max2 = _max2 - proc/get_danger_level(curval as num) - if (max2 >=0 && curval>=max2) - return 2 - if (min2 >=0 && curval<=min2) - return 2 - if (max1 >=0 && curval>=max1) - return 1 - if (min1 >=0 && curval<=min1) - return 1 - return 0 - proc/CopyFrom(datum/tlv/other) - min2 = other.min2 - min1 = other.min1 - max1 = other.max1 - max2 = other.max2 +#define AALARM_SCREEN_MAIN 1 +#define AALARM_SCREEN_VENT 2 +#define AALARM_SCREEN_SCRUB 3 +#define AALARM_SCREEN_MODE 4 +#define AALARM_SCREEN_SENSORS 5 -/obj/machinery/alarm - name = "alarm" - icon = 'icons/obj/monitors.dmi' - icon_state = "alarm0" - anchored = 1 - use_power = 1 - idle_power_usage = 4 - active_power_usage = 8 - power_channel = ENVIRON - req_access = list(access_atmospherics) - var/frequency = 1439 - //var/skipprocess = 0 //Experimenting - var/alarm_frequency = 1437 #define AALARM_REPORT_TIMEOUT 100 - var/datum/radio_frequency/radio_connection - var/locked = 1 - var/wiresexposed = 0 // If it's been screwdrivered open. - var/aidisabled = 0 - var/AAlarmwires = 31 - var/shorted = 0 - var/remote_control = 0 - // Uses code from apc.dm - -#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_VENTING 2 //makes draught -#define AALARM_MODE_PANIC 3 //constantly sucks all air -#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing -#define AALARM_MODE_OFF 5 - var/mode = AALARM_MODE_SCRUBBING - -#define AALARM_SCREEN_MAIN 1 -#define AALARM_SCREEN_VENT 2 -#define AALARM_SCREEN_SCRUB 3 -#define AALARM_SCREEN_MODE 4 -#define AALARM_SCREEN_SENSORS 5 - var/screen = AALARM_SCREEN_MAIN - var/area_uid - var/area/alarm_area - var/danger_level = 0 - - // breathable air according to human/Life() - var/list/TLV = list( - "oxygen" = new/datum/tlv( 16, 19, 135, 140), // Partial pressure, kpa - "carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa - "plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa - "other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa - "pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20), /* kpa */ - "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K - ) - -/* - // breathable air according to wikipedia - "oxygen" = new/datum/tlv( 9, 12, 158, 296), // Partial pressure, kpa - "carbon dioxide" = new/datum/tlv(-1.0,-1.0, 0.5, 1), // Partial pressure, kpa -*/ -/obj/machinery/alarm/server - //req_access = list(access_rd) //no, let departaments to work together - TLV = list( - "oxygen" = new/datum/tlv(-1.0, -1.0,-1.0,-1.0), // Partial pressure, kpa - "carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa - "plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa - "other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa - "pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60), /* kpa */ - "temperature" = new/datum/tlv(40, 60, 100, 120), // K - ) - -/obj/machinery/alarm/kitchen_cold_room - TLV = list( - "oxygen" = new/datum/tlv( 16, 19, 135, 140), // Partial pressure, kpa - "carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa - "plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa - "other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa - "pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.50,ONE_ATMOSPHERE*1.60), /* kpa */ - "temperature" = new/datum/tlv(200, 210, 273.15, 283.15), // K - ) +#define RCON_NO 1 +#define RCON_AUTO 2 +#define RCON_YES 3 +//all air alarms in area are connected via magic //all air alarms in area are connected via magic /area var/obj/machinery/alarm/master_air_alarm @@ -143,508 +55,739 @@ var/list/air_vent_info var/list/air_scrub_info -/obj/machinery/alarm/New() - ..() - alarm_area = get_area(loc) - if (alarm_area.master) - alarm_area = alarm_area.master - area_uid = alarm_area.uid - if (name == "alarm") - name = "[alarm_area.name] Air Alarm" +/obj/machinery/alarm + name = "alarm" + icon = 'monitors.dmi' + icon_state = "alarm0" + anchored = 1 + use_power = 1 + idle_power_usage = 4 + active_power_usage = 8 + power_channel = ENVIRON + req_access = list(access_atmospherics, access_engine_equip) + var/frequency = 1439 + //var/skipprocess = 0 //Experimenting + var/alarm_frequency = 1437 + var/remote_control = 0 + var/rcon_setting = 2 + var/rcon_time = 0 + var/locked = 1 + var/wiresexposed = 0 // If it's been screwdrivered open. + var/aidisabled = 0 + var/AAlarmwires = 31 + var/shorted = 0 -/obj/machinery/alarm/initialize() - set_frequency(frequency) - if (!master_is_operating()) - elect_master() + var/mode = AALARM_MODE_SCRUBBING + var/screen = AALARM_SCREEN_MAIN + var/area_uid + var/area/alarm_area + var/danger_level = 0 -/obj/machinery/alarm/proc/master_is_operating() - return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) + var/datum/radio_frequency/radio_connection -/obj/machinery/alarm/proc/elect_master() - for (var/area/A in alarm_area.related) - for (var/obj/machinery/alarm/AA in A) - if (!(AA.stat & (NOPOWER|BROKEN))) - alarm_area.master_air_alarm = AA - if (!alarm_area.air_vent_names) - alarm_area.air_vent_names = new - alarm_area.air_scrub_names = new - alarm_area.air_vent_info = new - alarm_area.air_scrub_info = new - return 1 - return 0 + var/list/TLV = list() -/obj/machinery/alarm/attack_hand(mob/user) - . = ..() - if (.) - return - user.set_machine(src) + server/New() + ..() + req_access = list(access_rd, access_atmospherics, access_engine_equip) + TLV["oxygen"] = list(-1.0, -1.0,-1.0,-1.0) // Partial pressure, kpa + TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa + TLV["plasma"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa + TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa + TLV["pressure"] = list(ONE_ATMOSPHERE*0.50,ONE_ATMOSPHERE*0.70,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */ + TLV["temperature"] = list(40, 60, 100, 120) // K - if ( (get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon)) - user.unset_machine() - user << browse(null, "window=air_alarm") - user << browse(null, "window=AAlarmwires") + New() + ..() + alarm_area = get_area(src) + if (alarm_area.master) + alarm_area = alarm_area.master + area_uid = alarm_area.uid + if (name == "alarm") + name = "[alarm_area.name] Air Alarm" + + // 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 + TLV["plasma"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa + TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa + TLV["pressure"] = list(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20) /* kpa */ + TLV["temperature"] = list(T0C, T0C+10, T0C+40, T0C+66) // K + + initialize() + set_frequency(frequency) + if (!master_is_operating()) + elect_master() + + + process() + if((stat & (NOPOWER|BROKEN)) || shorted) return + var/turf/simulated/location = loc + ASSERT(istype(location)) - else if (istype(user, /mob/living/silicon) && src.aidisabled) - user << "AI control for this Air Alarm interface has been disabled." - user << browse(null, "window=air_alarm") - return + var/datum/gas_mixture/environment = location.return_air() + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - if(wiresexposed && (!istype(user, /mob/living/silicon))) - var/t1 = text("[alarm_area.name] Air Alarm WiresAccess Panel
\n") - var/list/AAlarmwires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Black" = 5, - ) - for(var/wiredesc in AAlarmwires) - var/is_uncut = src.AAlarmwires & AAlarmWireColorToFlag[AAlarmwires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" + var/list/current_settings = TLV["pressure"] + var/environment_pressure = environment.return_pressure() + var/pressure_dangerlevel = get_danger_level(environment_pressure, current_settings) - else - t1 += "Cut " - t1 += "Pulse " + current_settings = TLV["oxygen"] + var/oxygen_dangerlevel = get_danger_level(environment.oxygen*partial_pressure, current_settings) - t1 += "
" - t1 += text("
\n[(src.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((src.shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(src.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") + current_settings = TLV["carbon dioxide"] + var/co2_dangerlevel = get_danger_level(environment.carbon_dioxide*partial_pressure, current_settings) - if(!shorted) - user << browse(return_text(),"window=air_alarm") - onclose(user, "air_alarm") - refresh_all() + current_settings = TLV["plasma"] + var/plasma_dangerlevel = get_danger_level(environment.toxins*partial_pressure, current_settings) - return + current_settings = TLV["other"] + var/other_moles = 0.0 + for(var/datum/gas/G in environment.trace_gases) + other_moles+=G.moles + var/other_dangerlevel = get_danger_level(other_moles*partial_pressure, current_settings) + current_settings = TLV["temperature"] + var/temperature_dangerlevel = get_danger_level(environment.temperature, current_settings) -/obj/machinery/alarm/proc/isWireColorCut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - return ((src.AAlarmwires & wireFlag) == 0) + var/old_danger_level = danger_level + danger_level = max(pressure_dangerlevel, + oxygen_dangerlevel, + co2_dangerlevel, + plasma_dangerlevel, + other_dangerlevel, + temperature_dangerlevel) -/obj/machinery/alarm/proc/isWireCut(var/wireIndex) - var/wireFlag = AAlarmIndexToFlag[wireIndex] - return ((src.AAlarmwires & wireFlag) == 0) + if (old_danger_level != danger_level) + apply_danger_level(danger_level) -/obj/machinery/alarm/proc/cut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] - AAlarmwires &= ~wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - src.locked = 1 - //world << "Idscan wire cut" - - if(AALARM_WIRE_POWER) - src.shock(usr, 50) - src.shorted = 1 - update_icon() - //world << "Power wire cut" - - if (AALARM_WIRE_AI_CONTROL) - if (src.aidisabled == 0) - src.aidisabled = 1 - //world << "AI Control Wire Cut" - - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_PANIC + if (mode==AALARM_MODE_CYCLE && environment_pressure= danger_levels[4] || current_value <= danger_levels[1]) + return 2 + if(current_value >= danger_levels[3] || current_value <= danger_levels[2]) + return 1 + return 0 + + update_icon() + if(wiresexposed) + icon_state = "alarmx" + return + if((stat & (NOPOWER|BROKEN)) || shorted) + icon_state = "alarmp" + return + switch(max(danger_level, alarm_area.atmosalm)) + if (0) + icon_state = "alarm0" + if (1) + icon_state = "alarm2" //yes, alarm2 is yellow alarm + if (2) + icon_state = "alarm1" + + receive_signal(datum/signal/signal) + if(stat & (NOPOWER|BROKEN)) + return + if (alarm_area.master_air_alarm != src) + if (master_is_operating()) + return + elect_master() + if (alarm_area.master_air_alarm != src) + return + if(!signal || signal.encryption) + return + var/id_tag = signal.data["tag"] + if (!id_tag) + return + if (signal.data["area"] != area_uid) + return + if (signal.data["sigtype"] != "status") + return + + var/dev_type = signal.data["device"] + if(!(id_tag in alarm_area.air_scrub_names) && !(id_tag in alarm_area.air_vent_names)) + register_env_machine(id_tag, dev_type) + if(dev_type == "AScr") + alarm_area.air_scrub_info[id_tag] = signal.data + else if(dev_type == "AVP") + alarm_area.air_vent_info[id_tag] = signal.data + + proc/register_env_machine(var/m_id, var/device_type) + var/new_name + if (device_type=="AVP") + new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" + alarm_area.air_vent_names[m_id] = new_name + else if (device_type=="AScr") + new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" + alarm_area.air_scrub_names[m_id] = new_name + else + return + spawn (10) + send_signal(m_id, list("init" = new_name) ) + + proc/refresh_all() + for(var/id_tag in alarm_area.air_vent_names) + var/list/I = alarm_area.air_vent_info[id_tag] + if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + continue + send_signal(id_tag, list("status") ) + for(var/id_tag in alarm_area.air_scrub_names) + var/list/I = alarm_area.air_scrub_info[id_tag] + if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + continue + send_signal(id_tag, list("status") ) + + proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_TO_AIRALARM) + + proc/send_signal(var/target, var/list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = command + signal.data["tag"] = target + signal.data["sigtype"] = "command" + + radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) + // world << text("Signal [] Broadcasted to []", command, target) + + return 1 + + proc/apply_mode() + var/current_pressures = TLV["pressure"] + var/target_pressure = (current_pressures[2] + current_pressures[3])/2 + switch(mode) + if(AALARM_MODE_SCRUBBING) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "setting"= 1, "scrubbing"= 1, "panic_siphon"= 0) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 1, "checks"= 1, "setting"= 1, "set_external_pressure"= target_pressure) ) + + if(AALARM_MODE_PANIC, AALARM_MODE_CYCLE) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 0) ) + + if(AALARM_MODE_REPLACEMENT) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "setting"= 3, "scrubbing"= 1, "panic_siphon"= 0) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 1, "checks"= 1, "setting"= 3, "set_external_pressure"= target_pressure) ) + + if(AALARM_MODE_FILL) + for(var/device_id in alarm_area.air_scrub_names) + send_signal(device_id, list("power"= 0) ) + for(var/device_id in alarm_area.air_vent_names) + send_signal(device_id, list("power"= 1, "checks"= 1, "setting"= 3, "set_external_pressure"= target_pressure) ) + + proc/apply_danger_level(var/new_danger_level) + alarm_area.atmosalm = new_danger_level + + for (var/area/A in alarm_area.related) + for (var/obj/machinery/alarm/AA in A) + if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.danger_level != new_danger_level) + AA.update_icon() + + if(danger_level > 1) + air_doors_close(0) + else + air_doors_open(0) + + update_icon() + + proc/air_doors_close(manual) + var/area/A = get_area(src) + if(!A.master.air_doors_activated) + A.master.air_doors_activated = 1 + for(var/obj/machinery/door/E in A.master.all_doors) + if(istype(E,/obj/machinery/door/firedoor)) + if(!E:blocked) + if(E.operating) + E:nextstate = CLOSED + else if(!E.density) + spawn(0) + E.close() + continue + +/* if(istype(E, /obj/machinery/door/airlock)) + if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER) || E:air_locked) continue + if(!E.density) + spawn(0) + E.close() + spawn(10) + if(E.density) + E:air_locked = E.req_access + E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + E.update_icon() + else if(E.operating) + spawn(10) + E.close() + if(E.density) + E:air_locked = E.req_access + E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + E.update_icon() + else if(!E:locked) //Don't lock already bolted doors. + E:air_locked = E.req_access + E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + E.update_icon()*/ + + proc/air_doors_open(manual) + var/area/A = get_area(loc) + if(A.master.air_doors_activated) + A.master.air_doors_activated = 0 + for(var/obj/machinery/door/E in A.master.all_doors) + if(istype(E, /obj/machinery/door/firedoor)) + if(!E:blocked) + if(E.operating) + E:nextstate = OPEN + else if(E.density) + spawn(0) + E.open() + continue + +/* if(istype(E, /obj/machinery/door/airlock)) + if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue + if(!isnull(E:air_locked)) //Don't mess with doors locked for other reasons. + E:req_access = E:air_locked + E:air_locked = null + E.update_icon()*/ + +/////////// +//HACKING// +/////////// + proc/isWireColorCut(var/wireColor) + var/wireFlag = AAlarmWireColorToFlag[wireColor] + return ((AAlarmwires & wireFlag) == 0) + + proc/isWireCut(var/wireIndex) + var/wireFlag = AAlarmIndexToFlag[wireIndex] + return ((AAlarmwires & wireFlag) == 0) + + 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() - spawn(1200) - if(shorted == 1) - shorted = 0 + 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 + + 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 + + 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) - // world << "AI Control wire pulsed" - if (src.aidisabled == 0) - src.aidisabled = 1 - src.updateDialog() - spawn(10) - if (src.aidisabled == 1) - src.aidisabled = 0 - src.updateDialog() - if(AALARM_WIRE_SYPHON) - // world << "Syphon wire pulsed" - mode = AALARM_MODE_REPLACEMENT - apply_mode() + if (AALARM_WIRE_AI_CONTROL) + if (aidisabled == 0) + aidisabled = 1 + updateDialog() + spawn(10) + if (aidisabled == 1) + aidisabled = 0 + updateDialog() - if(AALARM_WIRE_AALARM) - // world << "Aalarm wire pulsed" - if (alarm_area.atmosalert(0)) - post_alert(0) - spawn(1) - src.updateUsrDialog() - update_icon() + if(AALARM_WIRE_SYPHON) + mode = AALARM_MODE_REPLACEMENT + apply_mode() - src.updateDialog() - return + if(AALARM_WIRE_AALARM) + if (alarm_area.atmosalert(0)) + apply_danger_level(0) + spawn(1) + updateUsrDialog() + update_icon() -/obj/machinery/alarm/proc/shock(mob/user, prb) - if((stat & (NOPOWER))) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 //you lucked out, no shock for you - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() //sparks always. - if (electrocute_mob(user, get_area(src), src)) - return 1 - else - return 0 - -/obj/machinery/alarm/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) + updateDialog() return - if (alarm_area.master_air_alarm != src) - if (master_is_operating()) + + proc/shock(mob/user, prb) + if((stat & (NOPOWER))) // unpowered, no shock + return 0 + if(!prob(prb)) + return 0 //you lucked out, no shock for you + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() //sparks always. + if (electrocute_mob(user, get_area(src), src)) + return 1 + else + return 0 +/////////////// +//END HACKING// +/////////////// + + + attack_hand(mob/user) + . = ..() + if (.) return - elect_master() - if (alarm_area.master_air_alarm != src) - return - if(!signal || signal.encryption) - return - var/id_tag = signal.data["tag"] - if (!id_tag) - return - if (signal.data["area"] != area_uid) - return - if (signal.data["sigtype"] != "status") + user.machine = src + + if ( (get_dist(src, user) > 1 )) + if (!istype(user, /mob/living/silicon)) + user.machine = null + user << browse(null, "window=air_alarm") + user << browse(null, "window=AAlarmwires") + return + + + else if (istype(user, /mob/living/silicon) && aidisabled) + user << "AI control for this Air Alarm interface has been disabled." + 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/AAlarmwires = list( + "Orange" = 1, + "Dark red" = 2, + "White" = 3, + "Yellow" = 4, + "Black" = 5, + ) + for(var/wiredesc in AAlarmwires) + var/is_uncut = AAlarmwires & AAlarmWireColorToFlag[AAlarmwires[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(!shorted) + user << browse(return_text(user),"window=air_alarm") + onclose(user, "air_alarm") + return - var/dev_type = signal.data["device"] - if(!(id_tag in alarm_area.air_scrub_names) && !(id_tag in alarm_area.air_vent_names)) - register_env_machine(id_tag, dev_type) - if(dev_type == "AScr") - alarm_area.air_scrub_info[id_tag] = signal.data - else if(dev_type == "AVP") - alarm_area.air_vent_info[id_tag] = signal.data + proc/return_text(mob/user) + if(!(istype(user, /mob/living/silicon)) && locked) + return "\The [src][return_status()]
[rcon_text()]
(Swipe ID card to unlock interface)" + else + return "\The [src][return_status()]
[rcon_text()]
[return_controls()]" -/obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) - var/new_name - if (device_type=="AVP") - new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" - alarm_area.air_vent_names[m_id] = new_name - else if (device_type=="AScr") - new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" - alarm_area.air_scrub_names[m_id] = new_name - else - return - spawn (10) - send_signal(m_id, list("init" = new_name) ) + proc/return_status() + var/turf/location = get_turf(src) + var/datum/gas_mixture/environment = location.return_air() + var/total = environment.oxygen + environment.carbon_dioxide + environment.toxins + environment.nitrogen + var/output = "Air Status:
" -/obj/machinery/alarm/proc/refresh_all() - for(var/id_tag in alarm_area.air_vent_names) - var/list/I = alarm_area.air_vent_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) - continue - send_signal(id_tag, list("status") ) - for(var/id_tag in alarm_area.air_scrub_names) - var/list/I = alarm_area.air_scrub_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) - continue - send_signal(id_tag, list("status") ) + if(total == 0) + output += "Warning: Cannot obtain air sample for analysis." + return output -/obj/machinery/alarm/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_TO_AIRALARM) - -/obj/machinery/alarm/proc/send_signal(var/target, var/list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = command - signal.data["tag"] = target - signal.data["sigtype"] = "command" - - radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) -// world << text("Signal [] Broadcasted to []", command, target) - - return 1 - -/obj/machinery/alarm/proc/return_text() - if(!(istype(usr, /mob/living/silicon)) && locked) - return "[src][return_status()]
(Swipe ID card to unlock interface)" - else - return "[src][return_status()]
[return_controls()]" - -/obj/machinery/alarm/proc/return_status() - var/turf/location = src.loc - var/datum/gas_mixture/environment = location.return_air() - var/total = environment.oxygen + environment.carbon_dioxide + environment.toxins + environment.nitrogen - var/output = "Air Status:
" - - if(total == 0) - output +={"Warning: Cannot obtain air sample for analysis."} - return output - - output += {" + output += {" "} - var/datum/tlv/cur_tlv - var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - cur_tlv = TLV["pressure"] - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - cur_tlv = TLV["oxygen"] - var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.oxygen*GET_PP) - var/oxygen_percent = round(environment.oxygen / total * 100, 2) + var/list/current_settings = TLV["pressure"] + var/environment_pressure = environment.return_pressure() + var/pressure_dangerlevel = get_danger_level(environment_pressure, current_settings) - cur_tlv = TLV["carbon dioxide"] - var/co2_dangerlevel = cur_tlv.get_danger_level(environment.carbon_dioxide*GET_PP) - var/co2_percent = round(environment.carbon_dioxide / total * 100, 2) + current_settings = TLV["oxygen"] + var/oxygen_dangerlevel = get_danger_level(environment.oxygen*partial_pressure, current_settings) + var/oxygen_percent = round(environment.oxygen / total * 100, 2) - cur_tlv = TLV["plasma"] - var/plasma_dangerlevel = cur_tlv.get_danger_level(environment.toxins*GET_PP) - var/plasma_percent = round(environment.toxins / total * 100, 2) + current_settings = TLV["carbon dioxide"] + var/co2_dangerlevel = get_danger_level(environment.carbon_dioxide*partial_pressure, current_settings) + var/co2_percent = round(environment.carbon_dioxide / total * 100, 2) - cur_tlv = TLV["other"] - var/other_moles = 0.0 - for(var/datum/gas/G in environment.trace_gases) - other_moles+=G.moles - var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP) + current_settings = TLV["plasma"] + var/plasma_dangerlevel = get_danger_level(environment.toxins*partial_pressure, current_settings) + var/plasma_percent = round(environment.toxins / total * 100, 2) - cur_tlv = TLV["temperature"] - var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature) + current_settings = TLV["other"] + var/other_moles = 0.0 + for(var/datum/gas/G in environment.trace_gases) + other_moles+=G.moles + var/other_dangerlevel = get_danger_level(other_moles*partial_pressure, current_settings) - output += {" + current_settings = TLV["temperature"] + var/temperature_dangerlevel = get_danger_level(environment.temperature, current_settings) + + output += {" Pressure: [environment_pressure]kPa
Oxygen: [oxygen_percent]%
Carbon dioxide: [co2_percent]%
Toxins: [plasma_percent]%
"} - if (other_dangerlevel==2) - output += {"Notice: High Concentration of Unknown Particles Detected
"} - else if (other_dangerlevel==1) - output += {"Notice: Low Concentration of Unknown Particles Detected
"} + if (other_dangerlevel==2) + output += "Notice: High Concentration of Unknown Particles Detected
" + else if (other_dangerlevel==1) + output += "Notice: Low Concentration of Unknown Particles Detected
" - output += {" -Temperature: [environment.temperature]K
-"} + output += "Temperature: [environment.temperature]K
" - var/display_danger_level = max( - pressure_dangerlevel, - oxygen_dangerlevel, - co2_dangerlevel, - plasma_dangerlevel, - other_dangerlevel, - temperature_dangerlevel - ) + //Overall status + output += "Local Status: " + switch(max(pressure_dangerlevel,oxygen_dangerlevel,co2_dangerlevel,plasma_dangerlevel,other_dangerlevel,temperature_dangerlevel)) + if(2) + output += "DANGER: Internals Required" + if(1) + output += "Caution" + if(0) + if(alarm_area.atmosalm) + output += {"Caution: Atmos alert in area"} + else + output += {"Optimal"} - //Overall status - output += {"Local Status: "} - if(display_danger_level == 2) - output += {"DANGER: Internals Required"} - else if(display_danger_level == 1) - output += {"Caution"} - else if (alarm_area.atmosalm) - output += {"Caution: Atmos alert in area"} - else - output += {"Optimal"} + output += "

Atmospheric Lockdown: [alarm_area.air_doors_activated ? "ENABLED" : "Disabled"]" - return output + return output -/obj/machinery/alarm/proc/return_controls() - var/output = ""//"[alarm_zone] Air [name]
" + proc/rcon_text() + var/dat = "Remote Control:
" + if(rcon_setting == RCON_NO) + dat += "Off" + else + dat += "Off" + dat += " | " + if(rcon_setting == RCON_AUTO) + dat += "Auto" + else + dat += "Auto" + dat += " | " + if(rcon_setting == RCON_YES) + dat += "On" + else + dat += "On" + return dat - switch(screen) - if (AALARM_SCREEN_MAIN) - if(alarm_area.atmosalm) - output += {"Reset - Atmospheric Alarm
"} - else - output += {"Activate - Atmospheric Alarm
"} + proc/return_controls() + var/output = ""//"[alarm_zone] Air [name]
" - output += {" + switch(screen) + if (AALARM_SCREEN_MAIN) + if(alarm_area.atmosalm) + output += "Reset - Atmospheric Alarm
" + else + output += "Activate - Atmospheric Alarm
" + + output += {" Scrubbers Control
Vents Control
Set environmentals mode
Sensor Settings

"} - if (mode==AALARM_MODE_PANIC) - output += "PANIC SYPHON ACTIVE
Turn syphoning off" - else - output += "ACTIVATE PANIC SYPHON IN AREA" - if (AALARM_SCREEN_VENT) - var/sensor_data = "" - if(alarm_area.air_vent_names.len) - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/data = alarm_area.air_vent_info[id_tag] - if(!data) - continue; - var/state = "" - - sensor_data += {" -[long_name][state]
-Operating: -[data["power"]?"on":"off"] -
-Pressure checks: -external -internal -
-External pressure bound: -- -- -- -- -[data["external"]] -+ -+ -+ -+ - (reset) -
-"} - if (data["direction"] == "siphon") - sensor_data += {" -Direction: -siphoning -
-"} - sensor_data += {"
"} - else - sensor_data = "No vents connected.
" - output = {"Main menu
[sensor_data]"} - if (AALARM_SCREEN_SCRUB) - var/sensor_data = "" - if(alarm_area.air_scrub_names.len) - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/data = alarm_area.air_scrub_info[id_tag] - if(!data) - continue; - var/state = "" - - sensor_data += {" -[long_name][state]
-Operating: -[data["power"]?"on":"off"]
-Type: -[data["scrubbing"]?"scrubbing":"syphoning"]
-"} - - if(data["scrubbing"]) - sensor_data += {" -Filtering: -Carbon Dioxide -[data["filter_co2"]?"on":"off"]; -Toxins -[data["filter_toxins"]?"on":"off"]; -Nitrous Oxide -[data["filter_n2o"]?"on":"off"] -
-"} - sensor_data += {" -Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""] -Dea":"red'>A")]ctivate
-
-"} - else - sensor_data = "No scrubbers connected.
" - output = {"Main menu
[sensor_data]"} - - if (AALARM_SCREEN_MODE) - output += {" -Main menu
-Air machinery mode for the area:
    "} - var/list/modes = list( - AALARM_MODE_SCRUBBING = "Filtering", - AALARM_MODE_VENTING = "Draught", - AALARM_MODE_PANIC = "PANIC", - AALARM_MODE_REPLACEMENT = "REPLACE AIR", - AALARM_MODE_OFF = "Off", - ) - for (var/m=1,m<=modes.len,m++) - if (mode==m) - output += {"
  • [modes[m]] (selected)
  • "} + if (mode==AALARM_MODE_PANIC) + output += "PANIC SYPHON ACTIVE
    Turn syphoning off" else - output += {"
  • [modes[m]]
  • "} - output += "
" - if (AALARM_SCREEN_SENSORS) - output += {" + output += "ACTIVATE PANIC SYPHON IN AREA" + + + if (AALARM_SCREEN_VENT) + var/sensor_data = "" + if(alarm_area.air_vent_names.len) + for(var/id_tag in alarm_area.air_vent_names) + var/long_name = alarm_area.air_vent_names[id_tag] + var/list/data = alarm_area.air_vent_info[id_tag] + if(!data) + continue; + var/state = "" + + sensor_data += {" + [long_name][state]
+ Operating: + [data["power"]?"on":"off"] +
+ Pressure checks: + external + internal +
+ External pressure bound: + - + - + - + - + [data["external"]] + + + + + + + + + (reset) +
+ "} + if (data["direction"] == "siphon") + sensor_data += {" + Direction: + siphoning +
+ "} + sensor_data += {"
"} + else + sensor_data = "No vents connected.
" + output = {"Main menu
[sensor_data]"} + if (AALARM_SCREEN_SCRUB) + var/sensor_data = "" + if(alarm_area.air_scrub_names.len) + for(var/id_tag in alarm_area.air_scrub_names) + var/long_name = alarm_area.air_scrub_names[id_tag] + var/list/data = alarm_area.air_scrub_info[id_tag] + if(!data) + continue; + var/state = "" + + sensor_data += {" + [long_name][state]
+ Operating: + [data["power"]?"on":"off"]
+ Type: + [data["scrubbing"]?"scrubbing":"syphoning"]
+ "} + + if(data["scrubbing"]) + sensor_data += {" + Filtering: + Carbon Dioxide + [data["filter_co2"]?"on":"off"]; + Toxins + [data["filter_toxins"]?"on":"off"]; + Nitrous Oxide + [data["filter_n2o"]?"on":"off"] +
+ "} + sensor_data += {" + Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""] + Dea":"red'>A")]ctivate
+
+ "} + else + sensor_data = "No scrubbers connected.
" + output = {"Main menu
[sensor_data]"} + + if (AALARM_SCREEN_MODE) + output += "Main menu
Air machinery mode for the area:
    " + var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering",\ + AALARM_MODE_REPLACEMENT = "REPLACE AIR",\ + AALARM_MODE_PANIC = "PANIC",\ + AALARM_MODE_CYCLE = "CYCLE",\ + AALARM_MODE_FILL = "FILL",) + for (var/m=1,m<=modes.len,m++) + if (mode==m) + output += "
  • [modes[m]] (selected)
  • " + else + output += "
  • [modes[m]]
  • " + output += "
" + + if (AALARM_SCREEN_SENSORS) + output += {" Main menu
Alarm thresholds:
Partial pressure for gases @@ -660,318 +803,165 @@ table tr:first-child th:first-child { border: none;} "} - var/list/gases = list( - "oxygen" = "O2", - "carbon dioxide" = "CO2", - "plasma" = "Toxin", - "other" = "Other", - ) - var/list/thresholds = list("min2", "min1", "max1", "max2") - var/datum/tlv/tlv - for (var/g in gases) - output += {" - -"} - tlv = TLV[g] - for (var/v in thresholds) - output += {" - -"} - output += {" - -"} - tlv = TLV["pressure"] - output += {" - -"} - for (var/v in thresholds) - output += {" - -"} - output += {" - -"} - tlv = TLV["temperature"] - output += {" - -"} - for (var/v in thresholds) - output += {" - -"} - output += {" - -"} - output += {"
min2min1max1max2
[gases[g]] -[tlv.vars[v]>=0?tlv.vars[v]:"OFF"] -
Pressure -[tlv.vars[v]>=0?tlv.vars[v]:"OFF"] -
Temperature -[tlv.vars[v]>=0?tlv.vars[v]:"OFF"] -
"} + var/list/gases = list( + "oxygen" = "O2", + "carbon dioxide" = "CO2", + "plasma" = "Toxin", + "other" = "Other",) - return output + var/list/selected + for (var/g in gases) + output += "[gases[g]]" + selected = TLV[g] + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"]" + output += "" -/obj/machinery/alarm/Topic(href, href_list) - if(..()) - return - src.add_fingerprint(usr) - usr.set_machine(src) + selected = TLV["pressure"] + output += " Pressure" + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"]" + output += "" - if ( (get_dist(src, usr) > 1 )) - if (!istype(usr, /mob/living/silicon)) - usr.unset_machine() - usr << browse(null, "window=air_alarm") - usr << browse(null, "window=AAlarmwires") - return + selected = TLV["temperature"] + output += "Temperature" + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"]" + output += "" - if (href_list["AAlarmwires"]) - var/t1 = text2num(href_list["AAlarmwires"]) - 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) + return output + Topic(href, href_list) + if(href_list["rcon"]) + rcon_setting = text2num(href_list["rcon"]) - if(href_list["command"]) - var/device_id = href_list["id_tag"] - switch(href_list["command"]) - if( - "power", - "adjust_external_pressure", - "set_external_pressure", - "checks", - "co2_scrub", - "tox_scrub", - "n2o_scrub", - "panic_siphon", - "scrubbing" - ) - send_signal(device_id, list (href_list["command"] = text2num(href_list["val"]))) - spawn(3) - src.updateUsrDialog() + if ( (get_dist(src, usr) > 1 )) + if (!istype(usr, /mob/living/silicon)) + usr.machine = null + usr << browse(null, "window=air_alarm") + usr << browse(null, "window=AAlarmwires") + return - //if("adjust_threshold") //was a good idea but required very wide window - if("set_threshold") - var/env = href_list["env"] - var/varname = href_list["var"] - var/datum/tlv/tlv = TLV[env] - var/newval = input("Enter [varname] for env", "Alarm triggers", tlv.vars[varname]) as num|null + add_fingerprint(usr) + usr.machine = src - if (isnull(newval) || ..() || (locked && !issilicon(usr))) - return - if (newval<0) - tlv.vars[varname] = -1.0 - else if (env=="temperature" && newval>5000) - tlv.vars[varname] = 5000 - else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) - tlv.vars[varname] = 50*ONE_ATMOSPHERE - else if (env!="temperature" && env!="pressure" && newval>200) - tlv.vars[varname] = 200 - else - newval = round(newval,0.01) - tlv.vars[varname] = newval - spawn(1) - src.updateUsrDialog() + if(href_list["command"]) + var/device_id = href_list["id_tag"] + switch(href_list["command"]) + if( "power", + "adjust_external_pressure", + "set_external_pressure", + "checks", + "co2_scrub", + "tox_scrub", + "n2o_scrub", + "panic_siphon", + "scrubbing") - if(href_list["screen"]) - screen = text2num(href_list["screen"]) - spawn(1) - src.updateUsrDialog() + send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) ) + if("set_threshold") + var/env = href_list["env"] + var/threshold = text2num(href_list["var"]) + var/list/selected = TLV[env] + var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") + var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num + if (isnull(newval) || ..() || (locked && issilicon(usr))) + return + if (newval<0) + selected[threshold] = -1.0 + else if (env=="temperature" && newval>5000) + selected[threshold] = 5000 + else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) + selected[threshold] = 50*ONE_ATMOSPHERE + else if (env!="temperature" && env!="pressure" && newval>200) + selected[threshold] = 200 + else + newval = round(newval,0.01) + selected[threshold] = newval + if(threshold == 1) + if(selected[1] > selected[2]) + selected[2] = selected[1] + if(selected[1] > selected[3]) + selected[3] = selected[1] + if(selected[1] > selected[4]) + selected[4] = selected[1] + if(threshold == 2) + if(selected[1] > selected[2]) + selected[1] = selected[2] + if(selected[2] > selected[3]) + selected[3] = selected[2] + if(selected[2] > selected[4]) + selected[4] = selected[2] + if(threshold == 3) + if(selected[1] > selected[3]) + selected[1] = selected[3] + if(selected[2] > selected[3]) + selected[2] = selected[3] + if(selected[3] > selected[4]) + selected[4] = selected[3] + if(threshold == 4) + if(selected[1] > selected[4]) + selected[1] = selected[4] + if(selected[2] > selected[4]) + selected[2] = selected[4] + if(selected[3] > selected[4]) + selected[3] = selected[4] + apply_mode() - if(href_list["atmos_alarm"]) - if (alarm_area.atmosalert(2)) - post_alert(2) - spawn(1) - src.updateUsrDialog() - update_icon() - if(href_list["atmos_reset"]) - if (alarm_area.atmosalert(0)) - post_alert(0) - spawn(1) - src.updateUsrDialog() - update_icon() + if(href_list["screen"]) + screen = text2num(href_list["screen"]) - if(href_list["mode"]) - mode = text2num(href_list["mode"]) - apply_mode() - spawn(5) - src.updateUsrDialog() + if(href_list["atmos_unlock"]) + switch(href_list["atmos_unlock"]) + if("0") + air_doors_close(1) + if("1") + air_doors_open(1) - return + if(href_list["atmos_alarm"]) + if (alarm_area.atmosalert(2)) + apply_danger_level(2) + update_icon() -/obj/machinery/alarm/proc/apply_mode() - switch(mode) - if(AALARM_MODE_SCRUBBING) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list( - "power"= 1, - "co2_scrub"= 1, - "scrubbing"= 1, - "panic_siphon"= 0, - )) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list( - "power"= 1, - "checks"= 1, - "set_external_pressure"= ONE_ATMOSPHERE - )) + if(href_list["atmos_reset"]) + if (alarm_area.atmosalert(0)) + apply_danger_level(0) + update_icon() - if(AALARM_MODE_VENTING) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list( - "power"= 1, - "panic_siphon"= 0, - "scrubbing"= 0 - )) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list( - "power"= 1, - "checks"= 1, - "set_external_pressure"= ONE_ATMOSPHERE - )) - if( - AALARM_MODE_PANIC, - AALARM_MODE_REPLACEMENT - ) - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list( - "power"= 1, - "panic_siphon"= 1 - )) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list( - "power"= 0 - )) - /*if(AALARM_MODE_OFF) Commented out cause the "turn off panic" uses scrubbing mode now instead. - for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list( - "panic_siphon" = 0 - )) - for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list( - "power"= 1 - ))*/ + if(href_list["mode"]) + mode = text2num(href_list["mode"]) + apply_mode() -/obj/machinery/alarm/update_icon() - if(wiresexposed) - icon_state = "alarmx" - return - if((stat & (NOPOWER|BROKEN)) || shorted) - icon_state = "alarmp" - return - switch(max(danger_level, alarm_area.atmosalm)) - if (0) - src.icon_state = "alarm0" - if (1) - src.icon_state = "alarm2" //yes, alarm2 is yellow alarm - if (2) - src.icon_state = "alarm1" + 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) -/obj/machinery/alarm/process() - if((stat & (NOPOWER|BROKEN)) || shorted) - 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) - var/turf/simulated/location = src.loc - if (!istype(location)) - return 0 + updateUsrDialog() - var/datum/gas_mixture/environment = location.return_air() - - var/datum/tlv/cur_tlv - var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - - cur_tlv = TLV["pressure"] - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) - - cur_tlv = TLV["oxygen"] - var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.oxygen*GET_PP) - - cur_tlv = TLV["carbon dioxide"] - var/co2_dangerlevel = cur_tlv.get_danger_level(environment.carbon_dioxide*GET_PP) - - cur_tlv = TLV["plasma"] - var/plasma_dangerlevel = cur_tlv.get_danger_level(environment.toxins*GET_PP) - - cur_tlv = TLV["other"] - var/other_moles = 0.0 - for(var/datum/gas/G in environment.trace_gases) - other_moles+=G.moles - var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP) - - cur_tlv = TLV["temperature"] - var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature) - - var/old_danger_level = danger_level - danger_level = max( - pressure_dangerlevel, - oxygen_dangerlevel, - co2_dangerlevel, - plasma_dangerlevel, - other_dangerlevel, - temperature_dangerlevel - ) - if (old_danger_level!=danger_level) - apply_danger_level() - - if (mode==AALARM_MODE_REPLACEMENT && environment_pressure T0C+200) - src.alarm() // added check of detector status here + alarm() // added check of detector status here return /obj/machinery/firealarm/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/firealarm/bullet_act(BLAH) - return src.alarm() + return alarm() /obj/machinery/firealarm/attack_paw(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/firealarm/emp_act(severity) if(prob(50/severity)) alarm() @@ -1033,38 +1020,36 @@ table tr:first-child th:first-child { border: none;} /obj/machinery/firealarm/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wirecutters)) - src.detecting = !( src.detecting ) - if (src.detecting) - user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") - else - user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") + detecting = !detecting + user.visible_message("\red \The [user] has [detecting ? "re" : "dis" ]connected \the [src]'s detecting unit!",\ + "You have [detecting ? "re" : "dis" ]connected \the [src]'s detecting unit.") else - src.alarm() - src.add_fingerprint(user) + alarm() + add_fingerprint(user) return -/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed +/obj/machinery/firealarm/process() if(stat & (NOPOWER|BROKEN)) return -// var/area/A = src.loc -// A = A.loc + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master -// if(A.fire) -// src.icon_state = "fire1" -// else -// src.icon_state = "fire0" + if(A.fire) + icon_state = "fire1" + else + icon_state = "fire0" - if(src.timing) - if(src.time > 0) - src.time = src.time - ((world.timeofday - last_process)/10) + if (timing) + if (time > 0) + time = round(time) - 1 else - src.alarm() - src.time = 0 - src.timing = 0 - processing_objects.Remove(src) - src.updateDialog() - last_process = world.timeofday + alarm() + time = 0 + timing = 0 + updateDialog() return /obj/machinery/firealarm/power_change() @@ -1080,38 +1065,39 @@ table tr:first-child th:first-child { border: none;} if(user.stat || stat & (NOPOWER|BROKEN)) return - user.set_machine(src) - var/area/A = src.loc + user.machine = src + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master var/d1 var/d2 if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) - A = A.loc if (A.fire) d1 = text("Reset - Lockdown", src) else d1 = text("Alarm - Lockdown", src) - if (src.timing) + if (timing) d2 = text("Stop Time Lock", src) else d2 = text("Initiate Time Lock", src) - var/second = round(src.time) % 60 - var/minute = (round(src.time) - second) / 60 + var/second = time % 60 + var/minute = (time - second) / 60 var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") else - A = A.loc if (A.fire) d1 = text("[]", src, stars("Reset - Lockdown")) else d1 = text("[]", src, stars("Alarm - Lockdown")) - if (src.timing) + if (timing) d2 = text("[]", src, stars("Stop Time Lock")) else d2 = text("[]", src, stars("Initiate Time Lock")) - var/second = round(src.time) % 60 - var/minute = (round(src.time) - second) / 60 + var/second = time % 60 + var/minute = (time - second) / 60 var/dat = "[stars("Fire alarm")] [d1]\n
The current alert level is: [stars(get_security_level())]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") @@ -1121,114 +1107,114 @@ table tr:first-child th:first-child { border: none;} ..() if (usr.stat || stat & (BROKEN|NOPOWER)) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) + if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.machine = src if (href_list["reset"]) - src.reset() + reset() else if (href_list["alarm"]) - src.alarm() + alarm() else if (href_list["time"]) - src.timing = text2num(href_list["time"]) - last_process = world.timeofday - processing_objects.Add(src) + timing = text2num(href_list["time"]) else if (href_list["tp"]) var/tp = text2num(href_list["tp"]) - src.time += tp - src.time = min(max(round(src.time), 0), 120) - src.updateUsrDialog() + time += tp + time = min(max(round(time), 0), 120) + updateUsrDialog() - src.add_fingerprint(usr) + add_fingerprint(usr) else usr << browse(null, "window=firealarm") return return /obj/machinery/firealarm/proc/reset() - if (!( src.working )) - return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) + if (!working) return + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master for(var/area/RA in A.related) RA.firereset() return /obj/machinery/firealarm/proc/alarm() - if (!( src.working )) - return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) + if (!( working )) return + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master for(var/area/RA in A.related) RA.firealert() - //playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0) + //playsound(loc, 'signal.ogg', 75, 0) return /obj/machinery/partyalarm/attack_paw(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) + /obj/machinery/partyalarm/attack_hand(mob/user as mob) if(user.stat || stat & (NOPOWER|BROKEN)) return - user.set_machine(src) - var/area/A = src.loc + user.machine = src + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master var/d1 var/d2 if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) - A = A.loc if (A.party) d1 = text("No Party :(", src) else d1 = text("PARTY!!!", src) - if (src.timing) + if (timing) d2 = text("Stop Time Lock", src) else d2 = text("Initiate Time Lock", src) - var/second = src.time % 60 - var/minute = (src.time - second) / 60 + var/second = time % 60 + var/minute = (time - second) / 60 var/dat = text("Party Button []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) user << browse(dat, "window=partyalarm") onclose(user, "partyalarm") else - A = A.loc if (A.fire) d1 = text("[]", src, stars("No Party :(")) else d1 = text("[]", src, stars("PARTY!!!")) - if (src.timing) + if (timing) d2 = text("[]", src, stars("Stop Time Lock")) else d2 = text("[]", src, stars("Initiate Time Lock")) - var/second = src.time % 60 - var/minute = (src.time - second) / 60 + var/second = time % 60 + var/minute = (time - second) / 60 var/dat = text("[] []\n
\nTimer System: []
\nTime Left: [][] - - + +\n
", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src) user << browse(dat, "window=partyalarm") onclose(user, "partyalarm") return /obj/machinery/partyalarm/proc/reset() - if (!( src.working )) - return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) + if (!( working )) return + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master A.partyreset() return /obj/machinery/partyalarm/proc/alarm() - if (!( src.working )) - return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) + if (!( working )) return + var/area/A = get_area(src) + ASSERT(isarea(A)) + if(A.master) + A = A.master A.partyalert() return @@ -1236,25 +1222,25 @@ table tr:first-child th:first-child { border: none;} ..() if (usr.stat || stat & (BROKEN|NOPOWER)) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) - usr.set_machine(src) + if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + usr.machine = src if (href_list["reset"]) - src.reset() + reset() else if (href_list["alarm"]) - src.alarm() + alarm() else if (href_list["time"]) - src.timing = text2num(href_list["time"]) + timing = text2num(href_list["time"]) else if (href_list["tp"]) var/tp = text2num(href_list["tp"]) - src.time += tp - src.time = min(max(round(src.time), 0), 120) - src.updateUsrDialog() + time += tp + time = min(max(round(time), 0), 120) + updateUsrDialog() - src.add_fingerprint(usr) + add_fingerprint(usr) else usr << browse(null, "window=partyalarm") return - return + return \ No newline at end of file diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 14e544dcb05..a374abd6fd9 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,26 +1,62 @@ /var/const/OPEN = 1 /var/const/CLOSED = 2 - /obj/machinery/door/firedoor - name = "Firelock" - desc = "Apply crowbar" - icon = 'icons/obj/doors/Doorfire.dmi' + name = "\improper Emergency Shutter" + desc = "Emergency air-tight shutter, capable of sealing off breached areas." + icon = 'DoorHazard.dmi' icon_state = "door_open" + req_access = list(access_atmospherics, access_engine_equip) opacity = 0 density = 0 - power_channel = ENVIRON + var/blocked = 0 var/nextstate = null + var/net_id + var/list/areas_added + var/list/users_to_open + + New() + . = ..() + var/area/A = get_area(src) + ASSERT(istype(A)) + + A.all_doors.Add(src) + areas_added = list(A) + + for(var/direction in cardinal) + A = get_area(get_step(src,direction)) + if(istype(A) && !(A in areas_added)) + A.all_doors.Add(src) + areas_added += A + + + Del() + for(var/area/A in areas_added) + A.all_doors.Remove(src) + . = ..() + + + examine() + set src in view() + . = ..() + if( islist(users_to_open) && users_to_open.len) + var/users_to_open_string = users_to_open[1] + if(users_to_open.len >= 2) + for(var/i = 2 to users_to_open.len) + users_to_open_string += ", [users_to_open[i]]" + usr << "These people have opened \the [src] during an alert: [users_to_open_string]." Bumped(atom/AM) - if(p_open || operating) return - if(!density) return ..() + if(p_open || operating) + return + if(!density) + return ..() return 0 power_change() - if(powered(power_channel)) + if(powered(ENVIRON)) stat &= ~NOPOWER else stat |= NOPOWER @@ -29,24 +65,95 @@ attackby(obj/item/weapon/C as obj, mob/user as mob) add_fingerprint(user) - if(operating) return//Already doing something. + if(operating) + return//Already doing something. if(istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = C if(W.remove_fuel(0, user)) blocked = !blocked - user << text("\red You [blocked?"welded":"unwelded"] the [src]") + user.visible_message("\red \The [user] [blocked ? "welds" : "unwelds"] \the [src] with \a [W].",\ + "You [blocked ? "weld" : "unweld"] \the [src] with \the [W].",\ + "You hear something being welded.") update_icon() return - if(istype(C, /obj/item/weapon/crowbar) || (istype(C,/obj/item/weapon/twohanded/fireaxe) && C:wielded == 1)) - if(blocked || operating) return + var/area/A = get_area(src) + ASSERT(istype(A)) + if(A.master) + A = A.master + var/alarmed = A.air_doors_activated || A.fire + + if( istype(C, /obj/item/weapon/crowbar) || ( istype(C,/obj/item/weapon/twohanded/fireaxe) && C:wielded == 1 ) ) + if(operating) + return + if( blocked && istype(C, /obj/item/weapon/crowbar) ) + user.visible_message("\red \The [user] pries at \the [src] with \a [C], but \the [src] is welded in place!",\ + "You try to pry \the [src] [density ? "open" : "closed"], but it is welded in place!",\ + "You hear someone struggle and metal straining.") + return + if( istype(C, /obj/item/weapon/crowbar) ) + if( stat & (BROKEN|NOPOWER) || !density || !alarmed ) + user.visible_message("\red \The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!",\ + "You force \the [src] [density ? "open" : "closed"] with \the [C]!",\ + "You hear metal strain, and a door [density ? "open" : "close"].") + else if( allowed(user) ) + user.visible_message("\blue \The [user] lifts \the [src] with \a [C].",\ + "\The [src] scans your ID, and obediently opens as you apply your [C].",\ + "You hear metal move, and a door [density ? "open" : "close"].") + else + user.visible_message("\blue \The [user] pries at \the [src] with \a [C], but \the [src] resists being opened.",\ + "\red You pry at \the [src], but it actively resists your efforts. Maybe use your ID, perhaps?",\ + "You hear someone struggling and metal straining") + return + else + user.visible_message("\red \The [user] forces \the [ blocked ? "welded" : "" ] [src] [density ? "open" : "closed"] with \a [C]!",\ + "You force \the [ blocked ? "welded" : "" ] [src] [density ? "open" : "closed"] with \the [C]!",\ + "You hear metal strain and groan, and a door [density ? "open" : "close"].") + if(density) + spawn(0) + open() + else + spawn(0) + close() + + if( !stat && ( istype(C, /obj/item/weapon/card/id) || istype(C, /obj/item/device/pda) ) ) + var/obj/item/weapon/card/id/ID = C + + if( istype(C, /obj/item/device/pda) ) + var/obj/item/device/pda/pda = C + ID = pda.id + if(!istype(ID)) + ID = null + + var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density && !check_access(ID) ? "\nNote that by doing this, you acknowledge any damages from opening this [src.name]\nas being your own fault, and you will be held accountable under the law." : ""]",\ + "\The [src]", "Yes, [density ? "open" : "close"]", "No") + if(answer == "No") + return + if(user.stat || !user.canmove || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1) + user << "Sorry, you must remain able bodied and close to \the [src] in order to use it." + return + + if(alarmed && density && !check_access(ID) && ( ID && !( ID.registered_name in users_to_open ) ) ) + user.visible_message("\red \The [src] opens for \the [user], but only after they acknowledged responsibility for the consequences.",\ + "\The [src] opens after you acknowledge the consequences.",\ + "You hear a beep, and a door opening.") + if(ID && ID.registered_name) + if(!users_to_open) + users_to_open = list() + users_to_open += ID.registered_name + else + user.visible_message("\blue \The [src] [density ? "open" : "close"]s for \the [user].",\ + "\The [src] [density ? "open" : "close"]s.",\ + "You hear a beep, and a door opening.") + if(density) open() - return - else //close it up again //fucking 10/10 commenting here einstein + else close() - return - return + + if(alarmed && !density) + spawn(100) + nextstate = CLOSED process() @@ -54,9 +161,11 @@ return switch(nextstate) if(OPEN) - open() + spawn() + open() if(CLOSED) - close() + spawn() + close() nextstate = null return @@ -83,6 +192,4 @@ return - -//border_only fire doors are special when it comes to air groups /obj/machinery/door/firedoor/border_only \ No newline at end of file diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index b4992059f6f..dce2ab37bda 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -4,7 +4,8 @@ Bumped(atom/AM) - if(src.locked) return + if(src.locked) + return ..() return From 93476a2c168fa1bae8bb38175bc79fb193653747 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Fri, 4 Jan 2013 10:48:13 -0700 Subject: [PATCH 4/7] Finishing touches on Air Alarms, Firedoors, and Central Atmos Control --- baystation12.dme | 1 + .../components/unary/vent_pump.dm | 125 ++++++++---------- .../components/unary/vent_scrubber.dm | 48 ++++--- code/WorkInProgress/Mini/atmos_control.dm | 10 +- code/game/jobs/access.dm | 29 ++++ code/game/machinery/alarm.dm | 9 +- code/game/machinery/doors/firedoor.dm | 79 +++++++---- maps/tgstation.2.0.9.1.dmm | 12 +- 8 files changed, 180 insertions(+), 133 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 9962101e104..9de1e153ca6 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1152,6 +1152,7 @@ #include "code\WorkInProgress\Cael_Aislinn\Supermatter\SuperMatter.dm" #include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm" #include "code\WorkInProgress\Chinsky\ashtray.dm" +#include "code\WorkInProgress\Mini\atmos_control.dm" #include "code\WorkInProgress\Ported\policetape.dm" #include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm" #include "code\WorkInProgress\Susan\susan_desert_turfs.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 7b9444d8902..9aae6910c7c 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -5,13 +5,14 @@ name = "Air Vent" desc = "Has a valve and pump attached to it" - var/area/initial_loc level = 1 var/area_uid - var/id_tag = null + var/id_tag + power_channel = ENVIRON var/on = 0 var/pump_direction = 1 //0 = siphoning, 1 = releasing + var/pump_speed = 1 //Used to adjust speed for siphons var/external_pressure_bound = ONE_ATMOSPHERE var/internal_pressure_bound = 0 @@ -42,25 +43,27 @@ icon_state = "in" New() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid + var/area/A = get_area(loc) + if (A.master) + A = A.master + area_uid = A.uid if (!id_tag) assign_uid() id_tag = num2text(uid) if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() + initialize() + broadcast_status() ..() high_volume name = "Large Air Vent" power_channel = EQUIP + New() ..() air_contents.volume = 1000 + update_icon() if(welded) icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" @@ -77,11 +80,12 @@ process() ..() +// broadcast_status() if(stat & (NOPOWER|BROKEN)) return if (!node) on = 0 - //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 + if(!on) return 0 @@ -101,7 +105,7 @@ if(pressure_delta > 0) if(air_contents.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = pressure_delta*environment.volume*environment.group_multiplier*pump_speed/(air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) @@ -119,7 +123,7 @@ if(pressure_delta > 0) if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + var/transfer_moles = pressure_delta*air_contents.volume*air_contents.group_multiplier*pump_speed/(environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) if (isnull(removed)) //in space @@ -132,39 +136,42 @@ return 1 + + + //Radio remote control - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) + proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) - broadcast_status() - if(!radio_connection) - return 0 + proc/broadcast_status() + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - signal.data = list( - "area" = src.area_uid, - "tag" = src.id_tag, - "device" = "AVP", - "power" = on, - "direction" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "internal" = internal_pressure_bound, - "external" = external_pressure_bound, - "timestamp" = world.time, - "sigtype" = "status" - ) + signal.data = list( + "area" = src.area_uid, + "tag" = src.id_tag, + "device" = "AVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "internal" = internal_pressure_bound, + "external" = external_pressure_bound, + "timestamp" = world.time, + "sigtype" = "status", + "setting" = pump_speed + ) - radio_connection.post_signal(src, signal, radio_filter_out) + radio_connection.post_signal(src, signal, radio_filter_out) - return 1 + return 1 initialize() @@ -176,6 +183,7 @@ if(frequency) set_frequency(frequency) + receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return @@ -203,47 +211,29 @@ if("checks_toggle" in signal.data) pressure_checks = (pressure_checks?0:3) - if("direction" in signal.data) + if("direction" in signal) pump_direction = text2num(signal.data["direction"]) if("set_internal_pressure" in signal.data) - internal_pressure_bound = between( - 0, - text2num(signal.data["set_internal_pressure"]), - ONE_ATMOSPHERE*50 - ) + internal_pressure_bound = between(0, text2num(signal.data["set_internal_pressure"]), ONE_ATMOSPHERE*50) if("set_external_pressure" in signal.data) - external_pressure_bound = between( - 0, - text2num(signal.data["set_external_pressure"]), - ONE_ATMOSPHERE*50 - ) + external_pressure_bound = between(0, text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50) if("adjust_internal_pressure" in signal.data) - internal_pressure_bound = between( - 0, - internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), - ONE_ATMOSPHERE*50 - ) + internal_pressure_bound = between(0, internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), ONE_ATMOSPHERE*50) if("adjust_external_pressure" in signal.data) - external_pressure_bound = between( - 0, - external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), - ONE_ATMOSPHERE*50 - ) + external_pressure_bound = between(0, external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), ONE_ATMOSPHERE*50) if("init" in signal.data) name = signal.data["init"] return - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if("setting" in signal.data) + pump_speed = text2num(signal.data["setting"]) - //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal["command"]]\"\n[signal.debug_print()]") spawn(2) broadcast_status() update_icon() @@ -284,6 +274,7 @@ else user << "\blue You need more welding fuel to complete this task." return 1 + examine() set src in oview(1) ..() @@ -321,10 +312,4 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) - - /obj/machinery/atmospherics/unary/vent_pump/Del() - if (initial_loc.air_scrub_info) - initial_loc.air_scrub_info -= id_tag - ..() - return + del(src) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 84378df3d14..b9c26d32511 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -7,34 +7,36 @@ level = 1 - var/area/initial_loc var/id_tag = null - var/frequency = 1439 - var/datum/radio_frequency/radio_connection var/on = 0 var/scrubbing = 1 //0 = siphoning, 1 = scrubbing var/scrub_CO2 = 1 var/scrub_Toxins = 0 var/scrub_N2O = 0 + var/scrub_rate = 1 var/volume_rate = 120 var/panic = 0 //is this scrubber panicked? var/area_uid + + var/frequency = 1439 + var/datum/radio_frequency/radio_connection var/radio_filter_out var/radio_filter_in + New() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid + var/area/A = get_area(loc) + if (A.master) + A = A.master + area_uid = A.uid if (!id_tag) assign_uid() id_tag = num2text(uid) if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() + initialize() + broadcast_status() ..() update_icon() @@ -86,20 +88,20 @@ process() ..() +// broadcast_status() if(stat & (NOPOWER|BROKEN)) return if (!node) on = 0 - //broadcast_status() + if(!on) return 0 - var/datum/gas_mixture/environment = loc.return_air() if(scrubbing) if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0)) - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() + var/transfer_moles = min(1, volume_rate*scrub_rate/environment.volume)*environment.total_moles //Take a gas sample var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -118,15 +120,14 @@ if(removed.trace_gases.len>0) for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/oxygen_agent_b)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O) + if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O) removed.trace_gases -= trace_gas filtered_out.trace_gases += trace_gas //Remix the resulting gases + filtered_out.update_values() + removed.update_values() air_contents.merge(filtered_out) loc.assume_air(removed) @@ -138,7 +139,7 @@ if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) return - var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) + var/transfer_moles = environment.total_moles*(volume_rate*scrub_rate/environment.volume) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -220,6 +221,9 @@ broadcast_status() return //do not update_icon + if("setting" in signal.data) + scrub_rate = text2num(signal.data["setting"]) + // log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") spawn(2) broadcast_status() @@ -227,7 +231,7 @@ return power_change() - if(powered(power_channel)) + if(powered(ENVIRON)) stat &= ~NOPOWER else stat |= NOPOWER @@ -257,10 +261,4 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) - - /obj/machinery/atmospherics/unary/vent_scrubber/Del() - if (initial_loc.air_scrub_info) - initial_loc.air_scrub_info -= id_tag - ..() - return + del(src) \ No newline at end of file diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm index 6c06a16b799..506258cdf9b 100644 --- a/code/WorkInProgress/Mini/atmos_control.dm +++ b/code/WorkInProgress/Mini/atmos_control.dm @@ -16,7 +16,7 @@ /obj/machinery/computer/atmoscontrol/attack_hand(mob/user) if(..()) return - user.machine = src + user.set_machine(src) if(allowed(user)) overridden = 1 else if(!emagged) @@ -139,6 +139,12 @@ src.updateUsrDialog() return + if(href_list["atmos_unlock"]) + switch(href_list["atmos_unlock"]) + if("0") + current.air_doors_close(1) + if("1") + current.air_doors_open(1) if(href_list["atmos_alarm"]) if (current.alarm_area.atmosalert(2)) @@ -187,6 +193,8 @@ output += "PANIC SYPHON ACTIVE
turn syphoning off" else output += "ACTIVATE PANIC SYPHON IN AREA" + + output += "

Atmospheric Lockdown: [current.alarm_area.air_doors_activated ? "ENABLED" : "Disabled"]" if (AALARM_SCREEN_VENT) var/sensor_data = "" if(current.alarm_area.air_vent_names.len) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index a465147daa7..b83774e381d 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -517,3 +517,32 @@ return jobName return "Unknown" + +proc/FindNameFromID(var/mob/living/carbon/human/H) + ASSERT(istype(H)) + var/obj/item/weapon/card/id/C = H.get_active_hand() + if( istype(C) || istype(C, /obj/item/device/pda) ) + var/obj/item/weapon/card/id/ID = C + + if( istype(C, /obj/item/device/pda) ) + var/obj/item/device/pda/pda = C + ID = pda.id + if(!istype(ID)) + ID = null + + if(ID) + return ID.registered_name + + C = H.wear_id + + if( istype(C) || istype(C, /obj/item/device/pda) ) + var/obj/item/weapon/card/id/ID = C + + if( istype(C, /obj/item/device/pda) ) + var/obj/item/device/pda/pda = C + ID = pda.id + if(!istype(ID)) + ID = null + + if(ID) + return ID.registered_name diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index efac9a4b4a2..85843cca50f 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -46,7 +46,6 @@ #define RCON_AUTO 2 #define RCON_YES 3 -//all air alarms in area are connected via magic //all air alarms in area are connected via magic /area var/obj/machinery/alarm/master_air_alarm @@ -94,8 +93,8 @@ TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa TLV["plasma"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa - TLV["pressure"] = list(ONE_ATMOSPHERE*0.50,ONE_ATMOSPHERE*0.70,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */ - TLV["temperature"] = list(40, 60, 100, 120) // K + TLV["pressure"] = list(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */ + TLV["temperature"] = list(20, 40, 140, 160) // K New() ..() @@ -524,7 +523,7 @@ . = ..() if (.) return - user.machine = src + user.set_machine(src) if ( (get_dist(src, user) > 1 )) if (!istype(user, /mob/living/silicon)) @@ -647,8 +646,6 @@ Toxins: [plasma_percent]%
else output += {"Optimal"} - output += "

Atmospheric Lockdown: [alarm_area.air_doors_activated ? "ENABLED" : "Disabled"]" - return output proc/rcon_text() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index a374abd6fd9..b755f16d0a0 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -5,7 +5,7 @@ desc = "Emergency air-tight shutter, capable of sealing off breached areas." icon = 'DoorHazard.dmi' icon_state = "door_open" - req_access = list(access_atmospherics, access_engine_equip) + req_one_access = list(access_atmospherics, access_engine_equip) opacity = 0 density = 0 @@ -63,6 +63,10 @@ return + attack_hand(mob/user as mob) + return attackby(null, user) + + attackby(obj/item/weapon/C as obj, mob/user as mob) add_fingerprint(user) if(operating) @@ -77,6 +81,10 @@ update_icon() return + if(blocked) + user << "\red \The [src] is welded solid!" + return + var/area/A = get_area(src) ASSERT(istype(A)) if(A.master) @@ -116,6 +124,16 @@ spawn(0) close() + var/access_granted = 0 + var/users_name + if(!istype(C, /obj)) //If someone hit it with their hand. We need to see if they are allowed. + if(allowed(user)) + access_granted = 1 + if(ishuman(user)) + users_name = FindNameFromID(user) + else + users_name = "Unknown" + if( !stat && ( istype(C, /obj/item/weapon/card/id) || istype(C, /obj/item/device/pda) ) ) var/obj/item/weapon/card/id/ID = C @@ -125,35 +143,46 @@ if(!istype(ID)) ID = null - var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density && !check_access(ID) ? "\nNote that by doing this, you acknowledge any damages from opening this [src.name]\nas being your own fault, and you will be held accountable under the law." : ""]",\ - "\The [src]", "Yes, [density ? "open" : "close"]", "No") - if(answer == "No") - return - if(user.stat || !user.canmove || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1) - user << "Sorry, you must remain able bodied and close to \the [src] in order to use it." - return + if(ID) + users_name = ID.registered_name - if(alarmed && density && !check_access(ID) && ( ID && !( ID.registered_name in users_to_open ) ) ) - user.visible_message("\red \The [src] opens for \the [user], but only after they acknowledged responsibility for the consequences.",\ - "\The [src] opens after you acknowledge the consequences.",\ - "You hear a beep, and a door opening.") - if(ID && ID.registered_name) - if(!users_to_open) - users_to_open = list() - users_to_open += ID.registered_name - else - user.visible_message("\blue \The [src] [density ? "open" : "close"]s for \the [user].",\ - "\The [src] [density ? "open" : "close"]s.",\ - "You hear a beep, and a door opening.") + if(check_access(ID)) + access_granted = 1 - if(density) + var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density && !access_granted ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\ + "\The [src]", "Yes, [density ? "open" : "close"]", "No") + if(answer == "No") + return + if(user.stat || !user.canmove || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1) + user << "Sorry, you must remain able bodied and close to \the [src] in order to use it." + return + + if(alarmed && density && !access_granted && !( users_name in users_to_open ) ) + user.visible_message("\red \The [src] opens for \the [user], but only after they acknowledged responsibility for the consequences.",\ + "\The [src] opens after you acknowledge the consequences.",\ + "You hear a beep, and a door opening.") + if(!users_to_open) + users_to_open = list() + users_to_open += users_name + else + user.visible_message("\blue \The [src] [density ? "open" : "close"]s for \the [user].",\ + "\The [src] [density ? "open" : "close"]s.",\ + "You hear a beep, and a door opening.") + + var/needs_to_close = 0 + if(density) + if(alarmed) + needs_to_close = 1 + spawn() open() - else + else + spawn() close() - if(alarmed && !density) - spawn(100) - nextstate = CLOSED + if(needs_to_close) + spawn(50) + if(alarmed) + nextstate = CLOSED process() diff --git a/maps/tgstation.2.0.9.1.dmm b/maps/tgstation.2.0.9.1.dmm index e7e4ab656f0..1bce8a84949 100644 --- a/maps/tgstation.2.0.9.1.dmm +++ b/maps/tgstation.2.0.9.1.dmm @@ -5066,7 +5066,7 @@ "bTv" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r"; level = 2},/obj/machinery/meter,/turf/simulated/wall,/area/atmos) "bTw" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/obj/machinery/light,/turf/simulated/floor,/area/atmos) "bTx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/wall/r_wall,/area/atmos) -"bTy" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos) +"bTy" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) "bTz" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos) "bTA" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) "bTB" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_atmos{name = "Monitoring Room"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos) @@ -5074,7 +5074,7 @@ "bTD" = (/obj/machinery/atmospherics/pipe/manifold{tag = "icon-manifold-r (EAST)"; icon_state = "manifold-r"; dir = 4; level = 2; color = "red"},/turf/simulated/floor,/area/atmos) "bTE" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/atmos) "bTF" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos) -"bTG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/turf/simulated/floor,/area/atmos) +"bTG" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/obj/machinery/computer/atmoscontrol,/turf/simulated/floor,/area/atmos) "bTH" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/turf/simulated/floor,/area/atmos) "bTI" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) "bTJ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor,/area/atmos) @@ -5884,7 +5884,7 @@ "cjh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/engine/engineering) "cji" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/turf/simulated/floor,/area/engine/engineering) "cjj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/engine/engineering) -"cjk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) +"cjk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/turf/simulated/floor,/area/atmos) "cjl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cjm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cjn" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/starboard) @@ -8989,7 +8989,7 @@ "dqS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/disposal) "dqT" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/effect/sign/vacuum{pixel_x = -32},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/disposal) "dqU" = (/turf/space,/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/shuttle/transport1/centcom) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9152,7 +9152,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaafaafaaaaaaaaabPCbLjbPDbJLbJLbJLbOAbOAbOAbOAbOAbPEbOAbOAbOAbPFbPGbvZbMAbvZbPHbPIbNGbKsbPJbPKbHsbHsbHsbHsbPLbPMbPNbLGbPObPPbPQbPRbPSbPTbPUbPTbPVaafbLPbLPbLPbLPbLPaafaafaafbjIbPWbpGbIQbPXbPYbdpbPZbmxbQabQbbQcbQdbQebQfbQgbQhbQibQjbQibQkbLYbQlbQmbQnbQobQlbLYbQpbQqbNkbQrbQsbQtbQubQtbQvbQtbQwbQxbQxbQybQzbQAbccbccaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbAsbAtbJxbJvbJvbBNbBNbBNbBNbBNbBNbBNbBNbAtbAtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaabQCbLjbPDbJLaafaaabOAbQDbQEbQFbQGbQHbQIbQJbOAbOAbQKbQLbJYbvZbPHbQMbQNbMDbQObQPbQQbQRbQSbHsbQTbPMbLGbQUbLNbQVbQWbQXbQYbQZbRabRbbRcbMSbMTbRdbRebRebLPaafaaaaaablkbKvbdnbRfbEXbdnbdnbdnbRgbRhbRibRjbRkbRlbRmbRnbRobRpbRqbRrbRsbLYbLYbLYbLYbLYbLYbLYbRtbRubNkbRvbRwbRxbRybRzbRAbRBbRCbRDbREbRFbKObRGbQBbccbccbccaaaaaaaafaaaaaaaafagQagQagQaaaaaaaaaaafaaaaaaaafaaaaaaaafaaaaaabEfbAtbCSbAtbAtbBNbBNbBNbBNbBNbBNbBNbAtbAtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJLbJLbJLbJLbJLbLjbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbQJbQJbScbSdbSebvZbMAbvZbSfbSgbLNbLNbShbSibSjbLNbSkbSlbSmbSnbLNbSobSpbSqbSrbSsbLGbStbSubSvbNRaafbNSbSwbSxbSybLPaafaaaaaablkbKvbdnbSzbSAbSBbSCbSDbdpbRhbSEbNbbSFbSGbQfbSHbSIbSJbSKbSLbRsbSMbSNbSObSPbSQbSRbSSbSTbSUbNkbSVbSWbSXbSYbSZbTabTbbTcbSYbTdbSVbKObTebRHbRIbRJbRKbRLbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRMbRNbRObRPbRPbRQbAtbAtbBNbBNbRRbBNbBNbAtbAtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaabPCbTkbTlbTmbTnbTobTpbTnbTqbTrbTsbTtbQJbQJbQJbQJbQJbQJbScbSdbSebvZbMAbvZbTubTvbOKbTwbOKbTxbTybTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbLGbStbTKbTLbTMbOTbMTbTNbRebRebLPaafaafaafblkbKvbdnbTObTPbTQbTRbTSbdpbRhbTTbNbbNbbNbbNcbNbbNbbTUbNbbNbbRsbTVbTWbTVbTXbTYbTZbUabUabUbbNkbNkbKObUcbUdbUdbUdbUebUdbUfbKObKObKObUgbTfbccbTgbccaaaaaabThaaaaaaaafagQagQagQaaaaaaaaaaafaaaaaaaafaaaaaaaafaafaafbTibTjbBLbCTbAsbAtbAtbBNbBObBNbAtbAtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaabPCbTkbTlbTmbTnbTobTpbTnbTqbTrbTsbTtbQJbQJbQJbQJbQJbQJbScbSdbSebvZbMAbvZbTubTvbOKbTwbOKbTxbTGbTzbTAbTBbTCbTDbTEbTFcjkbTHbTIbTJbLGbStbTKbTLbTMbOTbMTbTNbRebRebLPaafaafaafblkbKvbdnbTObTPbTQbTRbTSbdpbRhbTTbNbbNbbNbbNcbNbbNbbTUbNbbNbbRsbTVbTWbTVbTXbTYbTZbUabUabUbbNkbNkbKObUcbUdbUdbUdbUebUdbUfbKObKObKObUgbTfbccbTgbccaaaaaabThaaaaaaaafagQagQagQaaaaaaaaaaafaaaaaaaafaaaaaaaafaafaafbTibTjbBLbCTbAsbAtbAtbBNbBObBNbAtbAtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaabQCbUlbUmbUnbIpbIpbJLbLgbUobLibOAbUpbQJbQFbQFbQFbQJbUqbOAbOAbQKbUrbMAbvZbTubUsbUtbHsbUubQPbUvbUwbUxbHsbUybUzbHsbHsbHsbUAbLGbUBbLGbStbSubUCbNRaafbLPbLPbLPbLPbLPaafaaaaaabNVbKvbdnbdnbdnbdnbdnbdnbUDbUEbdpbsDbUFbUGbUHbUIbUJbUKbULbUMbRsbUNbTVbUObTXbUPbUQbURbURbUSbUTbUUbKObUVbUWbUdbUXbUYbUWbUdbKObUZbVabVbbUhbUibUjaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbUkbAqbAqbArbAsbAsbAtbAtbAtbAtbAtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaabJLbJLbJLbJLbIpbUnbIpbIpbJLaaabVdaaabOAbVebQJbRZbSabSbbQJbQJbQJbQJbVfbvZbMAbVgbzvbHsbHsbHsbVhbVibVjbVkbVlbKcbNJbPMbVmbVnbVobTHbVpbTHbVqbVrbVsbVtbRcbMSbMTbVubVvbVwbLPaafaaaaaabccbVxbVybVybVybVybVzbdnbVAbRhbdpbdpbVBbQibVCbQibQibVDbQibVEbRsbVFbVGbVHbVIbVJbVGbVKbVLbVMbVNbVNbKObUdbVObUdbUdbUdbVObUdbKObTebccbVPbVQbccaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaabJLbVRbVSbVTbVUbVVbVWbVXbVWaaabVdaaabOAbVYbQJbQJbQJbVZbQJbWabWbbQJbWcbWdbLxbWdbWebWfbWgbWfbWhbWibWjbMFbLGbKcbNJbPMbWkbLGbWlbWmbVpbTHbVqbStbSubWnbNRaafbNSbWobWpbWqbLPaafaafaafbccbccbWrbWsbVQbccbWtbpGbPYbWubWvbWwbUFbWxbWxbWybWxbQibWzbWAbRsbWBbVGbVGbWCbVGbVGbWDbWEbWFbWGbWHbKObKObKObKObKObKObKObKObKObTebccaafaafaafaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9172,7 +9172,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafbYVcglbYXaaabYVcglbYXaaabYVcglbYXaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabJLbIpchFbLjcdCcgZcgZchacdCchGchGchHchIchJchKchLchMchNchOchPchQchRchScdMchTchUchVcdQcdQcdQbLPchtchWchtbLPchvchXchvbLPchzchYchzbLPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachZaaaaaabZxciacibciccidciecifcigciecigcifbZxaaaaaaaaaaaaaZvaZvaZvcihaafaafaafaafchEaafaafaafaafaafajXaZvaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaafbYVcglbYXaaabYVcglbYXaafbYVcglbYXaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacdCciicdCcijcdCcgZchachacdCcikcilcimcincheciocipciqcircfQciociscitcfQciocirciucivciwcixcdCbLPbLPbLPbLPbLPbLPbLPbLPbLPbLPbLPbLPbLPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZxbZxciycizbZxbZxbZxbZxbZxbZxbZxbZxaaaaaaaaaaaaaZvaaaaafaaaaafaaaaaaaaaciAaaaaafaafaaaaaaaaaaaaaZvaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXaafbYVciBbYXaaabYVciBbYXaaabYVciBbYXaafajlaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacdCciCcdCciDcdCcdCcdCcdCciEciFciGciHciHciHciGciIciGciJciKciLciMciNciOciGciGciPciGciQciRcdCaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbZxbZxbZxbZxaaaaafaafaafaafaafaaaaaaaaaaaaaaaaZvaaaciSciSciSciSciSaafciTaafciSciSciSciSciSaaaaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaajlaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafcdCchfchfcfQciUciVciWciXciGciYchfciZcjachfcjbcjccjdcjecjfcjecjgcjhcjbcjicjjchfchfciucjkcdCcdCchGchGchGcdCaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaZvaafcjlcjmcjmcjmcjmcjnciTcjocjpcjpcjpcjpcjqaafaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajlaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaajlaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafcdCchfchfcfQciUciVciWciXciGciYchfciZcjachfcjbcjccjdcjecjfcjecjgcjhcjbcjicjjchfchfciubTycdCcdCchGchGchGcdCaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaZvaafcjlcjmcjmcjmcjmcjnciTcjocjpcjpcjpcjpcjqaafaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajmajmajlajmajmajXajlajlajlajlajmajlajlajmcjraafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaacdCcjschfcjtcjucjvcjwcjxcjyciuchfcjzchfchfcjAcjBcjCcjDcjEcjDcjFcjBcjGcjHcjIchfchfciuchfcjJchGcjKcjLcjMcjMcjNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaZvaafcjOcjOcjOcjOcjOaaaciTaaacjOcjOcjOcjOcjOaafaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcdCcdCcjPcjQchechfcjRcjScjTciucjachfcjUcjVcjVcjWcjXcjYcjZcfHckacjWciJciJckbchfchfckcchfckdckecfFckfckgckhckiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZvaaaaafaaaaafaafaafaaaciTaaaaafaaaaafaaaaafaaaaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaackjckkcklchfckmcknckockpckqckrckscktckucdCckvckwckxcjackycdCckzckAckAckrckBckCckockDchGckEckFcjMcjMckGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZvaaaciSciSciSciSciSaafciTaafciSciSciSciSciSaafaZvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 4f93d392f4fa23433011eda7a0b3c82668be0213 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 6 Jan 2013 04:04:25 -0800 Subject: [PATCH 5/7] Added sprites and basic code for positronic brains. --- code/game/machinery/computer/ai_core.dm | 10 +++++----- code/game/mecha/mecha.dm | 4 ++-- code/game/objects/items/robot/robot_parts.dm | 14 +++++++------- code/modules/mob/living/carbon/brain/say.dm | 2 +- icons/obj/assemblies.dmi | Bin 17595 -> 24820 bytes 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 616a62c78b6..c3e0941b101 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -117,16 +117,16 @@ laws.add_inherent_law(M.newFreeFormLaw) usr << "Added a freeform law." - if(istype(P, /obj/item/device/mmi)) + if(istype(P, /obj/item/device/mmi) || istype(P, /obj/item/device/posibrain)) if(!P:brainmob) - user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "\red Sticking an empty [P] into the frame would sort of defeat the purpose." return if(P:brainmob.stat == 2) - user << "\red Sticking a dead brain into the frame would sort of defeat the purpose." + user << "\red Sticking a dead [P] into the frame would sort of defeat the purpose." return if(jobban_isbanned(P:brainmob, "AI")) - user << "\red This MMI does not seem to fit." + user << "\red This [P] does not seem to fit." return if(P:brainmob.mind) @@ -136,7 +136,7 @@ user.drop_item() P.loc = src brain = P - usr << "Added a brain." + usr << "Added [P]." icon_state = "3b" if(istype(P, /obj/item/weapon/crowbar) && brain) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 84fd6c7ae9f..f3e14d0b291 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -668,7 +668,7 @@ /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/device/mmi)) + if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/posibrain)) if(mmi_move_inside(W,user)) user << "[src]-MMI interface initialized successfuly" else @@ -1804,4 +1804,4 @@ //src.health = initial(src.health)/2.2 //src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return -*/ +*/ diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index acd210f5ddc..189aad862a7 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -161,14 +161,14 @@ else user << "\blue You need to attach a flash to it first!" - if(istype(W, /obj/item/device/mmi)) + if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/posibrain)) var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) - user << "\red You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise." + user << "\red You can't put the [W] in, the frame has to be standing on the ground to be perfectly precise." return if(!M.brainmob) - user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "\red Sticking an empty [W] into the frame would sort of defeat the purpose." return if(!M.brainmob.key) var/ghost_can_reenter = 0 @@ -178,19 +178,19 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - user << "The mmi indicates that their mind is completely unresponsive; there's no point." + user << "The [W] is completely unresponsive; there's no point." return if(M.brainmob.stat == DEAD) - user << "\red Sticking a dead brain into the frame would sort of defeat the purpose." + user << "\red Sticking a dead [W] into the frame would sort of defeat the purpose." return if(M.brainmob.mind in ticker.mode.head_revolutionaries) - user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." + user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W]." return if(jobban_isbanned(M.brainmob, "Cyborg")) - user << "\red This MMI does not seem to fit." + user << "\red This [W] does not seem to fit." return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc)) diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 4b8174cc21b..c4d9a865da2 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -2,7 +2,7 @@ if (silent) return - if(!(container && istype(container, /obj/item/device/mmi))) + if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/posibrain)))) return //No MMI, can't speak, bucko./N else if(prob(emp_damage*4)) diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index a0c27d7816b3e745a5d4935d05a68c82305761f0..a4a72b0a3803fccd72d67526a99b40dd2d5bde68 100644 GIT binary patch literal 24820 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 Date: Sun, 6 Jan 2013 10:53:29 -0800 Subject: [PATCH 6/7] Forgot the actual positronic brain file. Yay. --- .../mob/living/carbon/brain/posibrain.dm | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 code/modules/mob/living/carbon/brain/posibrain.dm diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm new file mode 100644 index 00000000000..aad1b6ef253 --- /dev/null +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -0,0 +1,118 @@ +/obj/item/device/posibrain + name = "positronic brain" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain" + w_class = 3 + origin_tech = "engineering=4;materials=4;bluespace=2;programming=6" + + var/list/construction_cost = list("metal"=500,"glass"=500,"silver"=200,"gold"=200,"plasma"=100,"diamond"=10) + var/construction_time = 75 + var/searching = 0 + var/askDelay = 10 * 60 * 1 + + req_access = list(access_robotics) + var/locked = 0 + var/mob/living/carbon/brain/brainmob = null//The current occupant. + var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. + + attack_self(mob/user as mob) + if(!brainmob && searching == 0) + //Start the process of searching for a new user. + user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." + icon_state = "posibrain-searching" + src.searching = 1 + src.request_player() + + proc/request_player() + for(var/mob/dead/observer/O in player_list) + if(jobban_isbanned(O, "pAI")) + continue + if(O.client) + if(O.client.be_pai) + question(O.client) + + proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") + if(!C || brainmob) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(response == "Yes") + transfer_personality(C.mob) + else if (response == "Never for this round") + C.be_pai = 0 + + + proc/transfer_personality(var/mob/candidate) + + var/mob/living/carbon/brain/B = new(src) + + src.searching = 0 + + src.brainmob = B + src.brainmob.mind = candidate.mind + + src.brainmob.name = "PBU-[rand(100, 999)]" + src.brainmob.real_name = "PBU-[rand(100, 999)]" + src.brainmob.loc = src + src.brainmob.container = src + src.brainmob.stat = 0 + src.brainmob.silent = 0 + src.brainmob.brain_op_stage = 4.0 + src.brainmob.key = candidate.key + + dead_mob_list -= src.brainmob + living_mob_list += src.brainmob + + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain chimes quietly.") + icon_state = "posibrain-occupied" + + proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. + + if(brainmob) return + + src.searching = 0 + icon_state = "posibrain" + + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + +/obj/item/device/posibrain/examine() + + set src in oview() + + if(!usr || !src) return + if( (usr.sdisabilities & BLIND || usr.blinded || usr.stat) && !istype(usr,/mob/dead/observer) ) + usr << "Something is there but you can't see it." + return + + var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" + msg += "" + + if(src.brainmob) + switch(src.brainmob.stat) + if(CONSCIOUS) + if(!src.brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk + if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n" + if(DEAD) msg += "It appears to be completely inactive.\n" + else + msg += "[desc]\n" + msg += "*---------*" + usr << msg + return + +/obj/item/device/posibrain/emp_act(severity) + if(!brainmob) + return + else + switch(severity) + if(1) + brainmob.emp_damage += rand(20,30) + if(2) + brainmob.emp_damage += rand(10,20) + if(3) + brainmob.emp_damage += rand(0,10) + ..() \ No newline at end of file From 981e7ff3d7c33a9f00837603a2d522bb57d7bbcb Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 6 Jan 2013 12:20:51 -0800 Subject: [PATCH 7/7] Description fix for posibrains, reset timer on posibrain search, minor fix for Gau's seedbag. --- code/game/objects/items/weapons/hydroponics.dm | 4 ++-- code/modules/mob/living/carbon/brain/posibrain.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 9274453e961..619828f68ce 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -58,7 +58,6 @@ user.machine = src interact(user) - /obj/item/weapon/seedbag/verb/toggle_mode() set name = "Switch Bagging Method" set category = "Object" @@ -99,7 +98,7 @@ S.updateUsrDialog() return -/obj/item/weapon/seedbag/proc/interact(mob/user as mob) +/obj/item/weapon/seedbag/interact(mob/user as mob) var/dat = "Select an item:
" @@ -119,6 +118,7 @@ user << browse("Seedbag Supplies[dat]", "window=seedbag") onclose(user, "seedbag") return + /obj/item/weapon/seedbag/Topic(href, href_list) if(..()) return diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index aad1b6ef253..bff5a6e192f 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -23,6 +23,7 @@ icon_state = "posibrain-searching" src.searching = 1 src.request_player() + spawn(600) reset_search() proc/request_player() for(var/mob/dead/observer/O in player_list) @@ -99,8 +100,7 @@ if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n" if(DEAD) msg += "It appears to be completely inactive.\n" else - msg += "[desc]\n" - msg += "*---------*
" + msg += "*---------*" usr << msg return