Merge pull request #9996 from PsiOmegaDelta/150702-AtmosAnalyzeCleanup

Refactors gas analyzation.
This commit is contained in:
Chinsky
2015-08-13 07:23:10 +03:00
8 changed files with 72 additions and 123 deletions

View File

@@ -31,6 +31,7 @@
#include "code\__defines\mobs.dm" #include "code\__defines\mobs.dm"
#include "code\__defines\research.dm" #include "code\__defines\research.dm"
#include "code\__defines\species_languages.dm" #include "code\__defines\species_languages.dm"
#include "code\_helpers\atmospherics.dm"
#include "code\_helpers\datum_pool.dm" #include "code\_helpers\datum_pool.dm"
#include "code\_helpers\files.dm" #include "code\_helpers\files.dm"
#include "code\_helpers\game.dm" #include "code\_helpers\game.dm"

View File

@@ -1120,20 +1120,8 @@
return return
if(istype(W, /obj/item/device/analyzer) && in_range(user, src)) if(istype(W, /obj/item/device/analyzer) && in_range(user, src))
for (var/mob/O in viewers(user, null)) var/obj/item/device/analyzer/A = W
O << "<span class='notice'>\The [user] has used \the [W] on \the [src] \icon[src]</span>" A.analyze_gases(src, user)
var/pressure = parent.air.return_pressure()
var/total_moles = parent.air.total_moles
user << "<span class='notice'>Results of analysis of \the [src] \icon[src]</span>"
if (total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in parent.air.gas)
user << "<span class='notice'>[gas_data.name[g]]: [round((parent.air.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(parent.air.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
/obj/machinery/atmospherics/pipe/tank/air /obj/machinery/atmospherics/pipe/tank/air
name = "Pressure Tank (Air)" name = "Pressure Tank (Air)"

View File

@@ -0,0 +1,47 @@
/obj/proc/analyze_gases(var/obj/A, var/mob/user)
if(src != A)
user.visible_message("<span class='notice'>\The [user] has used \an [src] on \the [A]</span>")
A.add_fingerprint(user)
var/list/result = A.atmosanalyze(user)
if(result && result.len)
user << "<span class='notice'>Results of the analysis[src == A ? "" : " of \the [A]"]</span>"
for(var/line in result)
user << "<span class='notice'>[line]</span>"
return 1
user << "<span class='warning'>Your [src] flashes a red light as it fails to analyze \the [A].</span>"
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 += "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/mix in mixture.gas)
results += "<span class='notice'>[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%</span>"
results += "<span class='notice'>Temperature: [round(mixture.temperature-T0C)]&deg;C</span>"
else
results += "<span class='notice'>\The [target] is empty!</span>"
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)

View File

@@ -104,7 +104,6 @@
network.update = 1 network.update = 1
/obj/machinery/portable_atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /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 ((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
if (src.holding) if (src.holding)
return return
@@ -136,21 +135,8 @@
return return
else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user)) else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user))
visible_message("<span class='notice'>\The [user] has used \the [W] on \the [src] \icon[icon]</span>") var/obj/item/device/analyzer/A = W
if(air_contents) A.analyze_gases(src, user)
var/pressure = air_contents.return_pressure()
var/total_moles = air_contents.total_moles
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
if (total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in air_contents.gas)
user << "<span class='notice'>[gas_data.name[g]]: [round((air_contents.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(air_contents.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
return return
return return

View File

@@ -1284,40 +1284,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
user << "<span class='notice'>No significant chemical agents found in [A].</span>" user << "<span class='notice'>No significant chemical agents found in [A].</span>"
if(5) if(5)
if((istype(A, /obj/item/weapon/tank)) || (istype(A, /obj/machinery/portable_atmospherics))) analyze_gases(A, user)
var/obj/icon = A
for (var/mob/O in viewers(user, null))
O << "<span class='warning'>\The [user] has used [src] on \icon[icon] [A].</span>"
var/pressure = A:air_contents.return_pressure()
var/total_moles = A:air_contents.total_moles
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
if (total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in A:air_contents.gas)
user << "<span class='notice'>[gas_data.name[g]]: [round((A:air_contents.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(A:air_contents.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
if (istype(A, /obj/machinery/atmospherics/pipe/tank))
var/obj/icon = A
for (var/mob/O in viewers(user, null))
O << "<span class='warning'>\The [user] has used [src] on \icon[icon] [A]</span>"
var/obj/machinery/atmospherics/pipe/tank/T = A
var/pressure = T.parent.air.return_pressure()
var/total_moles = T.parent.air.total_moles
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
if (total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in T.parent.air.gas)
user << "<span class='notice'>[gas_data.name[g]]: [round((T.parent.air.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(T.parent.air.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) 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, // JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents,

