ZAS settings reworked to be more configurable.

This commit is contained in:
Rob Nelson
2013-08-24 03:52:42 -07:00
parent 35711ba773
commit 1a40e9a817
11 changed files with 484 additions and 122 deletions

View File

@@ -1343,8 +1343,8 @@
#include "code\ZAS\FEA_system.dm" #include "code\ZAS\FEA_system.dm"
#include "code\ZAS\Fire.dm" #include "code\ZAS\Fire.dm"
#include "code\ZAS\Functions.dm" #include "code\ZAS\Functions.dm"
#include "code\ZAS\NewSettings.dm"
#include "code\ZAS\Plasma.dm" #include "code\ZAS\Plasma.dm"
#include "code\ZAS\Variable Settings.dm"
#include "code\ZAS\ZAS_Turfs.dm" #include "code\ZAS\ZAS_Turfs.dm"
#include "code\ZAS\ZAS_Zones.dm" #include "code\ZAS\ZAS_Zones.dm"
#include "interface\interface.dm" #include "interface\interface.dm"

View File

@@ -52,12 +52,12 @@ mob/var/tmp/last_airflow_stun = 0
mob/proc/airflow_stun() mob/proc/airflow_stun()
if(stat == 2) if(stat == 2)
return 0 return 0
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 if(last_airflow_stun > world.time - zas_settings.Get("airflow_stun_cooldown")) return 0
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
src << "\blue You stay upright as the air rushes past you." src << "\blue You stay upright as the air rushes past you."
return 0 return 0
if(vsc.airflow_push) if(zas_settings.Get("airflow_push"))
if(weakened <= 0) src << "\red The sudden rush of air knocks you over!" if(weakened <= 0) src << "\red The sudden rush of air knocks you over!"
weakened = max(weakened,5) weakened = max(weakened,5)
last_airflow_stun = world.time last_airflow_stun = world.time
@@ -72,7 +72,7 @@ mob/living/carbon/metroid/airflow_stun()
return return
mob/living/carbon/human/airflow_stun() mob/living/carbon/human/airflow_stun()
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 if(last_airflow_stun > world.time - zas_settings.Get("airflow_stun_cooldown")) return 0
if(buckled) return 0 if(buckled) return 0
if(shoes) if(shoes)
if(shoes.flags & NOSLIP) return 0 if(shoes.flags & NOSLIP) return 0
@@ -80,7 +80,7 @@ mob/living/carbon/human/airflow_stun()
src << "\blue You stay upright as the air rushes past you." src << "\blue You stay upright as the air rushes past you."
return 0 return 0
if(vsc.airflow_push) if(zas_settings.Get("airflow_push"))
if(weakened <= 0) src << "\red The sudden rush of air knocks you over!" if(weakened <= 0) src << "\red The sudden rush of air knocks you over!"
weakened = max(weakened,rand(1,5)) weakened = max(weakened,rand(1,5))
last_airflow_stun = world.time last_airflow_stun = world.time
@@ -89,17 +89,17 @@ mob/living/carbon/human/airflow_stun()
last_airflow_stun = world.time last_airflow_stun = world.time
atom/movable/proc/check_airflow_movable(n) atom/movable/proc/check_airflow_movable(n)
if(!vsc.airflow_push) if(!zas_settings.Get("airflow_push"))
return 0 return 0
if(anchored && !ismob(src)) if(anchored && !ismob(src))
return 0 return 0
if(!istype(src,/obj/item) && n < vsc.airflow_dense_pressure) if(!istype(src,/obj/item) && n < zas_settings.Get("airflow_dense_pressure"))
return 0 return 0
return 1 return 1
mob/check_airflow_movable(n) mob/check_airflow_movable(n)
if(n < vsc.airflow_heavy_pressure) if(n < zas_settings.Get("airflow_heavy_pressure"))
return 0 return 0
return 1 return 1
@@ -114,11 +114,11 @@ obj/item/check_airflow_movable(n)
. = ..() . = ..()
switch(w_class) switch(w_class)
if(2) if(2)
if(n < vsc.airflow_lightest_pressure) return 0 if(n < zas_settings.Get("airflow_lightest_pressure")) return 0
if(3) if(3)
if(n < vsc.airflow_light_pressure) return 0 if(n < zas_settings.Get("airflow_light_pressure")) return 0
if(4,5) if(4,5)
if(n < vsc.airflow_medium_pressure) return 0 if(n < zas_settings.Get("airflow_medium_pressure")) return 0
//The main airflow code. Called by zone updates. //The main airflow code. Called by zone updates.
//Zones A and B are air zones. n represents the amount of air moved. //Zones A and B are air zones. n represents the amount of air moved.
@@ -128,7 +128,7 @@ proc/Airflow(zone/A, zone/B)
var/n = B.air.return_pressure() - A.air.return_pressure() var/n = B.air.return_pressure() - A.air.return_pressure()
//Don't go any further if n is lower than the lowest value needed for airflow. //Don't go any further if n is lower than the lowest value needed for airflow.
if(abs(n) < vsc.airflow_lightest_pressure) return if(abs(n) < zas_settings.Get("airflow_lightest_pressure")) return
//These turfs are the midway point between A and B, and will be the destination point for thrown objects. //These turfs are the midway point between A and B, and will be the destination point for thrown objects.
var/list/connection/connections_A = A.connections var/list/connection/connections_A = A.connections
@@ -153,12 +153,12 @@ proc/Airflow(zone/A, zone/B)
var/list/temporary_pplz = air_sucked var/list/temporary_pplz = air_sucked
air_sucked = air_repelled air_sucked = air_repelled
air_repelled = temporary_pplz air_repelled = temporary_pplz
if(vsc.airflow_push) // If enabled if(zas_settings.Get("airflow_push")) // If enabled
for(var/atom/movable/M in air_sucked) for(var/atom/movable/M in air_sucked)
if(M.last_airflow > world.time - vsc.airflow_delay) continue if(M.last_airflow > world.time - zas_settings.Get("airflow_delay")) continue
//Check for knocking people over //Check for knocking people over
if(ismob(M) && n > vsc.airflow_stun_pressure) if(ismob(M) && n > zas_settings.Get("airflow_stun_pressure"))
if(M:status_flags & GODMODE) continue if(M:status_flags & GODMODE) continue
M:airflow_stun() M:airflow_stun()
@@ -180,9 +180,9 @@ proc/Airflow(zone/A, zone/B)
//Do it again for the stuff in the other zone, making it fly away. //Do it again for the stuff in the other zone, making it fly away.
for(var/atom/movable/M in air_repelled) for(var/atom/movable/M in air_repelled)
if(M.last_airflow > world.time - vsc.airflow_delay) continue if(M.last_airflow > world.time - zas_settings.Get("airflow_delay")) continue
if(ismob(M) && abs(n) > vsc.airflow_medium_pressure) if(ismob(M) && abs(n) > zas_settings.Get("airflow_medium_pressure"))
if(M:status_flags & GODMODE) continue if(M:status_flags & GODMODE) continue
M:airflow_stun() M:airflow_stun()
@@ -207,16 +207,16 @@ proc/AirflowSpace(zone/A)
var/n = A.air.return_pressure() var/n = A.air.return_pressure()
//Here, n is determined by only the pressure in the room. //Here, n is determined by only the pressure in the room.
if(n < vsc.airflow_lightest_pressure) return if(n < zas_settings.Get("airflow_lightest_pressure")) return
var/list/connected_turfs = A.unsimulated_tiles //The midpoints are now all the space connections. var/list/connected_turfs = A.unsimulated_tiles //The midpoints are now all the space connections.
var/list/pplz = A.movables() //We only need to worry about things in the zone, not things in space. var/list/pplz = A.movables() //We only need to worry about things in the zone, not things in space.
if(vsc.airflow_push) // If enabled if(zas_settings.Get("airflow_push")) // If enabled
for(var/atom/movable/M in pplz) for(var/atom/movable/M in pplz)
if(M.last_airflow > world.time - vsc.airflow_delay) continue if(M.last_airflow > world.time - zas_settings.Get("airflow_delay")) continue
if(ismob(M) && n > vsc.airflow_stun_pressure) if(ismob(M) && n > zas_settings.Get("airflow_stun_pressure"))
var/mob/O = M var/mob/O = M
if(O.status_flags & GODMODE) continue if(O.status_flags & GODMODE) continue
O.airflow_stun() O.airflow_stun()
@@ -243,10 +243,10 @@ atom/movable
var/tmp/last_airflow = 0 var/tmp/last_airflow = 0
proc/GotoAirflowDest(n) proc/GotoAirflowDest(n)
if(!vsc.airflow_push) return // If not enabled, fuck it. if(!zas_settings.Get("airflow_push")) return // If not enabled, fuck it.
if(!airflow_dest) return if(!airflow_dest) return
if(airflow_speed < 0) return if(airflow_speed < 0) return
if(last_airflow > world.time - vsc.airflow_delay) return if(last_airflow > world.time - zas_settings.Get("airflow_delay")) return
if(airflow_speed) if(airflow_speed)
airflow_speed = n/max(get_dist(src,airflow_dest),1) airflow_speed = n/max(get_dist(src,airflow_dest),1)
return return
@@ -280,7 +280,7 @@ atom/movable
while(airflow_speed > 0) while(airflow_speed > 0)
if(airflow_speed <= 0) return if(airflow_speed <= 0) return
airflow_speed = min(airflow_speed,15) airflow_speed = min(airflow_speed,15)
airflow_speed -= vsc.airflow_speed_decay airflow_speed -= zas_settings.Get("airflow_speed_decay")
if(airflow_speed > 7) if(airflow_speed > 7)
if(airflow_time++ >= airflow_speed - 7) if(airflow_time++ >= airflow_speed - 7)
if(od) if(od)
@@ -300,7 +300,7 @@ atom/movable
return return
step_towards(src, src.airflow_dest) step_towards(src, src.airflow_dest)
if(ismob(src) && src:client) if(ismob(src) && src:client)
src:client:move_delay = world.time + vsc.airflow_mob_slowdown src:client:move_delay = world.time + zas_settings.Get("airflow_mob_slowdown")
airflow_dest = null airflow_dest = null
airflow_speed = 0 airflow_speed = 0
airflow_time = 0 airflow_time = 0
@@ -309,10 +309,10 @@ atom/movable
proc/RepelAirflowDest(n) proc/RepelAirflowDest(n)
if(!vsc.airflow_push) return // If not enabled, fuck it. if(!zas_settings.Get("airflow_push")) return // If not enabled, fuck it.
if(!airflow_dest) return if(!airflow_dest) return
if(airflow_speed < 0) return if(airflow_speed < 0) return
if(last_airflow > world.time - vsc.airflow_delay) return if(last_airflow > world.time - zas_settings.Get("airflow_delay")) return
if(airflow_speed) if(airflow_speed)
airflow_speed = n/max(get_dist(src,airflow_dest),1) airflow_speed = n/max(get_dist(src,airflow_dest),1)
return return
@@ -346,7 +346,7 @@ atom/movable
while(airflow_speed > 0) while(airflow_speed > 0)
if(airflow_speed <= 0) return if(airflow_speed <= 0) return
airflow_speed = min(airflow_speed,15) airflow_speed = min(airflow_speed,15)
airflow_speed -= vsc.airflow_speed_decay airflow_speed -= zas_settings.Get("airflow_speed_decay")
if(airflow_speed > 7) if(airflow_speed > 7)
if(airflow_time++ >= airflow_speed - 7) if(airflow_time++ >= airflow_speed - 7)
sleep(1 * tick_multiplier) sleep(1 * tick_multiplier)
@@ -360,7 +360,7 @@ atom/movable
return return
step_towards(src, src.airflow_dest) step_towards(src, src.airflow_dest)
if(ismob(src) && src:client) if(ismob(src) && src:client)
src:client:move_delay = world.time + vsc.airflow_mob_slowdown src:client:move_delay = world.time + zas_settings.Get("airflow_mob_slowdown")
airflow_dest = null airflow_dest = null
airflow_speed = 0 airflow_speed = 0
airflow_time = 0 airflow_time = 0
@@ -405,7 +405,7 @@ mob/living/carbon/human/airflow_hit(atom/A)
src.wear_suit.add_blood(src) src.wear_suit.add_blood(src)
if (src.w_uniform) if (src.w_uniform)
src.w_uniform.add_blood(src) src.w_uniform.add_blood(src)
var/b_loss = airflow_speed * vsc.airflow_damage var/b_loss = airflow_speed * zas_settings.Get("airflow_damage")
var/blocked = run_armor_check("head","melee") var/blocked = run_armor_check("head","melee")
apply_damage(b_loss/3, BRUTE, "head", blocked, 0, "Airflow") apply_damage(b_loss/3, BRUTE, "head", blocked, 0, "Airflow")
@@ -416,12 +416,12 @@ mob/living/carbon/human/airflow_hit(atom/A)
blocked = run_armor_check("groin","melee") blocked = run_armor_check("groin","melee")
apply_damage(b_loss/3, BRUTE, "groin", blocked, 0, "Airflow") apply_damage(b_loss/3, BRUTE, "groin", blocked, 0, "Airflow")
if(vsc.airflow_push) if(zas_settings.Get("airflow_push"))
if(airflow_speed > 10) if(airflow_speed > 10)
paralysis += round(airflow_speed * vsc.airflow_stun) paralysis += round(airflow_speed * zas_settings.Get("airflow_stun"))
stunned = max(stunned,paralysis + 3) stunned = max(stunned,paralysis + 3)
else else
stunned += round(airflow_speed * vsc.airflow_stun/2) stunned += round(airflow_speed * zas_settings.Get("airflow_stun")/2)
. = ..() . = ..()

