Merge pull request #56 from Aurorastation/master

Master Ketchup
This commit is contained in:
skull132
2016-01-04 20:26:45 +02:00
37 changed files with 900 additions and 634 deletions
+2 -2
View File
@@ -39,10 +39,10 @@
#define FILE_DIR "icons/obj/clothing/species/tajaran"
#define FILE_DIR "icons/obj/clothing/species/unathi"
#define FILE_DIR "icons/obj/custom_items"
#define FILE_DIR "icons/obj/door_braces"
#define FILE_DIR "icons/obj/doors"
#define FILE_DIR "icons/obj/flora"
#define FILE_DIR "icons/obj/machines"
#define FILE_DIR "icons/obj/magnetic_locks"
#define FILE_DIR "icons/obj/pipes"
#define FILE_DIR "icons/pda_icons"
#define FILE_DIR "icons/spideros_icons"
@@ -568,12 +568,12 @@
#include "code\game\objects\items\devices\binoculars.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\debugger.dm"
#include "code\game\objects\items\devices\door_bracer.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\isocube.dm"
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\magnetic_lock.dm"
#include "code\game\objects\items\devices\megaphone.dm"
#include "code\game\objects\items\devices\modkit.dm"
#include "code\game\objects\items\devices\multitool.dm"
@@ -120,14 +120,14 @@
if(pressure_delta > 0.5)
if(pump_direction) //internal -> external
if (node1 && (environment.temperature || air1.temperature))
var/transfer_moles = calculate_transfer_moles(air1, environment)
var/transfer_moles = calculate_transfer_moles(air1, environment, pressure_delta)
power_draw = pump_gas(src, air1, environment, transfer_moles, power_rating)
if(power_draw >= 0 && network1)
network1.update = 1
else //external -> internal
if (node2 && (environment.temperature || air2.temperature))
var/transfer_moles = calculate_transfer_moles(environment, air2, (network2)? network2.volume : 0)
var/transfer_moles = calculate_transfer_moles(environment, air2, pressure_delta, (network2)? network2.volume : 0)
//limit flow rate from turfs
transfer_moles = min(transfer_moles, environment.total_moles*air2.volume/environment.volume) //group_multiplier gets divided out here
+18 -31
View File
@@ -26,6 +26,7 @@
var/area_uid
var/id_tag = null
var/hibernate = 0 //Do we even process?
var/pump_direction = 1 //0 = siphoning, 1 = releasing
var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND
@@ -88,7 +89,7 @@
/obj/machinery/atmospherics/unary/vent_pump/engine
name = "Engine Core Vent"
power_channel = ENVIRON
power_rating = 15000 //15 kW ~ 20 HP
power_rating = 30000 //15 kW ~ 20 HP
/obj/machinery/atmospherics/unary/vent_pump/engine/New()
..()
@@ -150,8 +151,8 @@
/obj/machinery/atmospherics/unary/vent_pump/process()
..()
last_power_draw = 0
last_flow_rate = 0
if (hibernate)
return 1
if (!node)
use_power = 0
@@ -168,15 +169,26 @@
if((environment.temperature || air_contents.temperature) && pressure_delta > 0.5)
if(pump_direction) //internal -> external
var/transfer_moles = calculate_transfer_moles(air_contents, environment)
var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta)
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
else //external -> internal
var/transfer_moles = calculate_transfer_moles(environment, air_contents, (network)? network.volume : 0)
var/transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, (network)? network.volume : 0)
//limit flow rate from turfs
transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here
power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating)
else
//If we're in an area that is fucking ideal, and we don't have to do anything, chances are we won't next tick either so why redo these calculations?
//JESUS FUCK. THERE ARE LITERALLY 250 OF YOU MOTHERFUCKERS ON ZLEVEL ONE AND YOU DO THIS SHIT EVERY TICK WHEN VERY OFTEN THERE IS NO REASON TO
if(pump_direction && pressure_checks == PRESSURE_CHECK_EXTERNAL && controller_iteration > 10) //99% of all vents
//Fucking hibernate because you ain't doing shit.
hibernate = 1
spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly
hibernate = 0
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
@@ -238,54 +250,41 @@
initial_loc.air_vent_names[id_tag] = new_name
src.name = new_name
initial_loc.air_vent_info[id_tag] = signal.data
radio_connection.post_signal(src, signal, radio_filter_out)
return 1
/obj/machinery/atmospherics/unary/vent_pump/initialize()
..()
//some vents work his own spesial way
radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null
radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null
if(frequency)
set_frequency(frequency)
/obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal)
if(stat & (NOPOWER|BROKEN))
return
hibernate = 0
//log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])")
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
if(signal.data["purge"] != null)
pressure_checks &= ~1
pump_direction = 0
if(signal.data["stabalize"] != null)
pressure_checks |= 1
pump_direction = 1
if(signal.data["power"] != null)
use_power = text2num(signal.data["power"])
if(signal.data["power_toggle"] != null)
use_power = !use_power
if(signal.data["checks"] != null)
if (signal.data["checks"] == "default")
pressure_checks = pressure_checks_default
else
pressure_checks = text2num(signal.data["checks"])
if(signal.data["checks_toggle"] != null)
pressure_checks = (pressure_checks?0:3)
if(signal.data["direction"] != null)
pump_direction = text2num(signal.data["direction"])
if(signal.data["set_internal_pressure"] != null)
if (signal.data["set_internal_pressure"] == "default")
internal_pressure_bound = internal_pressure_bound_default
@@ -295,7 +294,6 @@
text2num(signal.data["set_internal_pressure"]),
ONE_ATMOSPHERE*50
)
if(signal.data["set_external_pressure"] != null)
if (signal.data["set_external_pressure"] == "default")
external_pressure_bound = external_pressure_bound_default
@@ -305,32 +303,25 @@
text2num(signal.data["set_external_pressure"]),
ONE_ATMOSPHERE*50
)
if(signal.data["adjust_internal_pressure"] != null)
internal_pressure_bound = between(
0,
internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),
ONE_ATMOSPHERE*50
)
if(signal.data["adjust_external_pressure"] != null)
external_pressure_bound = between(
0,
external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),
ONE_ATMOSPHERE*50
)
if(signal.data["init"] != null)
name = signal.data["init"]
return
if(signal.data["status"] != null)
spawn(2)
broadcast_status()
return //do not update_icon
//log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
spawn(2)
broadcast_status()
@@ -368,13 +359,11 @@
user << "You are too far away to read the gauge."
if(welded)
user << "It seems welded shut."
/obj/machinery/atmospherics/unary/vent_pump/power_change()
var/old_stat = stat
..()
if(old_stat != stat)
update_icon()
/obj/machinery/atmospherics/unary/vent_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
@@ -400,14 +389,12 @@
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
/obj/machinery/atmospherics/unary/vent_pump/Del()
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
..()
return
/*
Alt-click to vent crawl - Monkeys, aliens, slimes and mice.
This is a little buggy but somehow that just seems to plague ventcrawl.
+102 -75
View File
@@ -35,37 +35,34 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
if(air_contents.check_combustability(liquid))
igniting = 1
create_fire(1000)
create_fire(vsc.fire_firelevel_multiplier)
return igniting
/zone/proc/process_fire()
if(!air.check_combustability())
var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, fire_tiles.len)
var/firelevel = burn_gas.zburn(src, fire_tiles, force_burn = 1, no_check = 1)
air.merge(burn_gas)
if (firelevel)
for (var/turf/T in fire_tiles)
if (T.fire)
T.fire.firelevel = firelevel
else
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fire_tiles -= T
fuel_objs -= fuel
else
for(var/turf/simulated/T in fire_tiles)
if(istype(T.fire))
T.fire.RemoveFire()
T.fire = null
fire_tiles.Cut()
fuel_objs.Cut()
if(!fire_tiles.len)
air_master.active_fire_zones.Remove(src)
return
var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, fire_tiles.len)
var/gm = burn_gas.group_multiplier
burn_gas.group_multiplier = 1
burn_gas.zburn(force_burn = 1, no_check = 1)
burn_gas.group_multiplier = gm
air.merge(burn_gas)
var/firelevel = air.calculate_firelevel()
for(var/turf/T in fire_tiles)
if(T.fire)
T.fire.firelevel = firelevel
else
fire_tiles -= T
/turf/proc/create_fire(fl)
return 0
@@ -79,8 +76,13 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
return 1
fire = new(src, fl)
zone.fire_tiles |= src
air_master.active_fire_zones |= zone
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src
zone.fire_tiles |= src
if (fuel)
zone.fuel_objs += fuel
return 0
/obj/fire
@@ -123,8 +125,8 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
SetLuminosity(3)
//im not sure how to implement a version that works for every creature so for now monkeys are firesafe
for(var/mob/living/carbon/human/M in loc)
M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the humans!
for(var/mob/living/L in loc)
L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs!
loc.fire_act(air_contents, air_contents.temperature, air_contents.volume)
for(var/atom/A in loc)
@@ -146,10 +148,11 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
if(!enemy_tile.zone || enemy_tile.fire)
continue
if(!enemy_tile.zone.fire_tiles.len)
var/datum/gas_mixture/acs = enemy_tile.return_air()
if(!acs || !acs.check_combustability())
continue
//if(!enemy_tile.zone.fire_tiles.len)
var/datum/gas_mixture/acs = enemy_tile.return_air()
var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in enemy_tile
if(!acs || !acs.check_combustability(liquid))
continue
//If extinguisher mist passed over the turf it's trying to spread to, don't spread and
//reduce firelevel.
@@ -178,10 +181,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
/obj/fire/Del()
if (istype(loc, /turf/simulated))
SetLuminosity(0)
loc = null
air_master.active_hotspots.Remove(src)
RemoveFire()
..()
@@ -198,65 +198,101 @@ turf/simulated/apply_fire_protection()
fire_protection = world.time
datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, force_burn, no_check = 0)
datum/gas_mixture/proc/zburn(zone/zone, force_burn, no_check = 0)
. = 0
if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(liquid)))
if ((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null)))
var/gas_fuel = 0
var/liquid_fuel = 0
var/total_fuel = 0
var/total_oxidizers = 0
for(var/g in gas)
for (var/g in gas)
if(gas_data.flags[g] & XGM_GAS_FUEL)
total_fuel += gas[g]
gas_fuel += gas[g]
if(gas_data.flags[g] & XGM_GAS_OXIDIZER)
total_oxidizers += gas[g]
gas_fuel *= group_multiplier
total_oxidizers *= group_multiplier
if(liquid)
//Liquid Fuel
if(liquid.amount <= 0.1)
del liquid
else
total_fuel += liquid.amount
if (zone)
for (var/obj/effect/decal/cleanable/liquid_fuel/fuel in zone.fuel_objs)
liquid_fuel += fuel.amount*LIQUIDFUEL_AMOUNT_TO_MOL
if(total_fuel == 0)
total_fuel = gas_fuel + liquid_fuel
if (total_fuel <= 0.005)
return 0
//Calculate the firelevel.
var/firelevel = calculate_firelevel(liquid, total_fuel, total_oxidizers, force = 1)
//*** Determine how fast the fire burns
//get the current inner energy of the gas mix
//calculate the firelevel.
var/firelevel = calculate_firelevel(zone? zone.fuel_objs : null, total_fuel, total_oxidizers, force = 1)
//get the current thermal energy of the gas mix
//this must be taken here to prevent the addition or deletion of energy by a changing heat capacity
var/starting_energy = temperature * heat_capacity()
//determine the amount of oxygen used
var/used_oxidizers = min(total_oxidizers, total_fuel / 2)
//determine how far the reaction can progress
var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit
//determine the amount of fuel actually used
var/used_fuel_ratio = min(2 * total_oxidizers , total_fuel) / total_fuel
total_fuel = total_fuel * used_fuel_ratio
//determine the actual rate of reaction, as measured by the amount of fuel reacting
var/total_reactants = total_fuel + used_oxidizers
//vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).
var/gas_reaction_progress = max(0.2*group_multiplier, (firelevel/vsc.fire_firelevel_multiplier)*gas_fuel)*FIRE_GAS_BURNRATE_MULT
//liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning (which is sort of accounted for by firelevel). Having more fuel means a longer burn.
var/liquid_reaction_progress = (firelevel/vsc.fire_firelevel_multiplier)*FIRE_LIQUID_BURNRATE_MULT
//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
//world << "liquid_reaction_progress = [liquid_reaction_progress]"
//world << "gas_reaction_progress = [gas_reaction_progress]"
var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress
var/used_fuel = min(total_reaction_progress, reaction_limit)
var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT)
//world << "used_fuel = [used_fuel]; used_oxidizers = [used_oxidizers]; reaction_limit=[reaction_limit]"
if (zone && zone.fuel_objs.len)
if (used_fuel <= FIRE_LIQUD_MIN_BURNRATE)
return 0
else if (used_fuel <= FIRE_GAS_MIN_BURNRATE * group_multiplier)
return 0
//*** Remove fuel and oxidizer, add carbon dioxide and heat
//remove and add gasses as calculated
remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers * used_reactants_ratio)
remove_by_flag(XGM_GAS_FUEL, total_fuel * used_reactants_ratio)
var/used_gas_fuel = min(used_fuel*(gas_reaction_progress/total_reaction_progress), gas_fuel) //remove in proportion to the relative reaction progress
var/used_liquid_fuel = between(0, used_fuel-used_gas_fuel, liquid_fuel)
adjust_gas("carbon_dioxide", max(total_fuel*used_reactants_ratio, 0))
//remove_by_flag() and adjust_gas() handle the group_multiplier for us.
remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers)
remove_by_flag(XGM_GAS_FUEL, used_gas_fuel)
adjust_gas("carbon_dioxide", used_oxidizers)
if(liquid)
liquid.amount -= (liquid.amount * used_fuel_ratio * used_reactants_ratio) * 5 // liquid fuel burns 5 times as quick
//As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel, some have less, but whatever.
if(zone && zone.fuel_objs.len)
var/fuel_to_remove = used_liquid_fuel/(zone.fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units
//world << "used gas fuel = [used_gas_fuel]; used other fuel = [used_fuel-used_gas_fuel]; fuel_to_remove = [fuel_to_remove]"
var/liquidonly = !check_combustability()
for(var/O in zone.fuel_objs)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = O
if(!istype(fuel))
zone.fuel_objs -= fuel
continue
if(liquid.amount <= 0) del liquid
fuel.amount -= fuel_to_remove
if(fuel.amount <= 0)
zone.fuel_objs -= fuel
if(liquidonly)
var/turf/T = fuel.loc
if(istype(T) && T.fire) del(T.fire)
del(fuel)
//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 + vsc.fire_fuel_energy_release * used_fuel) / heat_capacity()
update_values()
. = total_reactants * used_reactants_ratio
return firelevel
datum/gas_mixture/proc/check_recombustability(obj/effect/decal/cleanable/liquid_fuel/liquid)
datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
. = 0
for(var/g in gas)
if(gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1)
@@ -266,7 +302,7 @@ datum/gas_mixture/proc/check_recombustability(obj/effect/decal/cleanable/liquid_
if(!.)
return 0
if(liquid)
if(fuel_objs && fuel_objs.len)
return 1
. = 0
@@ -275,7 +311,7 @@ datum/gas_mixture/proc/check_recombustability(obj/effect/decal/cleanable/liquid_
. = 1
break
datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid)
datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid = null)
. = 0
for(var/g in gas)
if(gas_data.flags[g] & XGM_GAS_OXIDIZER && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1)
@@ -294,20 +330,11 @@ datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fu
. = 1
break
datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid, total_fuel = null, total_oxidizers = null, force = 0)
/datum/gas_mixture/proc/calculate_firelevel(list/fuel_objs, total_fuel, total_oxidizers, force = 0)
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
var/firelevel = 0
if(force || check_recombustability(liquid))
if(isnull(total_fuel))
for(var/g in gas)
if(gas_data.flags[g] & XGM_GAS_FUEL)
total_fuel += gas[g]
if(gas_data.flags[g] & XGM_GAS_OXIDIZER)
total_oxidizers += gas[g]
if(liquid)
total_fuel += liquid.amount
if(force || check_recombustability(fuel_objs))
var/total_combustables = (total_fuel + total_oxidizers)
if(total_combustables > 0)
+10 -3
View File
@@ -44,6 +44,7 @@ Class Procs:
/zone/var/invalid = 0
/zone/var/list/contents = list()
/zone/var/list/fire_tiles = list()
/zone/var/list/fuel_objs = list()
/zone/var/needs_update = 0
@@ -72,8 +73,11 @@ Class Procs:
T.zone = src
contents.Add(T)
if(T.fire)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fire_tiles.Add(T)
air_master.active_fire_zones.Add(src)
air_master.active_fire_zones |= src
if (fuel)
fuel_objs += fuel
T.update_graphic(air.graphic)
/zone/proc/remove(turf/simulated/T)
@@ -85,6 +89,9 @@ Class Procs:
#endif
contents.Remove(T)
fire_tiles.Remove(T)
if (T.fire)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fuel_objs -= fuel
T.zone = null
T.update_graphic(graphic_remove = air.graphic)
if(contents.len)
@@ -142,7 +149,7 @@ Class Procs:
M << name
for(var/g in air.gas)
M << "[gas_data.name[g]]: [air.gas[g]]"
M << "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)"
M << "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]K ([air.temperature - T0C]C)"
M << "O2 per N2: [(air.gas["nitrogen"] ? air.gas["oxygen"]/air.gas["nitrogen"] : "N/A")] Moles: [air.total_moles]"
M << "Simulated: [contents.len] ([air.group_multiplier])"
//M << "Unsimulated: [unsimulated_contents.len]"
@@ -162,4 +169,4 @@ Class Procs:
M << "Space Edges: [space_edges] ([space_coefficient] connections)"
//for(var/turf/T in unsimulated_contents)
// M << "[T] at ([T.x],[T.y])"
// M << "[T] at ([T.x],[T.y])"
+8 -8
View File
@@ -100,7 +100,7 @@
/datum/gas_mixture/proc/add_thermal_energy(var/thermal_energy)
if (total_moles == 0)
return 0
var/heat_capacity = heat_capacity()
if (thermal_energy < 0)
if (temperature < TCMB)
@@ -121,7 +121,7 @@
/datum/gas_mixture/proc/specific_entropy()
if (!gas.len || total_moles == 0)
return SPECIFIC_ENTROPY_VACUUM
. = 0
for(var/g in gas)
. += gas[g] * specific_entropy_gas(g)
@@ -129,24 +129,24 @@
/*
It's arguable whether this should even be called entropy anymore. It's more "based on" entropy than actually entropy now.
Returns the ideal gas specific entropy of a specific gas in the mix. This is the entropy due to that gas per mole of /that/ gas in the mixture, not the entropy due to that gas per mole of gas mixture.
For the purposes of SS13, the specific entropy is just a number that tells you how hard it is to move gas. You can replace this with whatever you want.
Just remember that returning a SMALL number == adding gas to this gas mix is HARD, taking gas away is EASY, and that returning a LARGE number means the opposite (so a vacuum should approach infinity).
So returning a constant/(partial pressure) would probably do what most players expect. Although the version I have implemented below is a bit more nuanced than simply 1/P in that it scales in a way
So returning a constant/(partial pressure) would probably do what most players expect. Although the version I have implemented below is a bit more nuanced than simply 1/P in that it scales in a way
which is bit more realistic (natural log), and returns a fairly accurate entropy around room temperatures and pressures.
*/
/datum/gas_mixture/proc/specific_entropy_gas(var/gasid)
if (!(gasid in gas) || gas[gasid] == 0)
return SPECIFIC_ENTROPY_VACUUM //that gas isn't here
//group_multiplier gets divided out in volume/gas[gasid] - also, V/(m*T) = R/(partial pressure)
var/molar_mass = gas_data.molar_mass[gasid]
var/specific_heat = gas_data.specific_heat[gasid]
return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*volume/(gas[gasid] * temperature)) * (molar_mass*specific_heat*temperature)**(2/3) + 1 ) + 15 )
//alternative, simpler equation
//var/partial_pressure = gas[gasid] * R_IDEAL_GAS_EQUATION * temperature / volume
//return R_IDEAL_GAS_EQUATION * ( log (1 + IDEAL_GAS_ENTROPY_CONSTANT/partial_pressure) + 20 )
@@ -265,7 +265,7 @@
return 1
/datum/gas_mixture/proc/react(atom/dump_location)
zburn(null)
zburn(null, force_burn = 0, no_check = 0)
//Rechecks the gas_mixture and adjusts the graphic list if needed.
//Two lists can be passed by reference if you need know specifically which graphics were added and removed.
+5
View File
@@ -88,6 +88,8 @@
var/aurorawikiurl
var/githuburl
var/whitelists_on_sql = 0 //Changes how whitelists are handled. SQL connection required to run this!
//Alert level description
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
@@ -528,6 +530,9 @@
if("topic_safe_address")
topic_safe_address = value
if ("whitelists_on_sql")
config.whitelists_on_sql = 1
else
log_misc("Unknown setting in configuration: '[name]'")
+12 -12
View File
@@ -1346,22 +1346,22 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
access = access_medical
group = "Medical / Science"
/datum/supply_packs/doorbracers_engineering
name = "Engineering Doorbracer Crate"
contains = list(/obj/item/device/doorbrace/engineering,
/obj/item/device/doorbrace/engineering,
/obj/item/device/doorbrace/engineering)
/datum/supply_packs/maglocks_engineering
name = "Engineering Magnetic Lock Crate"
contains = list(/obj/item/device/magnetic_lock/engineering,
/obj/item/device/magnetic_lock/engineering,
/obj/item/device/magnetic_lock/engineering)
cost = 30
containertype = /obj/structure/closet/crate
containername = "engineering doorbracers"
containername = "engineering magnetic locks"
group = "Engineering"
/datum/supply_packs/doorbracers_security
name = "Security Doorbracer Crate"
contains = list(/obj/item/device/doorbrace/security,
/obj/item/device/doorbrace/security,
/obj/item/device/doorbrace/security)
/datum/supply_packs/maglocks_security
name = "Security Magnetic Lock Crate"
contains = list(/obj/item/device/magnetic_lock/security,
/obj/item/device/magnetic_lock/security,
/obj/item/device/magnetic_lock/security)
cost = 30
containertype = /obj/structure/closet/crate
containername = "security doorbracers"
containername = "security magnetic locks"
group = "Security"
+133 -63
View File
@@ -48,45 +48,45 @@ DBConnection
var/server = ""
var/port = 3306
DBConnection/New(dbi_handler,username,password_handler,cursor_handler)
src.dbi = dbi_handler
src.user = username
src.password = password_handler
src.default_cursor = cursor_handler
DBConnection/New(dbi_handler, username, password_handler, cursor_handler)
dbi = dbi_handler
user = username
password = password_handler
default_cursor = cursor_handler
_db_con = _dm_db_new_con()
DBConnection/proc/Connect(dbi_handler=src.dbi,user_handler=src.user,password_handler=src.password,cursor_handler)
if(!sqllogging)
DBConnection/proc/Connect(dbi_handler = dbi, user_handler = user, password_handler = password, cursor_handler)
if (!sqllogging)
return 0
if(!src) return 0
cursor_handler = src.default_cursor
if(!cursor_handler) cursor_handler = Default_Cursor
return _dm_db_connect(_db_con,dbi_handler,user_handler,password_handler,cursor_handler,null)
if (!src)
return 0
cursor_handler = default_cursor
if (!cursor_handler)
cursor_handler = Default_Cursor
return _dm_db_connect(_db_con,dbi_handler, user_handler, password_handler, cursor_handler, null)
DBConnection/proc/Disconnect() return _dm_db_close(_db_con)
DBConnection/proc/Disconnect()
return _dm_db_close(_db_con)
DBConnection/proc/IsConnected()
if(!sqllogging) return 0
if(!sqllogging)
return 0
var/success = _dm_db_is_connected(_db_con)
return success
DBConnection/proc/Quote(str) return _dm_db_quote(_db_con,str)
DBConnection/proc/Quote(str)
return _dm_db_quote(_db_con,str)
DBConnection/proc/ErrorMsg()
return _dm_db_error_msg(_db_con)
DBConnection/proc/ErrorMsg() return _dm_db_error_msg(_db_con)
DBConnection/proc/SelectDB(database_name,dbi)
if(IsConnected()) Disconnect()
//return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[DB_SERVER]:[DB_PORT]"]",user,password)
return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[sqladdress]:[sqlport]"]",user,password)
DBConnection/proc/NewQuery(sql_query,cursor_handler=src.default_cursor) return new/DBQuery(sql_query,src,cursor_handler)
DBQuery/New(sql_query,DBConnection/connection_handler,cursor_handler)
if(sql_query) src.sql = sql_query
if(connection_handler) src.db_connection = connection_handler
if(cursor_handler) src.default_cursor = cursor_handler
_db_query = _dm_db_new_query()
return ..()
return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[sqladdress]:[sqlport]"]", user, password)
DBConnection/proc/NewQuery(sql_query, cursor_handler = default_cursor)
return new/DBQuery(sql_query, src, cursor_handler)
DBQuery
var/sql // The sql query being executed.
@@ -98,34 +98,53 @@ DBQuery
var/DBConnection/db_connection
var/_db_query
DBQuery/proc/Connect(DBConnection/connection_handler) src.db_connection = connection_handler
DBQuery/New(var/sql_query, var/DBConnection/connection_handler, var/cursor_handler)
if (sql_query)
sql = sql_query
if (connection_handler)
db_connection = connection_handler
if (cursor_handler)
default_cursor = cursor_handler
_db_query = _dm_db_new_query()
return ..()
DBQuery/proc/Execute(sql_query=src.sql,cursor_handler=default_cursor)
DBQuery/proc/Connect(DBConnection/connection_handler)
db_connection = connection_handler
DBQuery/proc/Execute(var/list/argument_list = null, var/pass_not_found = 0, sql_query = sql, cursor_handler = default_cursor)
Close()
return _dm_db_execute(_db_query,sql_query,db_connection._db_con,cursor_handler,null)
DBQuery/proc/NextRow() return _dm_db_next_row(_db_query,item,conversions)
if (argument_list)
sql_query = parseArguments(sql_query, argument_list, pass_not_found)
DBQuery/proc/RowsAffected() return _dm_db_rows_affected(_db_query)
return _dm_db_execute(_db_query, sql_query, db_connection._db_con, cursor_handler, null)
DBQuery/proc/RowCount() return _dm_db_row_count(_db_query)
DBQuery/proc/NextRow()
return _dm_db_next_row(_db_query,item,conversions)
DBQuery/proc/ErrorMsg() return _dm_db_error_msg(_db_query)
DBQuery/proc/RowsAffected()
return _dm_db_rows_affected(_db_query)
DBQuery/proc/RowCount()
return _dm_db_row_count(_db_query)
DBQuery/proc/ErrorMsg()
return _dm_db_error_msg(_db_query)
DBQuery/proc/Columns()
if(!columns)
if (!columns)
columns = _dm_db_columns(_db_query,/DBColumn)
return columns
DBQuery/proc/GetRowData()
var/list/columns = Columns()
var/list/results
if(columns.len)
if (columns.len)
results = list()
for(var/C in columns)
results+=C
for (var/C in columns)
results += C
var/DBColumn/cur_col = columns[C]
results[C] = src.item[(cur_col.position+1)]
results[C] = item[(cur_col.position+1)]
return results
DBQuery/proc/Close()
@@ -138,11 +157,49 @@ DBQuery/proc/Quote(str)
return db_connection.Quote(str)
DBQuery/proc/SetConversion(column,conversion)
if(istext(column)) column = columns.Find(column)
if(!conversions) conversions = new/list(column)
else if(conversions.len < column) conversions.len = column
if (istext(column))
column = columns.Find(column)
if (!conversions)
conversions = new/list(column)
else if (conversions.len < column)
conversions.len = column
conversions[column] = conversion
/* Works similarly to the PDO object's Execute() method in PHP.
* Insert a list of keys/values, it searches the SQL syntax for the keys,
* and replaces them with sanitized versions of the values.
* Can be called independently, or through dbcon.Execute(), where the list would be the first argument.
* passNotFound controls whether or not is passes keys not found in the SQL query.
* Keys are /case-sensitive/, be careful!
* Returns the parsed SQL query upon completion.
* - Skull132
*/
DBQuery/proc/parseArguments(var/query_to_parse = null, var/list/argument_list, var/pass_not_found = 0)
if (!query_to_parse || !argument_list || !argument_list.len)
return 0
for (var/placeholder in argument_list)
if (!findtextEx(sql, placeholder))
if (pass_not_found)
continue
else
return 0
var/argument = argument_list[placeholder]
if (isnull(argument))
argument = "NULL"
else if (istext(argument))
argument = dbcon.Quote(argument)
else if (isnum(argument))
argument = "'[argument]'"
else
return 0
query_to_parse = replacetextEx(sql, placeholder, argument)
return query_to_parse
DBColumn
var/name
@@ -153,32 +210,45 @@ DBColumn
var/length
var/max_length
DBColumn/New(name_handler,table_handler,position_handler,type_handler,flag_handler,length_handler,max_length_handler)
src.name = name_handler
src.table = table_handler
src.position = position_handler
src.sql_type = type_handler
src.flags = flag_handler
src.length = length_handler
src.max_length = max_length_handler
DBColumn/New(name_handler, table_handler, position_handler, type_handler, flag_handler, length_handler, max_length_handler)
name = name_handler
table = table_handler
position = position_handler
sql_type = type_handler
flags = flag_handler
length = length_handler
max_length = max_length_handler
return ..()
DBColumn/proc/SqlTypeName(type_handler=src.sql_type)
switch(type_handler)
if(TINYINT) return "TINYINT"
if(SMALLINT) return "SMALLINT"
if(MEDIUMINT) return "MEDIUMINT"
if(INTEGER) return "INTEGER"
if(BIGINT) return "BIGINT"
if(FLOAT) return "FLOAT"
if(DOUBLE) return "DOUBLE"
if(DATE) return "DATE"
if(DATETIME) return "DATETIME"
if(TIMESTAMP) return "TIMESTAMP"
if(TIME) return "TIME"
if(STRING) return "STRING"
if(BLOB) return "BLOB"
DBColumn/proc/SqlTypeName(type_handler = sql_type)
switch (type_handler)
if (TINYINT)
return "TINYINT"
if (SMALLINT)
return "SMALLINT"
if (MEDIUMINT)
return "MEDIUMINT"
if (INTEGER)
return "INTEGER"
if (BIGINT)
return "BIGINT"
if (FLOAT)
return "FLOAT"
if (DOUBLE)
return "DOUBLE"
if (DATE)
return "DATE"
if (DATETIME)
return "DATETIME"
if (TIMESTAMP)
return "TIMESTAMP"
if (TIME)
return "TIME"
if (STRING)
return "STRING"
if (BLOB)
return "BLOB"
#undef Default_Cursor
+1
View File
@@ -157,6 +157,7 @@ Devices and Tools;
Whitespace:Seperator;
Implants;
/obj/item/weapon/storage/box/syndie_kit/imp_freedom:3:Freedom Implant;
/obj/item/weapon/storage/box/syndie_kit/imp_adrenalin:3:Adrenalin Implant;
/obj/item/weapon/storage/box/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals);
Whitespace:Seperator;
(Pointless) Badassery;
+1
View File
@@ -72,6 +72,7 @@ Devices and Tools;
Whitespace:Seperator;
Implants;
/obj/item/weapon/storage/box/syndie_kit/imp_freedom:3:Freedom Implant;
/obj/item/weapon/storage/box/syndie_kit/imp_adrenalin:3:Adrenalin Implant;
/obj/item/weapon/storage/box/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals);
/obj/item/weapon/storage/box/syndie_kit/imp_explosive:6:Explosive Implant (DANGER!);
/obj/item/weapon/storage/box/syndie_kit/imp_compress:4:Compressed Matter Implant;Whitespace:Seperator;
+10 -9
View File
@@ -293,9 +293,10 @@
M.current.remove_vampire_blood(150)
M.current.verbs -= /client/vampire/proc/vampire_enthrall
spawn(1800) M.current.verbs += /client/vampire/proc/vampire_enthrall
else
M.current << "\red You or your target either moved or you dont have enough usable blood."
return
return
else
M.current << "\red You or your target either moved or you dont have enough usable blood."
return
/client/vampire/proc/vampire_cloak()
set category = "Abilities"
@@ -327,14 +328,14 @@
/mob/proc/can_enthrall(mob/living/carbon/C)
var/enthrall_safe = 0
/* for(var/obj/item/weapon/implant/loyalty/L in C)
for(var/obj/item/weapon/implant/loyalty/L in C)
if(L && L.implanted)
enthrall_safe = 1
break
for(var/obj/item/weapon/implant/traitor/T in C)
if(T && T.implanted)
enthrall_safe = 1
break*/
// for(var/obj/item/weapon/implant/traitor/T in C)
// if(T && T.implanted)
// enthrall_safe = 1
// break
if(!C)
world.log << "something bad happened on enthralling a mob src is [src] [src.key] \ref[src]"
return 0
@@ -526,4 +527,4 @@
bloodold = mind.vampire.bloodusable
mind.vampire.bloodusable = max(0, (mind.vampire.bloodusable - amount))
if(bloodold != mind.vampire.bloodusable)
src << "\blue <b>You have [mind.vampire.bloodusable] left to use.</b>"
src << "\blue <b>You have [mind.vampire.bloodusable] left to use.</b>"
+56 -15
View File
@@ -3,18 +3,36 @@
var/list/whitelist = list()
/hook/startup/proc/loadWhitelist()
if(config.usewhitelist)
if (config.usewhitelist)
load_whitelist()
return 1
/proc/load_whitelist()
whitelist = file2list(WHITELISTFILE)
if(!whitelist.len) whitelist = null
if (config.whitelists_on_sql)
establish_db_connection()
if (!dbcon.IsConnected())
//Continue with the old code if it fails. Stop and return if it succeeds.
log_misc("Database connection failed. Reverting to legacy system.")
config.whitelists_on_sql = 0
else
return
whitelist = file2list(WHITELISTFILE)
if (!whitelist.len)
whitelist = null
/proc/check_whitelist(mob/M)
if (config.whitelists_on_sql)
var/head_of_staff_whitelist = 1
if (M.client && M.client.whitelist_status)
return (M.client.whitelist_status & head_of_staff_whitelist)
/proc/check_whitelist(mob/M /*, var/rank*/)
if(!whitelist)
return 0
return ("[M.ckey]" in whitelist)
else
if (!whitelist)
return 0
return ("[M.ckey]" in whitelist)
/var/list/alien_whitelist = list()
@@ -24,6 +42,22 @@ var/list/whitelist = list()
return 1
/proc/load_alienwhitelist()
if (config.whitelists_on_sql)
establish_db_connection()
if (!dbcon.IsConnected())
log_misc("Database connection failed. Reverting to legacy system.")
config.whitelists_on_sql = 0
else
var/DBQuery/query = dbcon.NewQuery("SELECT status_name, flag FROM ss13_whitelist_statuses")
query.Execute()
while (query.NextRow())
if (query.item[1] in whitelisted_species)
whitelisted_species[query.item[1]] = text2num(query.item[2])
return
var/text = file2text("config/alienwhitelist.txt")
if (!text)
log_misc("Failed to load config/alienwhitelist.txt")
@@ -32,19 +66,26 @@ var/list/whitelist = list()
//todo: admin aliens
/proc/is_alien_whitelisted(mob/M, var/species)
if(!config.usealienwhitelist)
if (!config.usealienwhitelist)
return 1
if(species == "human" || species == "Human")
return 1
// if(check_rights(R_ADMIN, 0))
// return 1
if(!alien_whitelist)
if (!M || !species)
return 0
if(M && species)
if (species == "human" || species == "Human")
return 1
if (config.whitelists_on_sql)
if (M.client && M.client.whitelist_status)
return (M.client.whitelist_status & whitelisted_species[species])
else
if (!alien_whitelist)
return 0
for (var/s in alien_whitelist)
if(findtext(s,"[M.ckey] - [species]"))
if (findtext(s, "[M.ckey] - [species]"))
return 1
if(findtext(s,"[M.ckey] - All"))
if (findtext(s, "[M.ckey] - All"))
return 1
return 0
+1 -3
View File
@@ -193,9 +193,7 @@ update_flag
else
can_label = 0
if(air_contents.temperature > PLASMA_FLASHPOINT)
air_contents.zburn()
return
air_contents.react()
/obj/machinery/portable_atmospherics/canister/return_air()
return air_contents
+3 -3
View File
@@ -51,7 +51,7 @@
var/door_sound='sound/machines/airlock.ogg'
var/door_sound_distance=30
autoclose = 1
var/obj/item/device/doorbrace/bracer = null
var/obj/item/device/magnetic_lock/bracer = null
/obj/machinery/door/airlock/command
name = "Airlock"
@@ -718,12 +718,12 @@ About the new airlock wires panel:
set_frequency(ST.change_freq(frequency))
return
if (istype(C, /obj/item/device/doorbrace))
if (istype(C, /obj/item/device/magnetic_lock))
if (bracer)
user << "<span class='notice'>There is already a [bracer] on [src]!</span>"
return
var/obj/item/device/doorbrace/newbracer = C
var/obj/item/device/magnetic_lock/newbracer = C
newbracer.attachto(src, user)
return
@@ -22,6 +22,8 @@
var/state = STATE_IDLE
var/target_state = TARGET_NONE
var/waiting_ticks = 0
var/waiting_ticks_target = 2 // By default, we wait for two ticks before actually signalling the pump to do it's thing. This is to ensure ZAS registers the doors have closed, and we don't leak air.
/datum/computer/file/embedded_program/airlock/New(var/obj/machinery/embedded_controller/M)
..(M)
@@ -109,10 +111,14 @@
var/shutdown_pump = 0
switch(command)
if("cycle_ext")
begin_cycle_out()
//only respond to these commands if the airlock isn't already doing something
//prevents the controller from getting confused and doing strange things
if(state == target_state)
begin_cycle_out()
if("cycle_int")
begin_cycle_in()
if(state == target_state)
begin_cycle_in()
if("cycle_ext_door")
cycleDoors(TARGET_OUTOPEN)
@@ -122,14 +128,6 @@
if("abort")
stop_cycling()
/*
//dont do this. If the airlock can't get enough air to pressurize the person inside is stuck
state = STATE_PRESSURIZE
target_state = TARGET_NONE
memory["target_pressure"] = ONE_ATMOSPHERE
signalPump(tag_airpump, 1, 1, memory["target_pressure"])
process()
*/
if("force_ext")
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "toggle")
@@ -140,11 +138,9 @@
if("purge")
memory["purge"] = !memory["purge"]
if(memory["purge"])
toggleDoor(memory["exterior_status"], tag_exterior_door, 1, "close")
toggleDoor(memory["interior_status"], tag_interior_door, 1, "close")
state = STATE_DEPRESSURIZE
close_doors()
state = STATE_PREPARE
target_state = TARGET_NONE
signalPump(tag_airpump, 1, 0, 0)
if("secure")
memory["secure"] = !memory["secure"]
@@ -184,16 +180,21 @@
switch(state)
if(STATE_PREPARE)
if (check_doors_secured())
if(waiting_ticks < waiting_ticks_target)
waiting_ticks++
return
else
waiting_ticks = 0
var/chamber_pressure = memory["chamber_sensor_pressure"]
var/target_pressure = memory["target_pressure"]
if(memory["purge"])
//purge apparently means clearing the airlock chamber to vacuum (then refilling, handled later)
target_pressure = 0
state = STATE_DEPRESSURIZE
signalPump(tag_airpump, 1, 0, 0) //send a signal to start depressurizing
if(memory["purge"])
target_pressure = 0
if(chamber_pressure <= target_pressure)
else if(chamber_pressure <= target_pressure)
state = STATE_PRESSURIZE
signalPump(tag_airpump, 1, 1, target_pressure) //send a signal to start pressurizing
@@ -201,40 +202,37 @@
state = STATE_DEPRESSURIZE
signalPump(tag_airpump, 1, 0, target_pressure) //send a signal to start depressurizing
//Check for vacuum - this is set after the pumps so the pumps are aiming for 0
if(!memory["target_pressure"])
memory["target_pressure"] = ONE_ATMOSPHERE * 0.05
//Make sure the airlock isn't aiming for pure vacuum - an impossibility
memory["target_pressure"] = max(target_pressure, ONE_ATMOSPHERE * 0.05)
if(STATE_PRESSURIZE)
if(memory["chamber_sensor_pressure"] >= memory["target_pressure"] * 0.95)
cycleDoors(target_state)
state = STATE_IDLE
target_state = TARGET_NONE
//not done until the pump has reported that it's off
if(memory["pump_status"] != "off")
signalPump(tag_airpump, 0) //send a signal to stop pumping
else
cycleDoors(target_state)
state = STATE_IDLE
target_state = TARGET_NONE
if(STATE_DEPRESSURIZE)
if(memory["purge"])
if(memory["chamber_sensor_pressure"] <= ONE_ATMOSPHERE * 0.05)
state = STATE_PRESSURIZE
signalPump(tag_airpump, 1, 1, memory["target_pressure"])
if(memory["chamber_sensor_pressure"] <= memory["target_pressure"] * 1.05)
if(memory["purge"])
memory["purge"] = 0
memory["target_pressure"] = memory["internal_sensor_pressure"]
state = STATE_PREPARE
target_state = TARGET_NONE
else if(memory["chamber_sensor_pressure"] <= memory["target_pressure"] * 1.05)
cycleDoors(target_state)
state = STATE_IDLE
target_state = TARGET_NONE
//send a signal to stop pumping
if(memory["pump_status"] != "off")
else if(memory["pump_status"] != "off")
signalPump(tag_airpump, 0)
else
cycleDoors(target_state)
state = STATE_IDLE
target_state = TARGET_NONE
memory["processing"] = state != target_state
memory["processing"] = (state != target_state)
return 1
@@ -321,7 +319,6 @@ datum/computer/file/embedded_program/airlock/proc/signal_mech_sensor(var/command
/*----------------------------------------------------------
toggleDoor()
Sends a radio command to a door to either open or close. If
the command is 'toggle' the door will be sent a command that
reverses it's current state.
-6
View File
@@ -108,12 +108,6 @@
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
else if(patient.has_brain_worms())
var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
if(B.controlling)
holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
else
holder.icon_state = "hudhealthy"
@@ -9,29 +9,39 @@ obj/effect/decal/cleanable/liquid_fuel
New(newLoc,amt=1)
src.amount = amt
var/has_spread = 0
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
if(other != src)
other.amount += src.amount
spawn other.Spread()
del src
other.Spread()
has_spread = 1
break
Spread()
. = ..()
if (!has_spread)
Spread()
else
del(src)
proc/Spread()
proc/Spread(exclude = list())
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 5.0) return
if(amount < 15) return
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in cardinal)
if(rand(25))
var/turf/simulated/target = get_step(src,d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
amount *= 0.75
var/turf/simulated/target = get_step(src, d)
var/turf/simulated/origin = get_turf(src)
if (origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
if (other_fuel)
other_fuel.amount += amount * 0.25
if (!(other_fuel in exclude))
exclude += src
other_fuel.Spread(exclude)
else
new/obj/effect/decal/cleanable/liquid_fuel(target, amount * 0.25, 1)
amount *= 0.75
flamethrower_fuel
icon_state = "mustard"
@@ -5,10 +5,10 @@
#define LAYER_ATTACHED 3.2
#define LAYER_NORMAL 3
/obj/item/device/doorbrace
/obj/item/device/magnetic_lock
name = "magnetic door lock"
desc = "A large, ID locked device used for completely locking down airlocks."
icon = 'icons/obj/door_braces/centcom.dmi'
icon = 'icons/obj/magnetic_locks/centcom.dmi'
icon_state = "inactive"
w_class = 3
req_access = list(103)
@@ -17,38 +17,49 @@
var/department = "CENTCOM"
var/status = 0
var/constructionstate = 0
var/drainamount = 20
var/obj/machinery/door/airlock/target = null
var/obj/item/weapon/cell/powercell
/obj/item/device/doorbrace/security
icon = 'icons/obj/door_braces/security.dmi'
/obj/item/device/magnetic_lock/security
icon = 'icons/obj/magnetic_locks/security.dmi'
department = "Security"
req_access = list(1)
/obj/item/device/doorbrace/engineering
icon = 'icons/obj/door_braces/engineering.dmi'
/obj/item/device/magnetic_lock/engineering
icon = 'icons/obj/magnetic_locks/engineering.dmi'
department = "Engineering"
req_access = null
req_one_access = list(11, 24)
/obj/item/device/doorbrace/examine()
/obj/item/device/magnetic_lock/New()
..()
powercell = new /obj/item/weapon/cell/high()
/obj/item/device/magnetic_lock/examine()
..()
if (status == STATUS_BROKEN)
usr << "<span class='danger'>It looks broken!</span>"
else
usr << "\blue This device has [department] department markings on it."
if (powercell)
var/power = round(powercell.charge / powercell.maxcharge * 100)
usr << "\blue The powercell is at [power]% charge."
else
usr << "\red It has no powercell to power it!"
/obj/item/device/doorbrace/attack_hand(var/mob/user)
/obj/item/device/magnetic_lock/attack_hand(var/mob/user)
if (status == STATUS_ACTIVE)
ui_interact(user)
else
..()
/obj/item/device/doorbrace/bullet_act(var/obj/item/projectile/Proj)
/obj/item/device/magnetic_lock/bullet_act(var/obj/item/projectile/Proj)
takedamage(Proj.damage)
..()
/obj/item/device/doorbrace/attackby(var/obj/item/I, var/mob/user)
/obj/item/device/magnetic_lock/attackby(var/obj/item/I, var/mob/user)
if (status == STATUS_BROKEN)
user << "<span class='danger'>[src] is broken beyond repair!</span>"
return
@@ -97,6 +108,16 @@
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
setconstructionstate(0)
return
if (istype(I, /obj/item/weapon/cell))
user.drop_item()
I.loc = src
powercell = I
return
if (istype(I, /obj/item/weapon/crowbar))
user << "<span class='notice'>You remove \the [powercell] from \the [src].</span>"
powercell.loc = loc
powercell = null
return
if (istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
if (WT.remove_fuel(1, user))
@@ -119,7 +140,16 @@
setconstructionstate(4)
return
/obj/item/device/doorbrace/proc/attachto(var/obj/machinery/door/airlock/newtarget, var/mob/user as mob)
/obj/item/device/magnetic_lock/process()
if (powercell && powercell.charge > drainamount)
powercell.charge -= drainamount
else
if (powercell)
powercell.charge = 0
visible_message("<span class='danger'>[src] beeps loudly and falls off \the [target]; its powercell having run out of power.</span>")
setstatus(STATUS_INACTIVE)
/obj/item/device/magnetic_lock/proc/attachto(var/obj/machinery/door/airlock/newtarget, var/mob/user as mob)
if (status == STATUS_BROKEN)
user << "<span class='danger'>[src] is damaged beyond repair! It cannot be used!</span>"
return
@@ -152,7 +182,7 @@
setstatus(STATUS_ACTIVE, newtarget)
return
/obj/item/device/doorbrace/proc/setstatus(var/newstatus, var/obj/machinery/door/airlock/newtarget as obj)
/obj/item/device/magnetic_lock/proc/setstatus(var/newstatus, var/obj/machinery/door/airlock/newtarget as obj)
switch (newstatus)
if (STATUS_INACTIVE)
if (status != STATUS_ACTIVE)
@@ -187,7 +217,7 @@
icon_state = "broken"
status = newstatus
/obj/item/device/doorbrace/proc/setconstructionstate(var/newstate)
/obj/item/device/magnetic_lock/proc/setconstructionstate(var/newstate)
constructionstate = newstate
if (newstate == 0)
if (status == STATUS_ACTIVE)
@@ -201,7 +231,7 @@
else
icon_state = "deconstruct_[constructionstate]"
/obj/item/device/doorbrace/proc/detach(var/playflick = 1)
/obj/item/device/magnetic_lock/proc/detach(var/playflick = 1)
if (target)
if (playflick)
@@ -212,9 +242,11 @@
target.bracer = null
processing_objects.Remove(src)
anchored = 0
/obj/item/device/doorbrace/proc/attach(var/obj/machinery/door/airlock/newtarget as obj)
/obj/item/device/magnetic_lock/proc/attach(var/obj/machinery/door/airlock/newtarget as obj)
adjustsprite(newtarget)
layer = LAYER_ATTACHED
flick("deploy", src)
@@ -222,9 +254,11 @@
newtarget.bracer = src
target = newtarget
processing_objects.Add(src)
anchored = 1
/obj/item/device/doorbrace/proc/adjustsprite(var/obj/target as obj)
/obj/item/device/magnetic_lock/proc/adjustsprite(var/obj/target as obj)
if (target)
switch (get_dir(src, target))
if (NORTH)
@@ -255,7 +289,7 @@
pixel_x = 0
pixel_y = 0
/obj/item/device/doorbrace/proc/takedamage(var/damage)
/obj/item/device/magnetic_lock/proc/takedamage(var/damage)
health -= damage
if (damage >= 40 && prob(50))
@@ -269,7 +303,7 @@
if (prob(50))
spark()
/obj/item/device/doorbrace/proc/spark()
/obj/item/device/magnetic_lock/proc/spark()
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
if (target)
@@ -294,6 +294,8 @@
if(H.species.flags & IS_SYNTHETIC)
return
if(istype(H) && H.species.insulated)//Insulation
return
if(M.buckled && istype(M.buckled, /obj/structure/stool/bed/chair/wheelchair))
return ..()
@@ -52,6 +52,25 @@
flick("e_flash", M.flash)
M.Stun(2)
M.Weaken(10)
//Vaurca damage 29-012-15
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_BUG)
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(!E)
return
//Reworked damage 29/12/15
usr << "\red Your eyes burn with the intense light of the flash!."
E.damage += rand(10, 11)
if(E.damage > 12)
M.eye_blurry += rand(3,6)
if (E.damage >= E.min_broken_damage)
M.sdisabilities |= BLIND
else if (E.damage >= E.min_bruised_damage)
M.eye_blind = 5
M.eye_blurry = 5
M.disabilities |= NEARSIGHTED
spawn(100)
M.disabilities &= ~NEARSIGHTED
@@ -333,22 +333,20 @@ the implant may become unstable and either pre-maturely inject the subject or si
implanted(mob/M)
if(!istype(M, /mob/living/carbon/human)) return 0
if(!istype(M, /mob/living/carbon/human))
return 0
var/mob/living/carbon/human/H = M
if(H.mind in ticker.mode.head_revolutionaries)
if (H.mind in ticker.mode.head_revolutionaries)
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!")
return 0
else if(H.mind in ticker.mode:revolutionaries)
else if (H.mind in ticker.mode:revolutionaries)
ticker.mode:remove_revolutionary(H.mind)
H << "\blue You feel a surge of loyalty towards Nanotrasen."
return 1
implanted(mob/M)
if(!istype(M, /mob/living/carbon/human)) return 0
var/mob/living/carbon/human/H = M
if(H.mind in ticker.mode:cult)
else if (H.mind in ticker.mode:cult)
ticker.mode:remove_cultist(M.mind)
H << "\blue The implant robs you of your faith in Nar-Sie, leaving only obedience to NanoTrasen."
H << "\blue The implant robs you of your faith in Nar-Sie, leaving only obedience to NanoTrasen."
else if (H.mind in ticker.mode:changelings)
H << "\blue <b>We have weaved our flesh around and isolated the simple chip. It has no effect on us.</b> But they do not know it yet..."
H << "\blue You feel a surge of loyalty towards Nanotrasen."
return 1
//Alternatively! This is the null-rod deconversion, if the above doesn't work. There's two things down there and I don't know if that's okay.
@@ -386,14 +384,21 @@ the implant may become unstable and either pre-maturely inject the subject or si
return dat
trigger(emote, mob/source as mob)
if (src.uses < 1) return 0
trigger(emote, mob/living/carbon/human/source as mob)
if (src.uses < 1)
return 0
if (!istype(source))
return 0
if (emote == "pale")
src.uses--
source << "\blue You feel a sudden surge of energy!"
source.stat = 0
source.SetParalysis(0)
source.SetStunned(0)
source.SetWeakened(0)
source.SetParalysis(0)
source.lying = 0
source.setHalLoss(0)
source.update_canmove()
return
@@ -82,6 +82,16 @@
O.update()
return
/obj/item/weapon/storage/box/syndie_kit/imp_adrenalin
name = "boxed adrenalin implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_adrenalin/New()
..()
var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/adrenalin(O)
O.update()
return
/obj/item/weapon/storage/box/syndie_kit/imp_compress
name = "box (C)"
+1
View File
@@ -46,5 +46,6 @@
var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days.
var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
var/whitelist_status = 0 //Used to determine what whitelists the player has access to. Bitflag field.
preload_rsc = 0 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server.
+9 -15
View File
@@ -225,15 +225,14 @@
if(!dbcon.IsConnected())
return
var/sql_ckey = sql_sanitize_text(src.ckey)
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM ss13_player WHERE ckey = '[sql_ckey]'")
query.Execute()
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age, whitelist_status FROM ss13_player WHERE ckey = :ckey")
query.Execute(list(":ckey" = ckey))
var/sql_id = 0
player_age = 0 // New players won't have an entry so knowing we have a connection we set this to zero to be updated if their is a record.
while(query.NextRow())
sql_id = query.item[1]
player_age = text2num(query.item[2])
whitelist_status = text2num(query.item[3])
break
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM ss13_player WHERE ip = '[address]'")
@@ -261,24 +260,19 @@
if(src.holder)
admin_rank = src.holder.rank
var/sql_ip = sql_sanitize_text(src.address)
var/sql_computerid = sql_sanitize_text(src.computer_id)
var/sql_admin_rank = sql_sanitize_text(admin_rank)
if(sql_id)
//Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables
var/DBQuery/query_update = dbcon.NewQuery("UPDATE ss13_player SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]")
query_update.Execute()
var/DBQuery/query_update = dbcon.NewQuery("UPDATE ss13_player SET lastseen = Now(), ip = :ip, computerid = :computer_id, lastadminrank = :admin_rank WHERE id = :id")
query_update.Execute(list(":ip" = address, ":computer_id" = computer_id, ":admin_rank" = admin_rank, ":id" = sql_id))
else
//New player!! Need to insert all the stuff
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO ss13_player (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
query_insert.Execute()
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO ss13_player (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, :ckey, Now(), Now(), :ip, :computer_id, :admin_rank)")
query_insert.Execute(list(":ckey" = ckey, ":ip" = address, ":computer_id" = computer_id, ":admin_rank" = admin_rank))
//Logging player access
var/serverip = "[world.internet_address]:[world.port]"
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `ss13_connection_log`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');")
query_accesslog.Execute()
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `ss13_connection_log`(`id`, `datetime`, `serverip`, `ckey`, `ip`, `computerid`) VALUES(null, Now(), :server_ip, :ckey, :ip, :computer_id);")
query_accesslog.Execute(list(":server_ip" = serverip, ":ckey" = ckey, ":ip" = address, ":computer_id" = computer_id))
#undef TOPIC_SPAM_DELAY
+8 -8
View File
@@ -3,7 +3,7 @@
/obj/item/weapon/storage/box/swabs
name = "box of swab kits"
desc = "Sterilized equipment within. Do not contaminate."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "dnakit"
storage_slots=14
can_hold = list("/obj/item/weapon/forensics/swab")
@@ -29,7 +29,7 @@
/obj/item/weapon/forensics/swab
name = "swab kit"
desc = "A sterilized cotton swab and vial used to take forensic samples."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "swab"
flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON
w_class = 1.0
@@ -132,7 +132,7 @@
/obj/item/weapon/storage/briefcase/crimekit
name = "Crime Scene Kit"
desc = "A stainless steel-plated carrycase for all your forensic needs. Feels heavy."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "case"
item_state = "case"
storage_slots=14
@@ -156,7 +156,7 @@
/obj/item/weapon/forensics/slide
name = "microscope slide"
desc = "A pair of thin glass panes used in the examination of samples beneath a microscope."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "slide"
flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON
w_class = 1.0
@@ -219,7 +219,7 @@
/obj/machinery/microscope
name = "high powered electron microscope"
desc = "A highly advanced microscope capable of zooming up to 3000x."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "microscope"
anchored = 1
var/obj/item/weapon/forensics/sample = null
@@ -367,7 +367,7 @@
/obj/item/weapon/forensics/powder
name = "fingerprint powder"
desc = "A jar containing aluminum powder and a specialized brush."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "dust"
var/list/complete_prints = list()
var/stored = list()
@@ -432,7 +432,7 @@
/obj/item/weapon/forensics/fiberkit
name = "Fiber Collection Kit"
desc = "A magnifying glass and tweezers. Used to lift suit fibers."
icon = 'forensics.dmi'
icon = 'icons/obj/forensics.dmi'
icon_state = "m_glass"
var/list/fibers_complete = list()
var/stored = list()
@@ -678,4 +678,4 @@
icon_state = "printer"
var/printing = 0
density = 1
anchored = 1
anchored = 1
+7 -7
View File
@@ -1132,6 +1132,10 @@
return //TODO: DEFERRED
proc/handle_regular_status_updates()
if(species.flags & IS_BUG)
adjustBruteLoss(0)
adjustFireLoss(0)
if(status_flags & GODMODE) return 0
@@ -1408,6 +1412,9 @@
see_in_dark = 8
if(!druggy) see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
if(species.flags & IS_BUG) //Vaurca nightvision 29/12/15
see_in_dark = 8
if(seer==1)
var/obj/effect/rune/R = locate() in loc
if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
@@ -1817,13 +1824,6 @@
holder2.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
else if(has_brain_worms())
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B.controlling)
holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
holder2.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
if(virus2.len)
@@ -75,6 +75,7 @@
var/blood_color = "#A10808" //Red.
var/flesh_color = "#FFC896" //Pink.
var/base_color //Used when setting species.
var/darkness_view
//Used in icon caching.
var/race_key = 0
@@ -626,7 +627,8 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used.
secondary_unarmed_type = /datum/unarmed_attack/bite/strong
rarity_value = 2 //according to the code this does nothing but upset me so i guess it can stay
slowdown = 1 //slow
darksight = 666 //good at seeing
darksight = 8 //good at seeing
darkness_view = 7
eyes = "blank_eyes" //made out of butts
brute_mod = 0.5 //note to self: remove is_synthetic checks for brmod and burnmod
burn_mod = 2 //bugs on fire
+1 -7
View File
@@ -74,12 +74,6 @@
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
else if(patient.has_brain_worms())
var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
if(B.controlling)
holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
else
holder.icon_state = "hudhealthy"
client.images += holder
@@ -104,4 +98,4 @@
return "health0"
else
return "health-100"
return "0"
return "0"
+3 -1
View File
@@ -273,11 +273,13 @@
//No animations will be performed by this proc.
/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0)
if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb
var/mob/living/carbon/human/H = M //29/12/2015 INSULATION INITIATION
if(istype(H) && H.species.insulated) return 0
//This is for performance optimization only.
//DO NOT modify siemens_coeff here. That is checked in human/electrocute_act()
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
//var/mob/living/carbon/human/H = M Changed for inulation 29/12/15
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on
@@ -7,22 +7,51 @@
var/blood_type = null
New()
..()
if(blood_type != null)
name = "BloodPack [blood_type]"
reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
update_icon()
on_reagent_change()
/obj/item/weapon/reagent_containers/blood/New()
..()
if(blood_type != null)
name = "BloodPack [blood_type]"
reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
update_icon()
/obj/item/weapon/reagent_containers/blood/on_reagent_change()
update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 9) icon_state = "empty"
if(10 to 50) icon_state = "half"
if(51 to INFINITY) icon_state = "full"
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 9) icon_state = "empty"
if(10 to 50) icon_state = "half"
if(51 to INFINITY) icon_state = "full"
/obj/item/weapon/reagent_containers/blood/attack(mob/living/carbon/human/M as mob, mob/living/carbon/human/user as mob)
if (user == M && (user.mind in ticker.mode.vampires || user.mind.vampire))
if (reagents.get_reagent_amount("blood"))
user.visible_message("\red [user] raises \the [src] up to \his mouth and bites into it.", "\blue You raise \the [src] up to your mouth and bite into it, starting to drain its contents.")
while (do_after(user, 25, 5, 1))
var/blood_taken = 0
var/need_to_break = 0
if (reagents.get_reagent_amount("blood") > 10)
blood_taken = 10
else
blood_taken = reagents.get_reagent_amount("blood")
need_to_break = 1
reagents.remove_reagent("blood", blood_taken)
user.mind.vampire.bloodtotal += blood_taken
user.check_vampire_upgrade(user.mind)
if (blood_taken)
user << "\blue <b>You have accumulated [user.mind.vampire.bloodtotal] [user.mind.vampire.bloodtotal > 1 ? "units" : "unit"] of blood and have [user.mind.vampire.bloodusable] left to use."
if (need_to_break)
break
user.visible_message("\red [user] licks \his fangs dry, lowering \the [src].", "\blue You lick your fangs clean of the tasteless blood.")
else
..()
/obj/item/weapon/reagent_containers/blood/APlus
blood_type = "A+"
@@ -45,4 +74,4 @@
/obj/item/weapon/reagent_containers/blood/empty
name = "Empty BloodPack"
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
icon_state = "empty"
icon_state = "empty"
+12
View File
@@ -135,6 +135,18 @@
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 20
#define PLASMA_OXYGEN_FULLBURN 10
//For other fires
#define FIRE_REACTION_OXIDIZER_AMOUNT 3
#define FIRE_REACTION_FUEL_AMOUNT 2
#define FIRE_GAS_BURNRATE_MULT 1
#define FIRE_LIQUID_BURNRATE_MULT 0.5
#define LIQUIDFUEL_AMOUNT_TO_MOL 1
#define FIRE_GAS_MIN_BURNRATE 0.1
#define FIRE_LIQUD_MIN_BURNRATE 0.05
#define T0C 273.15 // 0degC
#define T20C 293.15 // 20degC
#define TCMB 2.7 // -270.3degC
+20 -3
View File
@@ -56,6 +56,26 @@ should be listed in the changelog upon commit though. Thanks. -->
<!-- DO NOT REMOVE, MOVE, OR COPY THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# -->
<div class='commit sansserif'>
<h2 class='date'>04 January 2015</h2>
<h3 class='author'>Skull132 Updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Fuel fires are back in the game (both welder fuel and flamethrowers burn properly).</li>
<li class='rscadd'>Adrenalin implant kits added to syndicate uplinks, worth 3 TC. Upon activation, the implant removes any and all stun effects that you have.</li>
<li class='rscadd'>Gave the vampires the ability to suck blood from bloodpacks. Just attack yourself with one. Note that only total blood is gained, not usable blood.</li>
<li class='tweak'>Loyalty implants tweaked: messages are now handled properly, head revs are safe once more, revs are properly removed, lings are given instructions on the fact that they can ignore the implant's effect.</li>
<li class='tweak'>Having a cortical borer in your head no longer flags you as such on the medical HUD.</li>
<li class='tweak'>Reworks whitelists to be SQL dependant, as opposed to running from a local file (should speed up server reboots).</li>
<li class='tweak'>Tweaks magnetic locks to have a powercell. Standard high cap cell will run a magnetic lock for about 16 minutes. Cells can be removed by using a screwdriver, then a crowbar.</li>
<li class='bugfix'>Loyalty implanted people cannot be enthralled. The vampire is now informed as such and the enthralling will fail.</li>
<li class='bugfix'>Vaurca eyes now take damage from flashbangs and flashes.</li>
<li class='bugfix'>Vaurca are now properly 'insulated' and resistant to electric shock.</li>
<li class='bugfix'>Multiple bugfixes on the map, by Witt.</li>
<li class='bugfix'>Organ transplants are fixed and now work, with the possible exception of eyes. Need to test. This also means that you can use the use the advanced operating table to conduct full on brain transplants.</li>
<li class='bugfix'>Head re-attachment surgery no longer deletes the brain.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>8 December 2015</h2>
<h3 class='author'>SoundScopes updated:</h3>
@@ -70,8 +90,6 @@ should be listed in the changelog upon commit though. Thanks. -->
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>Probably October</h2>
<h3 class='author'>SoundScopes updated:</h3>
@@ -86,7 +104,6 @@ should be listed in the changelog upon commit though. Thanks. -->
<li class='imageadd'>Peanut seed sprite</li>
<li class='bugfix'>Space has been fixed so you only need to define an area once</li>
<li class='bugfix'>SQL bug</li>
</ul>
</div>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

+266 -260
View File
File diff suppressed because it is too large Load Diff