diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm index 943b6dd012c..7ae23e7e4b8 100644 --- a/code/WorkInProgress/Mini/atmos_control.dm +++ b/code/WorkInProgress/Mini/atmos_control.dm @@ -14,25 +14,6 @@ var/overridden = 0 //not set yet, can't think of a good way to do it req_one_access = list(access_ce) -/* -/obj/machinery/computer/atmoscontrol/xeno - name = "\improper Xenobiology Atmospherics Computer" - filter=list( - /area/toxins/xenobiology/specimen_1, - /area/toxins/xenobiology/specimen_2, - /area/toxins/xenobiology/specimen_3, - /area/toxins/xenobiology/specimen_4, - /area/toxins/xenobiology/specimen_5, - /area/toxins/xenobiology/specimen_6) - req_one_access = list(access_xenobiology,access_ce) - - -/obj/machinery/computer/atmoscontrol/gas_chamber - name = "\improper Gas Chamber Atmospherics Computer" - filter=list( - /area/security/gas_chamber) - req_one_access = list(access_ce,access_hos) -*/ /obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) @@ -104,7 +85,7 @@ var/list/alarm_data=list() alarm_data["ID"]="\ref[alarm]" - alarm_data["danger"] = max(alarm.danger_level, alarm.alarm_area.atmosalm) + alarm_data["danger"] = max(alarm.local_danger_level, alarm.alarm_area.atmosalm-1) alarm_data["name"] = "[alarm]" alarms+=list(alarm_data) data["alarms"]=alarms @@ -239,15 +220,15 @@ current.air_doors_open(1) if(href_list["atmos_alarm"]) - if (current.alarm_area.atmosalert(2)) - current.apply_danger_level(2) + current.alarmActivated=1 + current.alarm_area.updateDangerLevel() spawn(1) src.updateUsrDialog() current.update_icon() return if(href_list["atmos_reset"]) - if (current.alarm_area.atmosalert(0)) - current.apply_danger_level(0) + current.alarmActivated=0 + current.alarm_area.updateDangerLevel() spawn(1) src.updateUsrDialog() current.update_icon() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index d561875973d..30991e2e65c 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -66,13 +66,31 @@ a.triggerAlarm("Power", src, cameras, source) return -/area/proc/atmosalert(danger_level) +/area/proc/updateDangerLevel() // if(type==/area) //No atmos alarms in space // return 0 //redudant + + + var/danger_level = 0 + + // Determine what the highest DL reported by air alarms is + for (var/area/RA in related) + for(var/obj/machinery/alarm/AA in RA) + if((AA.stat & (NOPOWER|BROKEN)) || AA.shorted || AA.buildstage != 2) + continue + var/reported_danger_level=AA.local_danger_level + if(AA.alarmActivated) + reported_danger_level=2 + if(reported_danger_level>danger_level) + danger_level=reported_danger_level + testing("Danger level at [AA.name]: [AA.local_danger_level] (reported [reported_danger_level])") + + testing("Danger level decided upon in [name]: [danger_level] (from [atmosalm])") + + // Danger level change? if(danger_level != atmosalm) - //updateicon() - //mouse_opacity = 0 - if (danger_level==2) + // Going to danger level 2 from something else + if (danger_level == 2) var/list/cameras = list() for(var/area/RA in related) //updateicon() @@ -83,6 +101,8 @@ aiPlayer.triggerAlarm("Atmosphere", src, cameras, src) for(var/obj/machinery/computer/station_alert/a in machines) a.triggerAlarm("Atmosphere", src, cameras, src) + CloseFirelocks() + // Dropping from danger level 2. else if (atmosalm == 2) for(var/area/RA in related) for(var/obj/machinery/camera/C in RA) @@ -91,6 +111,7 @@ aiPlayer.cancelAlarm("Atmosphere", src, src) for(var/obj/machinery/computer/station_alert/a in machines) a.cancelAlarm("Atmosphere", src, src) + OpenFirelocks() atmosalm = danger_level for (var/obj/machinery/alarm/AA in src) if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) @@ -98,6 +119,24 @@ return 1 return 0 +/area/proc/CloseFirelocks() + for(var/obj/machinery/door/firedoor/D in all_doors) + if(!D.blocked) + if(D.operating) + D.nextstate = CLOSED + else if(!D.density) + spawn() + D.close() + +/area/proc/OpenFirelocks() + for(var/obj/machinery/door/firedoor/D in all_doors) + if(!D.blocked) + if(D.operating) + D.nextstate = OPEN + else if(D.density) + spawn() + D.open() + /area/proc/firealert() if(name == "Space") //no fire alarms in space return @@ -105,13 +144,7 @@ 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() - D.close() + CloseFirelocks() var/list/cameras = list() for(var/area/RA in related) for (var/obj/machinery/camera/C in RA) @@ -127,13 +160,6 @@ 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 - else if(D.density) - spawn(0) - D.open() for(var/area/RA in related) for (var/obj/machinery/camera/C in RA) C.network.Remove("Fire Alarms") @@ -141,20 +167,7 @@ aiPlayer.cancelAlarm("Fire", src, src) for (var/obj/machinery/computer/station_alert/a in machines) a.cancelAlarm("Fire", src, src) - -/area/proc/readyalert() - if(name == "Space") - return - if(!eject) - eject = 1 - updateicon() - return - -/area/proc/readyreset() - if(eject) - eject = 0 - updateicon() - return + OpenFirelocks() /area/proc/radiation_alert() if(name == "Space") @@ -172,6 +185,20 @@ updateicon() return +/area/proc/readyalert() + if(name == "Space") + return + if(!eject) + eject = 1 + updateicon() + return + +/area/proc/readyreset() + if(eject) + eject = 0 + updateicon() + return + /area/proc/partyalert() if(name == "Space") //no parties in space!!! return @@ -186,13 +213,6 @@ party = 0 mouse_opacity = 0 updateicon() - for(var/obj/machinery/door/firedoor/D in src) - if(!D.blocked) - if(D.operating) - D.nextstate = OPEN - else if(D.density) - spawn(0) - D.open() return /area/proc/updateicon() @@ -267,7 +287,15 @@ master.used_environ = 0 /area/proc/use_power(var/amount, var/chan) + switch(chan) + if(EQUIP) + master.used_equip += amount + if(LIGHT) + master.used_light += amount + if(ENVIRON) + master.used_environ += amount +/area/proc/use_battery_power(var/amount, var/chan) switch(chan) if(EQUIP) master.used_equip += amount @@ -340,24 +368,21 @@ for(var/mob/living/carbon/human/M in SubA) thunk(M) -/area/proc/thunk(var/mob/living/carbon/human/M) - if(istype(M,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to. - if(istype(M.shoes, /obj/item/clothing/shoes/magboots) && (M.shoes.flags & NOSLIP)) +/area/proc/thunk(mob) + if(istype(mob,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to. + if((istype(mob:shoes, /obj/item/clothing/shoes/magboots) && (mob:shoes.flags & NOSLIP))) return - if (M.buckled) //Cam't fall down if you are buckled + if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing. return - if(istype(get_turf(M), /turf/space)) // Can't fall onto nothing. - return + if((istype(mob,/mob/living/carbon/human/)) && (mob:m_intent == "run")) // Only clumbsy humans can fall on their asses. + mob:AdjustStunned(5) + mob:AdjustWeakened(5) - if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == "run")). - M.AdjustStunned(5) - M.AdjustWeakened(5) + else if (istype(mob,/mob/living/carbon/human/)) + mob:AdjustStunned(2) + mob:AdjustWeakened(2) - else if (istype(M,/mob/living/carbon/human/)) - M.AdjustStunned(2) - M.AdjustWeakened(2) - - M << "Gravity!" + mob << "Gravity!" diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 0b76e21c88f..557c54e74ad 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -96,7 +96,8 @@ var/screen = AALARM_SCREEN_MAIN var/area_uid var/area/alarm_area - var/danger_level = 0 + var/local_danger_level = 0 + var/alarmActivated = 0 // Manually activated (independent from danger level) var/danger_averted_confidence=0 var/buildstage = 2 //2 is built, 1 is building, 0 is frame. @@ -226,37 +227,34 @@ target_temperature = T0C + MIN_TEMPERATURE var/datum/gas_mixture/gas = location.remove_air(0.25*environment.total_moles) - var/heat_capacity = 0 - var/energy_used - if(gas) - heat_capacity = gas.heat_capacity() - energy_used = min( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE) + var/heat_capacity = gas.heat_capacity() + var/energy_used = max( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE) - //Use power. Assuming that each power unit represents 1000 watts.... - use_power(energy_used/1000, ENVIRON) + //Use power. Assuming that each power unit represents 1000 watts.... + use_power(energy_used/1000, ENVIRON) - //We need to cool ourselves. - if(environment.temperature > target_temperature) - gas.temperature -= energy_used/heat_capacity - else - gas.temperature += energy_used/heat_capacity + //We need to cool ourselves. + if(environment.temperature > target_temperature) + gas.temperature -= energy_used/heat_capacity + else + gas.temperature += energy_used/heat_capacity - environment.merge(gas) + environment.merge(gas) if(abs(environment.temperature - target_temperature) <= 0.5) regulating_temperature = 0 visible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click as a faint electronic humming stops.") - var/old_level = danger_level - danger_level = overall_danger_level() - if(danger_level < old_level) + var/old_level = local_danger_level + var/new_danger = calculate_local_danger_level() + if(new_danger < old_level) danger_averted_confidence++ // Only change danger level if: // we're going up a level - // OR if we're going down a level and have sufficient confidence (prevents doors smashing open and closed). - if (old_level < danger_level || (danger_averted_confidence >= 5 && danger_level < old_level)) - refresh_danger_level() + // OR if we're going down a level and have sufficient confidence (prevents spamming update_icon). + if (old_level < new_danger || (danger_averted_confidence >= 5 && new_danger < old_level)) + setDangerLevel(new_danger) update_icon() danger_averted_confidence=0 // Reset counter. @@ -270,7 +268,7 @@ if(RCON_NO) remote_control = 0 if(RCON_AUTO) - if(danger_level == 2) + if(local_danger_level == 2) remote_control = 1 else remote_control = 0 @@ -280,7 +278,7 @@ updateDialog() return -/obj/machinery/alarm/proc/overall_danger_level() +/obj/machinery/alarm/proc/calculate_local_danger_level() var/turf/simulated/location = loc if(!istype(location)) return//returns if loc is not simulated @@ -336,7 +334,8 @@ if((stat & (NOPOWER|BROKEN)) || shorted) icon_state = "alarmp" return - switch(max(danger_level, alarm_area.atmosalm)) + + switch(max(local_danger_level, alarm_area.atmosalm-1)) if (0) icon_state = "alarm0" if (1) @@ -345,7 +344,7 @@ icon_state = "alarm1" /obj/machinery/alarm/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN) || !alarm_area) return if (alarm_area.master_air_alarm != src) if (master_is_operating()) @@ -458,23 +457,14 @@ for(var/device_id in alarm_area.air_vent_names) send_signal(device_id, list("power"= 0) ) -/obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level) - if (alarm_area.atmosalert(new_danger_level)) +// This sets our danger level, and, if it's changed, forces a new election of danger levels. +/obj/machinery/alarm/proc/setDangerLevel(var/new_danger_level) + if(local_danger_level==new_danger_level) + return + local_danger_level=new_danger_level + if(alarm_area.updateDangerLevel()) post_alert(new_danger_level) - if(danger_level > 1) - air_doors_close(0) - else - air_doors_open(0) - - update_icon() - - 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.danger_level=new_danger_level - AA.update_icon() - /obj/machinery/alarm/proc/post_alert(alert_level) var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency) if(!frequency) @@ -495,15 +485,6 @@ frequency.post_signal(src, alert_signal) -/obj/machinery/alarm/proc/refresh_danger_level() - var/level = 0 - for (var/area/A in alarm_area.related) - for (var/obj/machinery/alarm/AA in A) - if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) - if (AA.danger_level > level) - level = AA.danger_level - apply_danger_level(level) - /obj/machinery/alarm/proc/air_doors_close(manual) var/area/A = get_area(src) if(!A.master.air_doors_activated) @@ -602,9 +583,8 @@ apply_mode() if(AALARM_WIRE_AALARM) - - if (alarm_area.atmosalert(2)) - apply_danger_level(2) + alarmActivated=1 + alarm_area.updateDangerLevel() spawn(1) updateUsrDialog() update_icon() @@ -666,8 +646,8 @@ apply_mode() if(AALARM_WIRE_AALARM) - if (alarm_area.atmosalert(0)) - apply_danger_level(0) + alarmActivated=0 + alarm_area.updateDangerLevel() spawn(1) updateUsrDialog() update_icon() @@ -768,10 +748,11 @@ data["danger"]=danger return data - /obj/machinery/alarm/proc/get_nano_data(mob/user, fromAtmosConsole=0) + var/data[0] data["air"]=ui_air_status() + data["alarmActivated"]=alarmActivated || local_danger_level==2 data["sensors"]=TLV data["locked"]=fromAtmosConsole || (!(istype(user, /mob/living/silicon)) && locked) data["rcon"]=rcon_setting @@ -819,11 +800,13 @@ data["scrubbers"]=scrubbers return data + /obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) if(user.stat && !isobserver(user)) return var/list/data=src.get_nano_data(user,FALSE) + if (!ui) // no ui has been passed, so we'll search for one { ui = nanomanager.get_open_ui(user, src, ui_key) @@ -889,288 +872,6 @@ ui_interact(user) return -/* -/obj/machinery/alarm/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/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:
" - - if(total == 0) - output += "Warning: Cannot obtain air sample for analysis." - return output - - output += {" - -"} - - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - - var/list/current_settings = TLV["pressure"] - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = get_danger_level(environment_pressure, current_settings) - - 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) - - 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) - - 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) - - 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) - - 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
" - - output += "Temperature: [environment.temperature]K ([round(environment.temperature - T0C, 0.1)]C)
" - - //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"} - - return output - -/obj/machinery/alarm/proc/rcon_text() - var/dat = "" - - //Hackish, I know. I didn't feel like bothering to rework all of this. - 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
Thermostat:
[target_temperature - T0C]C
" - - return dat - -/obj/machinery/alarm/proc/fmtScrubberGasStatus(var/id_tag,var/code,var/list/data) - var/label=replacetext(uppertext(code),"2","2") - if(code=="tox") - label="Plasma" - return "[label]" - -/obj/machinery/alarm/proc/return_controls() - var/output = ""//"[alarm_zone] Air [name]
" - - 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: -[fmtScrubberGasStatus(id_tag,"co2",data)], -[fmtScrubberGasStatus(id_tag,"tox",data)], -[fmtScrubberGasStatus(id_tag,"n2o",data)], -[fmtScrubberGasStatus(id_tag,"o2",data)] -
-"} - 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: -

