From 48ee87269140d255e3528e364402f6c21bf38828 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 2 Jul 2015 15:32:21 +0200 Subject: [PATCH] Refactors gas analyize. --- baystation12.dme | 1 + code/ATMOSPHERICS/pipes.dm | 16 +------ code/_helpers/atmospherics.dm | 47 +++++++++++++++++++ .../atmoalter/portable_atmospherics.dm | 18 +------ code/game/objects/items/devices/PDA/PDA.dm | 35 +------------- code/game/objects/items/devices/scanners.dm | 29 ++++-------- .../objects/items/weapons/flamethrower.dm | 17 ++----- .../game/objects/items/weapons/tanks/tanks.dm | 32 ++++--------- 8 files changed, 72 insertions(+), 123 deletions(-) create mode 100644 code/_helpers/atmospherics.dm diff --git a/baystation12.dme b/baystation12.dme index ba02f28f65..7afd66f4b1 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -29,6 +29,7 @@ #include "code\__defines\mobs.dm" #include "code\__defines\research.dm" #include "code\__defines\species_languages.dm" +#include "code\_helpers\atmospherics.dm" #include "code\_helpers\datum_pool.dm" #include "code\_helpers\files.dm" #include "code\_helpers\game.dm" diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 2ff6c78f94..685fa55833 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -1120,20 +1120,8 @@ return if(istype(W, /obj/item/device/analyzer) && in_range(user, src)) - for (var/mob/O in viewers(user, null)) - O << "\The [user] has used \the [W] on \the [src] \icon[src]" - - var/pressure = parent.air.return_pressure() - var/total_moles = parent.air.total_moles - - user << "Results of analysis of \the [src] \icon[src]" - if (total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in parent.air.gas) - user << "[gas_data.name[g]]: [round((parent.air.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(parent.air.temperature-T0C)]°C" - else - user << "Tank is empty!" + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) /obj/machinery/atmospherics/pipe/tank/air name = "Pressure Tank (Air)" diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm new file mode 100644 index 0000000000..2fe393b4dc --- /dev/null +++ b/code/_helpers/atmospherics.dm @@ -0,0 +1,47 @@ +/obj/proc/analyze_gases(var/obj/A, var/mob/user) + if(src != A) + user.visible_message("\The [user] has used \an [src] on \the [A]") + + A.add_fingerprint(user) + var/list/result = A.atmosanalyze(user) + if(result && result.len) + user << "Results of the analysis[src == A ? "" : " of \the [A]"]" + for(var/line in result) + user << "[line]" + return 1 + + user << "Your [src] flashes a red light as it fails to analyze \the [A]." + return 0 + +/proc/atmosanalyzer_scan(var/obj/target, var/datum/gas_mixture/mixture, var/mob/user) + var/pressure = mixture.return_pressure() + var/total_moles = mixture.total_moles + + var/list/results = list() + if (total_moles>0) + results += "Pressure: [round(pressure,0.1)] kPa" + for(var/mix in mixture.gas) + results += "[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%" + results += "Temperature: [round(mixture.temperature-T0C)]°C" + else + results += "\The [target] is empty!" + + return results + +/obj/proc/atmosanalyze(var/mob/user) + return + +/obj/item/weapon/tank/atmosanalyze(var/mob/user) + return atmosanalyzer_scan(src, src.air_contents, user) + +/obj/machinery/portable_atmospherics/atmosanalyze(var/mob/user) + return atmosanalyzer_scan(src, src.air_contents, user) + +/obj/machinery/atmospherics/pipe/atmosanalyze(var/mob/user) + return atmosanalyzer_scan(src, src.parent.air, user) + +/obj/machinery/power/rad_collector/atmosanalyze(var/mob/user) + if(P) return atmosanalyzer_scan(src, src.P.air_contents, user) + +/obj/item/weapon/flamethrower/atmosanalyze(var/mob/user) + if(ptank) return atmosanalyzer_scan(src, ptank.air_contents, user) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index f8d611bcbf..21b0cd2c27 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -104,7 +104,6 @@ network.update = 1 /obj/machinery/portable_atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - var/obj/icon = src if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed ))) if (src.holding) return @@ -136,21 +135,8 @@ return else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user)) - visible_message("\The [user] has used \the [W] on \the [src] \icon[icon]") - if(air_contents) - var/pressure = air_contents.return_pressure() - var/total_moles = air_contents.total_moles - - user << "Results of analysis of \icon[icon]" - if (total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in air_contents.gas) - user << "[gas_data.name[g]]: [round((air_contents.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(air_contents.temperature-T0C)]°C" - else - user << "Tank is empty!" - else - user << "Tank is empty!" + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) return return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index fbdb7667a1..a01dc224c3 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1284,40 +1284,7 @@ var/global/list/obj/item/device/pda/PDAs = list() user << "No significant chemical agents found in [A]." if(5) - if((istype(A, /obj/item/weapon/tank)) || (istype(A, /obj/machinery/portable_atmospherics))) - var/obj/icon = A - for (var/mob/O in viewers(user, null)) - O << "\The [user] has used [src] on \icon[icon] [A]." - var/pressure = A:air_contents.return_pressure() - - var/total_moles = A:air_contents.total_moles - - user << "Results of analysis of \icon[icon]" - if (total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in A:air_contents.gas) - user << "[gas_data.name[g]]: [round((A:air_contents.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(A:air_contents.temperature-T0C)]°C" - else - user << "Tank is empty!" - - if (istype(A, /obj/machinery/atmospherics/pipe/tank)) - var/obj/icon = A - for (var/mob/O in viewers(user, null)) - O << "\The [user] has used [src] on \icon[icon] [A]" - - var/obj/machinery/atmospherics/pipe/tank/T = A - var/pressure = T.parent.air.return_pressure() - var/total_moles = T.parent.air.total_moles - - user << "Results of analysis of \icon[icon]" - if (total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in T.parent.air.gas) - user << "[gas_data.name[g]]: [round((T.parent.air.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(T.parent.air.temperature-T0C)]°C" - else - user << "Tank is empty!" + analyze_gases(A, user) if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) // JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents, diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 849ceac3af..3e888ae849 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -256,6 +256,13 @@ REAGENT SCANNER origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1) +/obj/item/device/analyzer/atmosanalyze(var/mob/user) + var/air = user.return_air() + if (!air) + return + + return atmosanalyzer_scan(src, air, user) + /obj/item/device/analyzer/attack_self(mob/user as mob) if (user.stat) @@ -264,27 +271,7 @@ REAGENT SCANNER usr << "You don't have the dexterity to do this!" return - var/turf/location = user.loc - if (!( istype(location, /turf) )) - return - - var/datum/gas_mixture/environment = location.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - user.show_message("Results:", 1) - if(abs(pressure - ONE_ATMOSPHERE) < 10) - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) - else - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) - if(total_moles) - for(var/g in environment.gas) - user.show_message("[gas_data.name[g]]: [round((environment.gas[g] / total_moles)*100)]%", 1) - - user.show_message("Temperature: [round(environment.temperature-T0C)]°C", 1) - - src.add_fingerprint(user) + analyze_gases(src, user) return /obj/item/device/mass_spectrometer diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 09816e3568..bbdd46cdb3 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -112,20 +112,9 @@ update_icon() return - if(istype(W, /obj/item/device/analyzer) && ptank) - var/obj/item/weapon/icon = src - user.visible_message("[user] has used the analyzer on \icon[icon]") - var/pressure = ptank.air_contents.return_pressure() - var/total_moles = ptank.air_contents.total_moles - - user << "Results of analysis of \icon[icon]" - if(total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in ptank.air_contents.gas) - user << "[gas_data.name[g]]: [round((ptank.air_contents.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(ptank.air_contents.temperature-T0C)]°C" - else - user << "Tank is empty!" + if(istype(W, /obj/item/device/analyzer)) + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) return ..() return diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 8c5b1de026..049d179846 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -87,28 +87,12 @@ /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - var/obj/icon = src - if (istype(src.loc, /obj/item/assembly)) icon = src.loc if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) - for (var/mob/O in viewers(user, null)) - O << "\The [user] has used [W] on \icon[icon] [src]" - - var/pressure = air_contents.return_pressure() - manipulated_by = user.real_name //This person is aware of the contents of the tank. - var/total_moles = air_contents.total_moles - - user << "Results of analysis of \icon[icon]" - if (total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in air_contents.gas) - user << "[gas_data.name[g]]: [(round(air_contents.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(air_contents.temperature-T0C)]°C" - else - user << "Tank is empty!" - src.add_fingerprint(user) + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) else if (istype(W,/obj/item/latexballon)) var/obj/item/latexballon/LB = W LB.blow(src) @@ -131,7 +115,7 @@ location = loc.loc else if(istype(loc, /mob/living/carbon)) location = loc - + var/using_internal if(istype(location)) if(location.internal==src) @@ -278,11 +262,11 @@ var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE explosion( - get_turf(loc), - round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), - round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), - round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), - round(min(BOMBCAP_FLASH_RADIUS, range*1.50)), + get_turf(loc), + round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), + round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), + round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), + round(min(BOMBCAP_FLASH_RADIUS, range*1.50)), ) qdel(src)