View File

@@ -128,12 +128,12 @@ obj
//Spread the fire. //Spread the fire.
if(!(locate(/obj/fire) in enemy_tile)) if(!(locate(/obj/fire) in enemy_tile))
if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0)) if( prob( 50 + 50 * (firelevel/zas_settings.Get("fire_firelevel_multiplier")) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0))
new/obj/fire(enemy_tile,firelevel) new/obj/fire(enemy_tile,firelevel)
//seperate part of the present gas //seperate part of the present gas
//this is done to prevent the fire burning all gases in a single pass //this is done to prevent the fire burning all gases in a single pass
var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate) var/datum/gas_mixture/flow = air_contents.remove_ratio(zas_settings.Get("fire_consuption_rate"))
///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR /////////////////////////////////////////////// ///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR ///////////////////////////////////////////////
if(flow) if(flow)
@@ -225,7 +225,7 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, forc
var/total_reactants = total_fuel + total_oxygen var/total_reactants = total_fuel + total_oxygen
//determine the amount of reactants actually reacting //determine the amount of reactants actually reacting
var/used_reactants_ratio = min( max(total_reactants * firelevel / vsc.fire_firelevel_multiplier, 0.2), total_reactants) / total_reactants var/used_reactants_ratio = min( max(total_reactants * firelevel / zas_settings.Get("fire_firelevel_multiplier"), 0.2), total_reactants) / total_reactants
//remove and add gasses as calculated //remove and add gasses as calculated
oxygen -= min(oxygen, total_oxygen * used_reactants_ratio ) oxygen -= min(oxygen, total_oxygen * used_reactants_ratio )
@@ -246,7 +246,7 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, forc
if(liquid.amount <= 0) del liquid if(liquid.amount <= 0) del liquid
//calculate the energy produced by the reaction and then set the new temperature of the mix //calculate the energy produced by the reaction and then set the new temperature of the mix
temperature = (starting_energy + vsc.fire_fuel_energy_release * total_fuel) / heat_capacity() temperature = (starting_energy + zas_settings.Get("fire_fuel_energy_release") * total_fuel) / heat_capacity()
update_values() update_values()
value = total_reactants * used_reactants_ratio value = total_reactants * used_reactants_ratio
@@ -311,7 +311,7 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue
//calculates how close the mixture of the reactants is to the optimum //calculates how close the mixture of the reactants is to the optimum
var/mix_multiplier = 1 / (1 + (5 * ((oxygen / total_combustables) ^2))) var/mix_multiplier = 1 / (1 + (5 * ((oxygen / total_combustables) ^2)))
//toss everything together //toss everything together
firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier firelevel = zas_settings.Get("fire_firelevel_multiplier") * mix_multiplier * dampening_multiplier
return max( 0, firelevel) return max( 0, firelevel)
@@ -330,7 +330,7 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue
//determine the multiplier //determine the multiplier
//minimize this for low-pressure enviroments //minimize this for low-pressure enviroments
var/mx = 5 * firelevel/vsc.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) var/mx = 5 * firelevel/zas_settings.Get("fire_firelevel_multiplier") * min(pressure / ONE_ATMOSPHERE, 1)
//Get heat transfer coefficients for clothing. //Get heat transfer coefficients for clothing.
//skytodo: kill anyone who breaks things then orders me to fix them //skytodo: kill anyone who breaks things then orders me to fix them