View File

@@ -256,6 +256,13 @@ REAGENT SCANNER
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1) 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) /obj/item/device/analyzer/attack_self(mob/user as mob)
if (user.stat) if (user.stat)
@@ -264,27 +271,7 @@ REAGENT SCANNER
usr << "<span class='warning'>You don't have the dexterity to do this!</span>" usr << "<span class='warning'>You don't have the dexterity to do this!</span>"
return return
var/turf/location = user.loc analyze_gases(src, user)
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("<span class='notice'><b>Results:</b></span>", 1)
if(abs(pressure - ONE_ATMOSPHERE) < 10)
user.show_message("<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>", 1)
else
user.show_message("<span class='warning'>Pressure: [round(pressure,0.1)] kPa</span>", 1)
if(total_moles)
for(var/g in environment.gas)
user.show_message("<span class='notice'>[gas_data.name[g]]: [round((environment.gas[g] / total_moles)*100)]%</span>", 1)
user.show_message("<span class='notice'>Temperature: [round(environment.temperature-T0C)]&deg;C</span>", 1)
src.add_fingerprint(user)
return return
/obj/item/device/mass_spectrometer /obj/item/device/mass_spectrometer

View File

@@ -112,20 +112,9 @@
update_icon() update_icon()
return return
if(istype(W, /obj/item/device/analyzer) && ptank) if(istype(W, /obj/item/device/analyzer))
var/obj/item/weapon/icon = src var/obj/item/device/analyzer/A = W
user.visible_message("<span class='notice'>[user] has used the analyzer on \icon[icon]</span>") A.analyze_gases(src, user)
var/pressure = ptank.air_contents.return_pressure()
var/total_moles = ptank.air_contents.total_moles
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
if(total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in ptank.air_contents.gas)
user << "<span class='notice'>[gas_data.name[g]]: [round((ptank.air_contents.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(ptank.air_contents.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
return return
..() ..()
return return

View File

@@ -87,28 +87,12 @@
/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) /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)) if (istype(src.loc, /obj/item/assembly))
icon = src.loc icon = src.loc
if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
for (var/mob/O in viewers(user, null)) var/obj/item/device/analyzer/A = W
O << "<span class='notice'>\The [user] has used [W] on \icon[icon] [src]</span>" A.analyze_gases(src, user)
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 << "<span class='notice'>Results of analysis of \icon[icon]</span>"
if (total_moles>0)
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
for(var/g in air_contents.gas)
user << "<span class='notice'>[gas_data.name[g]]: [(round(air_contents.gas[g] / total_moles) * 100)]%</span>"
user << "<span class='notice'>Temperature: [round(air_contents.temperature-T0C)]&deg;C</span>"
else
user << "<span class='notice'>Tank is empty!</span>"
src.add_fingerprint(user)
else if (istype(W,/obj/item/latexballon)) else if (istype(W,/obj/item/latexballon))
var/obj/item/latexballon/LB = W var/obj/item/latexballon/LB = W
LB.blow(src) LB.blow(src)
@@ -131,7 +115,7 @@
location = loc.loc location = loc.loc
else if(istype(loc, /mob/living/carbon)) else if(istype(loc, /mob/living/carbon))
location = loc location = loc
var/using_internal var/using_internal
if(istype(location)) if(istype(location))
if(location.internal==src) if(location.internal==src)
@@ -278,11 +262,11 @@
var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
explosion( explosion(
get_turf(loc), get_turf(loc),
round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)),
round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)),
round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)),
round(min(BOMBCAP_FLASH_RADIUS, range*1.50)), round(min(BOMBCAP_FLASH_RADIUS, range*1.50)),
) )
qdel(src) qdel(src)