Merge branch 'master' of github.com:Baystation12/Baystation12 into TGUpdates
Conflicts: maps/tgstation.2.0.8.dmm
@@ -54,12 +54,12 @@ vs_control/var
|
||||
airflow_light_pressure = 30
|
||||
airflow_medium_pressure = 45
|
||||
airflow_heavy_pressure = 60
|
||||
airflow_heaviest_pressure = 100
|
||||
airflow_heaviest_pressure = 90
|
||||
|
||||
airflow_damage = 0.3
|
||||
airflow_stun = 0.15
|
||||
airflow_speed_decay = 1
|
||||
airflow_delay = 35 //Time in deciseconds before they can be moved by airflow again.
|
||||
airflow_delay = 25 //Time in deciseconds before they can be moved by airflow again.
|
||||
airflow_mob_slowdown = 3 //Time in tenths of a second to add as a delay to each movement by a mob.\
|
||||
Only active if they are fighting the pull of the airflow.
|
||||
airflow_stun_cooldown = 10 //How long, in tenths of a second, to wait before stunning them again.
|
||||
@@ -85,7 +85,7 @@ mob/living/carbon/human/airflow_stun()
|
||||
if(shoes)
|
||||
if(shoes.flags & NOSLIP) return 0
|
||||
if(weakened <= 0) src << "\red The sudden rush of air knocks you over!"
|
||||
weakened = max(weakened,rand(1,2))
|
||||
weakened = max(weakened,rand(1,5))
|
||||
last_airflow_stun = world.time
|
||||
|
||||
atom/movable/proc/check_airflow_movable(n)
|
||||
@@ -126,11 +126,17 @@ proc/Airflow(zone/A,zone/B)
|
||||
//These turfs are the midway point between A and B, and will be the destination point for thrown objects.
|
||||
var/list/connection/connections_A = A.connections
|
||||
var/list/turf/connected_turfs = list()
|
||||
for(var/connection/C in connections_A)
|
||||
for(var/connection/C in connections_A) //Grab the turf that is in the zone we are flowing to (determined by n)
|
||||
if( ( A == C.A.zone || A == C.zone_A ) && ( B == C.B.zone || B == C.zone_B ) )
|
||||
connected_turfs |= C.A
|
||||
if(n < 0)
|
||||
connected_turfs |= C.B
|
||||
else
|
||||
connected_turfs |= C.A
|
||||
else if( ( A == C.B.zone || A == C.zone_B ) && ( B == C.A.zone || B == C.zone_A ) )
|
||||
connected_turfs |= C.B
|
||||
if(n < 0)
|
||||
connected_turfs |= C.A
|
||||
else
|
||||
connected_turfs |= C.B
|
||||
|
||||
//Get lists of things that can be thrown across the room for each zone.
|
||||
var/list/pplz = B.movables()
|
||||
@@ -145,7 +151,7 @@ proc/Airflow(zone/A,zone/B)
|
||||
if(M.last_airflow > world.time - vsc.airflow_delay) continue
|
||||
|
||||
//Check for knocking people over
|
||||
if(ismob(M) && n > vsc.airflow_medium_pressure)
|
||||
if(ismob(M) && n > vsc.airflow_heaviest_pressure)
|
||||
if(M:nodamage) continue
|
||||
M:airflow_stun()
|
||||
|
||||
@@ -333,6 +339,7 @@ atom/movable
|
||||
airflow_hit(A)
|
||||
else
|
||||
airflow_speed = 0
|
||||
airflow_time = 0
|
||||
. = ..()
|
||||
|
||||
atom/movable/proc/airflow_hit(atom/A)
|
||||
@@ -343,6 +350,7 @@ mob/airflow_hit(atom/A)
|
||||
for(var/mob/M in hearers(src))
|
||||
M.show_message("\red <B>[src] slams into [A]!</B>",1,"\red You hear a loud slam!",2)
|
||||
playsound(src.loc, "smash.ogg", 25, 1, -1)
|
||||
weakened = max(weakened, (istype(A,/obj/item) ? A:w_class : rand(1,5))) //Heheheh
|
||||
. = ..()
|
||||
|
||||
obj/airflow_hit(atom/A)
|
||||
@@ -356,8 +364,8 @@ obj/item/airflow_hit(atom/A)
|
||||
airflow_dest = null
|
||||
|
||||
mob/living/carbon/human/airflow_hit(atom/A)
|
||||
for(var/mob/M in hearers(src))
|
||||
M.show_message("\red <B>[src] slams into [A]!</B>",1,"\red You hear a loud slam!",2)
|
||||
// for(var/mob/M in hearers(src))
|
||||
// M.show_message("\red <B>[src] slams into [A]!</B>",1,"\red You hear a loud slam!",2)
|
||||
playsound(src.loc, "punch", 25, 1, -1)
|
||||
loc:add_blood(src)
|
||||
if (src.wear_suit)
|
||||
|
||||
@@ -11,6 +11,8 @@ connection
|
||||
zone
|
||||
zone_A
|
||||
zone_B
|
||||
ref_A
|
||||
ref_B
|
||||
indirect = 0 //If the connection is purely indirect, the zones should not join.
|
||||
last_updated //The tick at which this was last updated.
|
||||
no_zone_count = 0
|
||||
@@ -21,27 +23,29 @@ connection
|
||||
if(!A.zone.connections) A.zone.connections = list()
|
||||
A.zone.connections += src
|
||||
zone_A = A.zone
|
||||
ref_A = "\ref[A]"
|
||||
|
||||
if(!B.zone.connections) B.zone.connections = list()
|
||||
B.zone.connections += src
|
||||
zone_B = B.zone
|
||||
ref_B = "\ref[B]"
|
||||
|
||||
if(!air_master.tiles_with_connections)
|
||||
air_master.tiles_with_connections = list()
|
||||
|
||||
if(air_master.tiles_with_connections[A])
|
||||
var/list/A_connections = air_master.tiles_with_connections[A]
|
||||
if(air_master.tiles_with_connections[ref_A])
|
||||
var/list/A_connections = air_master.tiles_with_connections[ref_A]
|
||||
A_connections |= src
|
||||
else
|
||||
var/list/A_connections = list(src)
|
||||
air_master.tiles_with_connections[A] = A_connections
|
||||
air_master.tiles_with_connections[ref_A] = A_connections
|
||||
|
||||
if(air_master.tiles_with_connections[B])
|
||||
var/list/B_connections = air_master.tiles_with_connections[B]
|
||||
if(air_master.tiles_with_connections[ref_B])
|
||||
var/list/B_connections = air_master.tiles_with_connections[ref_B]
|
||||
B_connections |= src
|
||||
else
|
||||
var/list/B_connections = list(src)
|
||||
air_master.tiles_with_connections[B] = B_connections
|
||||
air_master.tiles_with_connections[ref_B] = B_connections
|
||||
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
@@ -68,23 +72,23 @@ connection
|
||||
A.zone.connections.Remove(src)
|
||||
if(!A.zone.connections.len)
|
||||
del A.zone.connections
|
||||
if(A in air_master.tiles_with_connections)
|
||||
var/list/A_connections = air_master.tiles_with_connections[A]
|
||||
A_connections -= src
|
||||
if(A_connections && !A_connections.len)
|
||||
del A_connections
|
||||
air_master.tiles_with_connections.Remove(A)
|
||||
if(ref_A in air_master.tiles_with_connections)
|
||||
var/list/A_connections = air_master.tiles_with_connections[ref_A]
|
||||
A_connections -= src
|
||||
if(A_connections && !A_connections.len)
|
||||
del A_connections
|
||||
air_master.tiles_with_connections.Remove(ref_A)
|
||||
if(B)
|
||||
if(B.zone && B.zone.connections)
|
||||
B.zone.connections.Remove(src)
|
||||
if(!B.zone.connections.len)
|
||||
del B.zone.connections
|
||||
if(B in air_master.tiles_with_connections)
|
||||
var/list/B_connections = air_master.tiles_with_connections[B]
|
||||
B_connections -= src
|
||||
if(B_connections && !B_connections.len)
|
||||
del B_connections
|
||||
air_master.tiles_with_connections.Remove(B)
|
||||
if(ref_B in air_master.tiles_with_connections)
|
||||
var/list/B_connections = air_master.tiles_with_connections[ref_B]
|
||||
B_connections -= src
|
||||
if(B_connections && !B_connections.len)
|
||||
del B_connections
|
||||
air_master.tiles_with_connections.Remove(ref_B)
|
||||
if(zone_A)
|
||||
if(zone_A && zone_A.connections)
|
||||
zone_A.connections.Remove(src)
|
||||
@@ -173,6 +177,8 @@ connection
|
||||
if(A.zone == B.zone)
|
||||
//world.log << "Connection removed: Zones now merged."
|
||||
del src
|
||||
if(ref_A != "\ref[A]" || ref_B != "\ref[B]")
|
||||
del src
|
||||
if((A.zone && A.zone != zone_A) || (B.zone && B.zone != zone_B))
|
||||
Sanitize()
|
||||
if(!A.zone || !B.zone)
|
||||
@@ -189,6 +195,17 @@ connection
|
||||
if(!A.zone || !B.zone)
|
||||
del src
|
||||
|
||||
if(A.zone == zone_B && B.zone == zone_A)
|
||||
var/turf/temp = B
|
||||
B = A
|
||||
A = temp
|
||||
zone_B = B.zone
|
||||
zone_A = A.zone
|
||||
var/temp_ref = ref_A
|
||||
ref_A = ref_B
|
||||
ref_B = temp_ref
|
||||
return
|
||||
|
||||
if(zone_A)
|
||||
if(zone_A.connections)
|
||||
zone_A.connections.Remove(src)
|
||||
@@ -244,6 +261,7 @@ connection
|
||||
|
||||
zone_A = A.zone
|
||||
|
||||
|
||||
else if(A.zone && A.zone != zone_A)
|
||||
if(zone_A)
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ zone
|
||||
|
||||
//Change all the zone vars of the turfs, check for space to be added to space_tiles.
|
||||
for(var/turf/T in contents)
|
||||
if(T.zone)
|
||||
T.zone.RemoveTurf(T)
|
||||
T.zone = src
|
||||
if(istype(T,/turf/space))
|
||||
AddSpace(T)
|
||||
@@ -30,8 +32,14 @@ zone
|
||||
|
||||
Del()
|
||||
//Ensuring the zone list doesn't get clogged with null values.
|
||||
for(var/turf/simulated/T in contents)
|
||||
if(T.zone && T.zone == src)
|
||||
T.zone = null
|
||||
for(var/zone/Z in connected_zones)
|
||||
if(src in Z.connected_zones)
|
||||
Z.connected_zones.Remove(src)
|
||||
for(var/connection/C in connections)
|
||||
del(C)
|
||||
C.Cleanup()
|
||||
zones -= src
|
||||
. = ..()
|
||||
|
||||
@@ -70,13 +78,13 @@ turf/proc/ZCanPass(turf/T)
|
||||
for(var/obj/obstacle in src)
|
||||
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window))
|
||||
continue
|
||||
if(!obstacle.CanPass(0, T, 0, 1))
|
||||
if(!obstacle.CanPass(0, T, 1.5, 1))
|
||||
return 0
|
||||
|
||||
for(var/obj/obstacle in T)
|
||||
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window))
|
||||
continue
|
||||
if(!obstacle.CanPass(0, src, 0, 1))
|
||||
if(!obstacle.CanPass(0, src, 1.5, 1))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
@@ -136,10 +136,11 @@ datum
|
||||
|
||||
for(var/turf/simulated/S in world)
|
||||
if(S.z < 5)
|
||||
if(!S.blocks_air && !S.zone && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
|
||||
new/zone(S)
|
||||
if(!S.zone && !S.blocks_air && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
|
||||
if(S.CanPass(null, S, 0, 0))
|
||||
new/zone(S)
|
||||
|
||||
S.update_air_properties()
|
||||
tiles_to_update |= S
|
||||
|
||||
world << "\red \b Geometry processed in [time2text(world.timeofday-start_time, "mm:ss")] minutes!"
|
||||
spawn start()
|
||||
@@ -151,6 +152,7 @@ datum
|
||||
//Outputs: None.
|
||||
|
||||
set background = 1
|
||||
|
||||
while(1)
|
||||
if(!kill_air)
|
||||
current_cycle++
|
||||
@@ -166,9 +168,7 @@ datum
|
||||
|
||||
if(tiles_to_update.len > 0) //If there are tiles to update, do so.
|
||||
for(var/turf/simulated/T in tiles_to_update)
|
||||
spawn
|
||||
if(istype(T))
|
||||
T.update_air_properties()
|
||||
T.update_air_properties()
|
||||
tiles_to_update = list()
|
||||
|
||||
for(var/zone/Z in zones)
|
||||
|
||||
@@ -174,7 +174,7 @@ turf
|
||||
if(CanPass(null, get_step(src,direction), 0, 0))
|
||||
air_check_directions |= direction
|
||||
|
||||
if(!zone && !density) //No zone and not a wall, lets add ourself to a zone.
|
||||
if(!zone && CanPass(null, src, 1.5, 1)) //No zone and not a wall, lets add ourself to a zone.
|
||||
for(var/direction in cardinal)
|
||||
if(air_check_directions&direction)
|
||||
var/turf/simulated/T = get_step(src,direction)
|
||||
@@ -184,9 +184,10 @@ turf
|
||||
if(!zone) //No zone found, new zone!
|
||||
new/zone(src)
|
||||
|
||||
if(!CanPass(null, src, 0, 0)) //Can't pass, and was updated. Delete zone connections involving this turf.
|
||||
if(air_master.tiles_with_connections[src])
|
||||
for(var/connection/C in air_master.tiles_with_connections[src])
|
||||
if(!CanPass(null, src, 0, 0) && !CanPass(null, src, 1.5, 1)) //Can't pass, and was updated. Delete zone connections involving this turf.
|
||||
if(air_master.tiles_with_connections["\ref[src]"])
|
||||
var/list/connections = air_master.tiles_with_connections["\ref[src]"]
|
||||
for(var/connection/C in connections)
|
||||
del C
|
||||
|
||||
update_zone_properties() //Update self zone and adjacent zones.
|
||||
@@ -202,25 +203,26 @@ turf
|
||||
var/turf/simulated/T = get_step(src,direction)
|
||||
if(air_check_directions&direction) //I can connect air in this direction
|
||||
if(!istype(T)) //Space
|
||||
if(zone)
|
||||
if(!CanPass(null, T, 1.5, 1) && CanPass(src, T, 0, 0)) //Normally would block it, instead lets make a connection to it.
|
||||
if(zone)
|
||||
zone.AddSpace(T)
|
||||
else if(!CanPass(src, T, 0, 0)) //I block the air, disconnect from it if connected.
|
||||
if(zone && T in zone.space_tiles)
|
||||
zone.RemoveSpace(T)
|
||||
else if(zone)
|
||||
zone.rebuild = 1
|
||||
continue
|
||||
else if(!(T.CanPass(null, src, 1.5, 1) && CanPass(null, T, 1.5, 1)) && (CanPass(null, T, 0, 0) || T.CanPass(null, src, 0, 0))) //I normally block air, but am permitting it.
|
||||
if(zone) //Either open or no doors, air can flow.
|
||||
ZConnect(src,T) //Connect 'em.
|
||||
else if(!(T.CanPass(null, src, 1.5, 1) && CanPass(null, T, 1.5, 1))) //If I block air, we must look to see if the adjacent turfs need rebuilt.
|
||||
else if(!T.CanPass(null, src, 1.5, 1) && !T.CanPass(null, src, 0, 0)) //If I block air, we must look to see if the adjacent turfs need rebuilt.
|
||||
if(T.zone && !T.zone.rebuild)
|
||||
for(var/direction2 in cardinal - direction) //Check all other directions for air that might be connected.
|
||||
var/turf/simulated/NT = get_step(src, direction2)
|
||||
if(NT.zone && NT.zone == T.zone)
|
||||
if(direction == reverse_direction(direction2)) //If it is opposite, then rebuild anyways.
|
||||
T.zone.rebuild = 1
|
||||
break
|
||||
else
|
||||
var/turf/simulated/LT = get_step(src, direction2|direction) //Is there a diagonal for the air to path around?
|
||||
if(!LT || !LT.zone || LT.zone != T.zone) //Either it does not exist or the zone does not match, rebuild
|
||||
T.zone.rebuild = 1
|
||||
break
|
||||
else if(!LT.CanPass(null, LT, 0, 0) || !NT.CanPass(null, NT, 0, 0)) //It exist, zone matches, see if it can transfer air. Otherwise, rebuild.
|
||||
T.zone.rebuild = 1
|
||||
break
|
||||
if(NT && NT.zone && NT.zone == T.zone)
|
||||
T.zone.rebuild = 1
|
||||
else if((!T.CanPass(null, src, 1.5, 1) && T.CanPass(null, src, 0, 0)) || (!CanPass(null, T, 1.5, 1) && CanPass(null, T, 0, 0)))
|
||||
if(T.zone != zone)
|
||||
ZConnect(src,T)
|
||||
else if(zone && !zone.rebuild)
|
||||
for(var/direction2 in cardinal - reverse_direction(direction)) //Check all other directions for air that might be connected.
|
||||
var/turf/simulated/NT = get_step(T, direction2)
|
||||
if(NT && NT.zone && NT.zone == zone)
|
||||
zone.rebuild = 1
|
||||
@@ -1,4 +1,18 @@
|
||||
vs_control/var/IgnitionLevel = 10 //Moles of oxygen+plasma - co2 needed to burn.
|
||||
/*
|
||||
|
||||
Making Bombs with ZAS:
|
||||
Make burny fire with lots of burning
|
||||
Draw off 5000K gas from burny fire
|
||||
Separate gas into oxygen and plasma components
|
||||
Obtain plasma and oxygen tanks filled up about 50-75% with normal-temp gas
|
||||
Fill rest with super hot gas from separated canisters, they should be about 125C now.
|
||||
Attach to transfer valve and open. BOOM.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
vs_control/var/IgnitionLevel = 0.5 //Moles of oxygen+plasma - co2 needed to burn.
|
||||
|
||||
//Some legacy definitions so fires can be started.
|
||||
atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
@@ -81,7 +95,7 @@ obj
|
||||
firelevel = air_contents.calculate_firelevel(liquid)
|
||||
|
||||
//Ensure that there is an appropriate amount of fuel and O2 here.
|
||||
if(firelevel > 25 && (air_contents.toxins || fuel || liquid))
|
||||
if(firelevel > 0.25 && (air_contents.toxins || fuel || liquid))
|
||||
|
||||
for(var/direction in cardinal)
|
||||
if(S.air_check_directions&direction) //Grab all valid bordering tiles
|
||||
@@ -92,15 +106,17 @@ obj
|
||||
//If extinguisher mist passed over the turf it's trying to spread to, don't spread and
|
||||
//reduce firelevel.
|
||||
if(enemy_tile.fire_protection > world.time-30)
|
||||
firelevel -= 150
|
||||
firelevel -= 1.5
|
||||
continue
|
||||
|
||||
//Spread the fire.
|
||||
if(!(locate(/obj/fire) in enemy_tile))
|
||||
if( prob( firelevel/2.5 ) )
|
||||
if( prob( firelevel*10 ) )
|
||||
new/obj/fire(enemy_tile,firelevel)
|
||||
|
||||
var/datum/gas_mixture/flow = air_contents.remove_ratio(0.5) //Take half the air from the room I guess.
|
||||
var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25)
|
||||
//The reason we're taking a part of the air instead of all of it is so that it doesn't jump to
|
||||
//the fire's max temperature instantaneously.
|
||||
|
||||
if(flow)
|
||||
|
||||
@@ -109,9 +125,9 @@ obj
|
||||
|
||||
//Change icon depending on the fuel, and thus temperature.
|
||||
icon_state = "1"
|
||||
if(firelevel > 25)
|
||||
if(firelevel > 2.5)
|
||||
icon_state = "2"
|
||||
if(firelevel > 100)
|
||||
if(firelevel > 6)
|
||||
icon_state = "3"
|
||||
|
||||
//Ensure flow temperature is higher than minimum fire temperatures.
|
||||
@@ -245,17 +261,20 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
|
||||
//Calculate the firelevel.
|
||||
var/firelevel = calculate_firelevel(liquid)
|
||||
|
||||
//Reaches a maximum practical temperature of around 2750.
|
||||
//Reaches a maximum practical temperature of around 4500.
|
||||
|
||||
temperature = 1000*log(0.016*firelevel + 1.45)
|
||||
//Increase temperature.
|
||||
temperature = max( 1700*log(0.4*firelevel + 1.23) , temperature )
|
||||
|
||||
//Consume some gas.
|
||||
var/consumed_gas = min(oxygen,0.002*firelevel,total_fuel) / fuel_sources
|
||||
var/consumed_gas = min(oxygen,0.0005*firelevel,total_fuel) / fuel_sources
|
||||
|
||||
oxygen -= consumed_gas
|
||||
|
||||
toxins = max(0,toxins-consumed_gas)
|
||||
|
||||
carbon_dioxide += consumed_gas*2
|
||||
|
||||
if(fuel)
|
||||
fuel.moles -= consumed_gas
|
||||
if(fuel.moles <= 0) del fuel
|
||||
@@ -268,16 +287,20 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
|
||||
return consumed_gas*fuel_sources
|
||||
return 0
|
||||
|
||||
|
||||
datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid)
|
||||
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
|
||||
var
|
||||
datum/gas/volatile_fuel/fuel = locate() in trace_gases
|
||||
fuel_level = 0
|
||||
liquid_level = 0
|
||||
liquid_concentration = 0
|
||||
|
||||
if(fuel) fuel_level = fuel.moles
|
||||
if(liquid) liquid_level = liquid.amount
|
||||
return oxygen + toxins + liquid_level*15 + fuel_level*5
|
||||
oxy_concentration = oxygen / volume
|
||||
tox_concentration = toxins / volume
|
||||
fuel_concentration = 0
|
||||
|
||||
if(fuel) fuel_concentration = (fuel.moles*5) / volume
|
||||
if(liquid) liquid_concentration = (liquid.amount*15) / volume
|
||||
return (oxy_concentration + tox_concentration + liquid_concentration + fuel_concentration)*100
|
||||
|
||||
/mob/living/carbon/human/proc/FireBurn(mx as num)
|
||||
//Burns mobs due to fire. Respects heat transfer coefficients on various body parts.
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
//Adds the turf to contents, increases the size of the zone, and sets the zone var.
|
||||
if(T in contents)
|
||||
return
|
||||
if(T.zone)
|
||||
T.zone.RemoveTurf(T)
|
||||
contents += T
|
||||
air.group_multiplier++
|
||||
T.zone = src
|
||||
@@ -42,8 +44,8 @@
|
||||
/turf/proc/check_connections()
|
||||
//Checks for new connections that can be made.
|
||||
for(var/d in cardinal)
|
||||
var/turf/T = get_step(src,d)
|
||||
if(!T || !T.zone || !T.CanPass(0,src,0,0))
|
||||
var/turf/simulated/T = get_step(src,d)
|
||||
if(!istype(T) || !T.zone || !T.CanPass(0,src,0,0))
|
||||
continue
|
||||
if(T.zone != zone)
|
||||
ZConnect(src,T)
|
||||
@@ -90,9 +92,12 @@ proc/ZMerge(zone/A,zone/B)
|
||||
A.contents = new_contents
|
||||
|
||||
//Set all the zone vars.
|
||||
for(var/turf/T in B.contents)
|
||||
for(var/turf/simulated/T in B.contents)
|
||||
T.zone = A
|
||||
|
||||
for(var/connection/C in A.connections)
|
||||
C.Cleanup()
|
||||
|
||||
del B
|
||||
|
||||
proc/ZConnect(turf/A,turf/B)
|
||||
@@ -111,12 +116,17 @@ proc/ZConnect(turf/A,turf/B)
|
||||
//Make some preliminary checks to see if the connection is valid.
|
||||
if(!A.zone || !B.zone) return
|
||||
if(A.zone == B.zone) return
|
||||
if(!A.CanPass(0,B,0,0)) return
|
||||
if(!A.CanPass(0,B,0,0) || !B.CanPass(0,A,0,0)) return
|
||||
if(A.CanPass(null, B, 1.5, 1) && B.CanPass(null, A, 1.5, 1))
|
||||
return ZMerge(A.zone, B.zone)
|
||||
|
||||
//Ensure the connection isn't already made.
|
||||
for(var/connection/C in A.zone.connections)
|
||||
if((C.A == A && C.B == B) || (C.A == B && C.B == A))
|
||||
return
|
||||
if(air_master.tiles_with_connections["\ref[A]"])
|
||||
var/list/connections = air_master.tiles_with_connections["\ref[A]"]
|
||||
for(var/connection/C in connections)
|
||||
C.Cleanup()
|
||||
if(C.B == B || C.A == B)
|
||||
return
|
||||
|
||||
var/connection/C = new(A,B)
|
||||
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
var/explosion_halt = 0
|
||||
var/zone_share_percent = 3.5
|
||||
zone/proc/process()
|
||||
//Deletes zone if empty.
|
||||
if(!contents.len)
|
||||
del src
|
||||
return 0
|
||||
//Does rebuilding stuff. Not sure if used.
|
||||
if(rebuild)
|
||||
//Deletes zone if empty.
|
||||
if(!contents.len)
|
||||
del src
|
||||
return 0
|
||||
|
||||
//Choose a random turf and regenerate the zone from it.
|
||||
var
|
||||
turf/sample = pick(contents)
|
||||
turf/simulated/sample = pick(contents)
|
||||
list/new_contents
|
||||
problem = 0
|
||||
|
||||
@@ -19,9 +19,25 @@ zone/proc/process()
|
||||
del(space_tiles)
|
||||
|
||||
contents.Remove(null) //I can't believe this is needed.
|
||||
|
||||
if(!contents.len)
|
||||
del src
|
||||
|
||||
var/list/tried_turfs = list()
|
||||
do
|
||||
sample = pick(contents) //Nor this.
|
||||
while(!istype(sample))
|
||||
if(sample)
|
||||
tried_turfs |= sample
|
||||
var/list/turfs_to_consider = contents - tried_turfs
|
||||
if(!turfs_to_consider.len)
|
||||
break
|
||||
sample = pick(turfs_to_consider) //Nor this.
|
||||
while(!istype(sample) || !sample.CanPass(null, sample, 1.5, 1))
|
||||
|
||||
if(!istype(sample) || !sample.CanPass(null, sample, 1.5, 1)) //Not a single valid turf.
|
||||
for(var/turf/simulated/T in contents)
|
||||
air_master.tiles_to_update |= T
|
||||
del src
|
||||
|
||||
new_contents = FloodFill(sample)
|
||||
|
||||
for(var/turf/space/S in new_contents)
|
||||
@@ -33,22 +49,25 @@ zone/proc/process()
|
||||
for(var/turf/T in contents)
|
||||
if(!(T in new_contents))
|
||||
problem = 1
|
||||
T.zone = null
|
||||
|
||||
if(problem)
|
||||
//Build some new zones for stuff that wasn't included.
|
||||
var/list/rebuild_turfs = list()
|
||||
for(var/turf/T in contents - new_contents)
|
||||
contents -= T
|
||||
rebuild_turfs += T
|
||||
T.zone = null
|
||||
var/list/turf/simulated/rebuild_turfs = contents - new_contents
|
||||
var/list/turf/simulated/reconsider_turfs = list()
|
||||
contents = new_contents
|
||||
for(var/turf/T in rebuild_turfs)
|
||||
if(istype(T,/turf/space))
|
||||
air_master.tiles_to_update |= T
|
||||
else if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
else
|
||||
reconsider_turfs |= T
|
||||
for(var/turf/T in reconsider_turfs)
|
||||
if(!T.zone)
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
if(istype(T,/turf/space))
|
||||
if(!T.zone.space_tiles)
|
||||
T.zone.space_tiles = list()
|
||||
T.zone.space_tiles |= T
|
||||
rebuild = 0
|
||||
|
||||
//Sometimes explosions will cause the air to be deleted for some reason.
|
||||
@@ -76,6 +95,16 @@ zone/proc/process()
|
||||
AirflowSpace(src)
|
||||
ShareSpace(air,total_space*(zone_share_percent/100))
|
||||
|
||||
if(!(last_update%20)) //every 20 processes.
|
||||
if(connections)
|
||||
connections.Remove(null)
|
||||
if(!connections.len)
|
||||
del connections
|
||||
if(connected_zones)
|
||||
connected_zones.Remove(null)
|
||||
if(!connected_zones.len)
|
||||
del connected_zones
|
||||
|
||||
//React the air here.
|
||||
//air.react(null,0)
|
||||
|
||||
|
||||
@@ -51,6 +51,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
var/list/related // the other areas of the same type as this
|
||||
var/list/lights // list of all lights on this area
|
||||
|
||||
var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
|
||||
var/air_doors_activated
|
||||
|
||||
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
|
||||
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
|
||||
var/list/teleportlocs = list()
|
||||
|
||||
@@ -507,7 +507,7 @@
|
||||
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
|
||||
|
||||
/obj/item/device/hacktool
|
||||
name = "hacktool"
|
||||
name = "modifed door debugger"
|
||||
icon_state = "hacktool"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
var/in_use = 0
|
||||
|
||||
@@ -529,8 +529,8 @@
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/toolbox/syndicate
|
||||
name = "suspicious looking toolbox"
|
||||
desc = "You have no idea what this is."
|
||||
name = "red and black toolbox"
|
||||
desc = "An oddly coloured toolbox."
|
||||
icon_state = "syndicate"
|
||||
item_state = "toolbox_syndi"
|
||||
origin_tech = "combat=1;syndicate=1"
|
||||
|
||||
@@ -720,7 +720,7 @@
|
||||
|
||||
/obj/item/weapon/card/id/syndicate
|
||||
name = "agent card"
|
||||
desc = "Shhhhh."
|
||||
// desc = "Shhhhh."
|
||||
access = list(access_maint_tunnels)
|
||||
origin_tech = "syndicate=3"
|
||||
|
||||
@@ -1840,7 +1840,7 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
|
||||
|
||||
/obj/item/weapon/plastique
|
||||
name = "plastic explosives"
|
||||
desc = "Used to put holes in specific areas without too much extra hole."
|
||||
desc = "Used to put holes in specific areas without too much extra hole. Does not work on people."
|
||||
gender = PLURAL
|
||||
icon = 'assemblies.dmi'
|
||||
icon_state = "plastic-explosive0"
|
||||
|
||||
@@ -124,10 +124,32 @@
|
||||
/area/proc/firealert()
|
||||
if(src.name == "Space") //no fire alarms in space
|
||||
return
|
||||
if (!( src.fire ))
|
||||
src.fire = 1
|
||||
src.updateicon()
|
||||
src.mouse_opacity = 0
|
||||
if (!fire)
|
||||
fire = 1
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
for(var/obj/machinery/door/airlock/E in master.all_doors)
|
||||
if(!E.air_locked)
|
||||
if((!E.arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
|
||||
if(!E.density)
|
||||
spawn(0)
|
||||
E.close()
|
||||
sleep(10)
|
||||
if(E.density)
|
||||
E.air_locked = E.req_access
|
||||
E.req_access = list(access_engine, access_atmospherics)
|
||||
E.update_icon()
|
||||
if(E.operating)
|
||||
spawn(10)
|
||||
E.close()
|
||||
if(E.density)
|
||||
E.air_locked = E.req_access
|
||||
E.req_access = list(access_engine, access_atmospherics)
|
||||
E.update_icon()
|
||||
else if(!E:locked) //Don't lock already bolted doors.
|
||||
E.air_locked = E.req_access
|
||||
E.req_access = list(access_engine, access_atmospherics)
|
||||
E.update_icon()
|
||||
for(var/obj/machinery/door/firedoor/D in src)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
@@ -145,10 +167,17 @@
|
||||
return
|
||||
|
||||
/area/proc/firereset()
|
||||
if (src.fire)
|
||||
src.fire = 0
|
||||
src.mouse_opacity = 0
|
||||
src.updateicon()
|
||||
if (fire)
|
||||
fire = 0
|
||||
mouse_opacity = 0
|
||||
updateicon()
|
||||
for(var/obj/machinery/door/airlock/E in master.all_doors)
|
||||
if((!E.arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
|
||||
if(E.air_locked) //Don't mess with doors locked for other reasons.
|
||||
if(E.density)
|
||||
E.req_access = E.air_locked
|
||||
E.air_locked = null
|
||||
E.update_icon()
|
||||
for(var/obj/machinery/door/firedoor/D in src)
|
||||
if(!D.blocked)
|
||||
if(D.operating)
|
||||
|
||||
@@ -145,7 +145,7 @@ Devices and Tools;
|
||||
/obj/item/clothing/glasses/thermal:3:Thermal Imaging Glasses;
|
||||
/obj/item/device/encryptionkey/binary:3:Binary Translator Key;
|
||||
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
|
||||
/obj/item/weapon/plastique:2:C-4 (Destroys walls);
|
||||
/obj/item/weapon/plastique:2:C-4 (Destroys walls, not people);
|
||||
/obj/item/device/powersink:5:Powersink (DANGER!);
|
||||
/obj/item/device/radio/beacon/syndicate:7:Singularity Beacon (DANGER!);
|
||||
/obj/item/weapon/circuitboard/teleporter:20:Teleporter Circuit Board;
|
||||
|
||||
@@ -59,7 +59,7 @@ Devices and Tools;
|
||||
/obj/item/weapon/storage/syndie_kit/space:3:Space Suit;
|
||||
/obj/item/clothing/glasses/thermal:3:Thermal Imaging Glasses;
|
||||
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
|
||||
/obj/item/weapon/plastique:2:C-4 (Destroys walls);
|
||||
/obj/item/weapon/plastique:2:C-4 (Destroys walls, not people);
|
||||
/obj/item/weapon/syndie/c4explosive:4:Low Power Explosive Charge, with Detonator;
|
||||
/obj/item/device/powersink:5:Powersink (DANGER!);
|
||||
/obj/item/device/radio/beacon/syndicate:7:Singularity Beacon (DANGER!);
|
||||
|
||||
@@ -36,25 +36,25 @@
|
||||
do
|
||||
switch(pick(1,2,3,4))
|
||||
if(1) //NORTH
|
||||
starty = world.maxy-3
|
||||
startx = rand(1, world.maxx-1)
|
||||
endy = 1
|
||||
endx = rand(1, world.maxx-1)
|
||||
starty = world.maxy-15
|
||||
startx = rand(15, world.maxx-15)
|
||||
endy = 15
|
||||
endx = rand(15, world.maxx-15)
|
||||
if(2) //EAST
|
||||
starty = rand(1,world.maxy-1)
|
||||
startx = world.maxx-3
|
||||
endy = rand(1, world.maxy-1)
|
||||
endx = 1
|
||||
starty = rand(15,world.maxy-15)
|
||||
startx = world.maxx-15
|
||||
endy = rand(15, world.maxy-15)
|
||||
endx = 15
|
||||
if(3) //SOUTH
|
||||
starty = 3
|
||||
startx = rand(1, world.maxx-1)
|
||||
endy = world.maxy-1
|
||||
endx = rand(1, world.maxx-1)
|
||||
starty = 15
|
||||
startx = rand(15, world.maxx-15)
|
||||
endy = world.maxy-15
|
||||
endx = rand(15, world.maxx-15)
|
||||
if(4) //WEST
|
||||
starty = rand(1, world.maxy-1)
|
||||
startx = 3
|
||||
endy = rand(1,world.maxy-1)
|
||||
endx = world.maxx-1
|
||||
starty = rand(15, world.maxy-15)
|
||||
startx = 15
|
||||
endy = rand(15,world.maxy-15)
|
||||
endx = world.maxx-15
|
||||
|
||||
pickedstart = locate(startx, starty, 1)
|
||||
pickedgoal = locate(endx, endy, 1)
|
||||
|
||||
@@ -103,6 +103,42 @@
|
||||
global_mutations += mut// add to global mutations list!
|
||||
*/
|
||||
|
||||
//setupdooralarms() goes through every door in the world before the game starts, checks all the squares
|
||||
//adjacent to them, and if the adjacent square does not contain a dense turf and is not in the same
|
||||
//area as the door, then the door is added to that adjacent area's auxdoor list to be used later on for
|
||||
//atmos and fire alarms.
|
||||
proc/setupdooralarms() //Strumpetplaya added 11/09/10 Automated Secondary Alarms on Doors
|
||||
world << "\red <B>Setting up atmospheric lockdown areas...</b>"
|
||||
for(var/obj/machinery/door/D in world)
|
||||
var/turf/source = get_turf(D)
|
||||
var/area/A = get_area(source)
|
||||
var/turf/north = get_step(source, NORTH)
|
||||
var/turf/east = get_step(source, EAST)
|
||||
var/turf/south = get_step(source, SOUTH)
|
||||
var/turf/west = get_step(source, WEST)
|
||||
A.all_doors |= D
|
||||
|
||||
if(!north.density)
|
||||
var/area/other_area = get_area(north)
|
||||
if(other_area.name != A.name)
|
||||
other_area.master.all_doors |= D
|
||||
|
||||
if(!east.density)
|
||||
var/area/other_area = get_area(east)
|
||||
if(other_area.name != A.name)
|
||||
other_area.master.all_doors |= D
|
||||
|
||||
if(!south.density)
|
||||
var/area/other_area = get_area(south)
|
||||
if(other_area.name != A.name)
|
||||
other_area.master.all_doors |= D
|
||||
|
||||
if(!west.density)
|
||||
var/area/other_area = get_area(west)
|
||||
if(other_area.name != A.name)
|
||||
other_area.master.all_doors |= D
|
||||
|
||||
|
||||
|
||||
/proc/setupfactions()
|
||||
|
||||
|
||||
@@ -1012,8 +1012,73 @@ table tr:first-child th:first-child { border: none;}
|
||||
new_area_danger_level = max(new_area_danger_level,AA.danger_level)
|
||||
if (alarm_area.atmosalert(new_area_danger_level)) //if area was in normal state or if area was in alert state
|
||||
post_alert(new_area_danger_level)
|
||||
|
||||
// if(danger_level > 1)
|
||||
// air_doors_close(0)
|
||||
// else
|
||||
// air_doors_open(0)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/alarm
|
||||
proc/air_doors_close(manual)
|
||||
var/area/A = get_area(src)
|
||||
if(!A.master.air_doors_activated)
|
||||
A.master.air_doors_activated = 1
|
||||
for(var/obj/machinery/door/E in A.master.all_doors)
|
||||
if(istype(E,/obj/machinery/door/firedoor))
|
||||
if(!E:blocked)
|
||||
if(E.operating)
|
||||
E:nextstate = CLOSED
|
||||
else if(!E.density)
|
||||
spawn(0)
|
||||
E.close()
|
||||
continue
|
||||
if(istype(E, /obj/machinery/door/airlock))
|
||||
if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
|
||||
if(!E.density)
|
||||
spawn(0)
|
||||
E.close()
|
||||
sleep(10)
|
||||
if(E.density)
|
||||
E:air_locked = E.req_access
|
||||
E:req_access = list(access_engine, access_atmospherics)
|
||||
E.update_icon()
|
||||
if(E.operating)
|
||||
spawn(10)
|
||||
E.close()
|
||||
if(E.density)
|
||||
E:air_locked = E.req_access
|
||||
E:req_access = list(access_engine, access_atmospherics)
|
||||
E.update_icon()
|
||||
else if(!E:locked) //Don't lock already bolted doors.
|
||||
E:air_locked = E.req_access
|
||||
E:req_access = list(access_engine, access_atmospherics)
|
||||
E.update_icon()
|
||||
|
||||
proc/air_doors_open(manual)
|
||||
var/area/A = get_area(loc)
|
||||
if(A.master.air_doors_activated)
|
||||
A.master.air_doors_activated = 0
|
||||
for(var/obj/machinery/door/E in A.master.all_doors)
|
||||
if(istype(E, /obj/machinery/door/firedoor))
|
||||
if(!E:blocked)
|
||||
if(E.operating)
|
||||
E:nextstate = OPEN
|
||||
else if(E.density)
|
||||
spawn(0)
|
||||
E.open()
|
||||
continue
|
||||
if(istype(E, /obj/machinery/door/airlock))
|
||||
if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
|
||||
if(E:air_locked) //Don't mess with doors locked for other reasons.
|
||||
if(E.density)
|
||||
E:req_access = E:air_locked
|
||||
E:air_locked = null
|
||||
E.update_icon()
|
||||
|
||||
|
||||
/obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob)
|
||||
/* if (istype(W, /obj/item/weapon/wirecutters))
|
||||
stat ^= BROKEN
|
||||
@@ -1186,12 +1251,9 @@ table tr:first-child th:first-child { border: none;}
|
||||
return
|
||||
|
||||
/obj/machinery/firealarm/proc/reset()
|
||||
if (!( src.working ))
|
||||
return
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
if (!( istype(A, /area) ))
|
||||
if (!working)
|
||||
return
|
||||
var/area/A = get_area(src)
|
||||
if(network)
|
||||
for(var/obj/machinery/door/firedoor/D in world)
|
||||
if(!D.blocked && D.net_id == src.network)
|
||||
|
||||
@@ -78,6 +78,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
|
||||
spawnPowerRestoreRunning = 0
|
||||
welded = null
|
||||
locked = 0
|
||||
list/air_locked = 0
|
||||
wires = 4095
|
||||
aiDisabledIdScanner = 0
|
||||
aiHacking = 0
|
||||
@@ -342,12 +343,14 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
|
||||
icon_state = "door_locked"
|
||||
else
|
||||
icon_state = "door_closed"
|
||||
if(p_open || welded)
|
||||
if(p_open || welded || air_locked)
|
||||
overlays = list()
|
||||
if(p_open)
|
||||
overlays += image(icon, "panel_open")
|
||||
if(welded)
|
||||
overlays += image(icon, "welded")
|
||||
if(air_locked)
|
||||
overlays += image('Door1.dmi', "air")
|
||||
else
|
||||
icon_state = "door_open"
|
||||
return
|
||||
|
||||
@@ -342,7 +342,7 @@
|
||||
update_nearby_tiles(need_rebuild)
|
||||
if(!air_master) return 0
|
||||
|
||||
var/turf/simulated/source = loc
|
||||
var/turf/simulated/source = get_turf(src)
|
||||
var/turf/simulated/north = get_step(source,NORTH)
|
||||
var/turf/simulated/south = get_step(source,SOUTH)
|
||||
var/turf/simulated/east = get_step(source,EAST)
|
||||
|
||||
@@ -87,43 +87,4 @@
|
||||
return
|
||||
|
||||
|
||||
|
||||
//border_only fire doors are special when it comes to air groups
|
||||
/obj/machinery/door/firedoor/border_only
|
||||
|
||||
New()
|
||||
..()
|
||||
var/turf/simulated/source = get_turf(src)
|
||||
var/turf/simulated/T = get_step(source,dir)
|
||||
if(!source.CanPass(null, T, 0, 0) || !locate(/obj/machinery/door/firedoor/border_only) in T)
|
||||
var/obj/machinery/door/firedoor/F = new(source)
|
||||
F.name = name
|
||||
F.desc = desc
|
||||
F.dir = dir
|
||||
spawn(0)
|
||||
del src
|
||||
|
||||
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group)
|
||||
var/direction = get_dir(src,target)
|
||||
if(direction)
|
||||
return (dir != direction)
|
||||
return 1 //It will break the zone when it actually drops, otherwise let it work normally.
|
||||
else if(density)
|
||||
if(!height)
|
||||
var/direction = get_dir(src,target)
|
||||
if(direction)
|
||||
return (dir != direction)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
update_nearby_tiles(need_rebuild)
|
||||
if(!air_master) return 0
|
||||
|
||||
var/turf/simulated/source = get_turf(src)
|
||||
var/turf/simulated/destination = get_step(source,dir)
|
||||
|
||||
if(istype(source)) air_master.tiles_to_update |= source
|
||||
if(istype(destination)) air_master.tiles_to_update |= destination
|
||||
return 1
|
||||
/obj/machinery/door/firedoor/border_only
|
||||
@@ -449,9 +449,9 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
src.toxic = 0
|
||||
|
||||
else if(src.waterlevel >= 100)
|
||||
user << "\red The [src] is already full."
|
||||
user << "\red \The [src] is already full."
|
||||
else
|
||||
user << "\red The bucket is not filled with water."
|
||||
user << "\red \The [src] is not filled with water."
|
||||
src.updateicon()
|
||||
|
||||
else if ( istype(O, /obj/item/nutrient) )
|
||||
|
||||
@@ -59,6 +59,8 @@ datum/controller/game_controller
|
||||
|
||||
setupgenetics()
|
||||
|
||||
setupdooralarms()
|
||||
|
||||
// for(var/i = 0, i < max_secret_rooms, i++)
|
||||
// make_mining_asteroid_secret()
|
||||
// Because energy cutlasses, facehuggers, and empty rooms are silly. FOR NOW. - Erthilo
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
access_status_display = 1
|
||||
|
||||
syndicate
|
||||
name = "Detomatix Cartridge"
|
||||
name = "modified signaler cartridge"
|
||||
icon_state = "cart"
|
||||
access_remote_door = 1
|
||||
remote_door_id = "syndicate" //Make sure this matches the syndicate shuttle's shield/door id!!
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
return
|
||||
|
||||
/obj/item/device/chameleon
|
||||
name = "chameleon-projector"
|
||||
name = "small device"
|
||||
icon_state = "shield0"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT | USEDELAY
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -13,6 +13,10 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
unacidable = 1//So effect are not targeted by alien acid.
|
||||
flags = TABLEPASS
|
||||
|
||||
/obj/effect/ex_act(severity)
|
||||
if(severity)
|
||||
del(src)
|
||||
|
||||
/obj/effect/effect/water
|
||||
name = "water"
|
||||
icon = 'effects.dmi'
|
||||
|
||||
@@ -406,7 +406,7 @@ ZIPPO
|
||||
var/lit = 0
|
||||
|
||||
/obj/item/weapon/lighter/zippo
|
||||
name = "Zippo lighter"
|
||||
name = "\improper Zippo lighter"
|
||||
desc = "The zippo."
|
||||
icon_state = "zippo"
|
||||
item_state = "zippo"
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
message_admins("ATTACK: [user] ([user.ckey]) planted [src] on [target] ([target:ckey]).")
|
||||
log_attack("<font color='red'> [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])</font>")
|
||||
target.overlays += image('assemblies.dmi', "plastic-explosive2")
|
||||
log_admin("[user] ([user.ckey]) has planted a [src].")
|
||||
message_admins("[user] ([user.ckey]) planted a [src].")
|
||||
user << "Bomb has been planted. Timer counting down from [timer]."
|
||||
spawn(timer*10)
|
||||
if(target)
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/implanter/explosive
|
||||
name = "implanter-explosive"
|
||||
name = "implanter (E)"
|
||||
|
||||
/obj/item/weapon/implanter/explosive/New()
|
||||
imp = new /obj/item/weapon/implant/explosive( src )
|
||||
@@ -75,7 +75,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/implanter/compressed
|
||||
name = "implanter-compressed"
|
||||
name = "implanter (C)"
|
||||
icon_state = "cimplanter0"
|
||||
|
||||
/obj/item/weapon/implanter/compressed/New()
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
/obj/item/weapon/syndie/c4explosive
|
||||
icon_state = "c-4small_0"
|
||||
item_state = "c-4small"
|
||||
name = "mysterious package"
|
||||
desc = "A mysterious package."
|
||||
name = "normal-sized package"
|
||||
desc = "A small wrapped package."
|
||||
w_class = 3
|
||||
|
||||
var/power = 1 /*Size of the explosion.*/
|
||||
@@ -27,9 +27,9 @@
|
||||
var/K = rand(1,2000)
|
||||
K = md5(num2text(K)+name)
|
||||
K = copytext(K,1,7)
|
||||
src.desc += "\n You see [K] engraved on \the [src]"
|
||||
src.desc += "\n You see [K] engraved on \the [src]."
|
||||
var/obj/item/weapon/syndie/c4detonator/detonator = new(src.loc)
|
||||
detonator.desc += "\n You see [K] engraved on \the [src]"
|
||||
detonator.desc += "\n You see [K] engraved on the lighter."
|
||||
detonator.bomb = src
|
||||
|
||||
/obj/item/weapon/syndie/c4explosive/proc/detonate()
|
||||
@@ -53,8 +53,8 @@
|
||||
/obj/item/weapon/syndie/c4detonator
|
||||
icon_state = "c-4detonator_0"
|
||||
item_state = "c-4detonator"
|
||||
name = "lighter" /*Sneaky, thanks Dreyfus.*/
|
||||
desc = "A disposable lighter, it's quite heavy."
|
||||
name = "\improper Zippo lighter" /*Sneaky, thanks Dreyfus.*/
|
||||
desc = "The zippo."
|
||||
w_class = 1
|
||||
|
||||
var/obj/item/weapon/syndie/c4explosive/bomb
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/obj/item/weapon/storage/syndie_kit
|
||||
name = "Box"
|
||||
desc = "A sleek, sturdy box"
|
||||
icon_state = "box_of_doom"
|
||||
name = "box"
|
||||
desc = "It's just an ordinary box."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_freedom
|
||||
name = "Freedom Implant (with injector)"
|
||||
name = "box (FI)"
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_freedom/New()
|
||||
var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src)
|
||||
@@ -15,7 +15,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_compress
|
||||
name = "Compressed Matter Implant (with injector)"
|
||||
name = "box (CMI)"
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_compress/New()
|
||||
new /obj/item/weapon/implanter/compressed(src)
|
||||
@@ -23,18 +23,18 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_explosive
|
||||
name = "Explosive Implant (with injector)"
|
||||
name = "box (EI)"
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_explosive/New()
|
||||
var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src)
|
||||
O.imp = new /obj/item/weapon/implant/explosive(O)
|
||||
O.name = "(BIO-HAZARD) BIO-detpack"
|
||||
// O.name = "(BIO-HAZARD) BIO-detpack"
|
||||
O.update()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_uplink
|
||||
name = "Uplink Implant (with injector)"
|
||||
name = "box (UI)"
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/imp_uplink/New()
|
||||
var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src)
|
||||
@@ -44,7 +44,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/space
|
||||
name = "Space Suit and Helmet"
|
||||
name = "box (SS)"
|
||||
|
||||
/obj/item/weapon/storage/syndie_kit/space/New()
|
||||
new /obj/item/clothing/suit/space/syndicate(src)
|
||||
|
||||
@@ -345,11 +345,11 @@
|
||||
/obj/structure/window/proc/update_nearby_tiles(need_rebuild)
|
||||
if(!air_master) return 0
|
||||
|
||||
var/turf/simulated/source = loc
|
||||
var/turf/simulated/source = get_turf(src)
|
||||
var/turf/simulated/target = get_step(source,dir)
|
||||
|
||||
if(istype(source)) air_master.tiles_to_update += source
|
||||
if(istype(target)) air_master.tiles_to_update += target
|
||||
if(istype(source)) air_master.tiles_to_update |= source
|
||||
if(istype(target)) air_master.tiles_to_update |= target
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -322,6 +322,8 @@
|
||||
|
||||
/turf/proc/ReplaceWithWall()
|
||||
var/old_icon = icon_state
|
||||
if(zone)
|
||||
zone.RemoveTurf(src)
|
||||
var/turf/simulated/wall/S = new /turf/simulated/wall( locate(src.x, src.y, src.z) )
|
||||
S.icon_old = old_icon
|
||||
S.opacity = 0
|
||||
@@ -342,6 +344,8 @@
|
||||
|
||||
/turf/proc/ReplaceWithRWall()
|
||||
var/old_icon = icon_state
|
||||
if(zone)
|
||||
zone.RemoveTurf(src)
|
||||
var/turf/simulated/wall/r_wall/S = new /turf/simulated/wall/r_wall( locate(src.x, src.y, src.z) )
|
||||
S.icon_old = old_icon
|
||||
S.opacity = 0
|
||||
|
||||
@@ -98,7 +98,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
lst[i] = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
|
||||
|
||||
if("reference")
|
||||
lst[i] = input("Select reference:","Reference",src) as mob|obj|turf|area in world
|
||||
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
|
||||
if(!UID) return
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
return
|
||||
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
|
||||
if("Yes")
|
||||
lst[i] = temp_variable
|
||||
if("NONOCANCEL!")
|
||||
return
|
||||
if("Search")
|
||||
lst[i] = input("Select reference:","Reference") as null|mob|obj|turf|area in world
|
||||
|
||||
if("mob reference")
|
||||
lst[i] = input("Select reference:","Reference",usr) as mob in world
|
||||
@@ -171,8 +185,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
|
||||
if(!UID) return
|
||||
if(length(UID) != 7)
|
||||
usr << "ERROR. UID must be 7 digits"
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
@@ -239,8 +251,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
|
||||
if(!UID) return
|
||||
if(length(UID) != 7)
|
||||
usr << "ERROR. UID must be 7 digits"
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
|
||||
@@ -66,8 +66,6 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
|
||||
if(!UID) return
|
||||
if(length(UID) != 7)
|
||||
usr << "ERROR. UID must be 7 digits"
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
@@ -131,8 +129,6 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
|
||||
if(!UID) return
|
||||
if(length(UID) != 7)
|
||||
usr << "ERROR. UID must be 7 digits"
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
@@ -308,8 +304,6 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as null|text
|
||||
if(!UID) return
|
||||
if(length(UID) != 7)
|
||||
usr << "ERROR. UID must be 7 digits"
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
@@ -554,8 +548,6 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if("Specifc UID (Hexadecimal number)")
|
||||
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
|
||||
if(!UID) return
|
||||
if(length(UID) != 7)
|
||||
usr << "ERROR. UID must be 7 digits"
|
||||
var/temp_variable = locate("\[0x[UID]\]")
|
||||
if(!temp_variable)
|
||||
usr << "ERROR. Could not locate referenced object."
|
||||
|
||||
@@ -524,14 +524,14 @@ datum
|
||||
src = null
|
||||
var/turf/the_turf = get_turf(O)
|
||||
var/datum/gas_mixture/napalm = new
|
||||
napalm.oxygen = volume*10
|
||||
napalm.oxygen = volume/10
|
||||
napalm.temperature = T0C
|
||||
napalm.update_values()
|
||||
the_turf.assume_air(napalm)
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
var/datum/gas_mixture/napalm = new
|
||||
napalm.oxygen = volume*10
|
||||
napalm.oxygen = volume/10
|
||||
napalm.temperature = T0C
|
||||
napalm.update_values()
|
||||
T.assume_air(napalm)
|
||||
@@ -554,14 +554,14 @@ datum
|
||||
src = null
|
||||
var/turf/the_turf = get_turf(O)
|
||||
var/datum/gas_mixture/napalm = new
|
||||
napalm.nitrogen = volume*10
|
||||
napalm.nitrogen = volume/10
|
||||
napalm.temperature = T0C
|
||||
napalm.update_values()
|
||||
the_turf.assume_air(napalm)
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
var/datum/gas_mixture/napalm = new
|
||||
napalm.nitrogen = volume*10
|
||||
napalm.nitrogen = volume/10
|
||||
napalm.temperature = T0C
|
||||
napalm.update_values()
|
||||
T.assume_air(napalm)
|
||||
@@ -1036,18 +1036,10 @@ datum
|
||||
var/turf/the_turf = get_turf(O)
|
||||
if(!the_turf)
|
||||
return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO
|
||||
var/datum/gas_mixture/napalm = new
|
||||
napalm.toxins = volume*10
|
||||
napalm.temperature = T0C
|
||||
napalm.update_values()
|
||||
the_turf.assume_air(napalm)
|
||||
new /obj/liquid_fuel(the_turf, volume)
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
var/datum/gas_mixture/napalm = new
|
||||
napalm.toxins = volume*10
|
||||
napalm.temperature = T0C
|
||||
napalm.update_values()
|
||||
T.assume_air(napalm)
|
||||
new /obj/liquid_fuel(T, volume)
|
||||
return
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -1155,19 +1147,17 @@ datum
|
||||
src = null
|
||||
var/turf/the_turf = get_turf(O)
|
||||
var/datum/gas_mixture/napalm = new
|
||||
var/datum/gas/volatile_fuel/fuel = new
|
||||
fuel.moles = 5
|
||||
napalm.trace_gases += fuel
|
||||
napalm.toxins = volume/5
|
||||
napalm.update_values()
|
||||
the_turf.assume_air(napalm)
|
||||
new /obj/liquid_fuel(the_turf, volume)
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
var/datum/gas_mixture/napalm = new
|
||||
var/datum/gas/volatile_fuel/fuel = new
|
||||
fuel.moles = 5
|
||||
napalm.trace_gases += fuel
|
||||
napalm.toxins = volume/5
|
||||
napalm.update_values()
|
||||
T.assume_air(napalm)
|
||||
new /obj/liquid_fuel(T, volume)
|
||||
return
|
||||
|
||||
leporazine
|
||||
|
||||
@@ -142,6 +142,16 @@
|
||||
//////////// Clothing ////////////
|
||||
//////////////////////////////////
|
||||
|
||||
//////////// Gloves ////////////
|
||||
|
||||
/obj/item/clothing/gloves/fluff/walter_brooks_1 //botanistpower: Walter Brooks
|
||||
name = "mittens"
|
||||
desc = "A pair of well worn, blue mittens."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "walter_brooks_1"
|
||||
item_state = "bluegloves"
|
||||
color="blue"
|
||||
|
||||
//////////// Eye Wear ////////////
|
||||
|
||||
/obj/item/clothing/glasses/meson/fluff/book_berner_1 //asanadas: Book Berner
|
||||
|
||||
@@ -63,7 +63,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
/mob/proc/ghost()
|
||||
set category = "Ghost"
|
||||
set name = "Ghost"
|
||||
set desc = "You cannot be revived as a ghost."
|
||||
|
||||
/*if(stat != 2) //this check causes nothing but troubles. Commented out for Nar-Sie's sake. --rastaf0
|
||||
src << "Only dead people and admins get to ghost, and admins don't use this verb to ghost while alive."
|
||||
|
||||
@@ -486,8 +486,9 @@
|
||||
head = null
|
||||
if(prev_head && (prev_head.flags & BLOCKHAIR))
|
||||
// rebuild face
|
||||
del(face_standing)
|
||||
del(face_lying)
|
||||
// del(face_standing)
|
||||
// del(face_lying)
|
||||
update_face()
|
||||
|
||||
else if (W == l_ear)
|
||||
l_ear = null
|
||||
@@ -506,8 +507,9 @@
|
||||
wear_mask = null
|
||||
if(prev_mask && (prev_mask.flags & BLOCKHAIR))
|
||||
// rebuild face
|
||||
del(face_standing)
|
||||
del(face_lying)
|
||||
// del(face_standing)
|
||||
// del(face_lying)
|
||||
update_face()
|
||||
|
||||
else if (W == wear_id)
|
||||
wear_id = null
|
||||
@@ -1255,7 +1257,6 @@
|
||||
// Should be called only when something about the clothing itself changed
|
||||
// which is not handled by the equip code.
|
||||
rebuild_appearance()
|
||||
update_face() //Fixes hair not coming back after using a BLOCKHAIR mask/helmet
|
||||
return
|
||||
|
||||
// TODO: once I have replaced the udpate_clothing() calls with update_lying() or
|
||||
@@ -1770,6 +1771,8 @@ It can still be worn/put on as normal.
|
||||
return
|
||||
var/obj/item/clothing/W = target.wear_mask
|
||||
target.u_equip(W)
|
||||
if (W.flags & BLOCKHAIR)
|
||||
target.update_face()
|
||||
if (target.client)
|
||||
target.client.screen -= W
|
||||
if (W)
|
||||
@@ -1899,6 +1902,8 @@ It can still be worn/put on as normal.
|
||||
target.u_equip(W)
|
||||
if (target.client)
|
||||
target.client.screen -= W
|
||||
if (W.flags & BLOCKHAIR)
|
||||
target.update_face()
|
||||
if (W)
|
||||
W.loc = target.loc
|
||||
W.dropped(target)
|
||||
|
||||
@@ -123,6 +123,8 @@
|
||||
var/list/icons = list("Blue", "Monochrome", "Rainbow", "Inverted", "Firewall", "Green", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Red", "Static")
|
||||
if (src.name == "B.A.N.N.E.D." && src.ckey == "spaceman96")
|
||||
icons += "B.A.N.N.E.D."
|
||||
if (src.name == "M00X-BC" && src.ckey == "searif")
|
||||
icons += "M00X-BC"
|
||||
icontype = input("Please, select a display!", "AI", null/*, null*/) in icons
|
||||
if(icontype == "Blue")
|
||||
icon_state = "ai"
|
||||
@@ -148,6 +150,8 @@
|
||||
icon_state = "ai-bliss"
|
||||
else if(icontype == "B.A.N.N.E.D.")
|
||||
icon_state = "ai-banned"
|
||||
else if(icontype == "M00X-BC")
|
||||
icon_state = "ai-searif"
|
||||
else if(icontype == "Red")
|
||||
icon_state = "ai-malf"
|
||||
else if(icontype == "Static")
|
||||
|
||||
@@ -82,7 +82,6 @@
|
||||
|
||||
for(var/L = 1 to netcount)
|
||||
var/datum/powernet/PN = new()
|
||||
//PN.tag = "powernet #[L]"
|
||||
powernets += PN
|
||||
PN.number = L
|
||||
|
||||
@@ -287,7 +286,6 @@
|
||||
// not looped, so make a new powernet
|
||||
|
||||
var/datum/powernet/PN = new()
|
||||
//PN.tag = "powernet #[L]"
|
||||
powernets += PN
|
||||
PN.number = powernets.len
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow
|
||||
name = "mini energy-crossbow"
|
||||
desc = "A weapon favored by many of the syndicates stealth specialists."
|
||||
desc = "A crossbow that doesn't seem to have space for bolts."
|
||||
icon_state = "crossbow"
|
||||
w_class = 2.0
|
||||
item_state = "crossbow"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
asanadas: Book Berner: /obj/item/clothing/under/chameleon/psyche, /obj/item/clothing/glasses/meson/fluff/book_berner_1
|
||||
atomicdog92: Seth Sealis: /obj/item/clothing/suit/storage/det_suit/fluff/leatherjack
|
||||
botanistpower: Walter Brooks: /obj/item/clothing/gloves/fluff/walter_brooks_1
|
||||
chinsky: Victor Kaminski: /obj/item/fluff/victor_kaminsky_1
|
||||
chinsky: Summer Springfield: /obj/item/weapon/camera_test/fluff/orange
|
||||
compactninja: Ysyr Rylias: /obj/item/weapon/reagent_containers/food/drinks/dry_ramen, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen
|
||||
|
||||
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 5.6 KiB |