View File

@@ -1,19 +1,30 @@
/*************************** /*
* FUCKING EXPERIMENTAL WILL EAT YOUR CHILDREN ZAS Settings System 2.0
****************************
Okay, so VariableSettings is a mess of spaghetticode. Okay, so VariableSettings is a mess of spaghetticode and
is about as flexible as a grandmother covered in
starch.
This is an attempt to fix that by using getters and This is an attempt to fix that by using getters and
setters instead of stupidity. It may or may setters instead of stupidity. It's a little more difficult
not work, but dammit, it's better than hackery. to code with, but dammit, it's better than hackery.
NOTE: plc was merged into the main settings. We can set up
visual groups later.
HOW2GET:
zas_setting.Get(/datum/ZAS_Setting/herp)
HOW2SET:
zas_setting.Set(/datum/ZAS_Setting/herp, "dsfargeg")
*/ */
var/global/ZAS_Settings/vsc = new var/global/ZAS_Settings/zas_settings = new
#define ZAS_TYPE_UNDEFINED -1 #define ZAS_TYPE_UNDEFINED -1
#define ZAS_TYPE_BOOLEAN 0 #define ZAS_TYPE_BOOLEAN 0
#define ZAS_TYPE_NUMERIC 1 #define ZAS_TYPE_NUMERIC 1
/** /**
* ZAS Setting Datum * ZAS Setting Datum
* *
@@ -137,6 +148,67 @@ var/global/ZAS_Settings/vsc = new
desc = "The smallest temperature difference which will cause heat to travel through doors." desc = "The smallest temperature difference which will cause heat to travel through doors."
valtype=ZAS_TYPE_NUMERIC valtype=ZAS_TYPE_NUMERIC
///////////////////////////////////////
// PLASMA SHIT
///////////////////////////////////////
// ALL CAPS BECAUSE PLASMA IS HARDCORE YO
// And I'm too lazy to fix the refs.
/datum/ZAS_Setting/PLASMA_DMG
name = "Plasma Damage Amount"
desc = "Self Descriptive"
value = 3
valtype=ZAS_TYPE_NUMERIC
/datum/ZAS_Setting/CLOTH_CONTAMINATION
name = "Cloth Contamination"
desc = "If this is on, plasma does damage by getting into cloth."
value = 1
valtype=ZAS_TYPE_BOOLEAN
/datum/ZAS_Setting/PLASMAGUARD_ONLY
name = "PlasmaGuard Only"
desc = "If this is on, only biosuits and spacesuits protect against contamination and ill effects."
value = 0
valtype=ZAS_TYPE_BOOLEAN
/datum/ZAS_Setting/GENETIC_CORRUPTION
name = "Genetic Corruption Chance"
desc = "Chance of genetic corruption as well as toxic damage, X in 10,000."
value = 0
valtype=ZAS_TYPE_BOOLEAN
/datum/ZAS_Setting/SKIN_BURNS
name = "Skin Burns"
desc = "Plasma has an effect similar to mustard gas on the un-suited."
value = 0
valtype=ZAS_TYPE_BOOLEAN
/datum/ZAS_Setting/EYE_BURNS
name = "Eye Burns"
desc = "Plasma burns the eyes of anyone not wearing eye protection."
value = 1
valtype=ZAS_TYPE_BOOLEAN
/datum/ZAS_Setting/CONTAMINATION_LOSS
name = "Contamination Loss"
desc = "How much toxin damage is dealt from contaminated clothing"
value = 0.02 //Per tick? ASK ARYN
valtype=ZAS_TYPE_NUMERIC
/datum/ZAS_Setting/PLASMA_HALLUCINATION
name = "Plasma Hallucination"
desc = "Does being in plasma cause you to hallucinate?"
value = 0
valtype=ZAS_TYPE_BOOLEAN
/datum/ZAS_Setting/N2O_HALLUCINATION
name = "N2O Hallucination"
desc = "Does being in sleeping gas cause you to hallucinate?"
value = 1
valtype=ZAS_TYPE_BOOLEAN
/** /**
* ZAS Settings * ZAS Settings
* *
@@ -146,24 +218,68 @@ var/global/ZAS_Settings/vsc = new
* @subpackage ZAS * @subpackage ZAS
*/ */
/ZAS_Settings /ZAS_Settings
// INTERNAL USE ONLY
var/list/datum/ZAS_Setting/settings = list() var/list/datum/ZAS_Setting/settings = list()
pl_control/plc = new()
/ZAS_Settings/New() /ZAS_Settings/New()
.=..() .=..()
for(var/S in typesof(/datum/ZAS_Setting) - /datum/ZAS_Setting) for(var/S in typesof(/datum/ZAS_Setting) - /datum/ZAS_Setting)
testing("Creating [S]")
var/id=idfrompath("[S]") var/id=idfrompath("[S]")
settings[id]=new S //testing("Creating zas_settings\[[id]\] = new [S]")
src.settings[id]=new S
if(fexists("config/ZAS.txt") == 0)
Save()
Load()
/ZAS_Settings/proc/Save()
var/F = file("config/ZAS.txt")
fdel(F)
for(var/id in src.settings)
var/datum/ZAS_Setting/setting = src.settings[id]
F << "# [setting.name]"
F << "# [setting.desc]"
F << "[id] [setting.value]"
F << ""
/ZAS_Settings/proc/Load()
for(var/t in file2list("config/ZAS.txt"))
if(!t) continue
t = trim(t)
if (length(t) == 0)
continue
else if (copytext(t, 1, 2) == "#")
continue
var/pos = findtext(t, " ")
var/name = null
var/value = null
if (pos)
name = copytext(t, 1, pos)
value = copytext(t, pos + 1)
else
name = t
if (!name)
continue
src.SetFromConfig(name,value)
// INTERNAL USE ONLY
/ZAS_Settings/proc/idfrompath(var/str) /ZAS_Settings/proc/idfrompath(var/str)
return replacetext(str,"/datum/ZAS_Setting/","") return replacetext(str,"/datum/ZAS_Setting/","")
/ZAS_Settings/proc/Set(var/id, var/value) // INTERNAL USE ONLY
var/datum/ZAS_Setting/setting = settings[id] /ZAS_Settings/proc/ChangeSetting(var/user,var/id)
var/datum/ZAS_Setting/setting = src.settings[id]
var/displayedValue=""
switch(setting.valtype) switch(setting.valtype)
if(ZAS_TYPE_NUMERIC) if(ZAS_TYPE_NUMERIC)
setting.value = input(user,"Enter a number:","Settings",newvar) as num setting.value = input(user,"Enter a number:","Settings",setting.value) as num
displayedValue="\"[setting.value]\""
/* /*
if(ZAS_TYPE_BITFLAG) if(ZAS_TYPE_BITFLAG)
var/flag = input(user,"Toggle which bit?","Settings") in bitflags var/flag = input(user,"Toggle which bit?","Settings") in bitflags
@@ -174,28 +290,207 @@ var/global/ZAS_Settings/vsc = new
newvar |= flag newvar |= flag
*/ */
if(ZAS_TYPE_BOOLEAN) if(ZAS_TYPE_BOOLEAN)
setting.value = !newvar setting.value = !setting.value
displayedValue = (setting.value) ? "ON" : "OFF"
/* /*
if(ZAS_TYPE_STRING) if(ZAS_TYPE_STRING)
setting.value = input(user,"Enter text:","Settings",newvar) as message setting.value = input(user,"Enter text:","Settings",newvar) as message
*/ */
else else
error("[S] has an invalid type. Enjoy your hard crash bb.") error("[id] has an invalid typeval.")
var/lol=1/0 return
error("[lol]") // Just in case this compiler optimizes out unused vars. world << "\blue <b>[key_name(user)] changed ZAS setting <i>[setting.name]</i> to <i>[displayedValue]</i>.</b>"
ChangeSettingsDialog(user)
/**
* Set the value of a setting.
*
* Recommended to use the actual type of the setting rather than the ID, since
* this will allow for the compiler to check the validity of id. Kinda.
*
* @param id Either the typepath of the desired setting, or the string ID of the setting.
* @param value The value that the setting should be set to.
*/
/ZAS_Settings/proc/Set(var/id, var/value)
var/datum/ZAS_Setting/setting = src.settings[idfrompath(id)]
setting.value=value
// INTERNAL USE ONLY
/ZAS_Settings/proc/SetFromConfig(var/id, var/value)
var/datum/ZAS_Setting/setting = src.settings[id]
switch(setting.valtype)
if(ZAS_TYPE_NUMERIC)
setting.value = text2num(value)
/*
if(ZAS_TYPE_BITFLAG)
var/flag = input(user,"Toggle which bit?","Settings") in bitflags
flag = text2num(flag)
if(newvar & flag)
newvar &= ~flag
else
newvar |= flag
*/
if(ZAS_TYPE_BOOLEAN)
setting.value = (value == "1")
/*
if(ZAS_TYPE_STRING)
setting.value = input(user,"Enter text:","Settings",newvar) as message
*/
/**
* Get a setting.
*
* Recommended to use the actual type of the setting rather than the ID, since
* this will allow for the compiler to check the validity of id. Kinda.
*
* @param id Either the typepath of the desired setting, or the string ID of the setting.
* @returns Value of the desired setting
*/
/ZAS_Settings/proc/Get(var/id) /ZAS_Settings/proc/Get(var/id)
return settings[id].value var/datum/ZAS_Setting/setting = src.settings[idfrompath(id)]
return setting.value
/ZAS_Settings/proc/ChangeSettingsDialog(mob/user,list/L) /ZAS_Settings/proc/ChangeSettingsDialog(mob/user)
//var/which = input(user,"Choose a setting:") in L var/dat = {"
var/dat = "<dl>" <html>
for(var/datum/ZAS_Setting/s in settings) <head>
dat += "<dt><b>[s.name] = [s.value]</b> <A href='?src=\ref[src];changevar=[idfrompath(s.type)]'>\[Change\]</A></dt>" <title>ZAS Settings 2.0</title>
<style type="text/css">
body,html {
background:#666666;
font-family:sans-serif;
font-size:smaller;
color: #cccccc;
}
a { color: white; }
</style>
</head>
<body>
<h1>ZAS Configuration</h1>
<p><a href="?src=\ref[src];save=1">Save Settings</a> | <a href="?src=\ref[src];load=1">Load Settings</a></p>
<p>Please note that changing these settings can and probably will result in death, destruction and mayhem. <b>Change at your own risk.</b></p>
<dl>"}
for(var/id in src.settings)
var/datum/ZAS_Setting/s = src.settings[id]
dat += "<dt><b>[s.name]</b> = <i>[s.value]</i> <A href='?src=\ref[src];changevar=[id]'>\[Change\]</A></dt>"
dat += "<dd>[s.desc]</i></dd>" dat += "<dd>[s.desc]</i></dd>"
dat += "</dl>" dat += "</dl></body></html>"
user << browse(dat,"window=settings") user << browse(dat,"window=settings")
/ZAS_Settings/Topic(href,href_list) /ZAS_Settings/Topic(href,href_list)
if("changevar" in href_list) if("changevar" in href_list)
ChangeSetting(usr,href_list["changevar"]) ChangeSetting(usr,href_list["changevar"])
if("save" in href_list)
var/sure = input(usr,"Are you sure? This will overwrite your ZAS configuration!","Overwrite ZAS.txt?", "No") in list("Yes","No")
if(sure=="Yes")
Save()
message_admins("[key_name(usr)] saved ZAS settings to disk.")
if("load" in href_list)
var/sure = input(usr,"Are you sure?","Reload ZAS.txt?", "No") in list("Yes","No")
if(sure=="Yes")
Load()
message_admins("[key_name(usr)] reloaded ZAS settings from disk.")
/ZAS_Settings/proc/SetDefault(var/mob/user)
var/list/setting_choices = list("Plasma - Standard", "Plasma - Low Hazard", "Plasma - High Hazard", "Plasma - Oh Shit!", "ZAS - Normal", "ZAS - Forgiving", "ZAS - Dangerous", "ZAS - Hellish")
var/def = input(user, "Which of these presets should be used?") as null|anything in setting_choices
if(!def)
return
switch(def)
if("Plasma - Standard")
Set("CLOTH_CONTAMINATION", 1) //If this is on, plasma does damage by getting into cloth.
Set("PLASMAGUARD_ONLY", 0)
Set("GENETIC_CORRUPTION", 0) //Chance of genetic corruption as well as toxic damage, X in 1000.
Set("SKIN_BURNS", 0) //Plasma has an effect similar to mustard gas on the un-suited.
Set("EYE_BURNS", 1) //Plasma burns the eyes of anyone not wearing eye protection.
Set("PLASMA_HALLUCINATION", 0)
Set("CONTAMINATION_LOSS", 0.02)
if("Plasma - Low Hazard")
Set("CLOTH_CONTAMINATION", 0) //If this is on, plasma does damage by getting into cloth.
Set("PLASMAGUARD_ONLY", 0)
Set("GENETIC_CORRUPTION", 0) //Chance of genetic corruption as well as toxic damage, X in 1000
Set("SKIN_BURNS", 0) //Plasma has an effect similar to mustard gas on the un-suited.
Set("EYE_BURNS", 1) //Plasma burns the eyes of anyone not wearing eye protection.
Set("PLASMA_HALLUCINATION", 0)
Set("CONTAMINATION_LOSS", 0.01)
if("Plasma - High Hazard")
Set("CLOTH_CONTAMINATION", 1) //If this is on, plasma does damage by getting into cloth.
Set("PLASMAGUARD_ONLY", 0)
Set("GENETIC_CORRUPTION", 0) //Chance of genetic corruption as well as toxic damage, X in 1000.
Set("SKIN_BURNS", 1) //Plasma has an effect similar to mustard gas on the un-suited.
Set("EYE_BURNS", 1) //Plasma burns the eyes of anyone not wearing eye protection.
Set("PLASMA_HALLUCINATION", 1)
Set("CONTAMINATION_LOSS", 0.05)
if("Plasma - Oh Shit!")
Set("CLOTH_CONTAMINATION", 1) //If this is on, plasma does damage by getting into cloth.
Set("PLASMAGUARD_ONLY", 1)
Set("GENETIC_CORRUPTION", 5) //Chance of genetic corruption as well as toxic damage, X in 1000.
Set("SKIN_BURNS", 1) //Plasma has an effect similar to mustard gas on the un-suited.
Set("EYE_BURNS", 1) //Plasma burns the eyes of anyone not wearing eye protection.
Set("PLASMA_HALLUCINATION", 1)
Set("CONTAMINATION_LOSS", 0.075)
if("ZAS - Normal")
Set("airflow_push", 0)
Set("airflow_lightest_pressure", 20)
Set("airflow_light_pressure", 35)
Set("airflow_medium_pressure", 50)
Set("airflow_heavy_pressure", 65)
Set("airflow_dense_pressure", 85)
Set("airflow_stun_pressure", 60)
Set("airflow_stun_cooldown", 60)
Set("airflow_stun", 1)
Set("airflow_damage", 2)
Set("airflow_speed_decay", 1.5)
Set("airflow_delay", 30)
Set("airflow_mob_slowdown", 1)
if("ZAS - Forgiving")
Set("airflow_push", 0)
Set("airflow_lightest_pressure", 45)
Set("airflow_light_pressure", 60)
Set("airflow_medium_pressure", 120)
Set("airflow_heavy_pressure", 110)
Set("airflow_dense_pressure", 200)
Set("airflow_stun_pressure", 150)
Set("airflow_stun_cooldown", 90)
Set("airflow_stun", 0.15)
Set("airflow_damage", 0.15)
Set("airflow_speed_decay", 1.5)
Set("airflow_delay", 50)
Set("airflow_mob_slowdown", 0)
if("ZAS - Dangerous")
Set("airflow_push", 1)
Set("airflow_lightest_pressure", 15)
Set("airflow_light_pressure", 30)
Set("airflow_medium_pressure", 45)
Set("airflow_heavy_pressure", 55)
Set("airflow_dense_pressure", 70)
Set("airflow_stun_pressure", 50)
Set("airflow_stun_cooldown", 50)
Set("airflow_stun", 2)
Set("airflow_damage", 3)
Set("airflow_speed_decay", 1.2)
Set("airflow_delay", 25)
Set("airflow_mob_slowdown", 2)
if("ZAS - Hellish")
Set("airflow_push", 1)
Set("airflow_lightest_pressure", 20)
Set("airflow_light_pressure", 30)
Set("airflow_medium_pressure", 40)
Set("airflow_heavy_pressure", 50)
Set("airflow_dense_pressure", 60)
Set("airflow_stun_pressure", 40)
Set("airflow_stun_cooldown", 40)
Set("airflow_stun", 3)
Set("airflow_damage", 4)
Set("airflow_speed_decay", 1)
Set("airflow_delay", 20)
Set("airflow_mob_slowdown", 3)
world << "\blue <b>[key_name(usr)] loaded ZAS preset <i>[def]</i></b>"

