diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d500428a29f..66f5ade3681 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -343,5 +343,6 @@ C.swap_hand() else var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr)) - T.Click(location, control, params) + if(T) + T.Click(location, control, params) return 1 diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index 1e4d7cd04c1..e682045cd7a 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -45,7 +45,8 @@ A.mode = 1 // AALARM_MODE_SCRUB A.apply_mode() if(WIRE_ALARM) // Clear alarms. - if(A.alarm_area.atmosalert(0, holder)) + var/area/AA = get_area_master(A) + if(AA.atmosalert(0, holder)) A.post_alert(0) A.update_icon() @@ -66,6 +67,7 @@ A.mode = 3 // AALARM_MODE_PANIC A.apply_mode() if(WIRE_ALARM) // Post alarm. - if(A.alarm_area.atmosalert(2, holder)) + var/area/AA = get_area_master(A) + if(AA.atmosalert(2, holder)) A.post_alert(2) A.update_icon() \ No newline at end of file diff --git a/code/game/dna.dm b/code/game/dna.dm index 97260fd785a..24b464d41ab 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -172,8 +172,8 @@ /mob/proc/set_species(datum/species/mrace, icon_update = 1) return -/mob/living/carbon/set_species(datum/species/mrace, icon_update = 1) - if(has_dna()) +/mob/living/carbon/set_species(datum/species/mrace = null, icon_update = 1) + if(mrace && has_dna()) if(dna.species.exotic_blood) var/datum/reagent/EB = dna.species.exotic_blood reagents.del_reagent(initial(EB.id)) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index c3121978a60..e4c4ba20d7b 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -94,7 +94,7 @@ /datum/objective_item/steal/plasma/check_special_completion(obj/item/weapon/tank/T) var/target_amount = text2num(name) var/found_amount = 0 - found_amount += T.air_contents.gases["plasma"][MOLES] + found_amount += T.air_contents.gases["plasma"] ? T.air_contents.gases["plasma"][MOLES] : 0 return found_amount>=target_amount diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 32b34729cbe..f8669e5b8ea 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -47,11 +47,6 @@ for(var/i in 1 to I) available_chems |= possible_chems[i] -/obj/machinery/sleeper/Destroy() - var/turf/T = loc - T.contents += contents - return ..() - /obj/machinery/sleeper/update_icon() if(state_open) icon_state = "sleeper-open" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index ccd7d9d44b6..cac36746465 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -95,18 +95,17 @@ /obj/item/weapon/storage/proc/show_to(mob/user) + if(!user.client) + return if(user.s_active != src && (user.stat == CONSCIOUS)) for(var/obj/item/I in src) if(I.on_found(user)) return if(user.s_active) user.s_active.hide_from(user) - user.client.screen -= boxes - user.client.screen -= closer - user.client.screen -= contents - user.client.screen += boxes - user.client.screen += closer - user.client.screen += contents + user.client.screen |= boxes + user.client.screen |= closer + user.client.screen |= contents user.s_active = src is_seeing |= user @@ -115,7 +114,6 @@ close_all() return ..() - /obj/item/weapon/storage/proc/hide_from(mob/user) if(!user.client) return diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index d08ec5689ed..aa4ef256b4c 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -45,7 +45,7 @@ #define AALARM_REPORT_TIMEOUT 100 /obj/machinery/airalarm - name = "alarm" + name = "air alarm" desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous." icon = 'icons/obj/monitors.dmi' icon_state = "alarm0" @@ -55,22 +55,18 @@ active_power_usage = 8 power_channel = ENVIRON req_access = list(access_atmospherics) - var/frequency = 1439 - //var/skipprocess = 0 //Experimenting - var/alarm_frequency = 1437 - var/datum/radio_frequency/radio_connection + var/danger_level = 0 + var/mode = AALARM_MODE_SCRUBBING + var/locked = 1 var/aidisabled = 0 var/shorted = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - - var/mode = AALARM_MODE_SCRUBBING - - var/area_uid - var/area/alarm_area - var/danger_level = 0 + var/frequency = 1439 + var/alarm_frequency = 1437 + var/datum/radio_frequency/radio_connection var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE* 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20), // kPa @@ -106,7 +102,6 @@ //all air alarms in area are connected via magic /area - var/obj/machinery/airalarm/master_air_alarm var/list/air_vent_names = list() var/list/air_scrub_names = list() var/list/air_vent_info = list() @@ -122,18 +117,15 @@ buildstage = 0 panel_open = 1 pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) - pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 + pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0 - 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" + var/area/A = get_area_master(src) + if(name == initial(name)) + name = "[A.name] Air Alarm" update_icon() if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() + initialize() /obj/machinery/airalarm/Destroy() if(SSradio) @@ -144,19 +136,6 @@ /obj/machinery/airalarm/initialize() set_frequency(frequency) - if(!master_is_operating()) - elect_master() - -/obj/machinery/airalarm/proc/master_is_operating() - return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) - -/obj/machinery/airalarm/proc/elect_master() - for(var/area/A in alarm_area.related) - for(var/obj/machinery/airalarm/AA in A) - if(!(AA.stat & (NOPOWER|BROKEN))) - alarm_area.master_air_alarm = AA - return 1 - return 0 /obj/machinery/airalarm/ui_status(mob/user) if(user.has_unlimited_silicon_privilege && aidisabled) @@ -177,11 +156,13 @@ "locked" = locked, "siliconUser" = user.has_unlimited_silicon_privilege, "emagged" = emagged, - "atmos_alarm" = alarm_area.atmosalm, - "fire_alarm" = alarm_area.fire, "danger_level" = danger_level, ) + var/area/A = get_area(src) + data["atmos_alarm"] = A.atmosalm + data["fire_alarm"] = A.fire + var/turf/T = get_turf(src) var/datum/gas_mixture/environment = T.return_air() var/datum/tlv/cur_tlv @@ -218,9 +199,9 @@ if(!locked || user.has_unlimited_silicon_privilege) data["vents"] = list() - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/info = alarm_area.air_vent_info[id_tag] + for(var/id_tag in A.air_vent_names) + var/long_name = A.air_vent_names[id_tag] + var/list/info = A.air_vent_info[id_tag] if(!info || info["frequency"] != frequency) continue data["vents"] += list(list( @@ -235,9 +216,9 @@ "extdefault"= (info["external"] == ONE_ATMOSPHERE) )) data["scrubbers"] = list() - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/info = alarm_area.air_scrub_info[id_tag] + for(var/id_tag in A.air_scrub_names) + var/long_name = A.air_scrub_names[id_tag] + var/list/info = A.air_scrub_info[id_tag] if(!info || info["frequency"] != frequency) continue data["scrubbers"] += list(list( @@ -314,7 +295,8 @@ send_signal(device_id, list("checks" = text2num(params["val"])^2)) . = TRUE if("set_external_pressure") - var/target = input("New target pressure:", name, alarm_area.air_vent_info[device_id]["external"]) as num|null + var/area/A = get_area_master(src) + var/target = input("New target pressure:", name, A.air_vent_info[device_id]["external"]) as num|null if(!isnull(target) && !..()) send_signal(device_id, list("set_external_pressure" = target)) . = TRUE @@ -339,11 +321,13 @@ apply_mode() . = TRUE if("alarm") - if(alarm_area.atmosalert(2, src)) + var/area/A = get_area_master(src) + if(A.atmosalert(2, src)) post_alert(2) . = TRUE if("reset") - if(alarm_area.atmosalert(0, src)) + var/area/A = get_area_master(src) + if(A.atmosalert(0, src)) post_alert(0) . = TRUE update_icon() @@ -374,16 +358,17 @@ return 0 /obj/machinery/airalarm/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) + var/area/A = get_area_master(src) + for(var/id_tag in A.air_vent_names) + var/list/I = A.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) + send_signal(id_tag, list("status")) + for(var/id_tag in A.air_scrub_names) + var/list/I = A.air_scrub_info[id_tag] + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) + send_signal(id_tag, list("status")) /obj/machinery/airalarm/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) @@ -408,9 +393,10 @@ return 1 /obj/machinery/airalarm/proc/apply_mode() + var/area/A = get_area_master(src) switch(mode) if(AALARM_MODE_SCRUBBING) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "co2_scrub" = 1, @@ -419,14 +405,14 @@ "scrubbing" = 1, "widenet" = 0, )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, "set_external_pressure" = ONE_ATMOSPHERE )) if(AALARM_MODE_CONTAMINATED) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "co2_scrub" = 1, @@ -435,27 +421,27 @@ "scrubbing" = 1, "widenet" = 1, )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, "set_external_pressure" = ONE_ATMOSPHERE )) if(AALARM_MODE_VENTING) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "widenet" = 0, "scrubbing" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, "set_external_pressure" = ONE_ATMOSPHERE*2 )) if(AALARM_MODE_REFILL) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "co2_scrub" = 1, @@ -464,7 +450,7 @@ "scrubbing" = 1, "widenet" = 0, )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 1, @@ -472,43 +458,43 @@ )) if(AALARM_MODE_PANIC, AALARM_MODE_REPLACEMENT) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "widenet" = 1, "scrubbing" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 0 )) if(AALARM_MODE_SIPHON) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, "widenet" = 0, "scrubbing" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 0 )) if(AALARM_MODE_OFF) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 0 )) if(AALARM_MODE_FLOOD) - for(var/device_id in alarm_area.air_scrub_names) + for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 0 )) - for(var/device_id in alarm_area.air_vent_names) + for(var/device_id in A.air_vent_names) send_signal(device_id, list( "power" = 1, "checks" = 2, @@ -529,21 +515,23 @@ 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" + + var/area/A = get_area_master(src) + switch(max(danger_level, A.atmosalm)) + if(0) + icon_state = "alarm0" + if(1) + icon_state = "alarm2" //yes, alarm2 is yellow alarm + if(2) + icon_state = "alarm1" /obj/machinery/airalarm/process() if((stat & (NOPOWER|BROKEN)) || shorted) return - var/turf/simulated/location = src.loc - if(!istype(location)) - return 0 + var/turf/simulated/location = get_turf(src) + if(!location) + return var/datum/tlv/cur_tlv @@ -570,23 +558,25 @@ var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) - if (old_danger_level != danger_level) + if(old_danger_level != danger_level) apply_danger_level() - if (mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) + if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) mode = AALARM_MODE_SCRUBBING apply_mode() - return /obj/machinery/airalarm/proc/post_alert(alert_level) var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency) - if(!frequency) return + if(!frequency) + return + + var/area/A = get_area_master(src) var/datum/signal/alert_signal = new alert_signal.source = src alert_signal.transmission_method = 1 - alert_signal.data["zone"] = alarm_area.name + alert_signal.data["zone"] = A.name alert_signal.data["type"] = "Atmospheric" if(alert_level==2) @@ -599,13 +589,16 @@ frequency.post_signal(src, alert_signal,null,-1) /obj/machinery/airalarm/proc/apply_danger_level() + var/area/A = get_area_master(src) + var/new_area_danger_level = 0 - for (var/area/A in alarm_area.related) - for (var/obj/machinery/airalarm/AA in A) + for(var/area/R in A.related) + for(var/obj/machinery/airalarm/AA in R) if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) new_area_danger_level = max(new_area_danger_level,AA.danger_level) - if (alarm_area.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state + if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state post_alert(new_area_danger_level) + update_icon() /obj/machinery/airalarm/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index a48785f31e3..a5b6fbe5865 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -6,35 +6,26 @@ #define RELEASING 1 /obj/machinery/atmospherics/components/unary/vent_pump - icon_state = "vent_map" - name = "air vent" desc = "Has a valve and pump attached to it" + icon_state = "vent_map" use_power = 1 - can_unwrench = 1 - welded = 0 - var/area/initial_loc - level = 1 - var/area_uid var/id_tag = null - var/on = 0 var/pump_direction = RELEASING + var/pressure_checks = EXT_BOUND var/external_pressure_bound = ONE_ATMOSPHERE var/internal_pressure_bound = 0 - - var/pressure_checks = EXT_BOUND //EXT_BOUND: Do not pass external_pressure_bound //INT_BOUND: Do not pass internal_pressure_bound //NO_BOUND: Do not pass either var/frequency = 1439 var/datum/radio_frequency/radio_connection - var/radio_filter_out var/radio_filter_in @@ -51,22 +42,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/New() ..() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) /obj/machinery/atmospherics/components/unary/vent_pump/Destroy() + var/area/A = get_area_master(src) + A.air_vent_names -= id_tag + A.air_vent_info -= id_tag + if(SSradio) SSradio.remove_object(src,frequency) radio_connection = null - if(initial_loc) - initial_loc.air_vent_info -= id_tag - initial_loc.air_vent_names -= id_tag - initial_loc = null + return ..() /obj/machinery/atmospherics/components/unary/vent_pump/high_volume @@ -164,24 +152,23 @@ signal.source = src signal.data = list( - "area" = src.area_uid, - "tag" = src.id_tag, + "tag" = id_tag, "frequency" = frequency, "device" = "VP", + "timestamp" = world.time, "power" = on, - "direction" = pump_direction?("release"):("siphon"), + "direction" = pump_direction ? "release" : "siphon", "checks" = pressure_checks, "internal" = internal_pressure_bound, "external" = external_pressure_bound, - "timestamp" = world.time, "sigtype" = "status" ) - if(!initial_loc.air_vent_names[id_tag]) - var/new_name = "\improper [initial_loc.name] vent pump #[initial_loc.air_vent_names.len+1]" - initial_loc.air_vent_names[id_tag] = new_name - src.name = new_name - initial_loc.air_vent_info[id_tag] = signal.data + var/area/A = get_area_master(src) + if(!A.air_vent_names[id_tag]) + name = "\improper [A.name] vent pump #[A.air_vent_names.len + 1]" + A.air_vent_names[id_tag] = name + A.air_vent_info[id_tag] = signal.data radio_connection.post_signal(src, signal, radio_filter_out) @@ -285,10 +272,7 @@ user << "It seems welded shut." /obj/machinery/atmospherics/components/unary/vent_pump/power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER + ..() update_icon_nopipes() /obj/machinery/atmospherics/components/unary/vent_pump/can_crawl_through() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index ff0acbbafcf..8d0e6e19614 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -2,67 +2,56 @@ #define SCRUBBING 1 /obj/machinery/atmospherics/components/unary/vent_scrubber - icon_state = "scrub_map" - name = "air scrubber" desc = "Has a valve and pump attached to it" - + icon_state = "scrub_map" use_power = 1 idle_power_usage = 10 active_power_usage = 60 - - level = 1 - can_unwrench = 1 - welded = 0 - var/area/initial_loc var/id_tag = null - var/frequency = 1439 - var/datum/radio_frequency/radio_connection - - var/list/turf/simulated/adjacent_turfs = list() - var/on = 0 var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing + var/scrub_CO2 = 1 var/scrub_Toxins = 0 var/scrub_N2O = 0 var/volume_rate = 200 var/widenet = 0 //is this scrubber acting on the 3x3 area around it. + var/list/turf/simulated/adjacent_turfs = list() - var/area_uid + var/frequency = 1439 + var/datum/radio_frequency/radio_connection var/radio_filter_out var/radio_filter_in - /obj/machinery/atmospherics/components/unary/vent_scrubber/New() ..() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) /obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy() + var/area/A = get_area_master(src) + A.air_scrub_names -= id_tag + A.air_scrub_info -= id_tag + if(SSradio) SSradio.remove_object(src,frequency) radio_connection = null - if(initial_loc) - initial_loc.air_scrub_info -= id_tag - initial_loc.air_scrub_names -= id_tag - initial_loc = null + for(var/I in adjacent_turfs) I = null + return ..() + /obj/machinery/atmospherics/components/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) return 0 - if (!on || welded) + if(!on || welded) return 0 if(stat & (NOPOWER|BROKEN)) return 0 @@ -80,7 +69,7 @@ amount = active_power_usage if (widenet) - amount += amount*(adjacent_turfs.len*(adjacent_turfs.len/2)) + amount += amount * (adjacent_turfs.len * (adjacent_turfs.len / 2)) use_power(amount, power_channel) return 1 @@ -115,7 +104,6 @@ signal.transmission_method = 1 //radio signal signal.source = src signal.data = list( - "area" = area_uid, "tag" = id_tag, "frequency" = frequency, "device" = "VS", @@ -128,11 +116,13 @@ "filter_n2o" = scrub_N2O, "sigtype" = "status" ) - if(!initial_loc.air_scrub_names[id_tag]) - var/new_name = "\improper [initial_loc.name] air scrubber #[initial_loc.air_scrub_names.len+1]" - initial_loc.air_scrub_names[id_tag] = new_name - src.name = new_name - initial_loc.air_scrub_info[id_tag] = signal.data + + var/area/A = get_area_master(src) + if(!A.air_scrub_names[id_tag]) + name = "\improper [A.name] air scrubber #[A.air_scrub_names.len + 1]" + A.air_scrub_names[id_tag] = name + A.air_scrub_info[id_tag] = signal.data + radio_connection.post_signal(src, signal, radio_filter_out) return 1 @@ -140,7 +130,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/atmosinit() radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null - if (frequency) + if(frequency) set_frequency(frequency) broadcast_status() check_turfs() @@ -159,8 +149,6 @@ for (var/turf/simulated/tile in adjacent_turfs) scrub(tile) - - /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/scrub(var/turf/simulated/tile) if (!istype(tile)) return 0 @@ -245,9 +233,9 @@ // diagonal turfs that can share atmos with *both* of the cardinal turfs /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/check_turfs() adjacent_turfs.Cut() - var/turf/T = loc - if (istype(T)) - adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir=1) + var/turf/T = get_turf(src) + if(istype(T)) + adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir = 1) /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) @@ -299,10 +287,7 @@ return /obj/machinery/atmospherics/components/unary/vent_scrubber/power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER + ..() update_icon_nopipes() /obj/machinery/atmospherics/components/unary/vent_scrubber/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 057bfd5f9d2..9f2c9cf4b1e 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -66,13 +66,18 @@ desc = "Pre-mixed air." icon_state = "grey" -/obj/machinery/portable_atmospherics/canister/New(loc) +/obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() - create_gas() + if(existing_mixture) + air_contents.copy_from(existing_mixture) + else + create_gas() + pump = new(src, FALSE) pump.on = TRUE pump.stat = 0 pump.build_network() + update_icon() /obj/machinery/portable_atmospherics/canister/Destroy() @@ -256,8 +261,7 @@ if(label && !..()) var/newtype = label2types[label] if(newtype) - var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc) - replacement.air_contents.copy_from(air_contents) + var/obj/machinery/portable_atmospherics/canister/replacement = new newtype(loc, air_contents) replacement.interact(usr) qdel(src) if("pressure") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 56d3c867675..480a2c62b41 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/atmos.dmi' use_power = 0 - var/datum/gas_mixture/air_contents = new + var/datum/gas_mixture/air_contents var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port var/obj/item/weapon/tank/holding @@ -15,22 +15,27 @@ /obj/machinery/portable_atmospherics/New() ..() SSair.atmos_machinery += src + + air_contents = new air_contents.volume = volume air_contents.temperature = T20C + return 1 +/obj/machinery/portable_atmospherics/Destroy() + SSair.atmos_machinery -= src + + qdel(air_contents) + air_contents = null + + return ..() + /obj/machinery/portable_atmospherics/process_atmos() if(!connected_port) // Pipe network handles reactions if connected. air_contents.react() else update_icon() -/obj/machinery/portable_atmospherics/Destroy() - qdel(air_contents) - air_contents = null - SSair.atmos_machinery -= src - return ..() - /obj/machinery/portable_atmospherics/return_air() return air_contents diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 03213f35a67..57834921fd4 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -89,7 +89,8 @@ age = rand(AGE_MIN,AGE_MAX) //job handling var/list/jobs = SSjob.occupations.Copy() - for(var/datum/job/J in jobs) + for(var/job in jobs) + var/datum/job/J = job if(J.title == "Cyborg" || J.title == "AI" || J.title == "Chaplain" || J.title == "Mime") jobs -= J myjob = pick(jobs) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index ba054ec21bf..2c7407d8556 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -626,7 +626,7 @@ var/global/list/synth_flesh_disguises = list() /datum/species/synth/proc/handle_disguise(mob/living/carbon/human/H) - if(H) + if(H && fake_species) // Obviously we only are disguise when we're... disguised. H.updatehealth() var/add_overlay = FALSE if(H.health < disguise_fail_health) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7ebd205db06..eb21d2b982a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -395,7 +395,12 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return /proc/IsAdminGhost(var/mob/user) - if(check_rights_for(user.client, R_ADMIN) && istype(user, /mob/dead/observer) && user.client.AI_Interact) - return 1 - else - return 0 \ No newline at end of file + if(!user.client) // Do they have a client? + return + if(!isobserver(user)) // Are they a ghost? + return + if(!check_rights_for(user.client, R_ADMIN)) // Are they allowed? + return + if(!user.client.AI_Interact) // Do they have it enabled? + return + return TRUE \ No newline at end of file diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index c720875aeb9..e93a0fb746c 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -288,7 +288,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Sound the alert if gravity was just enabled or disabled. var/alert = 0 var/area/area = get_area(src) - if(new_state) // If we turned on + if(on && ticker && ticker.current_state == GAME_STATE_PLAYING) // If we turned on and the game is live. if(gravity_in_level() == 0) alert = 1 investigate_log("was brought online and is now producing gravity for this level.", "gravity") @@ -354,14 +354,14 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. /obj/machinery/gravity_generator/main/proc/shake_everyone() - var/turf/our_turf = get_turf(src) + var/turf/T = get_turf(src) for(var/mob/M in mob_list) - var/turf/their_turf = get_turf(M) - if(their_turf.z == our_turf.z) - M.update_gravity(M.mob_has_gravity()) - if(M.client) - shake_camera(M, 15, 1) - M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) + if(M.z != z) + continue + M.update_gravity(M.mob_has_gravity()) + if(M.client) + shake_camera(M, 15, 1) + M.playsound_local(T, 'sound/effects/alert.ogg', 100, 1, 0.5) /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src)