Mecha no longer crush their occupants if you switch to internal pressure. (Normally.)

Bugfix:  Not all suits now protect from air pressure.  

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2887 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
VivianFoxfoot@gmail.com
2011-12-31 23:24:14 +00:00
parent cfba741fa2
commit 22719c3258
2 changed files with 94 additions and 16 deletions
+90 -7
View File
@@ -41,10 +41,13 @@
//inner atmos machinery. Air tank mostly
var/use_internal_tank = 0
var/internal_tank_valve = 0 // If the valve is set to one atm (0) or 40 (1)
var/internal_tank_wire = null
var/obj/item/device/radio/radio = null
var/obj/machinery/atmospherics/portables_connector/connected_port = null //filling the air tanks
var/obj/machinery/portable_atmospherics/canister/internal_tank
var/obj/machinery/portable_atmospherics/canister/cabin
var/max_temperature = 2500
var/internal_damage_threshold = 50 //health percentage below which internal damage is possible
@@ -78,6 +81,9 @@
if(!add_airtank())
removeVerb(/obj/mecha/verb/connect_to_port)
removeVerb(/obj/mecha/verb/toggle_internal_tank)
if(!add_cabin())
world << "Something went wrong! Are you sure you read the blueprints right?"
world << "Please report this to a coder."
src.spark_system.set_up(2, 0, src)
src.spark_system.attach(src)
cell = new(src)
@@ -115,6 +121,14 @@
internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
return internal_tank
/obj/mecha/proc/add_cabin()
cabin = new /obj/machinery/portable_atmospherics/canister/
var/startingpressure = 1/20
cabin.air_contents.oxygen = (O2STANDARD*startingpressure)*cabin.air_contents.volume/(R_IDEAL_GAS_EQUATION*cabin.air_contents.temperature)
cabin.air_contents.nitrogen = (N2STANDARD*startingpressure)*cabin.air_contents.volume/(R_IDEAL_GAS_EQUATION*cabin.air_contents.temperature)
return cabin
/obj/mecha/proc/do_after(delay as num)
sleep(delay)
if(src)
@@ -727,18 +741,58 @@
return T.remove_air(amount)
return
/obj/mecha/return_air()
/obj/mecha/return_air(var/airtank)
if(use_internal_tank && internal_tank)
var/datum/gas_mixture/environmenttank
var/datum/gas_mixture/environmentcabin
environmenttank = internal_tank.air_contents
environmentcabin = cabin.air_contents
var/release_pressure = null
if(internal_tank_valve)
release_pressure = INFINITY
else
release_pressure = ONE_ATMOSPHERE
var/cabin_pressure = environmentcabin.return_pressure()
var/pressure_delta = min(release_pressure - cabin_pressure, (environmenttank.return_pressure() - environmentcabin.return_pressure())/2)
//Can not have a pressure delta that would cause environment pressure > tank pressure
var/transfer_moles = 0
if((environmenttank.temperature > 0) && (pressure_delta > 0))
transfer_moles = pressure_delta*environmentcabin.volume/(environmentcabin.temperature * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = environmenttank.remove(transfer_moles)
environmentcabin.merge(removed)
if(airtank)
. = internal_tank.return_air()
else
. = cabin.return_air()
else if(airtank)
. = internal_tank.return_air()
else if (cabin.return_pressure() > WARNING_HIGH_PRESSURE)
cabin.air_contents.remove(min(75,cabin.return_pressure()))
. = cabin.return_air()
else
. = get_turf_air()
return
/obj/mecha/proc/return_pressure()
/obj/mecha/proc/return_pressure(var/airtank)
. = 0
var/datum/gas_mixture/gm = return_air()
var/datum/gas_mixture/gm = null
if(airtank)
gm = return_air(1)
else
gm = return_air()
if(gm)
. = gm.return_pressure()
return
/obj/mecha/proc/return_temperature()
@@ -1010,6 +1064,25 @@
else
return
if(mob_container.forceMove(src.loc))//ejecting mob container
if(ishuman(occupant) && (return_pressure() > HAZARD_HIGH_PRESSURE))
use_internal_tank = 0
var/datum/gas_mixture/environment = get_turf_air()
if(environment)
var/env_pressure = environment.return_pressure()
var/pressure_delta = (cabin.return_pressure() - env_pressure)
//Can not have a pressure delta that would cause environment pressure > tank pressure
var/transfer_moles = 0
if(pressure_delta > 0)
transfer_moles = pressure_delta*environment.volume/(cabin.return_temperature() * R_IDEAL_GAS_EQUATION)
//Actually transfer the gas
var/datum/gas_mixture/removed = cabin.air_contents.remove(transfer_moles)
loc.assume_air(removed)
occupant.SetStunned(5)
occupant.SetWeakened(5)
occupant << "You were blown out of the mech!"
src.log_message("[mob_container] moved out.")
occupant.reset_view()
/*
@@ -1143,7 +1216,8 @@
<b>Integrity: </b> [integrity]%<br>
<b>Powercell charge: </b>[isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]<br>
<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>
<b>Airtank pressure: </b>[src.return_pressure()]kPa<br>
<b>Airtank pressure: </b>[return_pressure(1)]kPa<br>
<b>Cabin pressure: </b>[src.return_pressure()]kPa<br>
<b>Internal temperature: </b> [src.return_temperature()]&deg;K|[src.return_temperature() - T0C]&deg;C<br>
<b>Lights: </b>[lights?"on":"off"]<br>
[src.dna?"<b>DNA-locked:</b><br> <span style='font-size:10px;letter-spacing:-1px;'>[src.dna]</span> \[<a href='?src=\ref[src];reset_dna=1'>Reset</a>\]<br>":null]
@@ -1259,6 +1333,7 @@
<body>
[add_req_access?"<a href='?src=\ref[src];req_access=1;id_card=\ref[id_card];user=\ref[user]'>Edit operation keycodes</a>":null]
[maint_access?"<a href='?src=\ref[src];maint_access=1;user=\ref[user]'>Initiate maintenance protocol</a>":null]
[(state >= 1) ?"<a href='?src=\ref[src];toggle_internal_tank_valve=1;user=\ref[user]'>Toggle Internal Air Pressure Safety</a>":null]
</body>
</html>"}
user << browse(output, "window=exosuit_maint_console")
@@ -1370,10 +1445,18 @@
if(state==0)
state = 1
user << "The securing bolts are now exposed."
else if(state==1)
state = 0
user << "The securing bolts are now hidden."
return
if(href_list["toggle_internal_tank_valve"] && state >=1)
internal_tank_valve = !internal_tank_valve
var/mob/user = filter.getMob("user")
if(user)
user << "The internal pressure safeties have been [internal_tank_valve?"disabled":"enabled"]!"
if (href_list["add_req_access"] && add_req_access)
operation_req_access += filter.getNum("add_req_access")
output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
@@ -1525,12 +1608,12 @@
process(var/obj/mecha/mecha)
if(!mecha.hasInternalDamage())
return src.stop()
var/datum/gas_mixture/int_tank_air = mecha.return_air()
var/datum/gas_mixture/int_tank_air = mecha.return_air(1)
if(mecha.hasInternalDamage(MECHA_INT_FIRE))
if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5))
mecha.clearInternalDamage(MECHA_INT_FIRE)
if(mecha.use_internal_tank && mecha.internal_tank)
if(mecha.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)))
if(mecha.return_pressure(1)>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)))
mecha.setInternalDamage(MECHA_INT_TANK_BREACH)
if(int_tank_air && int_tank_air.volume>0) //heat the air_contents
int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15))
@@ -1540,7 +1623,7 @@
mecha.pr_int_temp_processor.stop()
if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank
if(mecha.internal_tank)
int_tank_air = mecha.internal_tank.return_air()
int_tank_air = mecha.internal_tank.return_air(1)
if(int_tank_air)
var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10)
if(mecha.loc && hascall(mecha.loc,"assume_air"))
+4 -9
View File
@@ -495,19 +495,14 @@
var/pressure = environment.return_pressure()
if(!wear_suit)
if(!istype(wear_suit, /obj/item/clothing/suit/space))
if(!istype(wear_suit, /obj/item/clothing/suit/space)&&!istype(wear_suit, /obj/item/clothing/suit/armor/captain))
/*if(pressure < 20)
if(prob(25))
src << "You feel the splittle on your lips and the fluid on your eyes boiling away, the capillteries in your skin breaking."
adjustBruteLoss(5)
*/
if(pressure > HAZARD_HIGH_PRESSURE)
adjustBruteLoss(min((10+(round(pressure/(HIGH_STEP_PRESSURE)-2)*5)),MAX_PRESSURE_DAMAGE))
if(pressure > HAZARD_HIGH_PRESSURE)
adjustBruteLoss(min((10+(round(pressure/(HIGH_STEP_PRESSURE)-2)*5)),MAX_PRESSURE_DAMAGE))
@@ -926,7 +921,7 @@
if (pressure)
if((wear_suit) && (istype(wear_suit, /obj/item/clothing/suit/space)))
if(istype(wear_suit, /obj/item/clothing/suit/space)||istype(wear_suit, /obj/item/clothing/suit/armor/captain))
pressure.icon_state = "pressure0"
else