Merge remote-tracking branch 'upstream/dev' into emergency-shuttle
@@ -61,6 +61,7 @@
|
|||||||
#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm"
|
#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm"
|
||||||
#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm"
|
#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm"
|
||||||
#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm"
|
#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm"
|
||||||
|
#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm"
|
||||||
#include "code\ATMOSPHERICS\components\binary_devices\pump.dm"
|
#include "code\ATMOSPHERICS\components\binary_devices\pump.dm"
|
||||||
#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm"
|
#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm"
|
||||||
#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm"
|
#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm"
|
||||||
@@ -668,6 +669,7 @@
|
|||||||
#include "code\game\verbs\who.dm"
|
#include "code\game\verbs\who.dm"
|
||||||
#include "code\js\byjax.dm"
|
#include "code\js\byjax.dm"
|
||||||
#include "code\js\menus.dm"
|
#include "code\js\menus.dm"
|
||||||
|
#include "code\modules\spawnpoints.dm"
|
||||||
#include "code\modules\admin\admin.dm"
|
#include "code\modules\admin\admin.dm"
|
||||||
#include "code\modules\admin\admin_investigate.dm"
|
#include "code\modules\admin\admin_investigate.dm"
|
||||||
#include "code\modules\admin\admin_memo.dm"
|
#include "code\modules\admin\admin_memo.dm"
|
||||||
|
|||||||
289
code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1.
|
||||||
|
|
||||||
|
/obj/machinery/atmospherics/pipeturbine
|
||||||
|
name = "turbine"
|
||||||
|
desc = "A gas turbine. Converting pressure into energy since 1884."
|
||||||
|
icon = 'icons/obj/pipeturbine.dmi'
|
||||||
|
icon_state = "turbine"
|
||||||
|
anchored = 0
|
||||||
|
density = 1
|
||||||
|
|
||||||
|
var/efficiency = 0.4
|
||||||
|
var/kin_energy = 0
|
||||||
|
var/datum/gas_mixture/air_in = new
|
||||||
|
var/datum/gas_mixture/air_out = new
|
||||||
|
var/volume_ratio = 0.2
|
||||||
|
var/kin_loss = 0.001
|
||||||
|
|
||||||
|
var/dP = 0
|
||||||
|
|
||||||
|
var/obj/machinery/atmospherics/node1
|
||||||
|
var/obj/machinery/atmospherics/node2
|
||||||
|
|
||||||
|
var/datum/pipe_network/network1
|
||||||
|
var/datum/pipe_network/network2
|
||||||
|
|
||||||
|
New()
|
||||||
|
..()
|
||||||
|
air_in.volume = 200
|
||||||
|
air_out.volume = 800
|
||||||
|
volume_ratio = air_in.volume / (air_in.volume + air_out.volume)
|
||||||
|
switch(dir)
|
||||||
|
if(NORTH)
|
||||||
|
initialize_directions = EAST|WEST
|
||||||
|
if(SOUTH)
|
||||||
|
initialize_directions = EAST|WEST
|
||||||
|
if(EAST)
|
||||||
|
initialize_directions = NORTH|SOUTH
|
||||||
|
if(WEST)
|
||||||
|
initialize_directions = NORTH|SOUTH
|
||||||
|
|
||||||
|
Del()
|
||||||
|
loc = null
|
||||||
|
|
||||||
|
if(node1)
|
||||||
|
node1.disconnect(src)
|
||||||
|
del(network1)
|
||||||
|
if(node2)
|
||||||
|
node2.disconnect(src)
|
||||||
|
del(network2)
|
||||||
|
|
||||||
|
node1 = null
|
||||||
|
node2 = null
|
||||||
|
|
||||||
|
..()
|
||||||
|
|
||||||
|
process()
|
||||||
|
..()
|
||||||
|
if(anchored && !(stat&BROKEN))
|
||||||
|
kin_energy *= 1 - kin_loss
|
||||||
|
dP = max(air_in.return_pressure() - air_out.return_pressure(), 0)
|
||||||
|
if(dP > 10)
|
||||||
|
kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency
|
||||||
|
air_in.temperature *= volume_ratio**ADIABATIC_EXPONENT
|
||||||
|
|
||||||
|
var/datum/gas_mixture/air_all = new
|
||||||
|
air_all.volume = air_in.volume + air_out.volume
|
||||||
|
air_all.merge(air_in.remove_ratio(1))
|
||||||
|
air_all.merge(air_out.remove_ratio(1))
|
||||||
|
|
||||||
|
air_in.merge(air_all.remove(volume_ratio))
|
||||||
|
air_out.merge(air_all)
|
||||||
|
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
if (network1)
|
||||||
|
network1.update = 1
|
||||||
|
if (network2)
|
||||||
|
network2.update = 1
|
||||||
|
|
||||||
|
update_icon()
|
||||||
|
overlays.Cut()
|
||||||
|
if (dP > 10)
|
||||||
|
overlays += image('icons/obj/pipeturbine.dmi', "moto-turb")
|
||||||
|
if (kin_energy > 100000)
|
||||||
|
overlays += image('icons/obj/pipeturbine.dmi', "low-turb")
|
||||||
|
if (kin_energy > 500000)
|
||||||
|
overlays += image('icons/obj/pipeturbine.dmi', "med-turb")
|
||||||
|
if (kin_energy > 1000000)
|
||||||
|
overlays += image('icons/obj/pipeturbine.dmi', "hi-turb")
|
||||||
|
|
||||||
|
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
|
if(istype(W, /obj/item/weapon/wrench))
|
||||||
|
anchored = !anchored
|
||||||
|
user << "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor."
|
||||||
|
|
||||||
|
if(anchored)
|
||||||
|
if(dir & (NORTH|SOUTH))
|
||||||
|
initialize_directions = EAST|WEST
|
||||||
|
else if(dir & (EAST|WEST))
|
||||||
|
initialize_directions = NORTH|SOUTH
|
||||||
|
|
||||||
|
initialize()
|
||||||
|
build_network()
|
||||||
|
if (node1)
|
||||||
|
node1.initialize()
|
||||||
|
node1.build_network()
|
||||||
|
if (node2)
|
||||||
|
node2.initialize()
|
||||||
|
node2.build_network()
|
||||||
|
else
|
||||||
|
if(node1)
|
||||||
|
node1.disconnect(src)
|
||||||
|
del(network1)
|
||||||
|
if(node2)
|
||||||
|
node2.disconnect(src)
|
||||||
|
del(network2)
|
||||||
|
|
||||||
|
node1 = null
|
||||||
|
node2 = null
|
||||||
|
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
|
verb/rotate_clockwise()
|
||||||
|
set category = "Object"
|
||||||
|
set name = "Rotate Circulator (Clockwise)"
|
||||||
|
set src in view(1)
|
||||||
|
|
||||||
|
if (usr.stat || usr.restrained() || anchored)
|
||||||
|
return
|
||||||
|
|
||||||
|
src.dir = turn(src.dir, -90)
|
||||||
|
|
||||||
|
|
||||||
|
verb/rotate_anticlockwise()
|
||||||
|
set category = "Object"
|
||||||
|
set name = "Rotate Circulator (Counterclockwise)"
|
||||||
|
set src in view(1)
|
||||||
|
|
||||||
|
if (usr.stat || usr.restrained() || anchored)
|
||||||
|
return
|
||||||
|
|
||||||
|
src.dir = turn(src.dir, 90)
|
||||||
|
|
||||||
|
//Goddamn copypaste from binary base class because atmospherics machinery API is not damn flexible
|
||||||
|
network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
|
||||||
|
if(reference == node1)
|
||||||
|
network1 = new_network
|
||||||
|
|
||||||
|
else if(reference == node2)
|
||||||
|
network2 = new_network
|
||||||
|
|
||||||
|
if(new_network.normal_members.Find(src))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
new_network.normal_members += src
|
||||||
|
|
||||||
|
return null
|
||||||
|
|
||||||
|
initialize()
|
||||||
|
if(node1 && node2) return
|
||||||
|
|
||||||
|
var/node2_connect = turn(dir, -90)
|
||||||
|
var/node1_connect = turn(dir, 90)
|
||||||
|
|
||||||
|
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
|
||||||
|
if(target.initialize_directions & get_dir(target,src))
|
||||||
|
node1 = target
|
||||||
|
break
|
||||||
|
|
||||||
|
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
|
||||||
|
if(target.initialize_directions & get_dir(target,src))
|
||||||
|
node2 = target
|
||||||
|
break
|
||||||
|
|
||||||
|
build_network()
|
||||||
|
if(!network1 && node1)
|
||||||
|
network1 = new /datum/pipe_network()
|
||||||
|
network1.normal_members += src
|
||||||
|
network1.build_network(node1, src)
|
||||||
|
|
||||||
|
if(!network2 && node2)
|
||||||
|
network2 = new /datum/pipe_network()
|
||||||
|
network2.normal_members += src
|
||||||
|
network2.build_network(node2, src)
|
||||||
|
|
||||||
|
|
||||||
|
return_network(obj/machinery/atmospherics/reference)
|
||||||
|
build_network()
|
||||||
|
|
||||||
|
if(reference==node1)
|
||||||
|
return network1
|
||||||
|
|
||||||
|
if(reference==node2)
|
||||||
|
return network2
|
||||||
|
|
||||||
|
return null
|
||||||
|
|
||||||
|
reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
|
||||||
|
if(network1 == old_network)
|
||||||
|
network1 = new_network
|
||||||
|
if(network2 == old_network)
|
||||||
|
network2 = new_network
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return_network_air(datum/pipe_network/reference)
|
||||||
|
var/list/results = list()
|
||||||
|
|
||||||
|
if(network1 == reference)
|
||||||
|
results += air_in
|
||||||
|
if(network2 == reference)
|
||||||
|
results += air_out
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
disconnect(obj/machinery/atmospherics/reference)
|
||||||
|
if(reference==node1)
|
||||||
|
del(network1)
|
||||||
|
node1 = null
|
||||||
|
|
||||||
|
else if(reference==node2)
|
||||||
|
del(network2)
|
||||||
|
node2 = null
|
||||||
|
|
||||||
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
/obj/machinery/power/turbinemotor
|
||||||
|
name = "motor"
|
||||||
|
desc = "Electrogenerator. Converts rotation into power."
|
||||||
|
icon = 'icons/obj/pipeturbine.dmi'
|
||||||
|
icon_state = "motor"
|
||||||
|
anchored = 0
|
||||||
|
density = 1
|
||||||
|
|
||||||
|
var/kin_to_el_ratio = 0.1 //How much kinetic energy will be taken from turbine and converted into electricity
|
||||||
|
var/obj/machinery/atmospherics/pipeturbine/turbine
|
||||||
|
|
||||||
|
New()
|
||||||
|
..()
|
||||||
|
spawn(1)
|
||||||
|
updateConnection()
|
||||||
|
|
||||||
|
proc/updateConnection()
|
||||||
|
turbine = null
|
||||||
|
if(src.loc && anchored)
|
||||||
|
turbine = locate(/obj/machinery/atmospherics/pipeturbine) in get_step(src,dir)
|
||||||
|
if (turbine.stat & (BROKEN) || !turbine.anchored || turn(turbine.dir,180) != dir)
|
||||||
|
turbine = null
|
||||||
|
|
||||||
|
process()
|
||||||
|
updateConnection()
|
||||||
|
if(!turbine || !anchored || stat & (BROKEN))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/power_generated = kin_to_el_ratio * turbine.kin_energy
|
||||||
|
turbine.kin_energy -= power_generated
|
||||||
|
add_avail(power_generated)
|
||||||
|
|
||||||
|
|
||||||
|
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
|
if(istype(W, /obj/item/weapon/wrench))
|
||||||
|
anchored = !anchored
|
||||||
|
turbine = null
|
||||||
|
user << "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor."
|
||||||
|
updateConnection()
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
|
verb/rotate_clock()
|
||||||
|
set category = "Object"
|
||||||
|
set name = "Rotate Motor Clockwise"
|
||||||
|
set src in view(1)
|
||||||
|
|
||||||
|
if (usr.stat || usr.restrained() || anchored)
|
||||||
|
return
|
||||||
|
|
||||||
|
src.dir = turn(src.dir, -90)
|
||||||
|
|
||||||
|
verb/rotate_anticlock()
|
||||||
|
set category = "Object"
|
||||||
|
set name = "Rotate Motor Counterclockwise"
|
||||||
|
set src in view(1)
|
||||||
|
|
||||||
|
if (usr.stat || usr.restrained() || anchored)
|
||||||
|
return
|
||||||
|
|
||||||
|
src.dir = turn(src.dir, 90)
|
||||||
@@ -63,9 +63,11 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
|||||||
|
|
||||||
if(!istype(S))
|
if(!istype(S))
|
||||||
del src
|
del src
|
||||||
|
return
|
||||||
|
|
||||||
if(!S.zone)
|
if(!S.zone)
|
||||||
del src
|
del src
|
||||||
|
return
|
||||||
|
|
||||||
var/datum/gas_mixture/air_contents = S.return_air()
|
var/datum/gas_mixture/air_contents = S.return_air()
|
||||||
//get liquid fuels on the ground.
|
//get liquid fuels on the ground.
|
||||||
@@ -87,6 +89,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
|||||||
if(!air_contents.check_combustability(liquid))
|
if(!air_contents.check_combustability(liquid))
|
||||||
//del src
|
//del src
|
||||||
RemoveFire()
|
RemoveFire()
|
||||||
|
return
|
||||||
|
|
||||||
//get a firelevel and set the icon
|
//get a firelevel and set the icon
|
||||||
firelevel = air_contents.calculate_firelevel(liquid)
|
firelevel = air_contents.calculate_firelevel(liquid)
|
||||||
@@ -104,15 +107,16 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
|||||||
//im not sure how to implement a version that works for every creature so for now monkeys are firesafe
|
//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)
|
for(var/mob/living/carbon/human/M in loc)
|
||||||
M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans!
|
M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans!
|
||||||
|
|
||||||
|
loc.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
|
||||||
for(var/atom/A in loc)
|
for(var/atom/A in loc)
|
||||||
A.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
|
A.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
|
||||||
//spread
|
//spread
|
||||||
for(var/direction in cardinal)
|
for(var/direction in cardinal)
|
||||||
if(S.open_directions & direction) //Grab all valid bordering tiles
|
var/turf/simulated/enemy_tile = get_step(S, direction)
|
||||||
|
|
||||||
var/turf/simulated/enemy_tile = get_step(S, direction)
|
if(istype(enemy_tile))
|
||||||
|
if(S.open_directions & direction) //Grab all valid bordering tiles
|
||||||
if(istype(enemy_tile))
|
|
||||||
var/datum/gas_mixture/acs = enemy_tile.return_air()
|
var/datum/gas_mixture/acs = enemy_tile.return_air()
|
||||||
var/obj/effect/decal/cleanable/liquid_fuel/liq = locate() in enemy_tile
|
var/obj/effect/decal/cleanable/liquid_fuel/liq = locate() in enemy_tile
|
||||||
if(!acs) continue
|
if(!acs) continue
|
||||||
@@ -128,6 +132,9 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
|||||||
if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0))
|
if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0))
|
||||||
new/obj/fire(enemy_tile,firelevel)
|
new/obj/fire(enemy_tile,firelevel)
|
||||||
|
|
||||||
|
else
|
||||||
|
enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.return_volume())
|
||||||
|
|
||||||
//seperate part of the present gas
|
//seperate part of the present gas
|
||||||
//this is done to prevent the fire burning all gases in a single pass
|
//this is done to prevent the fire burning all gases in a single pass
|
||||||
var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate)
|
var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate)
|
||||||
|
|||||||
@@ -26,6 +26,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
var/turf/unsim = get_step(src, d)
|
var/turf/unsim = get_step(src, d)
|
||||||
|
|
||||||
|
if(!unsim)
|
||||||
|
continue
|
||||||
|
|
||||||
block = unsim.c_airblock(src)
|
block = unsim.c_airblock(src)
|
||||||
|
|
||||||
if(block & AIR_BLOCKED)
|
if(block & AIR_BLOCKED)
|
||||||
@@ -75,6 +79,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
var/turf/unsim = get_step(src, d)
|
var/turf/unsim = get_step(src, d)
|
||||||
|
|
||||||
|
if(!unsim) //edge of map
|
||||||
|
continue
|
||||||
|
|
||||||
var/block = unsim.c_airblock(src)
|
var/block = unsim.c_airblock(src)
|
||||||
if(block & AIR_BLOCKED)
|
if(block & AIR_BLOCKED)
|
||||||
|
|
||||||
@@ -108,6 +116,8 @@
|
|||||||
if(istype(unsim, /turf/simulated))
|
if(istype(unsim, /turf/simulated))
|
||||||
|
|
||||||
var/turf/simulated/sim = unsim
|
var/turf/simulated/sim = unsim
|
||||||
|
sim.open_directions |= reverse_dir[d]
|
||||||
|
|
||||||
if(air_master.has_valid_zone(sim))
|
if(air_master.has_valid_zone(sim))
|
||||||
|
|
||||||
//Might have assigned a zone, since this happens for each direction.
|
//Might have assigned a zone, since this happens for each direction.
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ datum/controller/game_controller
|
|||||||
var/last_thing_processed
|
var/last_thing_processed
|
||||||
var/mob/list/expensive_mobs = list()
|
var/mob/list/expensive_mobs = list()
|
||||||
var/rebuild_active_areas = 0
|
var/rebuild_active_areas = 0
|
||||||
|
|
||||||
var/list/shuttle_list //for debugging and VV
|
var/list/shuttle_list //for debugging and VV
|
||||||
|
|
||||||
datum/controller/game_controller/New()
|
datum/controller/game_controller/New()
|
||||||
@@ -83,6 +83,9 @@ datum/controller/game_controller/proc/setup()
|
|||||||
var/datum/ore_distribution/O = new()
|
var/datum/ore_distribution/O = new()
|
||||||
O.populate_distribution_map()
|
O.populate_distribution_map()
|
||||||
|
|
||||||
|
//Set up spawn points.
|
||||||
|
populate_spawn_points()
|
||||||
|
|
||||||
spawn(0)
|
spawn(0)
|
||||||
if(ticker)
|
if(ticker)
|
||||||
ticker.pregame()
|
ticker.pregame()
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
/datum/game_mode/cult
|
/datum/game_mode/cult
|
||||||
name = "cult"
|
name = "cult"
|
||||||
config_tag = "cult"
|
config_tag = "cult"
|
||||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
restricted_jobs = list("Chaplain","AI", "Cyborg", "Lawyer", "Head of Security", "Captain")
|
||||||
protected_jobs = list()
|
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||||
required_players = 5
|
required_players = 5
|
||||||
required_players_secret = 15
|
required_players_secret = 15
|
||||||
required_enemies = 3
|
required_enemies = 3
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
/datum/game_mode/revolution
|
/datum/game_mode/revolution
|
||||||
name = "revolution"
|
name = "revolution"
|
||||||
config_tag = "revolution"
|
config_tag = "revolution"
|
||||||
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
restricted_jobs = list("Lawyer", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||||
|
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||||
required_players = 4
|
required_players = 4
|
||||||
required_players_secret = 15
|
required_players_secret = 15
|
||||||
required_enemies = 3
|
required_enemies = 3
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ var/global/list/frozen_items = list()
|
|||||||
/obj/machinery/computer/cryopod/attack_ai()
|
/obj/machinery/computer/cryopod/attack_ai()
|
||||||
src.attack_hand()
|
src.attack_hand()
|
||||||
|
|
||||||
obj/machinery/computer/cryopod/attack_hand(mob/user = usr)
|
/obj/machinery/computer/cryopod/attack_hand(mob/user = usr)
|
||||||
if(stat & (NOPOWER|BROKEN))
|
if(stat & (NOPOWER|BROKEN))
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -43,12 +43,11 @@ obj/machinery/computer/cryopod/attack_hand(mob/user = usr)
|
|||||||
dat += "<a href='?src=\ref[src];log=1'>View storage log</a>.<br>"
|
dat += "<a href='?src=\ref[src];log=1'>View storage log</a>.<br>"
|
||||||
dat += "<a href='?src=\ref[src];item=1'>Recover object</a>.<br>"
|
dat += "<a href='?src=\ref[src];item=1'>Recover object</a>.<br>"
|
||||||
dat += "<a href='?src=\ref[src];allitems=1'>Recover all objects</a>.<br>"
|
dat += "<a href='?src=\ref[src];allitems=1'>Recover all objects</a>.<br>"
|
||||||
dat += "<a href='?src=\ref[src];crew=1'>Revive crew</a>.<br/><hr/>"
|
|
||||||
|
|
||||||
user << browse(dat, "window=cryopod_console")
|
user << browse(dat, "window=cryopod_console")
|
||||||
onclose(user, "cryopod_console")
|
onclose(user, "cryopod_console")
|
||||||
|
|
||||||
obj/machinery/computer/cryopod/Topic(href, href_list)
|
/obj/machinery/computer/cryopod/Topic(href, href_list)
|
||||||
|
|
||||||
if(..())
|
if(..())
|
||||||
return
|
return
|
||||||
@@ -95,9 +94,6 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
|
|||||||
I.loc = get_turf(src)
|
I.loc = get_turf(src)
|
||||||
frozen_items -= I
|
frozen_items -= I
|
||||||
|
|
||||||
else if(href_list["crew"])
|
|
||||||
user << "\red Functionality unavailable at this time."
|
|
||||||
|
|
||||||
src.updateUsrDialog()
|
src.updateUsrDialog()
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -240,7 +236,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
|
|||||||
current_mode.possible_traitors.Remove(occupant)
|
current_mode.possible_traitors.Remove(occupant)
|
||||||
|
|
||||||
// Delete them from datacore.
|
// Delete them from datacore.
|
||||||
|
|
||||||
if(PDA_Manifest.len)
|
if(PDA_Manifest.len)
|
||||||
PDA_Manifest.Cut()
|
PDA_Manifest.Cut()
|
||||||
for(var/datum/data/record/R in data_core.medical)
|
for(var/datum/data/record/R in data_core.medical)
|
||||||
|
|||||||
@@ -40,6 +40,14 @@
|
|||||||
latejoin += loc
|
latejoin += loc
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
|
if("JoinLateGateway")
|
||||||
|
latejoin_gateway += loc
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
if("JoinLateCryo")
|
||||||
|
latejoin_cryo += loc
|
||||||
|
del(src)
|
||||||
|
|
||||||
//prisoners
|
//prisoners
|
||||||
if("prisonwarp")
|
if("prisonwarp")
|
||||||
prisonwarp += loc
|
prisonwarp += loc
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
obj/structure
|
/obj/structure
|
||||||
icon = 'icons/obj/structures.dmi'
|
icon = 'icons/obj/structures.dmi'
|
||||||
|
var/climbable
|
||||||
|
|
||||||
obj/structure/blob_act()
|
/obj/structure/blob_act()
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
obj/structure/ex_act(severity)
|
/obj/structure/ex_act(severity)
|
||||||
switch(severity)
|
switch(severity)
|
||||||
if(1.0)
|
if(1.0)
|
||||||
del(src)
|
del(src)
|
||||||
@@ -17,12 +18,84 @@ obj/structure/ex_act(severity)
|
|||||||
if(3.0)
|
if(3.0)
|
||||||
return
|
return
|
||||||
|
|
||||||
obj/structure/meteorhit(obj/O as obj)
|
/obj/structure/meteorhit(obj/O as obj)
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
|
/obj/structure/New()
|
||||||
|
..()
|
||||||
|
if(climbable)
|
||||||
|
verbs += /obj/structure/proc/do_climb
|
||||||
|
|
||||||
|
/obj/structure/proc/do_climb()
|
||||||
|
|
||||||
|
set name = "Climb structure"
|
||||||
|
set desc = "Climbs onto a structure."
|
||||||
|
set category = "Object"
|
||||||
|
set src in oview(1)
|
||||||
|
|
||||||
|
if (!can_touch(usr) || !climbable)
|
||||||
|
return
|
||||||
|
|
||||||
|
usr.visible_message("<span class='warning'>[usr] starts climbing onto \the [src]!</span>")
|
||||||
|
|
||||||
|
if(!do_after(usr,50))
|
||||||
|
return
|
||||||
|
|
||||||
|
usr.loc = get_turf(src)
|
||||||
|
if (get_turf(usr) == get_turf(src))
|
||||||
|
usr.visible_message("<span class='warning'>[usr] climbs onto \the [src]!</span>")
|
||||||
|
|
||||||
|
/obj/structure/proc/structure_shaken()
|
||||||
|
|
||||||
|
for(var/mob/living/M in get_turf(src))
|
||||||
|
|
||||||
|
if(M.lying) return //No spamming this on people.
|
||||||
|
|
||||||
|
M.Weaken(5)
|
||||||
|
M << "\red You topple as \the [src] moves under you!"
|
||||||
|
|
||||||
|
if(prob(25))
|
||||||
|
|
||||||
|
var/damage = rand(15,30)
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
if(!istype(M))
|
||||||
|
H << "\red You land heavily!"
|
||||||
|
M.adjustBruteLoss(damage)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/datum/organ/external/affecting
|
||||||
|
|
||||||
|
switch(pick(list("ankle","wrist","head","knee","elbow")))
|
||||||
|
if("ankle")
|
||||||
|
affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||||
|
if("knee")
|
||||||
|
affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||||
|
if("wrist")
|
||||||
|
affecting = H.get_organ(pick("l_hand", "r_hand"))
|
||||||
|
if("elbow")
|
||||||
|
affecting = H.get_organ(pick("l_arm", "r_arm"))
|
||||||
|
if("head")
|
||||||
|
affecting = H.get_organ("head")
|
||||||
|
|
||||||
|
if(affecting)
|
||||||
|
M << "\red You land heavily on your [affecting.display_name]!"
|
||||||
|
affecting.take_damage(damage, 0)
|
||||||
|
if(affecting.parent)
|
||||||
|
affecting.parent.add_autopsy_data("Misadventure", damage)
|
||||||
|
else
|
||||||
|
H << "\red You land heavily!"
|
||||||
|
H.adjustBruteLoss(damage)
|
||||||
|
|
||||||
|
H.UpdateDamageIcon()
|
||||||
|
H.updatehealth()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/structure/proc/can_touch(var/mob/user)
|
||||||
|
if (!user)
|
||||||
|
return 0
|
||||||
|
if (user.stat || user.restrained() || user.paralysis || user.sleeping || user.lying || user.weakened)
|
||||||
|
return 0
|
||||||
|
if (issilicon(user))
|
||||||
|
user << "<span class='notice'>You need hands for this.</span>"
|
||||||
|
return 0
|
||||||
|
return 1
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
icon_state = "crate"
|
icon_state = "crate"
|
||||||
icon_opened = "crateopen"
|
icon_opened = "crateopen"
|
||||||
icon_closed = "crate"
|
icon_closed = "crate"
|
||||||
|
climbable = 1
|
||||||
// mouse_drag_pointer = MOUSE_ACTIVE_POINTER //???
|
// mouse_drag_pointer = MOUSE_ACTIVE_POINTER //???
|
||||||
var/rigged = 0
|
var/rigged = 0
|
||||||
|
|
||||||
@@ -36,7 +37,11 @@
|
|||||||
O.loc = get_turf(src)
|
O.loc = get_turf(src)
|
||||||
icon_state = icon_opened
|
icon_state = icon_opened
|
||||||
src.opened = 1
|
src.opened = 1
|
||||||
return 1
|
|
||||||
|
if(climbable)
|
||||||
|
structure_shaken()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
/obj/structure/closet/crate/close()
|
/obj/structure/closet/crate/close()
|
||||||
if(!src.opened)
|
if(!src.opened)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
anchored = 1.0
|
anchored = 1.0
|
||||||
layer = 2.8
|
layer = 2.8
|
||||||
throwpass = 1 //You can throw objects over this, despite it's density.")
|
throwpass = 1 //You can throw objects over this, despite it's density.")
|
||||||
|
climbable = 1
|
||||||
|
|
||||||
var/parts = /obj/item/weapon/table_parts
|
var/parts = /obj/item/weapon/table_parts
|
||||||
var/flipped = 0
|
var/flipped = 0
|
||||||
var/health = 100
|
var/health = 100
|
||||||
@@ -412,31 +414,26 @@
|
|||||||
return 0
|
return 0
|
||||||
return T.straight_table_check(direction)
|
return T.straight_table_check(direction)
|
||||||
|
|
||||||
/obj/structure/table/verb/can_touch(var/mob/user)
|
|
||||||
if (!user)
|
|
||||||
return 0
|
|
||||||
if (user.stat) //zombie goasts go away
|
|
||||||
return 0
|
|
||||||
if (issilicon(user))
|
|
||||||
user << "<span class='notice'>You need hands for this.</span>"
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/obj/structure/table/verb/do_flip()
|
/obj/structure/table/verb/do_flip()
|
||||||
set name = "Flip table"
|
set name = "Flip table"
|
||||||
set desc = "Flips a non-reinforced table"
|
set desc = "Flips a non-reinforced table"
|
||||||
set category = "Object"
|
set category = "Object"
|
||||||
set src in oview(1)
|
set src in oview(1)
|
||||||
if(ismouse(usr))
|
|
||||||
return
|
if (!can_touch(usr) || ismouse(usr))
|
||||||
if (!can_touch(usr))
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!flip(get_cardinal_dir(usr,src)))
|
if(!flip(get_cardinal_dir(usr,src)))
|
||||||
usr << "<span class='notice'>It won't budge.</span>"
|
usr << "<span class='notice'>It won't budge.</span>"
|
||||||
else
|
|
||||||
usr.visible_message("<span class='warning'>[usr] flips \the [src]!</span>")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
usr.visible_message("<span class='warning'>[usr] flips \the [src]!</span>")
|
||||||
|
|
||||||
|
if(climbable)
|
||||||
|
structure_shaken()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
/obj/structure/table/proc/unflipping_check(var/direction)
|
/obj/structure/table/proc/unflipping_check(var/direction)
|
||||||
for(var/mob/M in oview(src,0))
|
for(var/mob/M in oview(src,0))
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -324,7 +324,7 @@
|
|||||||
|
|
||||||
//checks if this window is full-tile one
|
//checks if this window is full-tile one
|
||||||
/obj/structure/window/proc/is_fulltile()
|
/obj/structure/window/proc/is_fulltile()
|
||||||
if(dir in list(5,6,9,10))
|
if(dir & (dir - 1))
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,21 @@ var/list/wood_icons = list("wood","wood-broken")
|
|||||||
src.hotspot_expose(1000,CELL_VOLUME)
|
src.hotspot_expose(1000,CELL_VOLUME)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||||
|
if(!burnt && prob(5))
|
||||||
|
burn_tile()
|
||||||
|
else if(prob(1) && !is_plating())
|
||||||
|
make_plating()
|
||||||
|
burn_tile()
|
||||||
|
return
|
||||||
|
|
||||||
|
/turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume)
|
||||||
|
var/dir_to = get_dir(src, adj_turf)
|
||||||
|
|
||||||
|
for(var/obj/structure/window/W in src)
|
||||||
|
if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile)
|
||||||
|
W.fire_act(adj_air, adj_temp, adj_volume)
|
||||||
|
|
||||||
/turf/simulated/floor/blob_act()
|
/turf/simulated/floor/blob_act()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,15 @@
|
|||||||
icon = 'icons/turf/walls.dmi'
|
icon = 'icons/turf/walls.dmi'
|
||||||
var/mineral = "metal"
|
var/mineral = "metal"
|
||||||
var/rotting = 0
|
var/rotting = 0
|
||||||
|
|
||||||
|
var/damage = 0
|
||||||
|
var/damage_cap = 100 //Wall will break down to girders if damage reaches this point
|
||||||
|
|
||||||
|
var/damage_overlay
|
||||||
|
var/global/damage_overlays[8]
|
||||||
|
|
||||||
|
var/max_temperature = 1800 //K, walls will take damage if they're next to a fire hotter than this
|
||||||
|
|
||||||
opacity = 1
|
opacity = 1
|
||||||
density = 1
|
density = 1
|
||||||
blocks_air = 1
|
blocks_air = 1
|
||||||
@@ -13,6 +22,89 @@
|
|||||||
|
|
||||||
var/walltype = "metal"
|
var/walltype = "metal"
|
||||||
|
|
||||||
|
/turf/simulated/wall/Del()
|
||||||
|
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
|
||||||
|
..()
|
||||||
|
|
||||||
|
/turf/simulated/wall/ChangeTurf(var/newtype)
|
||||||
|
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
|
||||||
|
..(newtype)
|
||||||
|
|
||||||
|
//Appearance
|
||||||
|
|
||||||
|
/turf/simulated/wall/examine()
|
||||||
|
. = ..()
|
||||||
|
|
||||||
|
if(!damage)
|
||||||
|
usr << "<span class='notice'>It looks fully intact.</span>"
|
||||||
|
else
|
||||||
|
var/dam = damage / damage_cap
|
||||||
|
if(dam <= 0.3)
|
||||||
|
usr << "<span class='warning'>It looks slightly damaged.</span>"
|
||||||
|
else if(dam <= 0.6)
|
||||||
|
usr << "<span class='warning'>It looks moderately damaged.</span>"
|
||||||
|
else
|
||||||
|
usr << "<span class='danger'>It looks heavily damaged.</span>"
|
||||||
|
|
||||||
|
if(rotting)
|
||||||
|
usr << "<span class='warning'>There is fungus growing on [src].</span>"
|
||||||
|
|
||||||
|
/turf/simulated/wall/proc/update_icon()
|
||||||
|
if(!damage_overlays[1]) //list hasn't been populated
|
||||||
|
generate_overlays()
|
||||||
|
|
||||||
|
if(!damage)
|
||||||
|
overlays.Cut()
|
||||||
|
return
|
||||||
|
|
||||||
|
var/overlay = round(damage / damage_cap * damage_overlays.len) + 1
|
||||||
|
if(overlay > damage_overlays.len)
|
||||||
|
overlay = damage_overlays.len
|
||||||
|
|
||||||
|
if(damage_overlay && overlay == damage_overlay) //No need to update.
|
||||||
|
return
|
||||||
|
|
||||||
|
overlays.Cut()
|
||||||
|
overlays += damage_overlays[overlay]
|
||||||
|
damage_overlay = overlay
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
/turf/simulated/wall/proc/generate_overlays()
|
||||||
|
var/alpha_inc = 256 / damage_overlays.len
|
||||||
|
|
||||||
|
for(var/i = 1; i <= damage_overlays.len; i++)
|
||||||
|
var/image/img = image(icon = 'icons/turf/walls.dmi', icon_state = "overlay_damage")
|
||||||
|
img.blend_mode = BLEND_MULTIPLY
|
||||||
|
img.alpha = (i * alpha_inc) - 1
|
||||||
|
damage_overlays[i] = img
|
||||||
|
|
||||||
|
//Damage
|
||||||
|
|
||||||
|
/turf/simulated/wall/proc/take_damage(dam)
|
||||||
|
if(dam)
|
||||||
|
damage = max(0, damage + dam)
|
||||||
|
update_damage()
|
||||||
|
return
|
||||||
|
|
||||||
|
/turf/simulated/wall/proc/update_damage()
|
||||||
|
var/cap = damage_cap
|
||||||
|
if(rotting)
|
||||||
|
cap = cap / 10
|
||||||
|
|
||||||
|
if(damage >= cap)
|
||||||
|
dismantle_wall()
|
||||||
|
else
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
/turf/simulated/wall/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume)
|
||||||
|
if(adj_temp > max_temperature)
|
||||||
|
take_damage(rand(10, 20) * (adj_temp / max_temperature))
|
||||||
|
|
||||||
|
return ..()
|
||||||
|
|
||||||
/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0)
|
/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0)
|
||||||
if(istype(src,/turf/simulated/wall/r_wall))
|
if(istype(src,/turf/simulated/wall/r_wall))
|
||||||
if(!devastated)
|
if(!devastated)
|
||||||
@@ -64,31 +156,76 @@
|
|||||||
ChangeTurf(/turf/simulated/floor/plating)
|
ChangeTurf(/turf/simulated/floor/plating)
|
||||||
|
|
||||||
/turf/simulated/wall/ex_act(severity)
|
/turf/simulated/wall/ex_act(severity)
|
||||||
if(rotting) severity = 1.0
|
|
||||||
switch(severity)
|
switch(severity)
|
||||||
if(1.0)
|
if(1.0)
|
||||||
//SN src = null
|
|
||||||
src.ChangeTurf(/turf/space)
|
src.ChangeTurf(/turf/space)
|
||||||
return
|
return
|
||||||
if(2.0)
|
if(2.0)
|
||||||
if (prob(50))
|
if(prob(75))
|
||||||
dismantle_wall(0,1)
|
take_damage(rand(150, 250))
|
||||||
else
|
else
|
||||||
dismantle_wall(1,1)
|
dismantle_wall(1,1)
|
||||||
if(3.0)
|
if(3.0)
|
||||||
var/proba
|
take_damage(rand(0, 250))
|
||||||
if (istype(src, /turf/simulated/wall/r_wall))
|
|
||||||
proba = 15
|
|
||||||
else
|
|
||||||
proba = 40
|
|
||||||
if (prob(proba))
|
|
||||||
dismantle_wall(0,1)
|
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
|
|
||||||
/turf/simulated/wall/blob_act()
|
/turf/simulated/wall/blob_act()
|
||||||
if(prob(50) || rotting)
|
take_damage(rand(75, 125))
|
||||||
|
return
|
||||||
|
|
||||||
|
// Wall-rot effect, a nasty fungus that destroys walls.
|
||||||
|
/turf/simulated/wall/proc/rot()
|
||||||
|
if(!rotting)
|
||||||
|
rotting = 1
|
||||||
|
|
||||||
|
var/number_rots = rand(2,3)
|
||||||
|
for(var/i=0, i<number_rots, i++)
|
||||||
|
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
|
||||||
|
O.name = "Wallrot"
|
||||||
|
O.desc = "Ick..."
|
||||||
|
O.icon = 'icons/effects/wallrot.dmi'
|
||||||
|
O.pixel_x += rand(-10, 10)
|
||||||
|
O.pixel_y += rand(-10, 10)
|
||||||
|
O.anchored = 1
|
||||||
|
O.density = 1
|
||||||
|
O.layer = 5
|
||||||
|
O.mouse_opacity = 0
|
||||||
|
|
||||||
|
/turf/simulated/wall/proc/thermitemelt(mob/user as mob)
|
||||||
|
if(mineral == "diamond")
|
||||||
|
return
|
||||||
|
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
|
||||||
|
O.name = "Thermite"
|
||||||
|
O.desc = "Looks hot."
|
||||||
|
O.icon = 'icons/effects/fire.dmi'
|
||||||
|
O.icon_state = "2"
|
||||||
|
O.anchored = 1
|
||||||
|
O.density = 1
|
||||||
|
O.layer = 5
|
||||||
|
|
||||||
|
src.ChangeTurf(/turf/simulated/floor/plating)
|
||||||
|
|
||||||
|
var/turf/simulated/floor/F = src
|
||||||
|
F.burn_tile()
|
||||||
|
F.icon_state = "wall_thermite"
|
||||||
|
user << "<span class='warning'>The thermite starts melting through the wall.</span>"
|
||||||
|
|
||||||
|
spawn(100)
|
||||||
|
if(O) del(O)
|
||||||
|
// F.sd_LumReset() //TODO: ~Carn
|
||||||
|
return
|
||||||
|
|
||||||
|
/turf/simulated/wall/meteorhit(obj/M as obj)
|
||||||
|
if (prob(15) && !rotting)
|
||||||
dismantle_wall()
|
dismantle_wall()
|
||||||
|
else if(prob(70) && !rotting)
|
||||||
|
ChangeTurf(/turf/simulated/floor/plating)
|
||||||
|
else
|
||||||
|
ReplaceWithLattice()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
//Interactions
|
||||||
|
|
||||||
/turf/simulated/wall/attack_paw(mob/user as mob)
|
/turf/simulated/wall/attack_paw(mob/user as mob)
|
||||||
if ((HULK in user.mutations))
|
if ((HULK in user.mutations))
|
||||||
@@ -99,6 +236,7 @@
|
|||||||
return
|
return
|
||||||
else
|
else
|
||||||
usr << text("\blue You punch the wall.")
|
usr << text("\blue You punch the wall.")
|
||||||
|
take_damage(rand(25, 75))
|
||||||
return
|
return
|
||||||
|
|
||||||
return src.attack_hand(user)
|
return src.attack_hand(user)
|
||||||
@@ -116,6 +254,7 @@
|
|||||||
return
|
return
|
||||||
else
|
else
|
||||||
M << text("\blue You smash against the wall.")
|
M << text("\blue You smash against the wall.")
|
||||||
|
take_damage(rand(25, 75))
|
||||||
return
|
return
|
||||||
|
|
||||||
M << "\blue You push the wall but nothing happens!"
|
M << "\blue You push the wall but nothing happens!"
|
||||||
@@ -130,6 +269,7 @@
|
|||||||
return
|
return
|
||||||
else
|
else
|
||||||
usr << text("\blue You punch the wall.")
|
usr << text("\blue You punch the wall.")
|
||||||
|
take_damage(rand(25, 75))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(rotting)
|
if(rotting)
|
||||||
@@ -193,17 +333,32 @@
|
|||||||
|
|
||||||
//DECONSTRUCTION
|
//DECONSTRUCTION
|
||||||
if( istype(W, /obj/item/weapon/weldingtool) )
|
if( istype(W, /obj/item/weapon/weldingtool) )
|
||||||
|
|
||||||
|
var/response = "Dismantle"
|
||||||
|
if(damage)
|
||||||
|
response = alert(user, "Would you like to repair or dismantle [src]?", "[src]", "Repair", "Dismantle")
|
||||||
|
|
||||||
var/obj/item/weapon/weldingtool/WT = W
|
var/obj/item/weapon/weldingtool/WT = W
|
||||||
if( WT.remove_fuel(0,user) )
|
|
||||||
user << "<span class='notice'>You begin slicing through the outer plating.</span>"
|
|
||||||
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
|
||||||
|
|
||||||
sleep(100)
|
if(WT.remove_fuel(0,user))
|
||||||
if( !istype(src, /turf/simulated/wall) || !user || !WT || !WT.isOn() || !T ) return
|
if(response == "Repair")
|
||||||
|
user << "<span class='notice'>You start repairing the damage to [src].</span>"
|
||||||
|
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
||||||
|
if(do_after(user, max(5, damage / 5)) && WT && WT.isOn())
|
||||||
|
user << "<span class='notice'>You finish repairing the damage to [src].</span>"
|
||||||
|
take_damage(-damage)
|
||||||
|
|
||||||
if( user.loc == T && user.get_active_hand() == WT )
|
else if(response == "Dismantle")
|
||||||
user << "<span class='notice'>You remove the outer plating.</span>"
|
user << "<span class='notice'>You begin slicing through the outer plating.</span>"
|
||||||
dismantle_wall()
|
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
||||||
|
|
||||||
|
sleep(100)
|
||||||
|
if( !istype(src, /turf/simulated/wall) || !user || !WT || !WT.isOn() || !T ) return
|
||||||
|
|
||||||
|
if( user.loc == T && user.get_active_hand() == WT )
|
||||||
|
user << "<span class='notice'>You remove the outer plating.</span>"
|
||||||
|
dismantle_wall()
|
||||||
|
return
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
|
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
|
||||||
return
|
return
|
||||||
@@ -306,62 +461,3 @@
|
|||||||
else
|
else
|
||||||
return attack_hand(user)
|
return attack_hand(user)
|
||||||
return
|
return
|
||||||
|
|
||||||
// Wall-rot effect, a nasty fungus that destroys walls.
|
|
||||||
/turf/simulated/wall/proc/rot()
|
|
||||||
if(!rotting)
|
|
||||||
rotting = 1
|
|
||||||
|
|
||||||
var/number_rots = rand(2,3)
|
|
||||||
for(var/i=0, i<number_rots, i++)
|
|
||||||
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
|
|
||||||
O.name = "Wallrot"
|
|
||||||
O.desc = "Ick..."
|
|
||||||
O.icon = 'icons/effects/wallrot.dmi'
|
|
||||||
O.pixel_x += rand(-10, 10)
|
|
||||||
O.pixel_y += rand(-10, 10)
|
|
||||||
O.anchored = 1
|
|
||||||
O.density = 1
|
|
||||||
O.layer = 5
|
|
||||||
O.mouse_opacity = 0
|
|
||||||
|
|
||||||
/turf/simulated/wall/proc/thermitemelt(mob/user as mob)
|
|
||||||
if(mineral == "diamond")
|
|
||||||
return
|
|
||||||
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
|
|
||||||
O.name = "Thermite"
|
|
||||||
O.desc = "Looks hot."
|
|
||||||
O.icon = 'icons/effects/fire.dmi'
|
|
||||||
O.icon_state = "2"
|
|
||||||
O.anchored = 1
|
|
||||||
O.density = 1
|
|
||||||
O.layer = 5
|
|
||||||
|
|
||||||
src.ChangeTurf(/turf/simulated/floor/plating)
|
|
||||||
|
|
||||||
var/turf/simulated/floor/F = src
|
|
||||||
F.burn_tile()
|
|
||||||
F.icon_state = "wall_thermite"
|
|
||||||
user << "<span class='warning'>The thermite starts melting through the wall.</span>"
|
|
||||||
|
|
||||||
spawn(100)
|
|
||||||
if(O) del(O)
|
|
||||||
// F.sd_LumReset() //TODO: ~Carn
|
|
||||||
return
|
|
||||||
|
|
||||||
/turf/simulated/wall/meteorhit(obj/M as obj)
|
|
||||||
if (prob(15) && !rotting)
|
|
||||||
dismantle_wall()
|
|
||||||
else if(prob(70) && !rotting)
|
|
||||||
ChangeTurf(/turf/simulated/floor/plating)
|
|
||||||
else
|
|
||||||
ReplaceWithLattice()
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/turf/simulated/wall/Del()
|
|
||||||
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
|
|
||||||
..()
|
|
||||||
|
|
||||||
/turf/simulated/wall/ChangeTurf(var/newtype)
|
|
||||||
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
|
|
||||||
..(newtype)
|
|
||||||
@@ -5,6 +5,9 @@
|
|||||||
opacity = 1
|
opacity = 1
|
||||||
density = 1
|
density = 1
|
||||||
|
|
||||||
|
damage_cap = 200
|
||||||
|
max_temperature = 6000
|
||||||
|
|
||||||
walltype = "rwall"
|
walltype = "rwall"
|
||||||
|
|
||||||
var/d_state = 0
|
var/d_state = 0
|
||||||
@@ -81,6 +84,19 @@
|
|||||||
user << "<span class='notice'>This wall is too thick to slice through. You will need to find a different path.</span>"
|
user << "<span class='notice'>This wall is too thick to slice through. You will need to find a different path.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if(damage && istype(W, /obj/item/weapon/weldingtool))
|
||||||
|
var/obj/item/weapon/weldingtool/WT = W
|
||||||
|
if(WT.remove_fuel(0,user))
|
||||||
|
user << "<span class='notice'>You start repairing the damage to [src].</span>"
|
||||||
|
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
||||||
|
if(do_after(user, max(5, damage / 5)) && WT && WT.isOn())
|
||||||
|
user << "<span class='notice'>You finish repairing the damage to [src].</span>"
|
||||||
|
take_damage(-damage)
|
||||||
|
return
|
||||||
|
else
|
||||||
|
user << "<span class='warning'>You need more welding fuel to complete this task.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
var/turf/T = user.loc //get user's location for delay checks
|
var/turf/T = user.loc //get user's location for delay checks
|
||||||
|
|
||||||
//DECONSTRUCTION
|
//DECONSTRUCTION
|
||||||
|
|||||||
@@ -149,6 +149,9 @@
|
|||||||
return
|
return
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/turf/proc/adjacent_fire_act(turf/simulated/floor/source, temperature, volume)
|
||||||
|
return
|
||||||
|
|
||||||
/turf/proc/is_plating()
|
/turf/proc/is_plating()
|
||||||
return 0
|
return 0
|
||||||
/turf/proc/is_asteroid_floor()
|
/turf/proc/is_asteroid_floor()
|
||||||
|
|||||||
@@ -125,7 +125,12 @@ var/airtunnel_bottom = 72 // default
|
|||||||
var/list/monkeystart = list()
|
var/list/monkeystart = list()
|
||||||
var/list/wizardstart = list()
|
var/list/wizardstart = list()
|
||||||
var/list/newplayer_start = list()
|
var/list/newplayer_start = list()
|
||||||
|
|
||||||
|
//Spawnpoints.
|
||||||
var/list/latejoin = list()
|
var/list/latejoin = list()
|
||||||
|
var/list/latejoin_gateway = list()
|
||||||
|
var/list/latejoin_cryo = list()
|
||||||
|
|
||||||
var/list/prisonwarp = list() //prisoners go to these
|
var/list/prisonwarp = list() //prisoners go to these
|
||||||
var/list/holdingfacility = list() //captured people go here
|
var/list/holdingfacility = list() //captured people go here
|
||||||
var/list/xeno_spawn = list()//Aliens spawn at these.
|
var/list/xeno_spawn = list()//Aliens spawn at these.
|
||||||
@@ -141,6 +146,8 @@ var/list/ninjastart = list()
|
|||||||
// list/traitors = list() //traitor list
|
// list/traitors = list() //traitor list
|
||||||
var/list/cardinal = list( NORTH, SOUTH, EAST, WEST )
|
var/list/cardinal = list( NORTH, SOUTH, EAST, WEST )
|
||||||
var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
|
var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
|
||||||
|
// reverse_dir[dir] = reverse of dir
|
||||||
|
var/list/reverse_dir = list(2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63)
|
||||||
|
|
||||||
var/datum/station_state/start_state = null
|
var/datum/station_state/start_state = null
|
||||||
var/datum/configuration/config = null
|
var/datum/configuration/config = null
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ datum/preferences
|
|||||||
var/be_random_name = 0 //whether we are a random name every round
|
var/be_random_name = 0 //whether we are a random name every round
|
||||||
var/gender = MALE //gender of character (well duh)
|
var/gender = MALE //gender of character (well duh)
|
||||||
var/age = 30 //age of character
|
var/age = 30 //age of character
|
||||||
|
var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
|
||||||
var/b_type = "A+" //blood type (not-chooseable)
|
var/b_type = "A+" //blood type (not-chooseable)
|
||||||
var/underwear = 1 //underwear type
|
var/underwear = 1 //underwear type
|
||||||
var/undershirt = 1 //undershirt type
|
var/undershirt = 1 //undershirt type
|
||||||
@@ -246,7 +247,8 @@ datum/preferences
|
|||||||
dat += "<br>"
|
dat += "<br>"
|
||||||
|
|
||||||
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'><b>[gender == MALE ? "Male" : "Female"]</b></a><br>"
|
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'><b>[gender == MALE ? "Male" : "Female"]</b></a><br>"
|
||||||
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a>"
|
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a><br>"
|
||||||
|
dat += "<b>Spawn Point</b>: <a href='byond://?src=\ref[user];preference=spawnpoint;task=input'>[spawnpoint]</a>"
|
||||||
|
|
||||||
dat += "<br>"
|
dat += "<br>"
|
||||||
dat += "<b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
dat += "<b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||||
@@ -1179,6 +1181,16 @@ datum/preferences
|
|||||||
var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
|
var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
|
||||||
if(!skin_style_name) return
|
if(!skin_style_name) return
|
||||||
|
|
||||||
|
if("spawnpoint")
|
||||||
|
var/list/spawnkeys = list()
|
||||||
|
for(var/S in spawntypes)
|
||||||
|
spawnkeys += S
|
||||||
|
var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys
|
||||||
|
if(!choice || !spawntypes[choice])
|
||||||
|
spawnpoint = "Arrivals Shuttle"
|
||||||
|
return
|
||||||
|
spawnpoint = choice
|
||||||
|
|
||||||
else
|
else
|
||||||
switch(href_list["preference"])
|
switch(href_list["preference"])
|
||||||
if("gender")
|
if("gender")
|
||||||
|
|||||||
@@ -108,6 +108,7 @@
|
|||||||
S["age"] >> age
|
S["age"] >> age
|
||||||
S["species"] >> species
|
S["species"] >> species
|
||||||
S["language"] >> language
|
S["language"] >> language
|
||||||
|
S["spawnpoint"] >> spawnpoint
|
||||||
|
|
||||||
//colors to be consolidated into hex strings (requires some work with dna code)
|
//colors to be consolidated into hex strings (requires some work with dna code)
|
||||||
S["hair_red"] >> r_hair
|
S["hair_red"] >> r_hair
|
||||||
@@ -168,6 +169,7 @@
|
|||||||
real_name = reject_bad_name(real_name)
|
real_name = reject_bad_name(real_name)
|
||||||
if(isnull(species)) species = "Human"
|
if(isnull(species)) species = "Human"
|
||||||
if(isnull(language)) language = "None"
|
if(isnull(language)) language = "None"
|
||||||
|
if(isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle"
|
||||||
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
|
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
|
||||||
if(!real_name) real_name = random_name(gender)
|
if(!real_name) real_name = random_name(gender)
|
||||||
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
||||||
|
|||||||
@@ -48,4 +48,12 @@
|
|||||||
name = "maintenance drone"
|
name = "maintenance drone"
|
||||||
desc = "It's a small maintenance robot."
|
desc = "It's a small maintenance robot."
|
||||||
icon_state = "drone"
|
icon_state = "drone"
|
||||||
origin_tech = "magnets=3;engineering=5"
|
origin_tech = "magnets=3;engineering=5"
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/holder/cat
|
||||||
|
|
||||||
|
name = "cat"
|
||||||
|
desc = "It's a cat. Meow."
|
||||||
|
icon_state = "cat"
|
||||||
|
origin_tech = null
|
||||||
@@ -60,6 +60,25 @@
|
|||||||
stop_automated_movement = 1
|
stop_automated_movement = 1
|
||||||
walk_to(src,movement_target,0,3)
|
walk_to(src,movement_target,0,3)
|
||||||
|
|
||||||
|
|
||||||
|
/mob/living/simple_animal/cat/MouseDrop(atom/over_object)
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/H = over_object
|
||||||
|
if(!istype(H)) return ..()
|
||||||
|
|
||||||
|
//This REALLY needs to be moved to a general mob proc somewhere.
|
||||||
|
if(H.a_intent == "help")
|
||||||
|
var/obj/item/weapon/holder/cat/C = new(loc)
|
||||||
|
src.loc = C
|
||||||
|
C.name = loc.name
|
||||||
|
C.attack_hand(H)
|
||||||
|
H << "You scoop up [src]."
|
||||||
|
src << "[H] scoops you up."
|
||||||
|
H.status_flags |= PASSEMOTES
|
||||||
|
return
|
||||||
|
else
|
||||||
|
return ..()
|
||||||
|
|
||||||
//RUNTIME IS ALIVE! SQUEEEEEEEE~
|
//RUNTIME IS ALIVE! SQUEEEEEEEE~
|
||||||
/mob/living/simple_animal/cat/Runtime
|
/mob/living/simple_animal/cat/Runtime
|
||||||
name = "Runtime"
|
name = "Runtime"
|
||||||
|
|||||||
@@ -159,7 +159,7 @@
|
|||||||
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
AttemptLateSpawn(href_list["SelectedJob"])
|
AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(href_list["privacy_poll"])
|
if(href_list["privacy_poll"])
|
||||||
@@ -270,7 +270,7 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
proc/AttemptLateSpawn(rank)
|
proc/AttemptLateSpawn(rank,var/spawning_at)
|
||||||
if (src != usr)
|
if (src != usr)
|
||||||
return 0
|
return 0
|
||||||
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
||||||
@@ -291,7 +291,21 @@
|
|||||||
var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind
|
var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind
|
||||||
job_master.EquipRank(character, rank, 1) //equips the human
|
job_master.EquipRank(character, rank, 1) //equips the human
|
||||||
EquipCustomItems(character)
|
EquipCustomItems(character)
|
||||||
character.loc = pick(latejoin)
|
|
||||||
|
//Find our spawning point.
|
||||||
|
var/join_message
|
||||||
|
var/datum/spawnpoint/S
|
||||||
|
|
||||||
|
if(spawning_at)
|
||||||
|
S = spawntypes[spawning_at]
|
||||||
|
|
||||||
|
if(S && istype(S))
|
||||||
|
character.loc = pick(S.turfs)
|
||||||
|
join_message = S.msg
|
||||||
|
else
|
||||||
|
character.loc = pick(latejoin)
|
||||||
|
join_message = "has arrived on the station"
|
||||||
|
|
||||||
character.lastarea = get_area(loc)
|
character.lastarea = get_area(loc)
|
||||||
// Moving wheelchair if they have one
|
// Moving wheelchair if they have one
|
||||||
if(character.buckled && istype(character.buckled, /obj/structure/stool/bed/chair/wheelchair))
|
if(character.buckled && istype(character.buckled, /obj/structure/stool/bed/chair/wheelchair))
|
||||||
@@ -305,18 +319,18 @@
|
|||||||
if(character.mind.assigned_role != "Cyborg")
|
if(character.mind.assigned_role != "Cyborg")
|
||||||
data_core.manifest_inject(character)
|
data_core.manifest_inject(character)
|
||||||
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
|
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
|
||||||
AnnounceArrival(character, rank)
|
AnnounceArrival(character, rank, join_message)
|
||||||
|
|
||||||
else
|
else
|
||||||
character.Robotize()
|
character.Robotize()
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
|
proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message)
|
||||||
if (ticker.current_state == GAME_STATE_PLAYING)
|
if (ticker.current_state == GAME_STATE_PLAYING)
|
||||||
var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI.
|
var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI.
|
||||||
if(character.mind.role_alt_title)
|
if(character.mind.role_alt_title)
|
||||||
rank = character.mind.role_alt_title
|
rank = character.mind.role_alt_title
|
||||||
a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] has arrived on the station.", "Arrivals Announcement Computer")
|
a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
|
||||||
del(a)
|
del(a)
|
||||||
|
|
||||||
proc/LateChoices()
|
proc/LateChoices()
|
||||||
|
|||||||
@@ -51,6 +51,9 @@
|
|||||||
turbine = locate() in get_step(src, get_dir(inturf, src))
|
turbine = locate() in get_step(src, get_dir(inturf, src))
|
||||||
if(!turbine)
|
if(!turbine)
|
||||||
stat |= BROKEN
|
stat |= BROKEN
|
||||||
|
else
|
||||||
|
turbine.stat &= !BROKEN
|
||||||
|
turbine.compressor = src
|
||||||
|
|
||||||
|
|
||||||
#define COMPFRICTION 5e5
|
#define COMPFRICTION 5e5
|
||||||
@@ -105,6 +108,9 @@
|
|||||||
compressor = locate() in get_step(src, get_dir(outturf, src))
|
compressor = locate() in get_step(src, get_dir(outturf, src))
|
||||||
if(!compressor)
|
if(!compressor)
|
||||||
stat |= BROKEN
|
stat |= BROKEN
|
||||||
|
else
|
||||||
|
compressor.stat &= !BROKEN
|
||||||
|
compressor.turbine = src
|
||||||
|
|
||||||
|
|
||||||
#define TURBPRES 9000000
|
#define TURBPRES 9000000
|
||||||
|
|||||||
36
code/modules/spawnpoints.dm
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
var/list/spawntypes = list()
|
||||||
|
|
||||||
|
/proc/populate_spawn_points()
|
||||||
|
spawntypes = list()
|
||||||
|
for(var/type in typesof(/datum/spawnpoint)-/datum/spawnpoint)
|
||||||
|
var/datum/spawnpoint/S = new type()
|
||||||
|
spawntypes[S.display_name] = S
|
||||||
|
|
||||||
|
/datum/spawnpoint
|
||||||
|
var/msg //Message to display on the arrivals computer.
|
||||||
|
var/list/turfs //List of turfs to spawn on.
|
||||||
|
var/display_name //Name used in preference setup.
|
||||||
|
|
||||||
|
/datum/spawnpoint/arrivals
|
||||||
|
display_name = "Arrivals Shuttle"
|
||||||
|
msg = "has arrived on the station"
|
||||||
|
|
||||||
|
/datum/spawnpoint/arrivals/New()
|
||||||
|
..()
|
||||||
|
turfs = latejoin
|
||||||
|
|
||||||
|
/*/datum/spawnpoint/gateway
|
||||||
|
display_name = "Gateway"
|
||||||
|
msg = "has completed translation from offsite gateway"
|
||||||
|
|
||||||
|
/datum/spawnpoint/gateway/New()
|
||||||
|
..()
|
||||||
|
turfs = latejoin_gateway*/
|
||||||
|
|
||||||
|
/datum/spawnpoint/cryo
|
||||||
|
display_name = "Cryogenic Storage"
|
||||||
|
msg = "has completed cryogenic revival"
|
||||||
|
|
||||||
|
/datum/spawnpoint/cryo/New()
|
||||||
|
..()
|
||||||
|
turfs = latejoin_cryo
|
||||||
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 120 KiB |
BIN
icons/obj/pipeturbine.dmi
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 147 KiB |