Sensor presets:
(Note, this only sets sensors, air supplied to vents must still be changed.)" - - if (AALARM_SCREEN_SENSORS) - output += {" -Main menu
-Alarm thresholds:
-Partial pressure for gases - - -"} - var/list/gases = list( - "oxygen" = "O2", - "carbon_dioxide" = "CO2", - "plasma" = "Toxin", - "other" = "Other",) - - var/list/selected - for (var/g in gases) - output += "" - selected = TLV[g] - for(var/i = 1, i <= 4, i++) - output += "" - output += "" - - selected = TLV["pressure"] - output += " " - for(var/i = 1, i <= 4, i++) - output += "" - output += "" - - selected = TLV["temperature"] - output += "" - for(var/i = 1, i <= 4, i++) - output += "" - output += "
min2min1max1max2
[gases[g]][selected[i] >= 0 ? selected[i] :"OFF"]
Pressure[selected[i] >= 0 ? selected[i] :"OFF"]
Temperature[selected[i] >= 0 ? selected[i] :"OFF"]
" - - return output -*/ /obj/machinery/alarm/Topic(href, href_list) var/changed=0 @@ -1226,8 +927,8 @@ table tr:first-child th:first-child { border: none;} 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))) + var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as num|null + if (isnull(newval) || ..() || (locked && !issilicon(usr))) return if (newval<0) selected[threshold] = -1.0 @@ -1288,14 +989,14 @@ table tr:first-child th:first-child { border: none;} */ if(href_list["atmos_alarm"]) - if (alarm_area.atmosalert(2)) - apply_danger_level(2) + alarmActivated=1 + alarm_area.updateDangerLevel() update_icon() changed=1 if(href_list["atmos_reset"]) - if (alarm_area.atmosalert(0)) - apply_danger_level(0) + alarmActivated=0 + alarm_area.updateDangerLevel() update_icon() changed=1 @@ -1447,6 +1148,7 @@ table tr:first-child th:first-child { border: none;} usr << "It is not wired." if (buildstage < 1) usr << "The circuit is missing." + /* AIR ALARM CIRCUIT Just a object used in constructing air alarms @@ -1526,8 +1228,6 @@ FIRE ALARM var/wiresexposed = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - var/area/A - /obj/machinery/firealarm/update_icon() if(wiresexposed) @@ -1657,38 +1357,49 @@ FIRE ALARM stat |= NOPOWER update_icon() - -/obj/machinery/firealarm/New() - ..() - - -/obj/machinery/firealarm/attack_hand(var/mob/user as mob) - if(stat & BROKEN) +/obj/machinery/firealarm/attack_hand(mob/user as mob) + if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN)) return - ui_interact(user) + if (buildstage != 2) + return -/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "fire_alarm") - A = src.loc.loc - if(stat & (BROKEN|NOPOWER)) return - if(user.stat || user.restrained()) return - var/data[0] - data["working"] = working - data["time"] = round(time) - data["timing"] = timing - data["securityLevel"] = uppertext(get_security_level()) - data["fire"] = A.fire - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key) - if (!ui) - ui = new(user, src, ui_key, "firealarm.tmpl", "Fire Alarm", 375, 250) - ui.set_initial_data(data) - ui.set_auto_update(1) - ui.open() + user.set_machine(src) + var/area/A = src.loc + 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) + 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/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 - ui.push_data(data) - return - - + A = A.loc + if (A.fire) + d1 = text("[]", src, stars("Reset - Lockdown")) + else + d1 = text("[]", src, stars("Alarm - Lockdown")) + if (src.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/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") + return /obj/machinery/firealarm/Topic(href, href_list) ..() @@ -1845,7 +1556,7 @@ Code shamelessly copied from apc_frame return attack_hand(user) /obj/machinery/partyalarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) + if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN)) return user.machine = src diff --git a/nano/templates/air_alarm.tmpl b/nano/templates/air_alarm.tmpl index 39a67aafb92..d1b5244acc6 100644 --- a/nano/templates/air_alarm.tmpl +++ b/nano/templates/air_alarm.tmpl @@ -54,6 +54,13 @@ Used In File(s): /code/game/machinery/alarm.dm {^{:~displayBar(air.contents.plasma, 0, 100, ~dangerToClass(air.danger.plasma))}} {^{:~string("
{1}%
",~dangerToClass(air.danger.plasma),~precisionRound(air.contents.plasma,2))}} + {^{if air.danger.other>0}} +
+
Other:
+ {^{:~displayBar(air.contents.other, 0, 100, ~dangerToClass(air.danger.other))}} + {^{:~string("
{1}%
",~dangerToClass(air.danger.other),~precisionRound(air.contents.other,2))}} +
+ {{/if}}
Temperature: @@ -74,7 +81,7 @@ Used In File(s): /code/game/machinery/alarm.dm
DANGER: Internals Required {{/if}} {^{if !locked}} - {^{if atmos_alarm}} + {^{if alarmActivated}} {^{:~link('Reset Alarm',null,{'atmos_reset':1},null,'linkOn')}} {{else}} {^{:~link('Activate Alarm',null,{'atmos_alarm':1},null,'red')}}