mirror of
https://github.com/Aurorastation/Aurora-Old.git
synced 2026-08-31 00:26:21 +01:00
+2
-2
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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])"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
+53
-19
@@ -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)"
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user