diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm index 7ae23e7e4b8..943b6dd012c 100644 --- a/code/WorkInProgress/Mini/atmos_control.dm +++ b/code/WorkInProgress/Mini/atmos_control.dm @@ -14,6 +14,25 @@ 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) @@ -85,7 +104,7 @@ var/list/alarm_data=list() alarm_data["ID"]="\ref[alarm]" - alarm_data["danger"] = max(alarm.local_danger_level, alarm.alarm_area.atmosalm-1) + alarm_data["danger"] = max(alarm.danger_level, alarm.alarm_area.atmosalm) alarm_data["name"] = "[alarm]" alarms+=list(alarm_data) data["alarms"]=alarms @@ -220,15 +239,15 @@ current.air_doors_open(1) if(href_list["atmos_alarm"]) - current.alarmActivated=1 - current.alarm_area.updateDangerLevel() + if (current.alarm_area.atmosalert(2)) + current.apply_danger_level(2) spawn(1) src.updateUsrDialog() current.update_icon() return if(href_list["atmos_reset"]) - current.alarmActivated=0 - current.alarm_area.updateDangerLevel() + if (current.alarm_area.atmosalert(0)) + current.apply_danger_level(0) spawn(1) src.updateUsrDialog() current.update_icon() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a28fcec54a2..1c1b9dc4a1a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -66,31 +66,13 @@ a.triggerAlarm("Power", src, cameras, source) return -/area/proc/updateDangerLevel() +/area/proc/atmosalert(danger_level) // 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) - // Going to danger level 2 from something else - if (danger_level == 2) + //updateicon() + //mouse_opacity = 0 + if (danger_level==2) var/list/cameras = list() for(var/area/RA in related) //updateicon() @@ -101,8 +83,6 @@ 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) @@ -111,7 +91,6 @@ 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) @@ -119,24 +98,6 @@ 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 @@ -144,7 +105,13 @@ fire = 1 updateicon() mouse_opacity = 0 - 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() var/list/cameras = list() for(var/area/RA in related) for (var/obj/machinery/camera/C in RA) @@ -160,6 +127,13 @@ 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") @@ -167,7 +141,20 @@ aiPlayer.cancelAlarm("Fire", src, src) for (var/obj/machinery/computer/station_alert/a in machines) a.cancelAlarm("Fire", src, src) - OpenFirelocks() + +/area/proc/readyalert() + if(name == "Space") + return + if(!eject) + eject = 1 + updateicon() + return + +/area/proc/readyreset() + if(eject) + eject = 0 + updateicon() + return /area/proc/radiation_alert() if(name == "Space") @@ -185,20 +172,6 @@ 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 @@ -213,6 +186,13 @@ 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() @@ -290,15 +270,7 @@ 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 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 557c54e74ad..0b76e21c88f 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -96,8 +96,7 @@ var/screen = AALARM_SCREEN_MAIN var/area_uid var/area/alarm_area - var/local_danger_level = 0 - var/alarmActivated = 0 // Manually activated (independent from danger level) + var/danger_level = 0 var/danger_averted_confidence=0 var/buildstage = 2 //2 is built, 1 is building, 0 is frame. @@ -227,34 +226,37 @@ target_temperature = T0C + MIN_TEMPERATURE var/datum/gas_mixture/gas = location.remove_air(0.25*environment.total_moles) - var/heat_capacity = gas.heat_capacity() - var/energy_used = max( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE) + 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) - //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 = local_danger_level - var/new_danger = calculate_local_danger_level() - if(new_danger < old_level) + var/old_level = danger_level + danger_level = overall_danger_level() + if(danger_level < 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 spamming update_icon). - if (old_level < new_danger || (danger_averted_confidence >= 5 && new_danger < old_level)) - setDangerLevel(new_danger) + // 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() update_icon() danger_averted_confidence=0 // Reset counter. @@ -268,7 +270,7 @@ if(RCON_NO) remote_control = 0 if(RCON_AUTO) - if(local_danger_level == 2) + if(danger_level == 2) remote_control = 1 else remote_control = 0 @@ -278,7 +280,7 @@ updateDialog() return -/obj/machinery/alarm/proc/calculate_local_danger_level() +/obj/machinery/alarm/proc/overall_danger_level() var/turf/simulated/location = loc if(!istype(location)) return//returns if loc is not simulated @@ -334,8 +336,7 @@ if((stat & (NOPOWER|BROKEN)) || shorted) icon_state = "alarmp" return - - switch(max(local_danger_level, alarm_area.atmosalm-1)) + switch(max(danger_level, alarm_area.atmosalm)) if (0) icon_state = "alarm0" if (1) @@ -344,7 +345,7 @@ icon_state = "alarm1" /obj/machinery/alarm/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN) || !alarm_area) + if(stat & (NOPOWER|BROKEN)) return if (alarm_area.master_air_alarm != src) if (master_is_operating()) @@ -457,14 +458,23 @@ for(var/device_id in alarm_area.air_vent_names) send_signal(device_id, list("power"= 0) ) -// 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()) +/obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level) + if (alarm_area.atmosalert(new_danger_level)) 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) @@ -485,6 +495,15 @@ 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) @@ -583,8 +602,9 @@ apply_mode() if(AALARM_WIRE_AALARM) - alarmActivated=1 - alarm_area.updateDangerLevel() + + if (alarm_area.atmosalert(2)) + apply_danger_level(2) spawn(1) updateUsrDialog() update_icon() @@ -646,8 +666,8 @@ apply_mode() if(AALARM_WIRE_AALARM) - alarmActivated=0 - alarm_area.updateDangerLevel() + if (alarm_area.atmosalert(0)) + apply_danger_level(0) spawn(1) updateUsrDialog() update_icon() @@ -748,11 +768,10 @@ data["danger"]=danger return data -/obj/machinery/alarm/proc/get_nano_data(mob/user, fromAtmosConsole=0) +/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 @@ -800,13 +819,11 @@ 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) @@ -872,6 +889,288 @@ ui_interact(user) return +/* +/obj/machinery/alarm/proc/return_text(mob/user) + if(!(istype(user, /mob/living/silicon)) && locked) + return "
| 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 | "
+
+ //Hackish, I know. I didn't feel like bothering to rework all of this.
+ dat += "Thermostat: [target_temperature - T0C]C |
| min2 | min1 | max1 | max2 | |
|---|---|---|---|---|
| [gases[g]] | " + selected = TLV[g] + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"] | " + output += "|||
| Pressure | " + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"] | " + output += "|||
| Temperature | " + for(var/i = 1, i <= 4, i++) + output += "[selected[i] >= 0 ? selected[i] :"OFF"] | " + output += "