View File

@@ -1,43 +1,5 @@
var/image/contamination_overlay = image('icons/effects/contamination.dmi') var/image/contamination_overlay = image('icons/effects/contamination.dmi')
pl_control/var
PLASMA_DMG = 3
PLASMA_DMG_NAME = "Plasma Damage Amount"
PLASMA_DMG_DESC = "Self Descriptive"
CLOTH_CONTAMINATION = 1
CLOTH_CONTAMINATION_NAME = "Cloth Contamination"
CLOTH_CONTAMINATION_DESC = "If this is on, plasma does damage by getting into cloth."
PLASMAGUARD_ONLY = 0
PLASMAGUARD_ONLY_NAME = "\"PlasmaGuard Only\""
PLASMAGUARD_ONLY_DESC = "If this is on, only biosuits and spacesuits protect against contamination and ill effects."
GENETIC_CORRUPTION = 0
GENETIC_CORRUPTION_NAME = "Genetic Corruption Chance"
GENETIC_CORRUPTION_DESC = "Chance of genetic corruption as well as toxic damage, X in 10,000."
SKIN_BURNS = 0
SKIN_BURNS_DESC = "Plasma has an effect similar to mustard gas on the un-suited."
SKIN_BURNS_NAME = "Skin Burns"
EYE_BURNS = 1
EYE_BURNS_NAME = "Eye Burns"
EYE_BURNS_DESC = "Plasma burns the eyes of anyone not wearing eye protection."
CONTAMINATION_LOSS = 0.02
CONTAMINATION_LOSS_NAME = "Contamination Loss"
CONTAMINATION_LOSS_DESC = "How much toxin damage is dealt from contaminated clothing" //Per tick? ASK ARYN
PLASMA_HALLUCINATION = 0
PLASMA_HALLUCINATION_NAME = "Plasma Hallucination"
PLASMA_HALLUCINATION_DESC = "Does being in plasma cause you to hallucinate?"
N2O_HALLUCINATION = 1
N2O_HALLUCINATION_NAME = "N2O Hallucination"
N2O_HALLUCINATION_DESC = "Does being in sleeping gas cause you to hallucinate?"
obj/var/contaminated = 0 obj/var/contaminated = 0
obj/item/proc obj/item/proc
@@ -78,21 +40,21 @@ obj/item/proc
//Handles all the bad things plasma can do. //Handles all the bad things plasma can do.
//Contamination //Contamination
if(vsc.plc.CLOTH_CONTAMINATION) contaminate() if(zas_settings.Get("CLOTH_CONTAMINATION")) contaminate()
//Anything else requires them to not be dead. //Anything else requires them to not be dead.
if(stat >= 2) if(stat >= 2)
return return
//Burn skin if exposed. //Burn skin if exposed.
if(vsc.plc.SKIN_BURNS) if(zas_settings.Get("SKIN_BURNS"))
if(!pl_head_protected() || !pl_suit_protected()) if(!pl_head_protected() || !pl_suit_protected())
burn_skin(0.75) burn_skin(0.75)
if(prob(20)) src << "\red Your skin burns!" if(prob(20)) src << "\red Your skin burns!"
updatehealth() updatehealth()
//Burn eyes if exposed. //Burn eyes if exposed.
if(vsc.plc.EYE_BURNS) if(zas_settings.Get("EYE_BURNS"))
if(!head) if(!head)
if(!wear_mask) if(!wear_mask)
burn_eyes() burn_eyes()
@@ -108,8 +70,8 @@ obj/item/proc
burn_eyes() burn_eyes()
//Genetic Corruption //Genetic Corruption
if(vsc.plc.GENETIC_CORRUPTION) if(zas_settings.Get("GENETIC_CORRUPTION"))
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION) if(rand(1,10000) < zas_settings.Get("GENETIC_CORRUPTION"))
randmutb(src) randmutb(src)
src << "\red High levels of toxins cause you to spontaneously mutate." src << "\red High levels of toxins cause you to spontaneously mutate."
domutcheck(src,null) domutcheck(src,null)
@@ -128,7 +90,7 @@ obj/item/proc
/mob/living/carbon/human/proc/pl_head_protected() /mob/living/carbon/human/proc/pl_head_protected()
//Checks if the head is adequately sealed. //Checks if the head is adequately sealed.
if(head) if(head)
if(vsc.plc.PLASMAGUARD_ONLY) if(zas_settings.Get("PLASMAGUARD_ONLY"))
if(head.flags & PLASMAGUARD) if(head.flags & PLASMAGUARD)
return 1 return 1
else if(head.flags & HEADCOVERSEYES) else if(head.flags & HEADCOVERSEYES)
@@ -138,7 +100,7 @@ obj/item/proc
/mob/living/carbon/human/proc/pl_suit_protected() /mob/living/carbon/human/proc/pl_suit_protected()
//Checks if the suit is adequately sealed. //Checks if the suit is adequately sealed.
if(wear_suit) if(wear_suit)
if(vsc.plc.PLASMAGUARD_ONLY) if(zas_settings.Get("PLASMAGUARD_ONLY"))
if(wear_suit.flags & PLASMAGUARD) return 1 if(wear_suit.flags & PLASMAGUARD) return 1
else else
if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1 if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1
@@ -154,7 +116,7 @@ obj/item/proc
turf/Entered(obj/item/I) turf/Entered(obj/item/I)
. = ..() . = ..()
//Items that are in plasma, but not on a mob, can still be contaminated. //Items that are in plasma, but not on a mob, can still be contaminated.
if(istype(I) && vsc.plc.CLOTH_CONTAMINATION) if(istype(I) && zas_settings.Get("CLOTH_CONTAMINATION"))
var/datum/gas_mixture/env = return_air(1) var/datum/gas_mixture/env = return_air(1)
if(!env) if(!env)
return return

