From 4bc6e9d52219a954c9139518a5320134a0cc8706 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 18 Sep 2017 01:45:39 -0500 Subject: [PATCH] [MIRROR] Cleaned up some decimal values. (#2797) * Cleaned up some decimal values. * Update gas_mixture.dm * Update color.dm * Update medsci.dm --- code/controllers/master.dm | 2 +- .../ark_of_the_clockwork_justicar.dm | 2 +- code/game/mecha/mecha.dm | 2 +- .../atmospherics/gasmixtures/gas_mixture.dm | 964 +++++++++--------- .../atmospherics/machinery/airalarm.dm | 4 +- code/modules/clothing/clothing.dm | 6 +- code/modules/clothing/gloves/color.dm | 426 ++++---- code/modules/clothing/masks/breath.dm | 4 +- code/modules/clothing/masks/miscellaneous.dm | 4 +- code/modules/clothing/suits/armor.dm | 2 +- code/modules/clothing/suits/jobs.dm | 4 +- code/modules/clothing/suits/utility.dm | 8 +- code/modules/clothing/under/jobs/civilian.dm | 2 +- code/modules/clothing/under/jobs/medsci.dm | 242 ++--- code/modules/hydroponics/hydroponics.dm | 2 +- .../carbon/human/species_types/golems.dm | 2 +- .../simple_animal/hostile/megafauna/dragon.dm | 4 +- .../hostile/megafauna/megafauna.dm | 2 +- .../chemistry/machinery/chem_heater.dm | 4 +- .../chemistry/reagents/alcohol_reagents.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 2 +- .../research/xenobiology/xenobiology.dm | 4 +- code/modules/surgery/organs/ears.dm | 2 +- config/config.txt | 4 +- 25 files changed, 851 insertions(+), 851 deletions(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 6981748198..11c460e326 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -422,7 +422,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // in those cases, so we just let them run) if (queue_node_flags & SS_NO_TICK_CHECK) if (queue_node.tick_usage > TICK_LIMIT_RUNNING - TICK_USAGE && ran_non_ticker) - queue_node.queued_priority += queue_priority_count * 0.10 + queue_node.queued_priority += queue_priority_count * 0.1 queue_priority_count -= queue_node_priority queue_priority_count += queue_node.queued_priority current_tick_budget -= queue_node_priority diff --git a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm index 2174f04dcb..b684b854c1 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -101,7 +101,7 @@ glow.linked = src /obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity) - var/damage = max((obj_integrity * 0.70) / severity, 100) //requires multiple bombs to take down + var/damage = max((obj_integrity * 0.7) / severity, 100) //requires multiple bombs to take down take_damage(damage, BRUTE, "bomb", 0) /obj/structure/destructible/clockwork/massive/celestial_gateway/attackby(obj/item/I, mob/living/user, params) //add components directly to the ark diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index fd52a75c18..200f771058 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -289,7 +289,7 @@ if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank if(internal_tank) var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) + var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.1) if(loc) loc.assume_air(leaked_gas) air_update_turf() diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index f5eb898163..ad1ba46d86 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -1,482 +1,482 @@ - /* -What are the archived variables for? - Calculations are done using the archived variables with the results merged into the regular variables. - This prevents race conditions that arise based on the order of tile processing. -*/ -#define MINIMUM_HEAT_CAPACITY 0.0003 -#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that - once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ - -GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm -GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) - -/proc/init_gaslist_cache() - . = list() - for(var/id in GLOB.meta_gas_info) - var/list/cached_gas = new(3) - - .[id] = cached_gas - - cached_gas[MOLES] = 0 - cached_gas[ARCHIVE] = 0 - cached_gas[GAS_META] = GLOB.meta_gas_info[id] - -#define GASLIST(id, out_list)\ - var/list/tmp_gaslist = GLOB.gaslist_cache[id];\ - out_list = tmp_gaslist.Copy(); - -/datum/gas_mixture - var/list/gases - var/temperature //kelvins - var/tmp/temperature_archived - var/volume //liters - var/last_share - var/list/reaction_results - -/datum/gas_mixture/New(volume = CELL_VOLUME) - gases = new - temperature = 0 - temperature_archived = 0 - src.volume = volume - last_share = 0 - reaction_results = new - -//listmos procs - - //assert_gas(gas_id) - used to guarantee that the gas list for this id exists. - //Must be used before adding to a gas. May be used before reading from a gas. -/datum/gas_mixture/proc/assert_gas(gas_id) - var/cached_gases = gases - if(cached_gases[gas_id]) - return - GASLIST(gas_id, cached_gases[gas_id]) - - //assert_gases(args) - shorthand for calling assert_gas() once for each gas type. -/datum/gas_mixture/proc/assert_gases() - for(var/id in args) - assert_gas(id) - - //add_gas(gas_id) - similar to assert_gas(), but does not check for an existing - //gas list for this id. This can clobber existing gases. - //Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). -/datum/gas_mixture/proc/add_gas(gas_id) - GASLIST(gas_id, gases[gas_id]) - - //add_gases(args) - shorthand for calling add_gas() once for each gas_type. -/datum/gas_mixture/proc/add_gases() - var/cached_gases = gases - for(var/id in args) - GASLIST(id, cached_gases[id]) - - //garbage_collect() - removes any gas list which is empty. - //If called with a list as an argument, only removes gas lists with IDs from that list. - //Must be used after subtracting from a gas. Must be used after assert_gas() - //if assert_gas() was called only to read from the gas. - //By removing empty gases, processing speed is increased. -/datum/gas_mixture/proc/garbage_collect(list/tocheck) - var/list/cached_gases = gases - for(var/id in (tocheck || cached_gases)) - if(cached_gases[id][MOLES] <= 0 && cached_gases[id][ARCHIVE] <= 0) - cached_gases -= id - - //PV = nRT -/datum/gas_mixture/proc/heat_capacity() //joules per kelvin - var/list/cached_gases = gases - . = 0 - for(var/id in cached_gases) - var/gas_data = cached_gases[id] - . += gas_data[MOLES] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - -/datum/gas_mixture/proc/heat_capacity_archived() //joules per kelvin - var/list/cached_gases = gases - . = 0 - for(var/id in cached_gases) - var/gas_data = cached_gases[id] - . += gas_data[ARCHIVE] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] - -//prefer this in performance critical areas -#define TOTAL_MOLES(cached_gases, out_var)\ - out_var = 0;\ - for(var/total_moles_id in cached_gases){\ - out_var += cached_gases[total_moles_id][MOLES];\ - } - -/datum/gas_mixture/proc/total_moles() - var/cached_gases = gases - TOTAL_MOLES(cached_gases, .) - -/datum/gas_mixture/proc/return_pressure() //kilopascals - if(volume > 0) // to prevent division by zero - var/cached_gases = gases - TOTAL_MOLES(cached_gases, .) - . *= R_IDEAL_GAS_EQUATION * temperature / volume - return - return 0 - -/datum/gas_mixture/proc/return_temperature() //kelvins - return temperature - -/datum/gas_mixture/proc/return_volume() //liters - return max(0, volume) - -/datum/gas_mixture/proc/thermal_energy() //joules - return temperature * heat_capacity() - -/datum/gas_mixture/proc/archive() - //Update archived versions of variables - //Returns: 1 in all cases - -/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) - //Merges all air from giver into self. Deletes giver. - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/remove(amount) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - -/datum/gas_mixture/proc/remove_ratio(ratio) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - -/datum/gas_mixture/proc/copy() - //Creates new, identical gas mixture - //Returns: duplicate gas mixture - -/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) - //Copies variables from sample - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/copy_from_turf(turf/model) - //Copies all gas info from the turf into the gas list along with temperature - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/parse_gas_string(gas_string) - //Copies variables from a particularly formatted string. - //Returns: 1 if we are mutable, 0 otherwise - -/datum/gas_mixture/proc/share(datum/gas_mixture/sharer) - //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length - //Returns: amount of gas exchanged (+ if sharer received) - -/datum/gas_mixture/proc/after_share(datum/gas_mixture/sharer) - //called on share's sharer to let it know it just got some gases - -/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length - //Returns: new temperature of the sharer - -/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) - //Compares sample to self to see if within acceptable ranges that group processing may be enabled - //Returns: a string indicating what check failed, or "" if check passes - -/datum/gas_mixture/proc/react(turf/open/dump_location) - //Performs various reactions such as combustion or fusion (LOL) - //Returns: 1 if any reaction took place; 0 otherwise - -/datum/gas_mixture/archive() - var/list/cached_gases = gases - - temperature_archived = temperature - for(var/id in cached_gases) - cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] - - return 1 - -/datum/gas_mixture/merge(datum/gas_mixture/giver) - if(!giver) - return 0 - - //heat transfer - if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - var/giver_heat_capacity = giver.heat_capacity() - var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity - if(combined_heat_capacity) - temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity - - var/list/cached_gases = gases //accessing datum vars is slower than proc vars - var/list/giver_gases = giver.gases - //gas transfer - for(var/giver_id in giver_gases) - assert_gas(giver_id) - cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] - - return 1 - -/datum/gas_mixture/remove(amount) - var/sum - var/list/cached_gases = gases - TOTAL_MOLES(cached_gases, sum) - amount = min(amount, sum) //Can not take more air than tile has! - if(amount <= 0) - return null - var/datum/gas_mixture/removed = new - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - for(var/id in cached_gases) - removed.add_gas(id) - removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) - cached_gases[id][MOLES] -= removed_gases[id][MOLES] - garbage_collect() - - return removed - -/datum/gas_mixture/remove_ratio(ratio) - if(ratio <= 0) - return null - ratio = min(ratio, 1) - - var/list/cached_gases = gases - var/datum/gas_mixture/removed = new - var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars - - removed.temperature = temperature - for(var/id in cached_gases) - removed.add_gas(id) - removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) - cached_gases[id][MOLES] -= removed_gases[id][MOLES] - - garbage_collect() - - return removed - -/datum/gas_mixture/copy() - var/list/cached_gases = gases - var/datum/gas_mixture/copy = new - var/list/copy_gases = copy.gases - - copy.temperature = temperature - for(var/id in cached_gases) - copy.add_gas(id) - copy_gases[id][MOLES] = cached_gases[id][MOLES] - - return copy - -/datum/gas_mixture/copy_from(datum/gas_mixture/sample) - var/list/cached_gases = gases //accessing datum vars is slower than proc vars - var/list/sample_gases = sample.gases - - temperature = sample.temperature - for(var/id in sample_gases) - assert_gas(id) - cached_gases[id][MOLES] = sample_gases[id][MOLES] - - //remove all gases not in the sample - cached_gases &= sample_gases - - return 1 - -/datum/gas_mixture/copy_from_turf(turf/model) - parse_gas_string(model.initial_gas_mix) - - //acounts for changes in temperature - var/turf/model_parent = model.parent_type - if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) - temperature = model.temperature - - return 1 - -/datum/gas_mixture/parse_gas_string(gas_string) - var/list/gases = src.gases - var/list/gas = params2list(gas_string) - if(gas["TEMP"]) - temperature = text2num(gas["TEMP"]) - gas -= "TEMP" - gases.Cut() - for(var/id in gas) - add_gas(id) - gases[id][MOLES] = text2num(gas[id]) - return 1 - -/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - if(!sharer) - return 0 - - var/list/cached_gases = gases - var/list/sharer_gases = sharer.gases - - var/temperature_delta = temperature_archived - sharer.temperature_archived - var/abs_temperature_delta = abs(temperature_delta) - - var/old_self_heat_capacity = 0 - var/old_sharer_heat_capacity = 0 - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - old_self_heat_capacity = heat_capacity() - old_sharer_heat_capacity = sharer.heat_capacity() - - var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer - var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us - - var/moved_moles = 0 - var/abs_moved_moles = 0 - - //GAS TRANSFER - for(var/id in sharer_gases - cached_gases) // create gases not in our cache - add_gas(id) - for(var/id in cached_gases) // transfer gases - if(!sharer_gases[id]) //checking here prevents an uneeded proc call if the check fails. - sharer.add_gas(id) - - var/gas = cached_gases[id] - var/sharergas = sharer_gases[id] - - var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures - - if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] - if(delta > 0) - heat_capacity_self_to_sharer += gas_heat_capacity - else - heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. saves a proc call. - - gas[MOLES] -= delta - sharergas[MOLES] += delta - moved_moles += delta - abs_moved_moles += abs(delta) - - last_share = abs_moved_moles - - //THERMAL ENERGY TRANSFER - if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer - var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self - - //transfer of thermal energy (via changed heat capacity) between self and sharer - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity - - if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) - sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity - //thermal energy of the system (self and sharer) is unchanged - - if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) - if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity - temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - - var/list/unique_gases = cached_gases ^ sharer_gases - if(unique_gases.len) //if all gases were present in both mixtures, we know that no gases are 0 - garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. - sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true - sharer.after_share(src, atmos_adjacent_turfs) - if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/our_moles - TOTAL_MOLES(cached_gases,our_moles) - var/their_moles - TOTAL_MOLES(sharer_gases,their_moles) - var/delta_pressure = temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles) - return delta_pressure * R_IDEAL_GAS_EQUATION / volume - -/datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - return - -/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - //transfer of thermal energy (via conduction) between self and sharer - if(sharer) - sharer_temperature = sharer.temperature_archived - var/temperature_delta = temperature_archived - sharer_temperature - if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity_archived() - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*temperature_delta* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - temperature = max(temperature - heat/self_heat_capacity, TCMB) - sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) - if(sharer) - sharer.temperature = sharer_temperature - return sharer_temperature - //thermal energy of the system (self and sharer) is unchanged - -/datum/gas_mixture/compare(datum/gas_mixture/sample) - var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars - var/list/cached_gases = gases - - for(var/id in cached_gases | sample_gases) // compare gases from either mixture - var/gas_moles = cached_gases[id] - gas_moles = gas_moles ? gas_moles[MOLES] : 0 - var/sample_moles = sample_gases[id] - sample_moles = sample_moles ? sample_moles[MOLES] : 0 - var/delta = abs(gas_moles - sample_moles) - if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \ - delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE) - return id - - var/our_moles - TOTAL_MOLES(cached_gases, our_moles) - if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE) - var/temp = temperature - var/sample_temp = sample.temperature - - var/temperature_delta = abs(temp - sample_temp) - if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return "temp" - - return "" - -/datum/gas_mixture/react(turf/open/dump_location) - . = 0 - if(temperature < TCMB) //just for safety - temperature = TCMB - reaction_results = new - - var/list/cached_gases = gases - var/temp = temperature - var/ener = thermal_energy() - - reaction_loop: - for(var/r in SSair.gas_reactions) - var/datum/gas_reaction/reaction = r - - var/list/min_reqs = reaction.min_requirements.Copy() - if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \ - || (min_reqs["ENER"] && ener < min_reqs["ENER"])) - continue - min_reqs -= "TEMP" - min_reqs -= "ENER" - - for(var/id in min_reqs) - if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id]) - continue reaction_loop - //at this point, all minimum requirements for the reaction are satisfied. - - /* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost - var/list/max_reqs = reaction.max_requirements.Copy() - if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \ - || (max_reqs["ENER"] && ener > max_reqs["ENER"])) - continue - max_reqs -= "TEMP" - max_reqs -= "ENER" - - for(var/id in max_reqs) - if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id]) - continue reaction_loop - //at this point, all requirements for the reaction are satisfied. we can now react() - */ - - . |= reaction.react(src, dump_location) - if(.) - garbage_collect() - -//Takes the amount of the gas you want to PP as an argument -//So I don't have to do some hacky switches/defines/magic strings -//eg: -//Tox_PP = get_partial_pressure(gas_mixture.toxins) -//O2_PP = get_partial_pressure(gas_mixture.oxygen) - -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) - return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME -//inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) - return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) - -//Mathematical proofs: -/* -get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp -get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() - -10/20*5 = 2.5 -10 = 2.5/5*20 -*/ + /* +What are the archived variables for? + Calculations are done using the archived variables with the results merged into the regular variables. + This prevents race conditions that arise based on the order of tile processing. +*/ +#define MINIMUM_HEAT_CAPACITY 0.0003 +#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that + once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ + +GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm +GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) + +/proc/init_gaslist_cache() + . = list() + for(var/id in GLOB.meta_gas_info) + var/list/cached_gas = new(3) + + .[id] = cached_gas + + cached_gas[MOLES] = 0 + cached_gas[ARCHIVE] = 0 + cached_gas[GAS_META] = GLOB.meta_gas_info[id] + +#define GASLIST(id, out_list)\ + var/list/tmp_gaslist = GLOB.gaslist_cache[id];\ + out_list = tmp_gaslist.Copy(); + +/datum/gas_mixture + var/list/gases + var/temperature //kelvins + var/tmp/temperature_archived + var/volume //liters + var/last_share + var/list/reaction_results + +/datum/gas_mixture/New(volume = CELL_VOLUME) + gases = new + temperature = 0 + temperature_archived = 0 + src.volume = volume + last_share = 0 + reaction_results = new + +//listmos procs + + //assert_gas(gas_id) - used to guarantee that the gas list for this id exists. + //Must be used before adding to a gas. May be used before reading from a gas. +/datum/gas_mixture/proc/assert_gas(gas_id) + var/cached_gases = gases + if(cached_gases[gas_id]) + return + GASLIST(gas_id, cached_gases[gas_id]) + + //assert_gases(args) - shorthand for calling assert_gas() once for each gas type. +/datum/gas_mixture/proc/assert_gases() + for(var/id in args) + assert_gas(id) + + //add_gas(gas_id) - similar to assert_gas(), but does not check for an existing + //gas list for this id. This can clobber existing gases. + //Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). +/datum/gas_mixture/proc/add_gas(gas_id) + GASLIST(gas_id, gases[gas_id]) + + //add_gases(args) - shorthand for calling add_gas() once for each gas_type. +/datum/gas_mixture/proc/add_gases() + var/cached_gases = gases + for(var/id in args) + GASLIST(id, cached_gases[id]) + + //garbage_collect() - removes any gas list which is empty. + //If called with a list as an argument, only removes gas lists with IDs from that list. + //Must be used after subtracting from a gas. Must be used after assert_gas() + //if assert_gas() was called only to read from the gas. + //By removing empty gases, processing speed is increased. +/datum/gas_mixture/proc/garbage_collect(list/tocheck) + var/list/cached_gases = gases + for(var/id in (tocheck || cached_gases)) + if(cached_gases[id][MOLES] <= 0 && cached_gases[id][ARCHIVE] <= 0) + cached_gases -= id + + //PV = nRT +/datum/gas_mixture/proc/heat_capacity() //joules per kelvin + var/list/cached_gases = gases + . = 0 + for(var/id in cached_gases) + var/gas_data = cached_gases[id] + . += gas_data[MOLES] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] + +/datum/gas_mixture/proc/heat_capacity_archived() //joules per kelvin + var/list/cached_gases = gases + . = 0 + for(var/id in cached_gases) + var/gas_data = cached_gases[id] + . += gas_data[ARCHIVE] * gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] + +//prefer this in performance critical areas +#define TOTAL_MOLES(cached_gases, out_var)\ + out_var = 0;\ + for(var/total_moles_id in cached_gases){\ + out_var += cached_gases[total_moles_id][MOLES];\ + } + +/datum/gas_mixture/proc/total_moles() + var/cached_gases = gases + TOTAL_MOLES(cached_gases, .) + +/datum/gas_mixture/proc/return_pressure() //kilopascals + if(volume > 0) // to prevent division by zero + var/cached_gases = gases + TOTAL_MOLES(cached_gases, .) + . *= R_IDEAL_GAS_EQUATION * temperature / volume + return + return 0 + +/datum/gas_mixture/proc/return_temperature() //kelvins + return temperature + +/datum/gas_mixture/proc/return_volume() //liters + return max(0, volume) + +/datum/gas_mixture/proc/thermal_energy() //joules + return temperature * heat_capacity() + +/datum/gas_mixture/proc/archive() + //Update archived versions of variables + //Returns: 1 in all cases + +/datum/gas_mixture/proc/merge(datum/gas_mixture/giver) + //Merges all air from giver into self. Deletes giver. + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/remove(amount) + //Proportionally removes amount of gas from the gas_mixture + //Returns: gas_mixture with the gases removed + +/datum/gas_mixture/proc/remove_ratio(ratio) + //Proportionally removes amount of gas from the gas_mixture + //Returns: gas_mixture with the gases removed + +/datum/gas_mixture/proc/copy() + //Creates new, identical gas mixture + //Returns: duplicate gas mixture + +/datum/gas_mixture/proc/copy_from(datum/gas_mixture/sample) + //Copies variables from sample + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/copy_from_turf(turf/model) + //Copies all gas info from the turf into the gas list along with temperature + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/parse_gas_string(gas_string) + //Copies variables from a particularly formatted string. + //Returns: 1 if we are mutable, 0 otherwise + +/datum/gas_mixture/proc/share(datum/gas_mixture/sharer) + //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length + //Returns: amount of gas exchanged (+ if sharer received) + +/datum/gas_mixture/proc/after_share(datum/gas_mixture/sharer) + //called on share's sharer to let it know it just got some gases + +/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) + //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length + //Returns: new temperature of the sharer + +/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) + //Compares sample to self to see if within acceptable ranges that group processing may be enabled + //Returns: a string indicating what check failed, or "" if check passes + +/datum/gas_mixture/proc/react(turf/open/dump_location) + //Performs various reactions such as combustion or fusion (LOL) + //Returns: 1 if any reaction took place; 0 otherwise + +/datum/gas_mixture/archive() + var/list/cached_gases = gases + + temperature_archived = temperature + for(var/id in cached_gases) + cached_gases[id][ARCHIVE] = cached_gases[id][MOLES] + + return 1 + +/datum/gas_mixture/merge(datum/gas_mixture/giver) + if(!giver) + return 0 + + //heat transfer + if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity() + var/giver_heat_capacity = giver.heat_capacity() + var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity + if(combined_heat_capacity) + temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity + + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + var/list/giver_gases = giver.gases + //gas transfer + for(var/giver_id in giver_gases) + assert_gas(giver_id) + cached_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] + + return 1 + +/datum/gas_mixture/remove(amount) + var/sum + var/list/cached_gases = gases + TOTAL_MOLES(cached_gases, sum) + amount = min(amount, sum) //Can not take more air than tile has! + if(amount <= 0) + return null + var/datum/gas_mixture/removed = new + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars + + removed.temperature = temperature + for(var/id in cached_gases) + removed.add_gas(id) + removed_gases[id][MOLES] = QUANTIZE((cached_gases[id][MOLES] / sum) * amount) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] + garbage_collect() + + return removed + +/datum/gas_mixture/remove_ratio(ratio) + if(ratio <= 0) + return null + ratio = min(ratio, 1) + + var/list/cached_gases = gases + var/datum/gas_mixture/removed = new + var/list/removed_gases = removed.gases //accessing datum vars is slower than proc vars + + removed.temperature = temperature + for(var/id in cached_gases) + removed.add_gas(id) + removed_gases[id][MOLES] = QUANTIZE(cached_gases[id][MOLES] * ratio) + cached_gases[id][MOLES] -= removed_gases[id][MOLES] + + garbage_collect() + + return removed + +/datum/gas_mixture/copy() + var/list/cached_gases = gases + var/datum/gas_mixture/copy = new + var/list/copy_gases = copy.gases + + copy.temperature = temperature + for(var/id in cached_gases) + copy.add_gas(id) + copy_gases[id][MOLES] = cached_gases[id][MOLES] + + return copy + +/datum/gas_mixture/copy_from(datum/gas_mixture/sample) + var/list/cached_gases = gases //accessing datum vars is slower than proc vars + var/list/sample_gases = sample.gases + + temperature = sample.temperature + for(var/id in sample_gases) + assert_gas(id) + cached_gases[id][MOLES] = sample_gases[id][MOLES] + + //remove all gases not in the sample + cached_gases &= sample_gases + + return 1 + +/datum/gas_mixture/copy_from_turf(turf/model) + parse_gas_string(model.initial_gas_mix) + + //acounts for changes in temperature + var/turf/model_parent = model.parent_type + if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) + temperature = model.temperature + + return 1 + +/datum/gas_mixture/parse_gas_string(gas_string) + var/list/gases = src.gases + var/list/gas = params2list(gas_string) + if(gas["TEMP"]) + temperature = text2num(gas["TEMP"]) + gas -= "TEMP" + gases.Cut() + for(var/id in gas) + add_gas(id) + gases[id][MOLES] = text2num(gas[id]) + return 1 + +/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + if(!sharer) + return 0 + + var/list/cached_gases = gases + var/list/sharer_gases = sharer.gases + + var/temperature_delta = temperature_archived - sharer.temperature_archived + var/abs_temperature_delta = abs(temperature_delta) + + var/old_self_heat_capacity = 0 + var/old_sharer_heat_capacity = 0 + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + old_self_heat_capacity = heat_capacity() + old_sharer_heat_capacity = sharer.heat_capacity() + + var/heat_capacity_self_to_sharer = 0 //heat capacity of the moles transferred from us to the sharer + var/heat_capacity_sharer_to_self = 0 //heat capacity of the moles transferred from the sharer to us + + var/moved_moles = 0 + var/abs_moved_moles = 0 + + //GAS TRANSFER + for(var/id in sharer_gases - cached_gases) // create gases not in our cache + add_gas(id) + for(var/id in cached_gases) // transfer gases + if(!sharer_gases[id]) //checking here prevents an uneeded proc call if the check fails. + sharer.add_gas(id) + + var/gas = cached_gases[id] + var/sharergas = sharer_gases[id] + + var/delta = QUANTIZE(gas[ARCHIVE] - sharergas[ARCHIVE])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures + + if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/gas_heat_capacity = delta * gas[GAS_META][META_GAS_SPECIFIC_HEAT] + if(delta > 0) + heat_capacity_self_to_sharer += gas_heat_capacity + else + heat_capacity_sharer_to_self -= gas_heat_capacity //subtract here instead of adding the absolute value because we know that delta is negative. saves a proc call. + + gas[MOLES] -= delta + sharergas[MOLES] += delta + moved_moles += delta + abs_moved_moles += abs(delta) + + last_share = abs_moved_moles + + //THERMAL ENERGY TRANSFER + if(abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer + var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self + + //transfer of thermal energy (via changed heat capacity) between self and sharer + if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) + temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity + + if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) + sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity + //thermal energy of the system (self and sharer) is unchanged + + if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) + if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.1) // <10% change in sharer heat capacity + temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) + + var/list/unique_gases = cached_gases ^ sharer_gases + if(unique_gases.len) //if all gases were present in both mixtures, we know that no gases are 0 + garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. + sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true + sharer.after_share(src, atmos_adjacent_turfs) + if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) + var/our_moles + TOTAL_MOLES(cached_gases,our_moles) + var/their_moles + TOTAL_MOLES(sharer_gases,their_moles) + var/delta_pressure = temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles) + return delta_pressure * R_IDEAL_GAS_EQUATION / volume + +/datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + return + +/datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + //transfer of thermal energy (via conduction) between self and sharer + if(sharer) + sharer_temperature = sharer.temperature_archived + var/temperature_delta = temperature_archived - sharer_temperature + if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) + var/self_heat_capacity = heat_capacity_archived() + sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity_archived() + + if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) + var/heat = conduction_coefficient*temperature_delta* \ + (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) + + temperature = max(temperature - heat/self_heat_capacity, TCMB) + sharer_temperature = max(sharer_temperature + heat/sharer_heat_capacity, TCMB) + if(sharer) + sharer.temperature = sharer_temperature + return sharer_temperature + //thermal energy of the system (self and sharer) is unchanged + +/datum/gas_mixture/compare(datum/gas_mixture/sample) + var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars + var/list/cached_gases = gases + + for(var/id in cached_gases | sample_gases) // compare gases from either mixture + var/gas_moles = cached_gases[id] + gas_moles = gas_moles ? gas_moles[MOLES] : 0 + var/sample_moles = sample_gases[id] + sample_moles = sample_moles ? sample_moles[MOLES] : 0 + var/delta = abs(gas_moles - sample_moles) + if(delta > MINIMUM_MOLES_DELTA_TO_MOVE && \ + delta > gas_moles * MINIMUM_AIR_RATIO_TO_MOVE) + return id + + var/our_moles + TOTAL_MOLES(cached_gases, our_moles) + if(our_moles > MINIMUM_MOLES_DELTA_TO_MOVE) + var/temp = temperature + var/sample_temp = sample.temperature + + var/temperature_delta = abs(temp - sample_temp) + if(temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + return "temp" + + return "" + +/datum/gas_mixture/react(turf/open/dump_location) + . = 0 + if(temperature < TCMB) //just for safety + temperature = TCMB + reaction_results = new + + var/list/cached_gases = gases + var/temp = temperature + var/ener = thermal_energy() + + reaction_loop: + for(var/r in SSair.gas_reactions) + var/datum/gas_reaction/reaction = r + + var/list/min_reqs = reaction.min_requirements.Copy() + if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \ + || (min_reqs["ENER"] && ener < min_reqs["ENER"])) + continue + min_reqs -= "TEMP" + min_reqs -= "ENER" + + for(var/id in min_reqs) + if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id]) + continue reaction_loop + //at this point, all minimum requirements for the reaction are satisfied. + + /* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost + var/list/max_reqs = reaction.max_requirements.Copy() + if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \ + || (max_reqs["ENER"] && ener > max_reqs["ENER"])) + continue + max_reqs -= "TEMP" + max_reqs -= "ENER" + + for(var/id in max_reqs) + if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id]) + continue reaction_loop + //at this point, all requirements for the reaction are satisfied. we can now react() + */ + + . |= reaction.react(src, dump_location) + if(.) + garbage_collect() + +//Takes the amount of the gas you want to PP as an argument +//So I don't have to do some hacky switches/defines/magic strings +//eg: +//Tox_PP = get_partial_pressure(gas_mixture.toxins) +//O2_PP = get_partial_pressure(gas_mixture.oxygen) + +/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) + return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME +//inverse +/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) + return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature) + +//Mathematical proofs: +/* +get_breath_partial_pressure(gas_pp) --> gas_pp/total_moles()*breath_pp = pp +get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() + +10/20*5 = 2.5 +10 = 2.5/5*20 +*/ diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 58a450bec9..1a03c69d49 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -73,7 +73,7 @@ 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 + "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K "o2" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa "n2" = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa @@ -101,7 +101,7 @@ /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. TLV = list( - "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE* 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20), // kPa + "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(200,210,273.15,283.15), // K "o2" = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa "n2" = new/datum/tlv(-1, -1, 1000, 1000), // Partial pressure, kpa diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 14e2faa754..9d8b25cebf 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -214,7 +214,7 @@ BLIND // can't see anything gender = PLURAL //Carn: for grammarically correct text-parsing w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/clothing/gloves.dmi' - siemens_coefficient = 0.50 + siemens_coefficient = 0.5 body_parts_covered = HANDS slot_flags = SLOT_GLOVES attack_verb = list("challenged") @@ -361,7 +361,7 @@ BLIND // can't see anything body_parts_covered = FEET slot_flags = SLOT_FEET - permeability_coefficient = 0.50 + permeability_coefficient = 0.5 slowdown = SHOES_SLOWDOWN var/blood_state = BLOOD_STATE_NOT_BLOODY var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) @@ -503,7 +503,7 @@ BLIND // can't see anything icon = 'icons/obj/clothing/uniforms.dmi' name = "under" body_parts_covered = CHEST|GROIN|LEGS|ARMS - permeability_coefficient = 0.90 + permeability_coefficient = 0.9 slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index b6b2eb9be1..a55b498e0b 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -1,213 +1,213 @@ -/obj/item/clothing/gloves/color/yellow - desc = "These gloves will protect the wearer from electric shock." - name = "insulated gloves" - icon_state = "yellow" - item_state = "ygloves" - siemens_coefficient = 0 - permeability_coefficient = 0.05 - item_color="yellow" - resistance_flags = 0 - -/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap - desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." - name = "budget insulated gloves" - icon_state = "yellow" - item_state = "ygloves" - siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() - permeability_coefficient = 0.05 - item_color="yellow" - resistance_flags = 0 - -/obj/item/clothing/gloves/color/fyellow/New() - ..() - siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) - -/obj/item/clothing/gloves/color/fyellow/old - desc = "Old and worn out insulated gloves, hopefully they still work." - name = "worn out insulated gloves" - -/obj/item/clothing/gloves/color/fyellow/old/Initialize() - . = ..() - siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) - -/obj/item/clothing/gloves/color/black - desc = "These gloves are fire-resistant." - name = "black gloves" - icon_state = "black" - item_state = "blackgloves" - item_color="black" - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - resistance_flags = 0 - var/can_be_cut = 1 - -/obj/item/clothing/gloves/color/black/hos - item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. - -/obj/item/clothing/gloves/color/black/ce - item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. - -/obj/item/clothing/gloves/color/black/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/wirecutters)) - if(can_be_cut && icon_state == initial(icon_state))//only if not dyed - to_chat(user, "You snip the fingertips off of [src].") - playsound(user.loc, W.usesound, rand(10,50), 1) - new /obj/item/clothing/gloves/fingerless(user.loc) - qdel(src) - ..() - -/obj/item/clothing/gloves/color/orange - name = "orange gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "orange" - item_state = "orangegloves" - item_color="orange" - -/obj/item/clothing/gloves/color/red - name = "red gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "red" - item_state = "redgloves" - item_color = "red" - - -/obj/item/clothing/gloves/color/red/insulated - name = "insulated gloves" - desc = "These gloves will protect the wearer from electric shock." - siemens_coefficient = 0 - permeability_coefficient = 0.05 - resistance_flags = 0 - -/obj/item/clothing/gloves/color/rainbow - name = "rainbow gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "rainbow" - item_state = "rainbowgloves" - item_color = "rainbow" - -/obj/item/clothing/gloves/color/rainbow/clown - item_color = "clown" - -/obj/item/clothing/gloves/color/blue - name = "blue gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "blue" - item_state = "bluegloves" - item_color="blue" - -/obj/item/clothing/gloves/color/purple - name = "purple gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "purple" - item_state = "purplegloves" - item_color="purple" - -/obj/item/clothing/gloves/color/green - name = "green gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "green" - item_state = "greengloves" - item_color="green" - -/obj/item/clothing/gloves/color/grey - name = "grey gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "gray" - item_state = "graygloves" - item_color="grey" - -/obj/item/clothing/gloves/color/grey/rd - item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way. - -/obj/item/clothing/gloves/color/grey/hop - item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way. - -/obj/item/clothing/gloves/color/light_brown - name = "light brown gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "lightbrown" - item_state = "lightbrowngloves" - item_color="light brown" - -/obj/item/clothing/gloves/color/brown - name = "brown gloves" - desc = "A pair of gloves, they don't look special in any way." - icon_state = "brown" - item_state = "browngloves" - item_color="brown" - -/obj/item/clothing/gloves/color/brown/cargo - item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way. - -/obj/item/clothing/gloves/color/captain - desc = "Regal blue gloves, with a nice gold trim. Swanky." - name = "captain's gloves" - icon_state = "captain" - item_state = "egloves" - item_color = "captain" - siemens_coefficient = 0 - permeability_coefficient = 0.05 - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - strip_delay = 60 - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 50) - -/obj/item/clothing/gloves/color/latex - name = "latex gloves" - desc = "Cheap sterile gloves made from latex." - icon_state = "latex" - item_state = "lgloves" - siemens_coefficient = 0.30 - permeability_coefficient = 0.01 - item_color="white" - transfer_prints = TRUE - resistance_flags = 0 - -/obj/item/clothing/gloves/color/latex/nitrile - name = "nitrile gloves" - desc = "Pricy sterile gloves that are stronger than latex." - icon_state = "nitrile" - item_state = "nitrilegloves" - item_color = "cmo" - transfer_prints = FALSE - -/obj/item/clothing/gloves/color/white - name = "white gloves" - desc = "These look pretty fancy." - icon_state = "white" - item_state = "wgloves" - item_color="mime" - -/obj/item/clothing/gloves/color/white/redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. - -/obj/item/clothing/gloves/color/random - name = "random gloves" - desc = "These gloves are supposed to be a random color..." - icon_state = "white" - item_state = "wgloves" - item_color = "mime" - -/obj/item/clothing/gloves/color/random/New() - ..() - var/list/gloves = list( - /obj/item/clothing/gloves/color/orange = 1, - /obj/item/clothing/gloves/color/red = 1, - /obj/item/clothing/gloves/color/blue = 1, - /obj/item/clothing/gloves/color/purple = 1, - /obj/item/clothing/gloves/color/green = 1, - /obj/item/clothing/gloves/color/grey = 1, - /obj/item/clothing/gloves/color/light_brown = 1, - /obj/item/clothing/gloves/color/brown = 1) - - var/obj/item/clothing/gloves/color/selected = pick(gloves) - - name = initial(selected.name) - desc = initial(selected.desc) - icon_state = initial(selected.icon_state) - item_state = initial(selected.item_state) - item_color = initial(selected.item_color) +/obj/item/clothing/gloves/color/yellow + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + siemens_coefficient = 0 + permeability_coefficient = 0.5 + item_color="yellow" + resistance_flags = 0 + +/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap + desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." + name = "budget insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() + permeability_coefficient = 0.5 + item_color="yellow" + resistance_flags = 0 + +/obj/item/clothing/gloves/color/fyellow/New() + ..() + siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) + +/obj/item/clothing/gloves/color/fyellow/old + desc = "Old and worn out insulated gloves, hopefully they still work." + name = "worn out insulated gloves" + +/obj/item/clothing/gloves/color/fyellow/old/Initialize() + . = ..() + siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) + +/obj/item/clothing/gloves/color/black + desc = "These gloves are fire-resistant." + name = "black gloves" + icon_state = "black" + item_state = "blackgloves" + item_color="black" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = 0 + var/can_be_cut = 1 + +/obj/item/clothing/gloves/color/black/hos + item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. + +/obj/item/clothing/gloves/color/black/ce + item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. + +/obj/item/clothing/gloves/color/black/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/wirecutters)) + if(can_be_cut && icon_state == initial(icon_state))//only if not dyed + to_chat(user, "You snip the fingertips off of [src].") + playsound(user.loc, W.usesound, rand(10,50), 1) + new /obj/item/clothing/gloves/fingerless(user.loc) + qdel(src) + ..() + +/obj/item/clothing/gloves/color/orange + name = "orange gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "orange" + item_state = "orangegloves" + item_color="orange" + +/obj/item/clothing/gloves/color/red + name = "red gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "red" + item_state = "redgloves" + item_color = "red" + + +/obj/item/clothing/gloves/color/red/insulated + name = "insulated gloves" + desc = "These gloves will protect the wearer from electric shock." + siemens_coefficient = 0 + permeability_coefficient = 0.5 + resistance_flags = 0 + +/obj/item/clothing/gloves/color/rainbow + name = "rainbow gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "rainbow" + item_state = "rainbowgloves" + item_color = "rainbow" + +/obj/item/clothing/gloves/color/rainbow/clown + item_color = "clown" + +/obj/item/clothing/gloves/color/blue + name = "blue gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "blue" + item_state = "bluegloves" + item_color="blue" + +/obj/item/clothing/gloves/color/purple + name = "purple gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "purple" + item_state = "purplegloves" + item_color="purple" + +/obj/item/clothing/gloves/color/green + name = "green gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "green" + item_state = "greengloves" + item_color="green" + +/obj/item/clothing/gloves/color/grey + name = "grey gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "gray" + item_state = "graygloves" + item_color="grey" + +/obj/item/clothing/gloves/color/grey/rd + item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way. + +/obj/item/clothing/gloves/color/grey/hop + item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way. + +/obj/item/clothing/gloves/color/light_brown + name = "light brown gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "lightbrown" + item_state = "lightbrowngloves" + item_color="light brown" + +/obj/item/clothing/gloves/color/brown + name = "brown gloves" + desc = "A pair of gloves, they don't look special in any way." + icon_state = "brown" + item_state = "browngloves" + item_color="brown" + +/obj/item/clothing/gloves/color/brown/cargo + item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way. + +/obj/item/clothing/gloves/color/captain + desc = "Regal blue gloves, with a nice gold trim. Swanky." + name = "captain's gloves" + icon_state = "captain" + item_state = "egloves" + item_color = "captain" + siemens_coefficient = 0 + permeability_coefficient = 0.5 + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + strip_delay = 60 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 50) + +/obj/item/clothing/gloves/color/latex + name = "latex gloves" + desc = "Cheap sterile gloves made from latex." + icon_state = "latex" + item_state = "lgloves" + siemens_coefficient = 0.3 + permeability_coefficient = 0.1 + item_color="white" + transfer_prints = TRUE + resistance_flags = 0 + +/obj/item/clothing/gloves/color/latex/nitrile + name = "nitrile gloves" + desc = "Pricy sterile gloves that are stronger than latex." + icon_state = "nitrile" + item_state = "nitrilegloves" + item_color = "cmo" + transfer_prints = FALSE + +/obj/item/clothing/gloves/color/white + name = "white gloves" + desc = "These look pretty fancy." + icon_state = "white" + item_state = "wgloves" + item_color="mime" + +/obj/item/clothing/gloves/color/white/redcoat + item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. + +/obj/item/clothing/gloves/color/random + name = "random gloves" + desc = "These gloves are supposed to be a random color..." + icon_state = "white" + item_state = "wgloves" + item_color = "mime" + +/obj/item/clothing/gloves/color/random/New() + ..() + var/list/gloves = list( + /obj/item/clothing/gloves/color/orange = 1, + /obj/item/clothing/gloves/color/red = 1, + /obj/item/clothing/gloves/color/blue = 1, + /obj/item/clothing/gloves/color/purple = 1, + /obj/item/clothing/gloves/color/green = 1, + /obj/item/clothing/gloves/color/grey = 1, + /obj/item/clothing/gloves/color/light_brown = 1, + /obj/item/clothing/gloves/color/brown = 1) + + var/obj/item/clothing/gloves/color/selected = pick(gloves) + + name = initial(selected.name) + desc = initial(selected.desc) + icon_state = initial(selected.icon_state) + item_state = initial(selected.item_state) + item_color = initial(selected.item_color) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 3c076f572f..39099fb1a2 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -7,8 +7,8 @@ flags_1 = MASKINTERNALS_1 visor_flags = MASKINTERNALS_1 w_class = WEIGHT_CLASS_SMALL - gas_transfer_coefficient = 0.10 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.1 + permeability_coefficient = 0.5 actions_types = list(/datum/action/item_action/adjust) flags_cover = MASKCOVERSMOUTH visor_flags_cover = MASKCOVERSMOUTH diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 6b91d1a265..8422b5b76f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -5,7 +5,7 @@ item_state = "blindfold" flags_cover = MASKCOVERSMOUTH w_class = WEIGHT_CLASS_SMALL - gas_transfer_coefficient = 0.90 + gas_transfer_coefficient = 0.9 equip_delay_other = 20 /obj/item/clothing/mask/muzzle/attack_paw(mob/user) @@ -26,7 +26,7 @@ flags_cover = MASKCOVERSMOUTH visor_flags_inv = HIDEFACE visor_flags_cover = MASKCOVERSMOUTH - gas_transfer_coefficient = 0.90 + gas_transfer_coefficient = 0.9 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0, fire = 0, acid = 0) actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 59dd6e2d8d..13221350ee 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -362,7 +362,7 @@ icon_state = "heavy" item_state = "swat_suit" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 + gas_transfer_coefficient = 0.9 flags_1 = THICKMATERIAL_1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 3 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index c12accc8c1..5211dd7938 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -70,8 +70,8 @@ desc = "An apron-jacket used by a high class chef." icon_state = "chef" item_state = "chef" - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 body_parts_covered = CHEST|GROIN|ARMS allowed = list(/obj/item/kitchen) togglename = "sleeves" diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index e0e6ee6e5a..3ea8721b7e 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -15,8 +15,8 @@ icon_state = "fire" item_state = "ro_suit" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/extinguisher, /obj/item/crowbar) slowdown = 1 @@ -122,8 +122,8 @@ icon_state = "rad" item_state = "rad_suit" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 flags_1 = THICKMATERIAL_1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/device/geiger_counter) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 19cfc834f9..5210034af9 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -76,7 +76,7 @@ icon_state = "hydroponics" item_state = "g_suit" item_color = "hydroponics" - permeability_coefficient = 0.50 + permeability_coefficient = 0.5 /obj/item/clothing/under/rank/janitor desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 9c5ab5168a..d80b7ddba3 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -1,121 +1,121 @@ -/* - * Science - */ -/obj/item/clothing/under/rank/research_director - desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." - name = "research director's vest suit" - icon_state = "director" - item_state = "lb_suit" - item_color = "director" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 35) - can_adjust = 0 - -/obj/item/clothing/under/rank/research_director/alt - desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." - name = "research director's tan suit" - icon_state = "rdwhimsy" - item_state = "rdwhimsy" - item_color = "rdwhimsy" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) - can_adjust = 1 - alt_covers_chest = 1 - -/obj/item/clothing/under/rank/research_director/turtleneck - desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style." - name = "research director's turtleneck" - icon_state = "rdturtle" - item_state = "p_suit" - item_color = "rdturtle" - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) - can_adjust = 1 - alt_covers_chest = 1 - -/obj/item/clothing/under/rank/scientist - desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." - name = "scientist's jumpsuit" - icon_state = "toxins" - item_state = "w_suit" - item_color = "toxinswhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) - - -/obj/item/clothing/under/rank/chemist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." - name = "chemist's jumpsuit" - icon_state = "chemistry" - item_state = "w_suit" - item_color = "chemistrywhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 65) - -/* - * Medical - */ -/obj/item/clothing/under/rank/chief_medical_officer - desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." - name = "chief medical officer's jumpsuit" - icon_state = "cmo" - item_state = "w_suit" - item_color = "cmo" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/geneticist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." - name = "geneticist's jumpsuit" - icon_state = "genetics" - item_state = "w_suit" - item_color = "geneticswhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/virologist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." - name = "virologist's jumpsuit" - icon_state = "virology" - item_state = "w_suit" - item_color = "virologywhite" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/nursesuit - desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." - name = "nurse's suit" - icon_state = "nursesuit" - item_state = "w_suit" - item_color = "nursesuit" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - fitted = NO_FEMALE_UNIFORM - can_adjust = 0 - -/obj/item/clothing/under/rank/medical - desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." - name = "medical doctor's jumpsuit" - icon_state = "medical" - item_state = "w_suit" - item_color = "medical" - permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - -/obj/item/clothing/under/rank/medical/blue - name = "medical scrubs" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." - icon_state = "scrubsblue" - item_color = "scrubsblue" - can_adjust = 0 - -/obj/item/clothing/under/rank/medical/green - name = "medical scrubs" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." - icon_state = "scrubsgreen" - item_color = "scrubsgreen" - can_adjust = 0 - -/obj/item/clothing/under/rank/medical/purple - name = "medical scrubs" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." - icon_state = "scrubspurple" - item_color = "scrubspurple" - can_adjust = 0 +/* + * Science + */ +/obj/item/clothing/under/rank/research_director + desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." + name = "research director's vest suit" + icon_state = "director" + item_state = "lb_suit" + item_color = "director" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 35) + can_adjust = 0 + +/obj/item/clothing/under/rank/research_director/alt + desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." + name = "research director's tan suit" + icon_state = "rdwhimsy" + item_state = "rdwhimsy" + item_color = "rdwhimsy" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) + can_adjust = 1 + alt_covers_chest = 1 + +/obj/item/clothing/under/rank/research_director/turtleneck + desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style." + name = "research director's turtleneck" + icon_state = "rdturtle" + item_state = "p_suit" + item_color = "rdturtle" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0) + can_adjust = 1 + alt_covers_chest = 1 + +/obj/item/clothing/under/rank/scientist + desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." + name = "scientist's jumpsuit" + icon_state = "toxins" + item_state = "w_suit" + item_color = "toxinswhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) + + +/obj/item/clothing/under/rank/chemist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." + name = "chemist's jumpsuit" + icon_state = "chemistry" + item_state = "w_suit" + item_color = "chemistrywhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 65) + +/* + * Medical + */ +/obj/item/clothing/under/rank/chief_medical_officer + desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." + name = "chief medical officer's jumpsuit" + icon_state = "cmo" + item_state = "w_suit" + item_color = "cmo" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/geneticist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." + name = "geneticist's jumpsuit" + icon_state = "genetics" + item_state = "w_suit" + item_color = "geneticswhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/virologist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." + name = "virologist's jumpsuit" + icon_state = "virology" + item_state = "w_suit" + item_color = "virologywhite" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/nursesuit + desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." + name = "nurse's suit" + icon_state = "nursesuit" + item_state = "w_suit" + item_color = "nursesuit" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + fitted = NO_FEMALE_UNIFORM + can_adjust = 0 + +/obj/item/clothing/under/rank/medical + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." + name = "medical doctor's jumpsuit" + icon_state = "medical" + item_state = "w_suit" + item_color = "medical" + permeability_coefficient = 0.5 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/rank/medical/blue + name = "medical scrubs" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." + icon_state = "scrubsblue" + item_color = "scrubsblue" + can_adjust = 0 + +/obj/item/clothing/under/rank/medical/green + name = "medical scrubs" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." + icon_state = "scrubsgreen" + item_color = "scrubsgreen" + can_adjust = 0 + +/obj/item/clothing/under/rank/medical/purple + name = "medical scrubs" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." + icon_state = "scrubspurple" + item_color = "scrubspurple" + can_adjust = 0 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 52f5e4e138..4f5f9cbaf7 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -622,7 +622,7 @@ adjustHealth(round(salt * 0.25)) if (myseed) myseed.adjust_production(-round(salt/100)-prob(salt%100)) - myseed.adjust_potency(round(salt*0.50)) + myseed.adjust_potency(round(salt*0.5)) // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer if(S.has_reagent("ash", 1)) adjustHealth(round(S.get_reagent_amount("ash") * 0.25)) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 45f7ba7dc2..5df45e2755 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -159,7 +159,7 @@ name = "Plasteel Golem" id = "plasteel golem" fixed_mut_color = "bbb" - stunmod = 0.40 + stunmod = 0.4 punchdamagelow = 12 punchdamagehigh = 21 punchstunthreshold = 18 //still 40% stun chance diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index f5e097841a..c8272ca65e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -352,9 +352,9 @@ Difficulty: Medium /obj/effect/temp_visual/dragon_flight/proc/flight(negative) if(negative) - animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.1, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) else - animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) + animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.1, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) sleep(3) icon_state = "swoop" if(negative) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index c4618db620..dfbdace1f2 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -60,7 +60,7 @@ else var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) if(C && crusher_loot) - if(C.total_damage >= maxHealth * 0.60) //if you do at least 60% of its health with the crusher, you'll get the item + if(C.total_damage >= maxHealth * 0.6) //if you do at least 60% of its health with the crusher, you'll get the item spawn_crusher_loot() if(!admin_spawned) SSblackbox.set_details("megafauna_kills","[initial(name)]") diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index ce1f469f8d..abe58cb79d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -10,11 +10,11 @@ circuit = /obj/item/circuitboard/machine/chem_heater var/obj/item/reagent_containers/beaker = null var/target_temperature = 300 - var/heater_coefficient = 0.10 + var/heater_coefficient = 0.1 var/on = FALSE /obj/machinery/chem_heater/RefreshParts() - heater_coefficient = 0.10 + heater_coefficient = 0.1 for(var/obj/item/stock_parts/micro_laser/M in component_parts) heater_coefficient *= M.rating diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index f89c89377e..c114f7017b 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -69,7 +69,7 @@ All effects don't start immediately, but rather get worse over time; the rate is for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.10*power_multiplier, S.success_multiplier) + S.success_multiplier = max(0.1*power_multiplier, S.success_multiplier) // +10% success propability on each step, useful while operating in less-than-perfect conditions return ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 57a7f3445d..ab9d95582b 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -353,7 +353,7 @@ var/mob/living/carbon/C = M for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.10, S.success_multiplier) + S.success_multiplier = max(0.1, S.success_multiplier) // +10% success propability on each step, useful while operating in less-than-perfect conditions if(show_message) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 1eac1f5272..a370ce2de9 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -797,7 +797,7 @@ var/mob/living/carbon/C = M for(var/s in C.surgeries) var/datum/surgery/S = s - S.success_multiplier = max(0.20, S.success_multiplier) + S.success_multiplier = max(0.2, S.success_multiplier) // +20% success propability on each step, useful while operating in less-than-perfect conditions ..() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 47d6d40901..79fc4078f8 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -429,8 +429,8 @@ icon_state = "golem" item_state = "golem" w_class = WEIGHT_CLASS_BULKY - gas_transfer_coefficient = 0.90 - permeability_coefficient = 0.50 + gas_transfer_coefficient = 0.9 + permeability_coefficient = 0.5 body_parts_covered = FULL_BODY flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 26c2239bb6..f8a310c8f7 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -27,7 +27,7 @@ else if(C.ears && (C.ears.flags_2 & HEALS_EARS_2)) deaf = max(deaf - 1, 1) - ear_damage = max(ear_damage - 0.10, 0) + ear_damage = max(ear_damage - 0.1, 0) // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. if(ear_damage < UNHEALING_EAR_DAMAGE) ear_damage = max(ear_damage - 0.05, 0) diff --git a/config/config.txt b/config/config.txt index 0e47eb0192..80a587885b 100644 --- a/config/config.txt +++ b/config/config.txt @@ -145,8 +145,8 @@ CHECK_RANDOMIZER ## IPINTEL: ## This allows you to detect likely proxies by checking ips against getipintel.net -## Rating to warn at: (0.90 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning -#IPINTEL_RATING_BAD 0.90 +## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning +#IPINTEL_RATING_BAD 0.9 ## Contact email, (required to use the service, leaving blank or default disables IPINTEL) #IPINTEL_EMAIL ch@nge.me ## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times)