View File

@@ -170,7 +170,7 @@ var/list/CounterDoorDirections = list(SOUTH,EAST) //Which directions doors turfs
if(unsimulated_tiles.len) if(unsimulated_tiles.len)
var/moved_air = ShareSpace(air,unsimulated_tiles) var/moved_air = ShareSpace(air,unsimulated_tiles)
if(moved_air > vsc.airflow_lightest_pressure) if(moved_air > zas_settings.Get("airflow_lightest_pressure"))
AirflowSpace(src) AirflowSpace(src)
else else
unsimulated_tiles = null unsimulated_tiles = null
@@ -252,7 +252,7 @@ var/list/CounterDoorDirections = list(SOUTH,EAST) //Which directions doors turfs
//Ensure we're not doing pointless calculations on equilibrium zones. //Ensure we're not doing pointless calculations on equilibrium zones.
var/moles_delta = abs(air.total_moles() - Z.air.total_moles()) var/moles_delta = abs(air.total_moles() - Z.air.total_moles())
if(moles_delta > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1) if(moles_delta > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1)
if(abs(Z.air.return_pressure() - air.return_pressure()) > vsc.airflow_lightest_pressure) if(abs(Z.air.return_pressure() - air.return_pressure()) > zas_settings.Get("airflow_lightest_pressure"))
Airflow(src,Z) Airflow(src,Z)
var/unsimulated_boost = 0 var/unsimulated_boost = 0
if(unsimulated_tiles) if(unsimulated_tiles)
@@ -267,7 +267,7 @@ var/list/CounterDoorDirections = list(SOUTH,EAST) //Which directions doors turfs
if(Z.last_update > last_update) if(Z.last_update > last_update)
continue continue
if(air && Z.air) if(air && Z.air)
if( abs(air.temperature - Z.air.temperature) > vsc.connection_temperature_delta ) if( abs(air.temperature - Z.air.temperature) > zas_settings.Get("connection_temperature_delta") )
ShareHeat(air, Z.air, closed_connection_zones[Z]) ShareHeat(air, Z.air, closed_connection_zones[Z])
progress = "all components completed successfully, the problem is not here" progress = "all components completed successfully, the problem is not here"
@@ -408,7 +408,7 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles, dbg_output)
ratio = sharing_lookup_table[unsimulated_tiles.len] ratio = sharing_lookup_table[unsimulated_tiles.len]
//We need to adjust it to account for the insulation settings. //We need to adjust it to account for the insulation settings.
ratio *= 1 - vsc.connection_insulation ratio *= 1 - zas_settings.Get("connection_insulation")
A.oxygen = max(0, (A.oxygen - oxy_avg) * (1 - ratio) + oxy_avg ) A.oxygen = max(0, (A.oxygen - oxy_avg) * (1 - ratio) + oxy_avg )
A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1 - ratio) + nit_avg ) A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1 - ratio) + nit_avg )

View File

@@ -79,7 +79,7 @@
/obj/machinery/door/proc/bumpopen(mob/user as mob) /obj/machinery/door/proc/bumpopen(mob/user as mob)
if(operating) return if(operating) return
if(user.last_airflow > world.time - vsc.airflow_delay) //Fakkit if(user.last_airflow > world.time - zas_settings.Get("airflow_delay")) //Fakkit
return return
src.add_fingerprint(user) src.add_fingerprint(user)
if(!src.requiresID()) if(!src.requiresID())

View File

@@ -501,8 +501,7 @@ var/global/floorIsLava = 0
<A href='?src=\ref[src];quick_create_object=1'>Quick Create Object</A><br> <A href='?src=\ref[src];quick_create_object=1'>Quick Create Object</A><br>
<A href='?src=\ref[src];create_turf=1'>Create Turf</A><br> <A href='?src=\ref[src];create_turf=1'>Create Turf</A><br>
<A href='?src=\ref[src];create_mob=1'>Create Mob</A><br> <A href='?src=\ref[src];create_mob=1'>Create Mob</A><br>
<br><A href='?src=\ref[src];vsc=airflow'>Edit Airflow Settings</A><br> <br><A href='?src=\ref[src];vsc=airflow'>Edit ZAS Settings</A><br>
<A href='?src=\ref[src];vsc=plasma'>Edit Plasma Settings</A><br>
<A href='?src=\ref[src];vsc=default'>Choose a default ZAS setting</A><br> <A href='?src=\ref[src];vsc=default'>Choose a default ZAS setting</A><br>
"} "}

View File

@@ -2453,11 +2453,9 @@
else if(href_list["vsc"]) else if(href_list["vsc"])
if(check_rights(R_ADMIN|R_SERVER)) if(check_rights(R_ADMIN|R_SERVER))
if(href_list["vsc"] == "airflow") if(href_list["vsc"] == "airflow")
vsc.ChangeSettingsDialog(usr,vsc.settings) zas_settings.ChangeSettingsDialog(usr,zas_settings.settings)
if(href_list["vsc"] == "plasma")
vsc.ChangeSettingsDialog(usr,vsc.plc.settings)
if(href_list["vsc"] == "default") if(href_list["vsc"] == "default")
vsc.SetDefault(usr) zas_settings.SetDefault(usr)
// player info stuff // player info stuff

View File

@@ -833,7 +833,7 @@
var/total_plasmaloss = 0 var/total_plasmaloss = 0
for(var/obj/item/I in src) for(var/obj/item/I in src)
if(I.contaminated) if(I.contaminated)
total_plasmaloss += vsc.plc.CONTAMINATION_LOSS total_plasmaloss += zas_settings.Get("CONTAMINATION_LOSS")
if(status_flags & GODMODE) return 0 //godmode if(status_flags & GODMODE) return 0 //godmode
adjustToxLoss(total_plasmaloss) adjustToxLoss(total_plasmaloss)

108
config-example/ZAS.txt Normal file
View File

@@ -0,0 +1,108 @@
# Fire - Air Consumption Ratio
# Ratio of air removed and combusted per tick.
fire_consumption_rate 0.75
# Fire - Firelevel Constant
# Multiplied by the equation for firelevel, affects mainly the extingiushing of fires.
fire_firelevel_multiplier 25
# Fire - Fuel energy release
# The energy in joule released when burning one mol of a burnable substance
fire_fuel_energy_release 550000
# Airflow - Small Movement Threshold %
# Percent of 1 Atm. at which items with the small weight classes will move.
airflow_lightest_pressure 20
# Airflow - Medium Movement Threshold %
# Percent of 1 Atm. at which items with the medium weight classes will move.
airflow_light_pressure 35
# Airflow - Heavy Movement Threshold %
# Percent of 1 Atm. at which items with the largest weight classes will move.
airflow_medium_pressure 50
# Airflow - Mob Movement Threshold %
# Percent of 1 Atm. at which mobs will move.
airflow_heavy_pressure 65
# Airflow - Dense Movement Threshold %
# Percent of 1 Atm. at which items with canisters and closets will move.
airflow_dense_pressure 85
# Airflow - Mob Stunning Threshold %
# Percent of 1 Atm. at which mobs will be stunned by airflow.
airflow_stun_pressure 60
# Aiflow Stunning - Cooldown
# How long, in tenths of a second, to wait before stunning them again.
airflow_stun_cooldown 60
# Airflow Impact - Stunning
# How much a mob is stunned when hit by an object.
airflow_stun 1
# Airflow Impact - Damage
# Damage from airflow impacts.
airflow_damage 2
# Airflow Speed Decay
# How rapidly the speed gained from airflow decays.
airflow_speed_decay 1.5
# Airflow Retrigger Delay
# Time in deciseconds before things can be moved by airflow again.
airflow_delay 30
# Airflow Slowdown
# Time in tenths of a second to add as a delay to each movement by a mob if they are fighting the pull of the airflow.
airflow_mob_slowdown 1
# Airflow - Push
# 1=yes please rape my server, 0=no
airflow_push 0
# Connections - Insulation
# How insulative a connection is, in terms of heat transfer. 1 is perfectly insulative, and 0 is perfectly conductive.
connection_insulation 0.4
# Connections - Temperature Difference
# The smallest temperature difference which will cause heat to travel through doors.
connection_temperature_delta 10
# Plasma Damage Amount
# Self Descriptive
PLASMA_DMG 3
# Cloth Contamination
# If this is on, plasma does damage by getting into cloth.
CLOTH_CONTAMINATION 1
# PlasmaGuard Only
# If this is on, only biosuits and spacesuits protect against contamination and ill effects.
PLASMAGUARD_ONLY 0
# Genetic Corruption Chance
# Chance of genetic corruption as well as toxic damage, X in 10,000.
GENETIC_CORRUPTION 0
# Skin Burns
# Plasma has an effect similar to mustard gas on the un-suited.
SKIN_BURNS 0
# Eye Burns
# Plasma burns the eyes of anyone not wearing eye protection.
EYE_BURNS 1
# Contamination Loss
# How much toxin damage is dealt from contaminated clothing
CONTAMINATION_LOSS 0.02
# Plasma Hallucination
# Does being in plasma cause you to hallucinate?
PLASMA_HALLUCINATION 0
# N2O Hallucination
# Does being in sleeping gas cause you to hallucinate?
N2O_HALLUCINATION 1